Načela čistog koda za XOOPS
Pregled
Section titled “Pregled”Čist kod je kod koji je jednostavan za čitanje, razumijevanje i održavanje. Ovaj vodič pokriva načela čistog koda posebno primijenjena na razvoj modula XOOPS.
Temeljna načela
Section titled “Temeljna načela”mindmap root((Clean Code)) Readability Meaningful Names Small Functions Comments When Needed Simplicity Single Responsibility DRY Principle KISS Principle Maintainability Consistent Style Error Handling TestingImena koja imaju smisla
Section titled “Imena koja imaju smisla”Varijable
Section titled “Varijable”// Bad$d = new DateTime();$u = $memberHandler->getUser($id);$arr = [];
// Good$createdDate = new DateTime();$currentUser = $memberHandler->getUser($userId);$publishedArticles = [];Funkcije
Section titled “Funkcije”// 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 { ... }Nastava
Section titled “Nastava”// Badclass Manager { ... }class Helper { ... }class Utils { ... }
// Goodclass ArticleRepository { ... }class NotificationService { ... }class PermissionChecker { ... }Male funkcije
Section titled “Male funkcije”Jedna odgovornost
Section titled “Jedna odgovornost”// 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);}Duljina funkcije
Section titled “Duljina funkcije”Neka funkcije budu kratke - idealno ispod 20 redaka:
// 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);}SUHO načelo (nemojte se ponavljati)
Section titled “SUHO načelo (nemojte se ponavljati)”Ekstrakt zajedničkog koda
Section titled “Ekstrakt zajedničkog koda”// 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);}Rješavanje grešaka
Section titled “Rješavanje grešaka”Koristite iznimke ispravno
Section titled “Koristite iznimke ispravno”// 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']);Postupajte s pogreškama elegantno
Section titled “Postupajte s pogreškama elegantno”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); }}Komentari
Section titled “Komentari”Kada komentirati
Section titled “Kada komentirati”// 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{ // ...}Organizacija koda
Section titled “Organizacija koda”Struktura klase
Section titled “Struktura klase”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 { ... }}Kontrolni popis čistog koda
Section titled “Kontrolni popis čistog koda”- Imena su smislena i izgovorljiva
- Funkcije rade samo jednu stvar
- Funkcije su male (< 20 redaka)
- Nema dupliciranog koda
- Ispravno rukovanje pogreškama uz posebne iznimke
- Komentari objašnjavaju “zašto”, a ne “što”
- Dosljedno oblikovanje i stil
- Nema čarobnih brojeva ili nizova
- Ovisnosti se ubacuju, a ne stvaraju
Povezana dokumentacija
Section titled “Povezana dokumentacija”- Organizacija koda
- Rješavanje grešaka
- Testiranje najboljih praksi
- Standardi PHP