Evet, SOLID, kolayca test edilebilecek kod tasarlamanın çok iyi bir yoludur. Kısa bir astar olarak:
S - Tek Sorumluluk İlkesi: Bir nesne tam olarak bir şey yapmalı ve kod üssünde o şeyi yapan tek nesne olmalıdır. Örneğin, bir etki alanı sınıfı alın, bir Fatura deyin. Fatura sınıfı, sistemde kullanılan bir faturanın veri yapısını ve iş kurallarını temsil etmelidir. Kod tabanında bir faturayı temsil eden tek sınıf olmalıdır. Bu, bir yöntemin bir amacı olması gerektiğini ve bu ihtiyacı karşılayan kod tabanındaki tek yöntem olması gerektiğini söyleyerek daha da bozulabilir.
Bu prensibi izleyerek, aynı işlevselliği farklı nesneler üzerinde yazmanız gereken test sayısını azaltarak tasarımınızın test edilebilirliğini arttırırsınız ve ayrıca tipik olarak izolasyonda test edilmesi daha kolay olan daha küçük işlevsellik parçalarına sahip olursunuz.
O - Açık / Kapalı Prensip: Bir sınıf uzamaya açık olmalı, ancak değişmeye kapalı olmalıdır . Bir nesne var olduğunda ve doğru çalıştığında, ideal olarak yeni işlevsellik ekleyen değişiklikler yapmak için o nesneye geri dönmeye gerek olmamalıdır. Bunun yerine, nesne, yeni işlevsellik sağlamak için onu türeterek veya içine yeni veya farklı bağımlılık uygulamaları takarak genişletilmelidir. Bu gerilemeyi önler; Nesnenin başka bir yerde kullanıldığı gibi davranışını değiştirmeden yeni işlevselliği ne zaman ve nerede gerekliyse sunabilirsiniz.
Bu ilkeye bağlı kalarak, genellikle kodun "alaycı" tolere etme kabiliyetini arttırırsınız ve ayrıca yeni davranışı öngörmek için testleri yeniden yazmak zorunda kalmazsınız; Bir nesne için mevcut tüm testler hala genişletilmiş uygulama üzerinde çalışmalı, genişletilmiş uygulamayı kullanan yeni işlevsellik için yeni testler de çalışmalıdır.
L - Liskov Değiştirme Prensibi: B sınıfına bağlı olan A sınıfı, farkı bilmeden herhangi bir X: B'yi kullanabilmelidir. Bu, temel olarak, bir bağımlılık olarak kullandığınız her şeyin, bağımlı sınıfın gördüğü gibi benzer davranışa sahip olması gerektiği anlamına gelir. Kısa bir örnek olarak, ConsoleWriter tarafından uygulanan Write (string) ifadesini gösteren bir IWriter arayüzünüz olduğunu varsayalım. Şimdi bunun yerine bir dosyaya yazmak zorundasınız, bu yüzden FileWriter oluşturursunuz. Bunu yaparken, FileWriter'ın ConsoleWriter ile aynı şekilde kullanılabildiğinden emin olmalısınız (yani bağımlıyla etkileşim kurabilmenin tek yolu Yazma (dize) öğesini çağırarak) ve böylece FileWriter'ın yapması gereken ek bilgiler olabilir. iş (yazılacak yol ve dosya gibi) bağımlıdan başka bir yerden sağlanmalıdır.
Bu, test edilebilir kod yazmak için çok önemlidir, çünkü LSP'ye uygun bir tasarım, beklenen davranışı değiştirmeden, herhangi bir noktada gerçek bir şeyle ikame edilmiş "küçük bir kod parçasının güvenle test edilmesine izin veren" alaylı "bir nesneye sahip olabilir sistemin daha sonra fişe takılı gerçek nesnelerle çalışacağını.
I - Arayüz Ayrıştırma Prensibi: Bir arayüz, arayüz tarafından tanımlanan rolün işlevselliğini sağlamak için mümkün olduğu kadar az yönteme sahip olmalıdır . Basitçe söylemek gerekirse, daha küçük arayüzler daha az sayıda büyük arayüzden daha iyidir. Bunun nedeni, büyük bir arabirimin değişmesi için daha fazla nedeni olması ve kod tabanında başka bir yerde gerekmeyebilecek daha fazla değişikliğe neden olmasıdır.
ISS'ye bağlılık, test edilen sistemlerin karmaşıklığını ve bu SUT'ların bağımlılıklarını azaltarak test edilebilirliği artırır. Test ettiğiniz nesne, DoOne (), DoTwo () ve DoThree () arayüzlerini içeren bir IDoThreeThings arayüzüne bağlıysa, nesne yalnızca DoTwo yöntemini kullanıyor olsa bile, üç yöntemi de uygulayan bir nesneyle alay etmelisiniz. Ancak, nesne yalnızca IDoTwo'ya bağlıysa (yalnızca DoTwo'yu gösterir), bu yöntemi olan bir nesneyle daha kolay alay edebilirsiniz.
D - Bağımlılık Tersine Çevirme İlkesi: Betonlar ve soyutlamalar, asla diğer betonlara değil, soyutlamalara dayanmalıdır . Bu prensip doğrudan gevşek bağlanma inancını zorlar. Bir nesne asla bir nesnenin ne olduğunu bilmemelidir; bunun yerine bir nesnenin ne yaptığını umursamalıdır. Bu nedenle, bir nesnenin veya yöntemin özelliklerini ve parametrelerini tanımlarken, arayüzlerin ve / veya soyut temel sınıfların kullanılması, her zaman somut uygulamaların kullanılması için tercih edilmelidir. Bu, kullanımı değiştirmek zorunda kalmadan bir uygulamayı bir başkasıyla değiştirmenize olanak sağlar (ayrıca, DIP ile el ele giden LSP'yi de takip ederseniz).
Yine, bu test edilebilirlik için çok önemlidir, çünkü bir kez daha, nesneyi test ettiği nesneyle test ederken, “üretim” uygulaması yerine bir bağımlılığın sahte bir uygulamasını enjekte etmenize izin verir. üretimde. Bu, "izolasyonda" ünite testi için anahtardır.