Nguyên tắc mã sạch cho XOOPS
Tổng quan
Phần tiêu đề “Tổng quan”Mã sạch là mã dễ đọc, dễ hiểu và dễ bảo trì. Hướng dẫn này bao gồm các nguyên tắc mã sạch được áp dụng cụ thể cho việc phát triển mô-đun XOOPS.
Nguyên tắc cốt lõi
Phần tiêu đề “Nguyên tắc cốt lõi”mindmap root((Clean Code)) Readability Meaningful Names Small Functions Comments When Needed Simplicity Single Responsibility DRY Principle KISS Principle Maintainability Consistent Style Error Handling TestingNhững cái tên ý nghĩa
Phần tiêu đề “Những cái tên ý nghĩa”// Bad$d = new DateTime();$u = $memberHandler->getUser($id);$arr = [];
// Good$createdDate = new DateTime();$currentUser = $memberHandler->getUser($userId);$publishedArticles = [];Chức năng
Phần tiêu đề “Chức năng”// 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 { ... }Lớp học
Phần tiêu đề “Lớp học”// Badclass Manager { ... }class Helper { ... }class Utils { ... }
// Goodclass ArticleRepository { ... }class NotificationService { ... }class PermissionChecker { ... }Hàm nhỏ
Phần tiêu đề “Hàm nhỏ”Trách nhiệm duy nhất
Phần tiêu đề “Trách nhiệm duy nhất”// 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ài hàm
Phần tiêu đề “Độ dài hàm”Giữ các chức năng ngắn gọn - lý tưởng là dưới 20 dòng:
// 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);}Nguyên tắc KHÔ (Đừng lặp lại chính mình)
Phần tiêu đề “Nguyên tắc KHÔ (Đừng lặp lại chính mình)”Trích xuất mã chung
Phần tiêu đề “Trích xuất mã chung”// 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);}Xử lý lỗi
Phần tiêu đề “Xử lý lỗi”Sử dụng ngoại lệ đúng cách
Phần tiêu đề “Sử dụng ngoại lệ đúng cách”// 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']);Xử lý lỗi một cách khéo léo
Phần tiêu đề “Xử lý lỗi một cách khéo léo”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); }}Bình luận
Phần tiêu đề “Bình luận”Thời điểm bình luận
Phần tiêu đề “Thời điểm bình luận”// 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{ // ...}Tổ chức mã
Phần tiêu đề “Tổ chức mã”Cấu trúc lớp
Phần tiêu đề “Cấu trúc lớp”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 { ... }}Danh sách kiểm tra mã sạch
Phần tiêu đề “Danh sách kiểm tra mã sạch”- Tên có ý nghĩa và dễ phát âm
- [] Hàm chỉ làm một việc
- Hàm nhỏ (< 20 dòng)
- [] Không có mã trùng lặp
- Xử lý lỗi phù hợp với các trường hợp ngoại lệ cụ thể
- Bình luận giải thích “tại sao” chứ không phải “cái gì”
- Định dạng và phong cách nhất quán
- [] Không có số hoặc chuỗi ma thuật
- [] Các phụ thuộc được chèn vào, không được tạo
Tài liệu liên quan
Phần tiêu đề “Tài liệu liên quan”- Mã tổ chức
- Xử lý lỗi
- Thử nghiệm các phương pháp hay nhất
- Tiêu chuẩn PHP