Clean-Code-Prinzipien für XOOPS
Übersicht
Abschnitt betitelt „Übersicht“Clean Code ist Code, der leicht zu lesen, zu verstehen und zu warten ist. Dieser Leitfaden behandelt Clean-Code-Prinzipien, die speziell auf die XOOPS-Modulentwicklung angewendet werden.
Kernprinzipien
Abschnitt betitelt „Kernprinzipien“mindmap root((Clean Code)) Readability Meaningful Names Small Functions Comments When Needed Simplicity Single Responsibility DRY Principle KISS Principle Maintainability Consistent Style Error Handling TestingAussagekräftige Namen
Abschnitt betitelt „Aussagekräftige Namen“Variablen
Abschnitt betitelt „Variablen“// Bad$d = new DateTime();$u = $memberHandler->getUser($id);$arr = [];
// Good$createdDate = new DateTime();$currentUser = $memberHandler->getUser($userId);$publishedArticles = [];Funktionen
Abschnitt betitelt „Funktionen“// Badfunction process($data) { ... }function handle($item) { ... }function doStuff($x, $y) { ... }
// Goodfunction publishArticle(Article $article): void { ... }function calculateTotalPrice(array $items): float { ... }function sendNotificationEmail(User $user, string $subject): bool { ... }Klassen
Abschnitt betitelt „Klassen“// Badclass Manager { ... }class Helper { ... }class Utils { ... }
// Goodclass ArticleRepository { ... }class NotificationService { ... }class PermissionChecker { ... }Kleine Funktionen
Abschnitt betitelt „Kleine Funktionen“Einzelverantwortung
Abschnitt betitelt „Einzelverantwortung“// Bad - does too many thingsfunction processArticle($data) { // Validate if (empty($data['title'])) { throw new Exception('Title required'); } // Save $article = new Article(); $article->setTitle($data['title']); $this->repository->save($article); // Notify $this->mailer->send($article->getAuthor(), 'Article published'); // Log $this->logger->info('Article created'); return $article;}
// Good - each function does one thingfunction validateArticleData(array $data): void{ if (empty($data['title'])) { throw new ValidationException('Title required'); }}
function createArticle(array $data): Article{ $this->validateArticleData($data); return Article::create($data['title'], $data['content']);}
function publishArticle(Article $article): void{ $this->repository->save($article); $this->notifyAuthor($article); $this->logArticleCreation($article);}Funktionslänge
Abschnitt betitelt „Funktionslänge“Halten Sie Funktionen kurz - idealerweise unter 20 Zeilen:
// Good - focused functionpublic function getPublishedArticles(int $limit = 10): array{ $criteria = new CriteriaCompo(); $criteria->add(new Criteria('status', 'published')); $criteria->setSort('published_at'); $criteria->setOrder('DESC'); $criteria->setLimit($limit);
return $this->repository->getObjects($criteria);}DRY-Prinzip (Don’t Repeat Yourself)
Abschnitt betitelt „DRY-Prinzip (Don’t Repeat Yourself)“Allgemeinen Code extrahieren
Abschnitt betitelt „Allgemeinen Code extrahieren“// Bad - repeated codefunction getActiveUsers() { $criteria = new CriteriaCompo(); $criteria->add(new Criteria('level', 0, '>')); $criteria->setSort('uname'); return $this->userHandler->getObjects($criteria);}
function getActiveAdmins() { $criteria = new CriteriaCompo(); $criteria->add(new Criteria('level', 0, '>')); $criteria->add(new Criteria('is_admin', 1)); $criteria->setSort('uname'); return $this->userHandler->getObjects($criteria);}
// Good - shared logic extractedfunction getUsers(CriteriaCompo $criteria): array{ $criteria->add(new Criteria('level', 0, '>')); $criteria->setSort('uname'); return $this->userHandler->getObjects($criteria);}
function getActiveUsers(): array{ return $this->getUsers(new CriteriaCompo());}
function getActiveAdmins(): array{ $criteria = new CriteriaCompo(); $criteria->add(new Criteria('is_admin', 1)); return $this->getUsers($criteria);}Fehlerbehandlung
Abschnitt betitelt „Fehlerbehandlung“Ausnahmen richtig verwenden
Abschnitt betitelt „Ausnahmen richtig verwenden“// Bad - generic exceptionsthrow new Exception('Error');
// Good - specific exceptionsthrow new ArticleNotFoundException($articleId);throw new PermissionDeniedException('Cannot edit article');throw new ValidationException(['title' => 'Title is required']);Fehler elegant behandeln
Abschnitt betitelt „Fehler elegant behandeln“public function findArticle(string $id): ?Article{ try { return $this->repository->findById($id); } catch (DatabaseException $e) { $this->logger->error('Database error finding article', [ 'id' => $id, 'error' => $e->getMessage() ]); throw new ServiceException('Unable to retrieve article', 0, $e); }}Kommentare
Abschnitt betitelt „Kommentare“Wann man kommentieren sollte
Abschnitt betitelt „Wann man kommentieren sollte“// Bad - obvious comment// Increment counter$counter++;
// Good - explains why, not what// Cache for 1 hour to reduce database load during peak traffic$cache->set($key, $data, 3600);
// Good - documents complex algorithm/** * Calculate article relevance score using TF-IDF algorithm. * Higher scores indicate better match with search terms. */function calculateRelevanceScore(Article $article, array $terms): float{ // ...}Code-Organisation
Abschnitt betitelt „Code-Organisation“Klassenstruktur
Abschnitt betitelt „Klassenstruktur“class ArticleService{ // 1. Constants private const MAX_TITLE_LENGTH = 255;
// 2. Properties private ArticleRepository $repository; private EventDispatcher $events;
// 3. Constructor public function __construct( ArticleRepository $repository, EventDispatcher $events ) { $this->repository = $repository; $this->events = $events; }
// 4. Public methods public function publish(Article $article): void { ... } public function archive(Article $article): void { ... }
// 5. Private methods private function validateForPublication(Article $article): void { ... }}Clean-Code-Checkliste
Abschnitt betitelt „Clean-Code-Checkliste“- Namen sind aussagekräftig und aussprechbar
- Funktionen tun nur eine Sache
- Funktionen sind klein (< 20 Zeilen)
- Kein duplizierter Code
- Ordnungsgemäße Fehlerbehandlung mit spezifischen Ausnahmen
- Kommentare erklären “warum”, nicht “was”
- Konsistente Formatierung und Stil
- Keine magischen Zahlen oder Zeichenketten
- Abhängigkeiten werden injiziert, nicht erstellt
Verwandte Dokumentation
Abschnitt betitelt „Verwandte Dokumentation“- Code-Organisation
- Fehlerbehandlung
- Testing Best Practices
- PHP Standards