Prinsip Kode Bersih untuk XOOPS
Ikhtisar
Section titled “Ikhtisar”Kode bersih adalah kode yang mudah dibaca, dipahami, dan dipelihara. Panduan ini mencakup prinsip kode bersih yang khusus diterapkan pada pengembangan module XOOPS.
Prinsip core
Section titled “Prinsip core”mindmap root((Clean Code)) Readability Meaningful Names Small Functions Comments When Needed Simplicity Single Responsibility DRY Principle KISS Principle Maintainability Consistent Style Error Handling TestingNama yang Bermakna
Section titled “Nama yang Bermakna”Variabel
Section titled “Variabel”// Bad$d = new DateTime();$u = $memberHandler->getUser($id);$arr = [];
// Good$createdDate = new DateTime();$currentUser = $memberHandler->getUser($userId);$publishedArticles = [];Fungsi
Section titled “Fungsi”// 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 { ... }// Badclass Manager { ... }class Helper { ... }class Utils { ... }
// Goodclass ArticleRepository { ... }class NotificationService { ... }class PermissionChecker { ... }Fungsi Kecil
Section titled “Fungsi Kecil”Tanggung Jawab Tunggal
Section titled “Tanggung Jawab Tunggal”// 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 Fungsi
Section titled “Panjang Fungsi”Jaga agar fungsinya tetap singkat - idealnya di bawah 20 baris:
// 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 Ulangi Sendiri)
Section titled “Prinsip KERING (Jangan Ulangi Sendiri)”Ekstrak Kode Umum
Section titled “Ekstrak Kode Umum”// 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);}Penanganan Kesalahan
Section titled “Penanganan Kesalahan”Gunakan Pengecualian dengan Benar
Section titled “Gunakan Pengecualian dengan Benar”// 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 Kesalahan dengan Baik
Section titled “Tangani Kesalahan dengan Baik”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); }}Komentar
Section titled “Komentar”Kapan Harus Berkomentar
Section titled “Kapan Harus Berkomentar”// 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 Kode
Section titled “Organisasi Kode”Struktur Kelas
Section titled “Struktur Kelas”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 { ... }}Daftar Periksa Kode Bersih
Section titled “Daftar Periksa Kode Bersih”- Nama bermakna dan dapat diucapkan
- Fungsi hanya melakukan satu hal
- Fungsinya kecil (< 20 baris)
- Tidak ada kode duplikat
- Penanganan kesalahan yang tepat dengan pengecualian tertentu
- Komentar menjelaskan “mengapa”, bukan “apa”
- Format dan gaya yang konsisten
- Tidak ada angka atau string ajaib
- Dependensi dimasukkan, bukan dibuat
Dokumentasi Terkait
Section titled “Dokumentasi Terkait”- Organisasi Kode
- Penanganan Kesalahan
- Menguji Praktik Terbaik
- Standar PHP