Kural
Bir dosyada bir sınıf.
Tek bir dosyada birden fazla sınıf bulunması, kod
organizasyonunu belirsizleştirir ve kodda gezinmeyi zorlaştırır.
Desteklenen diller: 45+Giriş
Birden fazla sınıfın tek bir dosyaya konulması, kod tabanında gezinirken belirli sınıfları bulmayı zorlaştırır. Arayan geliştiriciler UserRepository öğesini, beş başka sınıfla birlikte şu adlı bir dosyanın içinde gömülü kalmışsa hızlıca bulamaz: database.js adı verilen dosya. Bu durum en az şaşırtma ilkesini (principle of least surprise) ihlal eder ve ekip üyeleri sınıf tanımlarını aramakla vakit kaybettiği için geliştirme sürecini yavaşlatır.
Neden önemli?
Kod sürdürülebilirliği: Dosya başına birden fazla sınıf, sorumluluklar arasında belirsiz sınırlar oluşturur. Bir sınıfın değiştirilmesi gerektiğinde geliştiriciler, ilişkisiz sınıfları içeren bir dosyayı açmak zorunda kalır; bu da Bilişsel yükü ve yanlış kodu kazara değiştirme riskini artırır.
Gezinme ve keşfedilebilirlik: Birden fazla sınıf aynı dosyayı paylaştığında IDE'ler ve metin düzenleyiciler doğru "tanıma git" (go to definition) işlevini sağlamakta zorlanır. Geliştiriciler ihtiyaç duydukları sınıfa doğrudan atlamak yerine dosya içinde arama yaparak zaman harcar. Bu durum, yüzlerce sınıfın bulunduğu büyük kod tabanlarında katlanarak artar.
Sürüm kontrol çakışmaları: Birden fazla sınıf aynı dosyayı paylaştığında, farklı geliştiricilerin farklı sınıflarda yaptığı değişiklikler birleştirme (merge) çakışmalarına yol açar. Ayrı dosyalar, her geliştirici kendi dosyasında çalıştığı için koordinasyon yükü olmadan paralel geliştirmeyi mümkün kılar.
Kod örnekleri
❌ Kural dışı:
// 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ış: Şu isimli tek bir dosyada ilişkisiz üç repository sınıfı database.js. Şunu aramak OrderRepository öğesini bulmak, bunun yerine database.js içinde değil OrderRepository.jsiçinde olduğunu bilmeyi gerektirir. Dosya değişiklikleri birden fazla sınıfı etkileyerek gereksiz birleştirme çakışmaları yaratır.
✅ Kurallara uygun:
// 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;
Neden önemli: Her sınıfın kendi dosyasında olması gezinmeyi öngörülebilir kılar. IDE'ler bir sınıf aranırken doğrudan şuraya atlayabilir: OrderRepository.js . Bir repository'de yapılan değişiklikler diğerlerini etkilemez ve gereksiz birleştirme çakışmalarını ortadan kaldırır.
Sonuç
Öngörülebilir bir gezinme için dosyaları içerdikleri sınıflara göre adlandırın. Bu kural, belirli sınıfları hızlıca bulmanın önemli olduğu büyük kod tabanlarında ölçeklenebilirdir. Ekstra dosyalar, sağladıkları organizasyonel netliğe fazlasıyla değer.

