Principy čistého kódu pro XOOPS
Přehled
Sekce “Přehled”Čistý kód je kód, který je snadno čitelný, pochopitelný a udržovatelný. Tato příručka pokrývá principy čistého kódu specificky aplikované na vývoj modulu XOOPS.
Základní principy
Sekce “Základní principy”mindmap root((Clean Code)) Readability Meaningful Names Small Functions Comments When Needed Simplicity Single Responsibility DRY Principle KISS Principle Maintainability Consistent Style Error Handling TestingSmysluplná jména
Sekce “Smysluplná jména”Proměnné
Sekce “Proměnné”// Bad$d = new DateTime();$u = $memberHandler->getUser($id);$arr = [];
// Good$createdDate = new DateTime();$currentUser = $memberHandler->getUser($userId);$publishedArticles = [];Funkce
Sekce “Funkce”// 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 { ... }Třídy
Sekce “Třídy”// Badclass Manager { ... }class Helper { ... }class Utils { ... }
// Goodclass ArticleRepository { ... }class NotificationService { ... }class PermissionChecker { ... }Malé funkce
Sekce “Malé funkce”Jediná odpovědnost
Sekce “Jediná odpovědnost”// 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);}Délka funkce
Sekce “Délka funkce”Udržujte funkce krátké – ideálně do 20 řádků:
// 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);}Princip DRY (neopakujte se)
Sekce “Princip DRY (neopakujte se)”Extrahujte společný kód
Sekce “Extrahujte společný kód”// 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);}Zpracování chyb
Sekce “Zpracování chyb”Používejte výjimky správně
Sekce “Používejte výjimky správně”// 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']);Zvládejte chyby elegantně
Sekce “Zvládejte chyby elegantně”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); }}Komentáře
Sekce “Komentáře”Kdy komentovat
Sekce “Kdy komentovat”// 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{ // ...}Organizace kódu
Sekce “Organizace kódu”Struktura třídy
Sekce “Struktura třídy”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 { ... }}Kontrolní seznam čistého kódu
Sekce “Kontrolní seznam čistého kódu”- Jména jsou smysluplná a vyslovitelná
- Funkce dělají pouze jednu věc
- Funkce jsou malé (< 20 řádků)
- Žádný duplicitní kód
- Správné zpracování chyb se specifickými výjimkami
- Komentáře vysvětlují “proč”, nikoli “co”
- Konzistentní formátování a styl
- Žádná magická čísla ani řetězce
- Závislosti jsou vkládány, nikoli vytvářeny
Související dokumentace
Sekce “Související dokumentace”- Organizace kódu
- Zpracování chyb
- Testování osvědčených postupů
- Normy PHP