Prinsip Kod Bersih untuk XOOPS
Gambaran KeseluruhanKod bersih ialah kod yang mudah dibaca, difahami dan diselenggara. Panduan ini merangkumi prinsip kod bersih yang digunakan khusus untuk pembangunan modul XOOPS.## Prinsip Teras
Section titled “Gambaran KeseluruhanKod bersih ialah kod yang mudah dibaca, difahami dan diselenggara. Panduan ini merangkumi prinsip kod bersih yang digunakan khusus untuk pembangunan modul XOOPS.## Prinsip Teras”mermaidmindmap root((Clean Code)) Readability Meaningful Names Small Functions Comments When Needed Simplicity Single Responsibility DRY Principle KISS Principle Maintainability Consistent Style Error Handling TestingNama Bermakna### Pembolehubah
Section titled “Nama Bermakna### Pembolehubah”php// Bad$d = new DateTime();$u = $memberHandler->getUser($id);$arr = [];
// Good$createdDate = new DateTime();$currentUser = $memberHandler->getUser($userId);$publishedArticles = [];Fungsi
Section titled “Fungsi”php// 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 { ... }php// Badclass Manager { ... }class Helper { ... }class Utils { ... }
// Goodclass ArticleRepository { ... }class NotificationService { ... }class PermissionChecker { ... }Fungsi Kecil### Tanggungjawab Tunggal
Section titled “Fungsi Kecil### Tanggungjawab Tunggal”php// 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);}Panjang FungsiPastikan fungsi pendek - idealnya di bawah 20 baris:
Section titled “Panjang FungsiPastikan fungsi pendek - idealnya di bawah 20 baris:”php// 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);}Prinsip KERING (Jangan Ulang Sendiri)### Ekstrak Kod Biasa
Section titled “Prinsip KERING (Jangan Ulang Sendiri)### Ekstrak Kod Biasa”php// 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);}Pengendalian Ralat### Gunakan Pengecualian dengan Betul
Section titled “Pengendalian Ralat### Gunakan Pengecualian dengan Betul”php// 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']);Tangani Ralat Dengan Anggun
Section titled “Tangani Ralat Dengan Anggun”phppublic 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); }}Komen### Bila Mengulas
Section titled “Komen### Bila Mengulas”php// 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{ // ...}Organisasi Kod### Struktur Kelas
Section titled “Organisasi Kod### Struktur Kelas”phpclass 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 { ... }}Senarai Semak Kod Bersih- [ ] Nama bermakna dan boleh disebut
Section titled “Senarai Semak Kod Bersih- [ ] Nama bermakna dan boleh disebut”- Fungsi melakukan satu perkara sahaja
- Fungsi adalah kecil (< 20 baris)
- Tiada kod pendua
- Pengendalian ralat yang betul dengan pengecualian khusus
- Komen menerangkan “mengapa”, bukan “apa”
- Pemformatan dan gaya yang konsisten
- Tiada nombor ajaib atau rentetan
- Ketergantungan disuntik, bukan dicipta## Dokumentasi Berkaitan- Organisasi Kod
- Pengendalian Ralat
- Menguji Amalan Terbaik
- Piawaian PHP