Tiszta kód alapelvei az XOOPS-hoz
Áttekintés
Szekció neve “Áttekintés”A tiszta kód könnyen olvasható, érthető és karbantartható kód. Ez az útmutató a kifejezetten a XOOPS modulfejlesztésre alkalmazott tiszta kód elveit ismerteti.
Alapelvek
Szekció neve “Alapelvek”mindmap root((Clean Code)) Readability Meaningful Names Small Functions Comments When Needed Simplicity Single Responsibility DRY Principle KISS Principle Maintainability Consistent Style Error Handling TestingJelentős nevek
Szekció neve “Jelentős nevek”Változók
Szekció neve “Változók”// Bad$d = new DateTime();$u = $memberHandler->getUser($id);$arr = [];
// Good$createdDate = new DateTime();$currentUser = $memberHandler->getUser($userId);$publishedArticles = [];Funkciók
Szekció neve “Funkciók”// 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 { ... }Osztályok
Szekció neve “Osztályok”// Badclass Manager { ... }class Helper { ... }class Utils { ... }
// Goodclass ArticleRepository { ... }class NotificationService { ... }class PermissionChecker { ... }Kis funkciók
Szekció neve “Kis funkciók”Egyedülálló felelősség
Szekció neve “Egyedülálló felelősség”// 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);}Funkció hossza
Szekció neve “Funkció hossza”A függvények legyenek rövidek – ideális esetben 20 sor alatt:
// 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 alapelv (ne ismételd magad)
Szekció neve “DRY alapelv (ne ismételd magad)”A közös kód kibontása
Szekció neve “A közös kód kibontása”// 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);}Hibakezelés
Szekció neve “Hibakezelés”Használja megfelelően a kivételeket
Szekció neve “Használja megfelelően a kivételeket”// 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']);Kezelje a hibákat kecsesen
Szekció neve “Kezelje a hibákat kecsesen”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); }}Megjegyzések
Szekció neve “Megjegyzések”Mikor érdemes kommentálni
Szekció neve “Mikor érdemes kommentálni”// 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{ // ...}Kódszervezet
Szekció neve “Kódszervezet”Osztálystruktúra
Szekció neve “Osztálystruktúra”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 { ... }}Tiszta kód ellenőrzőlista
Szekció neve “Tiszta kód ellenőrzőlista”- A nevek értelmesek és kiejthetők
- A függvények csak egy dolgot hajtanak végre
- A függvények kicsik (< 20 sor)
- Nincs duplikált kód
- Megfelelő hibakezelés bizonyos kivételekkel
- A megjegyzések a “miért” magyarázatot magyarázzák, nem a “mit”
- Következetes formázás és stílus
- Nincsenek mágikus számok vagy karakterláncok
- A függőségeket a rendszer beinjektálja, nem hozza létre
Kapcsolódó dokumentáció
Szekció neve “Kapcsolódó dokumentáció”- Code Organization
- Hibakezelés
- A legjobb gyakorlatok tesztelése
- PHP szabványok