Aikido

Neden her dosya için tek bir sınıf kullanmalısınız: kod düzenini ve gezinmeyi iyileştirme

Okunabilirlik

Kural

Bir sınıf dosya dosya.
Birden fazla sınıf içinde bir tek dosyada yap kod
düzen belirsiz ve zorlaştırır navigasyon yönlendirilmesi.

Desteklenen diller: 45+

Giriş

Birden fazla sınıfı tek bir dosyaya yerleştirmek, kod tabanında gezinirken belirli sınıfları bulmayı zorlaştırır. Arayan geliştiriciler Kullanıcı Deposu eğer şu adlı bir dosyanın içinde saklıysa, onu çabucak bulamazsınız database.js diğer beş sınıfla birlikte. Bu durum, “en az sürpriz” ilkesini ihlal eder ve ekip üyeleri sınıf tanımlarını aramakla zaman kaybettikleri için geliştirme sürecini yavaşlatır.

Neden önemli?

Kod bakım kolaylığı: Bir dosyada birden fazla sınıf bulunması, sorumluluklar arasında belirsiz sınırlar yaratır. Bir sınıfta değişiklik yapılması gerektiğinde, geliştiriciler konuyla ilgisi olmayan sınıfların da bulunduğu bir dosyayı açmak zorunda kalır; bu da bilişsel yükü artırır ve yanlışlıkla yanlış kodu değiştirme riskini yükseltir.

Gezinme ve bulunabilirlik: Birden fazla sınıfın aynı dosyayı paylaştığı durumlarda, IDE’ler ve metin editörleri doğru bir “tanıma git” işlevi sunmakta zorlanır. Geliştiriciler, ihtiyaç duydukları sınıfa doğrudan atlamak yerine dosyaların içinde arama yapmakla zaman harcarlar. Bu durum, yüzlerce sınıf içeren büyük kod tabanlarında daha da belirgin hale gelir.

Sürüm kontrolü çakışmaları: Birden fazla sınıf aynı dosyayı paylaştığında, farklı geliştiriciler tarafından farklı sınıflarda yapılan değişiklikler birleştirme çakışmalarına yol açar. Ayrı dosyalar, her geliştiricinin kendi dosyasında çalışması sayesinde koordinasyon yükü olmaksızın paralel geliştirmeye olanak tanır.

Kod örnekleri

❌ Uygun değil:

// database.js
class UserRepository {
    async findById(id) {
        return db.users.findOne({ id });
    }
}

class OrderRepository {
    async findByUser(userId) {
        return db.orders.find({ userId });
    }
}

class ProductRepository {
    async findInStock() {
        return db.products.find({ stock: { $gt: 0 } });
    }
}

module.exports = { UserRepository, OrderRepository, ProductRepository };

Neden yanlış: Adı olan tek bir dosyada bulunan birbiriyle ilişkisi olmayan üç depo sınıfı database.js. Arama Sipariş Deposu bunun içinde olduğunu bilmek gerekir database.js yerine OrderRepository.js. Dosyadaki değişiklikler birden fazla sınıfı etkiliyor ve bu da gereksiz birleştirme çakışmalarına yol açıyor.

✅ Uygunluk:

// UserRepository.js
class UserRepository {
    async findById(id) {
        return db.users.findOne({ id });
    }
}
module.exports = UserRepository;

// OrderRepository.js
class OrderRepository {
    async findByUser(userId) {
        return db.orders.find({ userId });
    }
}
module.exports = OrderRepository;

// ProductRepository.js
class ProductRepository {
    async findInStock() {
        return db.products.find({ stock: { $gt: 0 } });
    }
}
module.exports = ProductRepository;

Bunun önemi: Her sınıfın kendi dosyasında yer alması, gezinmeyi öngörülebilir hale getirir. IDE’ler doğrudan şuraya atlayabilir: OrderRepository.js sınıf aranırken. Bir depoda yapılan değişiklikler diğerlerini etkilemez; bu sayede gereksiz birleştirme çakışmaları ortadan kalkar.

Sonuç

Öngörülebilir gezinme için dosyaları, içerdikleri sınıfa göre adlandırın. Bu kural, belirli sınıfları hızlı bir şekilde bulmanın önemli olduğu büyük kod tabanlarında da geçerlidir. Ekstra dosyalar, sağladıkları düzen ve netlik açısından buna değer.

Sık Sorulan Sorular

Sorularınız mı var?

Peki ya küçük yardımcı sınıflar ya da özel sınıflar?

Yalnızca bir üst sınıf tarafından kullanılan küçük yardımcı sınıflar, gerçekten uygulama ayrıntıları niteliğindeyse aynı dosyada kalabilir. Ancak, yardımcı sınıflar yeniden kullanılıyorsa veya 20-30 satırı aşıyorsa, bunları ayrı bir dosyaya ayırın. Yalnızca bir genel sınıfı desteklemek amacıyla var olan özel sınıflar, makul istisnalar olarak kabul edilebilir.

Bu, TypeScript arayüzleri ve türleri için de geçerli mi?

Bir sınıfın kullandığı türler ve arayüzler aynı dosyada yer alabilir. Ancak, birden fazla dosyada ortak olarak kullanılan türler, kendi tür tanım dosyalarında yer almalıdır. Burada önemli olan nokta, tanımın yalnızca o dosya tarafından mı kullanıldığı, yoksa başka yerlerde de gerekli olup olmadığıdır.

Peki ya standart uygulamada birden fazla sınıf içeren Python gibi diller ne olacak?

Python'daki uygulamalar farklılık gösterse de ilke yine de geçerlidir: Birbiriyle ilişkili sınıflar, uyumlu bir modül oluşturuyorsa bunları bir araya getirin; ancak birbiriyle ilgisi olmayan sınıfları karıştırmaktan kaçının. User ve UserProfile sınıflarını içeren bir models.py dosyası mantıklıdır. Yirmi adet birbiriyle ilgisi olmayan sınıfı barındıran bir utils.py dosyası ise mantıklı değildir.

Ana sınıf ve alt sınıf gibi birbiriyle ilişkili sınıfları nasıl düzenleyebilirim?

Bunları aynı dizin içinde ayrı dosyalara yerleştirin. Animal ve Dog için animals/Animal.js ve animals/Dog.js dosyalarını kullanın. Dizin yapısı, her dosya için tek bir sınıf ilkesini korurken sınıflar arasındaki ilişkileri de gösterir. Bu yaklaşım, ilgili sınıfları tek bir dosyada bir araya getirmekten daha iyi ölçeklenebilirlik sağlar.

Ya sınıfları ayıklamak sonucunda çok sayıda küçük dosya oluşursa?

Birkaç büyük dosyaya kıyasla çok sayıda küçük dosya tercih edilir. Modern entegre geliştirme ortamları (IDE’ler) binlerce dosyayı verimli bir şekilde yönetir. Dosya sisteminde gezinmek, büyük dosyaların içinde arama yapmaktan daha hızlıdır. Her sınıfın tam olarak nerede bulunduğunu bilmenin sağladığı netlik, “çok fazla dosya” algısından daha ağır basar.

Şimdi güvenliğinizi sağlayın

Kodunuzu, bulutunuzu ve çalışma zamanınızı tek bir merkezi sistemde güvenceye alın.
Güvenlik açıklarını otomatik olarak hızla bulun ve düzeltin.

Kredi kartı gerekmez | Tarama sonuçları 32 saniyede.