Tek Sorumluluk İlkesi
("her sınıfın yalnızca tek bir sorumluluğu olmalı; başka bir deyişle, her sınıfın değişmesi için tek ve tek neden olması gerekir")
Katılmıyorum. Ben düşünüyorum yöntem değiştirmek için tek bir neden olmalı ve bir sınıftaki tüm yöntemler bir olmalı bire başka mantıklı bir ilişki , ancak sınıf kendisi aslında belki yapmak birkaç (ilgili) şeyler.
Tecrübelerime göre, bu prensip çok fazla aşırı gayretle uygulanmakta ve pek çok minik tek yöntem sınıfıyla son buluyorsunuz. Çalıştığım çevik dükkanlar da bunu yaptı.
.Net API'sinin yaratıcılarının bu tür bir zihniyete sahip olup olmadığını düşünün: List.Sort (), List.Reverse (), List.Find () vs. yerine ListSorter, ListReverser ve ListSearcher sınıflarına sahibiz!
Artık SRP'ye (ki teoride kendisi fena değil) karşı tartışmak yerine , uzun soluklu anekdot deneyimlerimin bir kısmını paylaşacağım:
Çalıştığım bir yerde , beş sınıftan oluşan çok basit bir maksimum akış çözücü yazdım : bir düğüm, bir grafik, bir grafik oluşturucu, bir grafik çözücü ve bir grafik çözücüyü kullanmak için bir grafik gerçek dünya problemi. Hiçbiri özellikle karmaşık ya da uzundu (çözücü en fazla ~ 150 çizgide en uzundu). Bununla birlikte, sınıfların çok fazla “sorumluluğu” olduğuna karar verildi, bu nedenle iş arkadaşlarım kodu yeniden düzenlemeye başladılar. Tamamlandığında, 5 sınıfım, toplam kod satırı orijinalleri üç kattan fazla olan 25 sınıfa genişletildi. Kodun akışı artık açık değildi ve yeni birim testlerinin amacı değildi; Şimdi kendi kodumun ne yaptığını bulmakta zorlandım.
Aynı yerde, hemen hemen her sınıfın sadece tek bir metodu vardı (sadece "sorumluluğu"). Programın içindeki akışı takip etmek neredeyse imkansızdı ve çoğu birim testi , her ikisinin de amacı benim için aynı derecede gizemli olan bu sınıfın başka bir sınıftan kod dediğini test etmekten ibaretti . Kelimenin tam anlamıyla, sadece düzinelerce (IMO) olması gereken yüzlerce sınıf vardı. Her sınıf yalnızca bir "şey" yaptı , ancak "AdminUserCreationAttemptorFactory" gibi adlandırma kuralları olsa bile sınıflar arasındaki ilişkiyi söylemek zordu.
Başka bir yerde (aynı zamanda yalnızca tek bir yöntem zihniyetine sahip olması gereken sınıfları da vardı ), belirli bir operasyon sırasında zamanın% 95'ini kaplayan bir yöntemi optimize etmeye çalışıyorduk. (Aptalca) biraz optimize ettikten sonra, neden dikkatimi bir bajilyon defau olarak adlandırıldığına yönelttim. Bir sınıftaki bir döngüde çağrılıyordu ... onun yöntemi başka bir sınıftaki bir döngüde çağrılıyordu ... ki bu da bir döngüde çağrılıyordu.
Hepsi söylendi, 13 sınıfa yayılmış beş düzey döngü vardı (ciddi olarak). Bir sınıfın gerçekte ne yaptığını sadece bakarak bakarak belirlemek imkansızdı - hangi metodun ne dendiğini ve bu metotların hangi metotların adlandırıldığını vb. Hepsi tek bir yöntemde toplanmış olsaydı, sorunlu yöntemimiz hemen anlaşılan beş döngü seviyesinin içine yerleştirilmiş ancak 70 satır uzunluğunda olurdu.
Bu 13 sınıfı bir sınıfa yeniden ateşleme isteğim reddedildi.