مبادئ الكود النظيف لـ XOOPS
نظرة عامة
Section titled “نظرة عامة”الكود النظيف هو كود يسهل قراءته وفهمه وصيانته. يغطي هذا الدليل مبادئ الكود النظيف المطبقة بشكل خاص على تطوير وحدة XOOPS.
المبادئ الأساسية
Section titled “المبادئ الأساسية”mindmap root((الكود النظيف)) القابلية للقراءة أسماء ذات مغزى وظائف صغيرة التعليقات عند الحاجة البساطة مسؤولية واحدة مبدأ DRY مبدأ KISS قابلية الصيانة أسلوب متسق معالجة الخطأ الاختبارأسماء ذات مغزى
Section titled “أسماء ذات مغزى”المتغيرات
Section titled “المتغيرات”// سيء$d = new DateTime();$u = $memberHandler->getUser($id);$arr = [];
// جيد$createdDate = new DateTime();$currentUser = $memberHandler->getUser($userId);$publishedArticles = [];الدوال
Section titled “الدوال”// سيءfunction process($data) { ... }function handle($item) { ... }function doStuff($x, $y) { ... }
// جيدfunction publishArticle(Article $article): void { ... }function calculateTotalPrice(array $items): float { ... }function sendNotificationEmail(User $user, string $subject): bool { ... }الفئات
Section titled “الفئات”// سيءclass Manager { ... }class Helper { ... }class Utils { ... }
// جيدclass ArticleRepository { ... }class NotificationService { ... }class PermissionChecker { ... }وظائف صغيرة
Section titled “وظائف صغيرة”مسؤولية واحدة
Section titled “مسؤولية واحدة”// سيء - يفعل أشياء كثيرة جداًfunction processArticle($data) { // تحقق if (empty($data['title'])) { throw new Exception('العنوان مطلوب'); } // احفظ $article = new Article(); $article->setTitle($data['title']); $this->repository->save($article); // أخبر $this->mailer->send($article->getAuthor(), 'تم نشر المقال'); // سجل $this->logger->info('تم إنشاء المقال'); return $article;}
// جيد - كل دالة تفعل شيء واحدfunction validateArticleData(array $data): void{ if (empty($data['title'])) { throw new ValidationException('العنوان مطلوب'); }}
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 سطراً:
// جيد - دالة مركزةpublic 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 “استخرج الكود المشترك”// سيء - كود مكررfunction 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);}
// جيد - منطق مشترك مستخرجfunction 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 “استخدم الاستثناءات بشكل صحيح”// سيء - استثناءات عامةthrow new Exception('خطأ');
// جيد - استثناءات محددةthrow new ArticleNotFoundException($articleId);throw new PermissionDeniedException('لا يمكنك تعديل المقال');throw new ValidationException(['title' => 'العنوان مطلوب']);معالجة الأخطاء بأناقة
Section titled “معالجة الأخطاء بأناقة”public function findArticle(string $id): ?Article{ try { return $this->repository->findById($id); } catch (DatabaseException $e) { $this->logger->error('خطأ قاعدة بيانات البحث عن المقال', [ 'id' => $id, 'error' => $e->getMessage() ]); throw new ServiceException('لا يمكن استرجاع المقال', 0, $e); }}التعليقات
Section titled “التعليقات”متى تعلق
Section titled “متى تعلق”// سيء - تعليق واضح// زيادة العداد$counter++;
// جيد - يشرح السبب وليس ماذا// الذاكرة المؤقتة لمدة ساعة واحدة لتقليل حمل قاعدة البيانات أثناء ذروة الحركة$cache->set($key, $data, 3600);
// جيد - يوثق الخوارزمية المعقدة/** * حساب درجة صلة المقال باستخدام خوارزمية TF-IDF. * الدرجات الأعلى تشير إلى تطابق أفضل مع شروط البحث. */function calculateRelevanceScore(Article $article, array $terms): float{ // ...}تنظيم الكود
Section titled “تنظيم الكود”هيكل الفئة
Section titled “هيكل الفئة”class ArticleService{ // 1. الثوابت private const MAX_TITLE_LENGTH = 255;
// 2. الخصائص private ArticleRepository $repository; private EventDispatcher $events;
// 3. المنشئ public function __construct( ArticleRepository $repository, EventDispatcher $events ) { $this->repository = $repository; $this->events = $events; }
// 4. الطرق العامة public function publish(Article $article): void { ... } public function archive(Article $article): void { ... }
// 5. الطرق الخاصة private function validateForPublication(Article $article): void { ... }}قائمة التحقق من الكود النظيف
Section titled “قائمة التحقق من الكود النظيف”- الأسماء ذات معنى وقابلة للنطق
- الدوال تفعل شيء واحد فقط
- الدوال صغيرة (< 20 سطراً)
- لا يوجد كود مكرر
- معالجة خطأ صحيحة مع استثناءات محددة
- التعليقات تشرح “لماذا” وليس “ماذا”
- التنسيق والأسلوب متسق
- لا توجد أرقام أو سلاسل نص سحرية
- الاعتماديات مُحقونة وليست مُنشأة
الوثائق ذات الصلة
Section titled “الوثائق ذات الصلة”- Code Organization
- Error Handling
- Testing Best Practices
- PHP Standards