Zasady czystego kodu dla XOOPS
Przegląd
Dział zatytułowany „Przegląd”Czysty kod to kod, który jest łatwy do czytania, zrozumienia i utrzymania. Ten przewodnik obejmuje zasady czystego kodu stosowane konkretnie do rozwoju modułów XOOPS.
Zasady podstawowe
Dział zatytułowany „Zasady podstawowe”mindmap root((Clean Code)) Readability Meaningful Names Small Functions Comments When Needed Simplicity Single Responsibility DRY Principle KISS Principle Maintainability Consistent Style Error Handling TestingZnaczące nazwy
Dział zatytułowany „Znaczące nazwy”Zmienne
Dział zatytułowany „Zmienne”// Bad$d = new DateTime();$u = $memberHandler->getUser($id);$arr = [];
// Good$createdDate = new DateTime();$currentUser = $memberHandler->getUser($userId);$publishedArticles = [];Funkcje
Dział zatytułowany „Funkcje”// 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 { ... }// Badclass Manager { ... }class Helper { ... }class Utils { ... }
// Goodclass ArticleRepository { ... }class NotificationService { ... }class PermissionChecker { ... }Małe funkcje
Dział zatytułowany „Małe funkcje”Pojedyncza odpowiedzialność
Dział zatytułowany „Pojedyncza odpowiedzialność”// 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ługość funkcji
Dział zatytułowany „Długość funkcji”Trzymaj funkcje krótko - idealnie poniżej 20 linii:
// 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);}Zasada DRY (Don’t Repeat Yourself)
Dział zatytułowany „Zasada DRY (Don’t Repeat Yourself)”Wyodrębniaj wspólny kod
Dział zatytułowany „Wyodrębniaj wspólny kod”// 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);}Obsługa błędów
Dział zatytułowany „Obsługa błędów”Używaj wyjątków prawidłowo
Dział zatytułowany „Używaj wyjątków prawidłowo”// 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']);Obsługuj błędy gracefully
Dział zatytułowany „Obsługuj błędy gracefully”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); }}Komentarze
Dział zatytułowany „Komentarze”Kiedy komentować
Dział zatytułowany „Kiedy komentować”// 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{ // ...}Organizacja kodu
Dział zatytułowany „Organizacja kodu”Struktura klasy
Dział zatytułowany „Struktura klasy”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 { ... }}Lista kontrolna czystego kodu
Dział zatytułowany „Lista kontrolna czystego kodu”- Nazwy są znaczące i wymawiane
- Funkcje robią jedną rzecz
- Funkcje są małe (< 20 linii)
- Brak zduplikowanego kodu
- Właściwa obsługa błędów z konkretnymi wyjątkami
- Komentarze wyjaśniają “dlaczego”, a nie “co”
- Konsystentne formatowanie i styl
- Brak magicznych liczb ani łańcuchów
- Zależności są wstrzykiwane, nie tworzone
Powiązana dokumentacja
Dział zatytułowany „Powiązana dokumentacja”- Organizacja kodu
- Obsługa błędów
- Najlepsze praktyki testowania
- Standardy PHP