Soru yanlış bir ikilem sunuyor. YAGNI prensibinin doğru uygulanması ilgisiz bir şey değildir. İyi tasarımın bir yönü . SOLID ilkelerinin her biri aynı zamanda iyi tasarım unsurlarıdır. Her prensibi herhangi bir disiplinde her zaman tam olarak uygulayamazsınız. Gerçek dünyadaki problemler kodunuza çok fazla kuvvet uygular ve bunlardan bazıları zıt yönlere zorlar. Tasarım ilkeleri bütün bunları hesaba katmak zorundadır, ancak hiçbir koşulda bütün durumlar için uygun bir prensip yoktur.
Şimdi, her bir ilkeye, bazen farklı yönlere yönelebildikleri halde, hiçbir şekilde içsel olarak çatışmaya girmeyecekleri anlayışı ile bir göz atalım.
YAGNI, geliştiricilerin belirli bir yeniden işleme türünden kaçınmasına yardımcı olmak için tasarlandı: ki bu yanlış olanı yapmaktan geliyor. Bunu, gelecekte neyin değişeceğini ya da neye ihtiyaç duyulacağını düşündüğümüz hakkındaki tahminlere dayanarak, kararların çok erken alınmamasını sağlayarak bize yol göstererek yapar. Toplu tecrübe bize bunu yaptığımızda genelde yanlış olduğumuzu söyler. Örneğin, YAGNI size şu anda birden fazla uygulayıcıya ihtiyaç duymadığınızı bilmiyorsanız , yeniden kullanılabilirlik amacıyla bir arayüz oluşturmamanızı söyleyecektir . Benzer şekilde, YAGNI, şu anda birden fazla ekrana sahip olacağınızı bilmiyorsanız, bir uygulamadaki tek formu yönetmek için bir "Ekran Yöneticisi" oluşturmadığını söyler .
Birçok kişi sandığının aksine, KATI olduğu değil kullanırlılık, genericity, hatta soyutlama hakkında. SOLID, belirli bir değişikliğin ne olabileceği hakkında hiçbir şey söylemeden, değişime hazır kod yazmanıza yardımcı olmak için tasarlanmıştır . SOLID'in beş prensibi, aşırı jenerik olmadan esnek ve saf olmadan basit olan kod oluşturma stratejisi oluşturur. SOLID kodunun doğru uygulanması, iyi tanımlanmış rol ve sınırlara sahip küçük, odaklanmış sınıflar oluşturur. Pratik sonuç, ihtiyaç duyulan herhangi bir değişiklik için asgari sayıda sınıfa dokunulması gerektiğidir. Benzer şekilde, herhangi bir kod değişikliği için, diğer sınıflara indirgenmiş bir miktar "dalgalanma" vardır.
Sahip olduğunuz örnek duruma baktığımızda, YAGNI ve SOLID'in ne söyleyebileceğini görelim. Tüm depoların dışardan aynı görünmesi nedeniyle ortak bir depo arayüzü düşünmektesiniz. Ancak ortak, genel bir ara yüzün değeri, uygulayıcılardan herhangi birini, özellikle hangisinin olduğunu bilmeye gerek kalmadan kullanma yeteneğidir. Uygulamanızda bunun gerekli veya yararlı olacağı bir yer olmadığı sürece, YAGNI yapmaz diyor.
Bakılacak 5 KATI ilke var. S, Tek Sorumluluktur. Bu arayüzle ilgili hiçbir şey söylemez, ancak somut sınıflarınız hakkında bir şeyler söyleyebilir. Veri erişiminin kendisinin en iyi şekilde bir veya daha fazla sınıfın sorumluluğunun üstlenebileceği, depoların sorumluluğunun örtük bir bağlamdan (CustomerRepository, Müşteri varlıkları için dolaylı olarak bir depo olduğu) açık çağrılara çevrilmesidir. Müşteri varlık türünü belirten genelleştirilmiş veri erişim API'si.
O Açık-Kapalı. Bu çoğunlukla miras ile ilgilidir. Eğer depolarınızı ortak işlevsellik uygulayan ortak bir tabandan türetmeye çalışıyorsanız ya da farklı depolardan daha fazla türetmeyi düşünüyorsanız, bu geçerli olacaktır. Ama sen değilsin, öyle değil.
L, Liskov Değiştirilebilirliktir. Bu, depoları ortak havuz arayüzü üzerinden kullanmayı amaçladıysanız geçerlidir. Tutarlılığı sağlamak ve farklı uygulayıcılar için özel işlemlerden kaçınmak için arayüze ve uygulamalara kısıtlamalar getirmektedir. Bunun nedeni, bu tür özel işlemlerin bir arayüzün amacını baltalamasıdır. Bu prensibi göz önünde bulundurmak faydalı olabilir, çünkü ortak depo arabirimini kullanmaktan sizi uyarabilir. Bu YAGNI'nin rehberliği ile çakışıyor.
Ben Arabirim Ayrımıyım. Bu, depolarınıza farklı sorgu işlemleri eklemeye başlarsanız geçerli olabilir. Arabirim ayrımı, bir sınıfın üyelerini belirli tüketiciler tarafından diğeri diğerlerinin kullanacağı iki alt gruba ayırabileceğiniz, ancak hiçbir tüketicinin her iki alt grubu kullanmayacağı durumlarda geçerlidir. Kılavuz, ortak bir taneden ziyade iki ayrı arayüz oluşturmaktır. Sizin durumunuzda, münferit örnekleri alma ve kaydetmenin, genel sorgulama yapan aynı kod tarafından tüketilmesi muhtemel değildir, bu yüzden bunları iki arayüze ayırmak faydalı olabilir.
D Bağımlılık Enjeksiyonu. Burada S ile aynı noktaya geri dönüyoruz. Veri erişim API'si tüketiminizi ayrı bir nesneye ayırırsanız, bu ilke, yalnızca o nesnenin bir örneğini yenileştirmek yerine, oluştururken bunu iletmeniz gerektiğini söyler. bir depo. Bu, veri erişim bileşeninin kullanım ömrünü kontrol etmeyi kolaylaştırır ve bu sayede tek bir oluşturma rotasına gitmenize gerek kalmadan, depolarınız arasında referanslar paylaşma olanağını açar.
SOLID ilkelerinin çoğunun mutlaka uygulamanızın geliştirilmesinin bu aşamasında uygulanmayacağını not etmek önemlidir. Örneğin, veri erişimini engellemeniz gerekip gerekmediğine ve veri tabanı mantığını veritabanına çarpmadan sınamak isteyip istemediğinize bağlıdır. Bu olası gibi görünmüyor (maalesef, bence), bu yüzden muhtemelen gerekli değildir.
Tüm bu düşüncelerden sonra, YAGNI ve SOLID'in aslında bir ortak sağlam, anında alakalı tavsiye sunduğunu görüyoruz: Muhtemelen ortak bir genel depo arayüzü oluşturmak gerekli değildir.
Tüm bu dikkatli düşünce bir öğrenme alıştırması olarak son derece faydalıdır. Öğrenirken zaman alıcıdır, ancak zamanla sezgiyi geliştirirsiniz ve çok hızlı olur. Yapmanız gereken doğru şeyi bileceksiniz, ancak birisi nedenini açıklamanızı istemediği sürece tüm bu kelimeleri düşünmenize gerek yok.