XOOPS için Temiz Kod İlkeleri
Genel Bakış
Section titled “Genel Bakış”Temiz kod, okunması, anlaşılması ve bakımı kolay olan koddur. Bu kılavuz, özellikle XOOPS modülü geliştirmede uygulanan temiz kod ilkelerini kapsar.
Temel İlkeler
Section titled “Temel İlkeler”mindmap root((Clean Code)) Readability Meaningful Names Small Functions Comments When Needed Simplicity Single Responsibility DRY Principle KISS Principle Maintainability Consistent Style Error Handling TestingAnlamlı İsimler
Section titled “Anlamlı İsimler”Değişkenler
Section titled “Değişkenler”// Bad$d = new DateTime();$u = $memberHandler->getUser($id);$arr = [];
// Good$createdDate = new DateTime();$currentUser = $memberHandler->getUser($userId);$publishedArticles = [];İşlevler
Section titled “İşlevler”// 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 { ... }Sınıflar
Section titled “Sınıflar”// Badclass Manager { ... }class Helper { ... }class Utils { ... }
// Goodclass ArticleRepository { ... }class NotificationService { ... }class PermissionChecker { ... }Küçük Fonksiyonlar
Section titled “Küçük Fonksiyonlar”Tek Sorumluluk
Section titled “Tek Sorumluluk”// 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);}Fonksiyon Uzunluğu
Section titled “Fonksiyon Uzunluğu”İşlevleri kısa tutun; ideal olarak 20 satırın altında:
// 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 Prensibi (Kendinizi Tekrar Etmeyin)
Section titled “DRY Prensibi (Kendinizi Tekrar Etmeyin)”Ortak Kodu Çıkar
Section titled “Ortak Kodu Çıkar”// 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);}Hata İşleme
Section titled “Hata İşleme”İstisnaları Doğru Şekilde Kullanın
Section titled “İstisnaları Doğru Şekilde Kullanın”// 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']);Hataları İncelikle Ele Alın
Section titled “Hataları İncelikle Ele Alın”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); }}Yorumlar
Section titled “Yorumlar”Ne Zaman Yorum Yapılmalı
Section titled “Ne Zaman Yorum Yapılmalı”// 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{ // ...}Kod Organizasyonu
Section titled “Kod Organizasyonu”Sınıf Yapısı
Section titled “Sınıf Yapısı”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 { ... }}Kod Kontrol Listesini Temizleyin
Section titled “Kod Kontrol Listesini Temizleyin”- İsimler anlamlı ve telaffuz edilebilir
- İşlevler yalnızca tek bir şeyi yapar
- Fonksiyonlar küçüktür (< 20 satır)
- Yinelenen kod yok
- Belirli istisnalar dışında doğru hata yönetimi
- Yorumlar “neyi” değil “neden”i açıklar
- Tutarlı biçimlendirme ve stil
- Sihirli sayı veya dize yok
- Bağımlılıklar oluşturulmaz, enjekte edilir
İlgili Belgeler
Section titled “İlgili Belgeler”- Kod Organizasyonu
- Hata İşleme
- En İyi Uygulamaların Test Edilmesi
- PHP Standartlar