עקרונות קוד נקי עבור XOOPS
סקירה כללית
Section titled “סקירה כללית”קוד נקי הוא קוד שקל לקרוא, להבין ולתחזק. מדריך זה מכסה עקרונות קוד נקי שיושמו במיוחד לפיתוח מודול XOOPS.
עקרונות ליבה
Section titled “עקרונות ליבה”mindmap root((Clean Code)) Readability Meaningful Names Small Functions Comments When Needed Simplicity Single Responsibility DRY Principle KISS Principle Maintainability Consistent Style Error Handling Testingשמות בעלי משמעות
Section titled “שמות בעלי משמעות”משתנים
Section titled “משתנים”// Bad$d = new DateTime();$u = $memberHandler->getUser($id);$arr = [];
// Good$createdDate = new DateTime();$currentUser = $memberHandler->getUser($userId);$publishedArticles = [];פונקציות
Section titled “פונקציות”// 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 { ... }שיעורים
Section titled “שיעורים”// Badclass Manager { ... }class Helper { ... }class Utils { ... }
// Goodclass ArticleRepository { ... }class NotificationService { ... }class PermissionChecker { ... }פונקציות קטנות
Section titled “פונקציות קטנות”אחריות יחידה
Section titled “אחריות יחידה”// 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);}אורך הפונקציה
Section titled “אורך הפונקציה”שמור על פונקציות קצרות - באופן אידיאלי מתחת ל-20 שורות:
// 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 עקרון (אל תחזור על עצמך)
Section titled “DRY עקרון (אל תחזור על עצמך)”חלץ קוד נפוץ
Section titled “חלץ קוד נפוץ”// 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);}טיפול בשגיאות
Section titled “טיפול בשגיאות”השתמש בחריגים כראוי
Section titled “השתמש בחריגים כראוי”// 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']);טפל בשגיאות בחן
Section titled “טפל בשגיאות בחן”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); }}מתי להגיב
Section titled “מתי להגיב”// 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{ // ...}ארגון קוד
Section titled “ארגון קוד”מבנה כיתה
Section titled “מבנה כיתה”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 { ... }}רשימת קוד נקייה
Section titled “רשימת קוד נקייה”- שמות הם בעלי משמעות וניתנים להגייה
- פונקציות עושות דבר אחד בלבד
- הפונקציות קטנות (< 20 שורות)
- אין קוד משוכפל
- טיפול נכון בשגיאות עם חריגים ספציפיים
- הערות מסבירות “למה”, לא “מה”
- עיצוב וסגנון עקביים
- ללא מספרי קסם או מחרוזות
- תלויות מוזרקות, לא נוצרות
תיעוד קשור
Section titled “תיעוד קשור”- ארגון קוד
- טיפול בשגיאות
- בדיקת שיטות עבודה מומלצות
- PHP תקנים