اصول کد پاک برای 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 = [];// 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