Test odaklı geliştirme beni SOLID'yi takip etmeye zorluyor mu?


15

TDD uygulayıcılarından, TDD'nin avantajlarından birinin, geliştiricileri SOLID ilkelerini (Tek sorumluluk, Açık-kapalı, Liskov ikamesi, Arayüz ayrımı ve Bağımlılık dönüşümü) takip etmeye zorlaması olduğunu çok şey duydum . Ancak bana gelince, SOLID'i takip etmenin (ve böylece test edilebilir mimari yaratmanın) önemli olduğunu anlamak için sadece bazı testler (öncelikle birim test) yazmak yeterlidir.

TDD, geliştiricileri SOLID'i sadece birim testler yazmaktan daha aktif olarak takip etmeye zorluyor mu?


1
TDD temel olarak geliştiricileri test yazmaya zorlamakla ilgilidir. Birim testleri yazmanın size SOLID kodu yazdığını söylüyorsanız, sanırım TDD sizi SOLID kodu yazmaya zorlar. Bu sadece söylediklerinize dayanıyor ve cevabımda görebileceğiniz fikrimi doğru bir şekilde yansıtmıyor.
Yam Marcovic

1
Yam: Katılıyorum, TDD birim testleri yazmakla ilgili değil. TDD, eldeki sorun için minimal karmaşık ve doğru bir çözüme ulaşmak üzeredir. Testler sadece prosedürün bir yan ürünüdür
Amit Wadhwa

TDD tanımı gereği koddan önce test yazmakla ilgilidir. Teorik olarak, testler olmadan bile minimal karmaşık ve doğru bir çözüm oluşturabilirsiniz. Testler size anında geri bildirim ve regresyon farkındalığı sağlar. Testlerle aşırı karmaşık bir çözüm oluşturmak hala mümkün olduğundan, TDD kendi başına minimal düzeyde karmaşık çözümler oluşturmakla ilgili değildir. Söylediklerinin tam tersi. Zarif çözümler, prosedürün bir yan ürünüdür, tersi değildir.
Yam Marcovic

Yanıtlar:


24

Her şeyden önce, TDD kesinlikle gelmez zorlamak KATI kod yazmak size. İsterseniz TDD yapabilir ve büyük bir karmaşa yaratabilirsiniz.

Tabii ki, SOLID ilkelerini bilmek yardımcı olur, çünkü aksi takdirde sorunlarınızın çoğuna iyi bir cevap vermeyebilir ve böylece kötü testlerle birlikte kötü kod yazabilirsiniz.

SOLID ilkelerini zaten biliyorsanız, TDD bunları düşünmenizi ve aktif olarak kullanmanızı teşvik edecektir.

Yani illa harflerin tamamı kapsamaz dedi KATI ama kuvvetle teşvik eder ve o kadar hemen görünür ve rahatsız edici yapmadığı sonuçlarını yapar, çünkü en azından kısmen KATI kod yazmak size teşvik etmektedir.

Örneğin:

  1. İhtiyacınız olanı alay edebilmek için ayrıştırılmış kod yazmanız gerekir. Bu, Bağımlılık Ters Çevirme İlkesini destekler .
  2. Açık ve kısa testler yazmanız gerekir, böylece testlerde çok fazla değişiklik yapmak zorunda kalmazsınız (aksi halde yapılırsa büyük bir kod gürültüsü kaynağı olabilir). Bu, Tek Sorumluluk İlkesini destekler .
  3. Bu tartışılabilir, ancak Arayüz Segregasyon Prensibi , sınıfların alay etmeyi takip etmeyi ve anlamayı kolaylaştıran daha hafif arayüzlere bağımlı olmalarına izin verir, çünkü "Neden bu 5 yöntem de alay edilmedi?" daha da önemlisi, hangi yöntemin alay edileceğine karar verirken çok fazla seçeneğiniz yoktur. Test etmeden önce sınıfın tüm kodunu gerçekten gözden geçirmek istemiyorsanız ve nasıl çalıştığına dair temel bir anlayış elde etmek için deneme yanılma yöntemini kullanmak iyi bir şeydir.

Açık / Kapalı ilkesine uymak , koddan sonra yazılan testlere yardımcı olabilir , çünkü genellikle test edilen sınıflardan türeyen test sınıflarındaki harici hizmet çağrılarını geçersiz kılmanıza izin verir. TDD'de bunun diğer ilkeler kadar gerekli olmadığına inanıyorum, ama yanılmış olabilirim.

Sınıfınızın, aynı statik olarak yazılan arabirimi uygulayan desteklenmeyen bir örnek alması için değişiklikleri en aza indirmek istiyorsanız, ancak uygun test senaryolarında gerçekleşmesi olası değilse, Liskov ikame kuralına uymak harikadır. genellikle bağımlılıklarının gerçek dünyadaki uygulamalarını test altında herhangi bir sınıftan geçmeyecektir.

En önemlisi, daha temiz, daha anlaşılır ve bakımı kolay bir kod yazmanızı teşvik etmek için SOLID ilkeleri yapıldı ve TDD de öyle. Dolayısıyla, TDD'yi düzgün bir şekilde yaparsanız ve kodunuzun ve testlerinizin nasıl göründüğüne dikkat ederseniz (ve hemen geri bildirim, API ve doğruluk açısından akıllıca olduğunuz için çok zor değil), genel olarak SOLID ilkeleri hakkında daha az endişelenebilirsiniz.


Ayrıca Açık / kapalı ve Liskov ikamesini takip etmedikçe alayların daha sonra kırılacaktır. Bu nedenle TDD, OCP ve LSP'yi uygulamanıza yardımcı olmasa bile, oluşturulan testler onu kırdığınızda size bildirir. Daha genel olarak test etmenin bir etkisi, ama yine de söz etmeye değer.
Jonas Schubert Erlandsson

9

Hayır

TDD, sürekli yeniden düzenleme nedeniyle iyi uygulamaları takip etmeyi kolaylaştırabilir, ancak sizi herhangi bir ilkeye uymaya zorlamaz. Tek yaptığı, yazdığınız kodun test edildiğinden emin olmaktır. Testi tamamlamak için kod yazarken istediğiniz ilkeleri takip edebilirsiniz; ya da hiç ilke yok.


2

TDD yapmaya başladığımda, SOLID Prensipleri konusundaki anlayışım genişledi. Bağımlılıkları nasıl taklit edeceğimizi düşünmeye başlar başlamaz, kod tabanındaki hemen hemen her bileşenin alternatif bir alternatif uygulamaya sahip olduğunu fark ettim. Ve basit bir genel API'yi test etmenin ne kadar kolay olduğu.

Ayrıca, çoğu tasarım deseninin çok daha güçlü bir şekilde anlaşılmasını sağlamıştır. Özellikle Strateji Paterni.


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.