Giriş: Neden SOLID ve TDD Birlikte Birleşin

Modern yazılım geliştirme hem yapısal bütünlüğü hem de davranışsal doğrulığı talep eder. Birkaç metodoloji bunu SOLID ilkeleri ve Test-Driven Development (TDD) Yüzeyde, SOLID tasarıma odaklanır - sadece sınıf ve modüller birbiriyle nasıl ilgilidir - TDD işlem üzerinde yoğunlaşır - her adımda testler yazar.

SOLID ve TDD arasındaki sinerji, geri bildirim döngüsü olarak anlaşılabilir. TDD nudges geliştiricilerinin küçük, test edilebilir bir davranış birimlerine doğru ilerlemektedir.Bu makale, TDD'nin doğal olarak izole edilmiş ve gevşek bir şekilde çiftleştiğini gösterir.Başlangıçta, bir SOLID tabanlı mimari TDD daha hızlı ve daha güvenilir hale getirir, çünkü her bir tüm sistemi spin etmeye gerek kalmadan belirli bir sorumluluğu test eder.Bu makale TDD'nin her bir şekilde ayrıntılı olarak inceler.

SOLID İlkelerini Anlamak

Robert C. Martin (Ncle Bob) tarafından 2000'lerin başlarında, SOLID acronym, her bir test odaklı gelişme bağlamında incelenen beş tasarım prensibini özetliyor.

Tek Sorumluluk Prensi (SRP)

[FONT:0]SRP[DÜDÜT:1], bir sınıfın sadece bir yapılandırma dosyası ve süreçleri kullanıcı girişi okuması gerektiğini belirtir.Bir sınıf için bir birim testi yazmak, yapılandırma dosyasına veya iş kuralına karşı koymak gerekir.Bir sınıf test sırasında tek bir davranışı izole etmek zor olur. Örneğin, her iki sınıf da bir yapılandırma dosyası ve süreçleri kullanıcı girişi okur.

Bir TDD perspektifinden, SRP doğal bir müttefiktir.Bir test ilk önce yazarken, tek bir davranış hakkında düşünmeye zorlanırsınız – “Bu küçük senaryoda sistem ne yapmalı?”

Açık / Kısa Prensip (OCP)

[FONT=0)OCP[DÜDÜT:1) yazılım kuruluşlarının uzatma için açık olması gerektiğini iddia ediyor, ancak değişiklik için kapalı olması gerektiğini iddia ediyor. Hedef, mevcut olmayan, test edilen kod olmadan yeni özellikler eklemek. Pratikte, bu, bir sözleşme tanımlayan arayüzler veya soyut sınıflar aracılığıyla elde edilir, beton uygulamaları değiştirilebiliyor veya eklenebilir.

TDD ve OCP karşılıklı olarak yeniden finanse edilir. Çünkü TDD, mevcut ödeme işlemci testlerine dokunmadan yeni bir uygulama oluşturabilirsiniz. Bu, bu testleri veya kapakladıkları kodu değiştirmekten kaçınmanız için son derece motive edilir. OCP'yi ihlal eden bir sistem için genellikle yeni bir ödeme kutusuna yol açar (örneğin, yeni bir ödeme kartı) yeni bir uygulama eklediğinizde, yeni bir uzatma işlemi eklendiğinde, riskinizi azaltır ve regresyon paketinizi yeşil tutarsınız.

Liskov Altung Prensliği (LSP)

[FONT:0)LSP[DÜDÜT:1) alt tiplerin programın doğruliğini değiştirmeden temel türlerine yönelik olarak alt kategorilerde olması gerektiğini belirtir. Başka bir deyişle, bir müşteri bir OKT:0) nesneyi beklerse, istemcinin mantığını bozmamalıdır. LSP genellikle, programın doğru bir sınıf yönteminde bir taban sınıfı yöntemini değiştirir.

TDD LSP'nin erken ihlallerini ortaya çıkarabilir. Bir arayüz veya soyut sınıf kullanan bir test yazarken, sözleşme hakkında bir varsayım yapıyorsunuz.Eğer bu arayüzün farklı uygulamaları testin doğru olduğunda bile başarısız olması için teste neden olur, tasarım muhtemelen LSP'yi ihlal eder. Good TDD uygulama güçleri, LSP ile doğal olarak uyumlu olan sözleşmeler tanımlamanız için sizi ihlal eder.

Interface Segregation Principles (ISP)

[FONT:0)ISP[DÜT:1], hiçbir müşterinin kullanmadığı yöntemlere bağlı olması gerektiğini tavsiye eder. Fat arabirimleri - birçok ilgili yöntemi içeren arayüzler - bu tür bir arayüz uygularken gereksiz bir darbe yaratır.

Küçük, kohesive testleri yazarak, doğal olarak role özgü arayüzlere doğru oturabilirsiniz. Örneğin, bir monolithicurFLT:4) ile arayüze bağlı olarak, alginçT:6), [[DÜcretsiz ve testlere daha fazla odaklanabilirsiniz.

Bağlanma Prensipleri (DIP)

[FONT:0]DIP[[DFLT:1], soyutlamalara bağlı olarak, koncretions. Yüksek seviyeli modüller düşük seviyeli modüller ithal etmemeli; her ikiniz de arayüzlere bağlı olmalıdır. Bu, iş mantığı doğrudan doğruya bağlı olduğunda, izolasyonda mantığın gerçek bir veritabanı olmadan imkansız hale geldiğini test eder.

TDD şampiyonu DIP çünkü testler kodunuzun ilk müşterileridir.Bir sınıfı uygulamadan önce bir test yazarken, testin tüketeceği arayüz doğal olarak tasarlayabilirsiniz.Bu arayüz daha sonra yazılır ve bunu sorunsuz bir şekilde değiştirebilirsiniz.Bu ters teknolojiden biri DIP'e ulaşmak için en güçlü yollardan biridir.

Test-Driven Development nedir?

Test-Driven Development sadece “ilk test yazmak” değildir, sıkı bir geri bildirim döngüsü takip eden bir disiplindir: 0,0)Red, Green, Repha).

  1. [FONT:0)Red[DÜT:1): İstenen bir davranışı tanımlayan başarısız bir test yazın. Test mümkün olduğunca özel olmalıdır (örneğin, “a user with no subscription should see the default dashboard”).
  2. [FONT:0)Green): Testin geçişini yapmak için minimum üretim kodu yazın. Ekstra özellikleri eklemek için bir uyarıyı bırakın.
  3. [FONT:0)Refaksiyon[[Dönetici: Her iki testin ve üretim kodunu temizleyin, tüm testlerin yeşil kalmasını sağlarken bu adım, SOLID bağlılık da dahil olmak üzere tasarım geliştirmeleri yerdir.

Bu döngü günde onlarca kez tekrarlanır. Her döngü test edilen işlevselliğin küçük bir artışını oluşturur. Avantajlar iyi belgelenir: daha az böcek, daha iyi regresyon kapsamı, kesinti süresi azaltır ve doğrudan SOLID'nin hedeflerini ortaya koyan bir tasarım.

SOLID ve TDD arasındaki Synergy

SOLID ve TDD'nin kesiştiği yer mimari tasarımın doğrulanmasıdır. Her ilke TDD deneyiminin farklı bir yönünü basitleştirir. Aşağıda bu ilişkileri somut örneklerle ayrıntılı olarak inceleyeceğiz.

SRP ve DIP ile Geliştirilmiş Testability

Test edilebilirliği, muhtemelen bir kod tabanının (tabases, web hizmetleri, dosya sistemleri) tümünün çalıştırdığı bir işlemden kısa ve kolay anlamasını sağlar. DIP, bu sınıfların gerçek bir fiyat servisine bağlı kalmasını sağlar.

OCP ve TDD'nin Yeniden Güvenlik Netliği

TDD'nin ana satış noktalarından biri size yeniden düzenleme cesaretini veriyor. Test paketi, güvenlik ağı olarak çalışır. OCP yeni özellikleri eklemede mevcut kodu değiştirme ihtiyacına sahip olarak test edilir.Bu kombinasyon, OCP'yi takip ettiğinizde, genellikle yeni alt sınıfları veya eklentileri düzenlemeden ziyade, OCP mevcut işlevleri tamamen test eder ve tüm testleri doğrulayabilir.

LSP ve ISS Test Tasarımlarında

Çoğu zaman sözleşme ve arayüzleri düşünmenize yardımcı olur. LSP size bir temel sınıfa veya arayüze karşı yazılmış bir testin geçerli bir uygulama için geçeceğini hatırlatıyor. Belirli bir alt sınıfa karşı çalıştırdığınızda bir test başarısız olduğunu bulursanız, LSP ihlali ortaya çıkardınız - ve bu iyi bir test seti temizlemenizi teşvik ediyor.

Pratik Örnek: Bir Bildirim Hizmeti Oluşturmak

E-posta yoluyla mesajları gönderebilecek bir bildirim sistemi inşa etmeyi hayal edin, SMS ve it. Daha az deneyimli bir geliştirici, tüm testleri etkileyecek bir yöntemle bir monolithicurFLT:17. ”Bu, nasıl teslim edileceğine karar vermek için bir anahtarlama sistemi inşa edebilirsiniz. Test etmek için üç farklı teslimat mekanizmasına karşı, ve herhangi bir e-posta formatına sahip olmak tüm testleri etkileyecektir.

TDD ile SOLID'i uygulamak için:

  • [FONT:0]SRP[DÜT:1]: TheurFLT:19|sadece orkestralar gönderiyor. Her teslimat kanalı (email, SMS, it) kendi sınıfında tek bir sorumlulukla yaşıyor.
  • [FONT=0)OCP[DÜT:1): Yeni bir kanal eklemek (örneğin, Slack,) mevcut arayüze uygun olan bir aŞFLT:20 uygularsınız - sınıfa dokunmanız gerekmez.
  • [FONT:0)LSP[DÜT:1): Tüm uygulamalar [FONTD:2] arayüz, [[Üyetim: 9) perspektifinden değişebilir.
  • [FONT:0)ISP[DÜT:1): Bir bildirim göndermekle ilgili yöntemler içerir - [[Şerefli yöntemler veya [[Üye Olmayanlar İçin İlişkili yöntemler.
  • [FONT:0]DIP[DFLT:1]: [FONTFLT:26], beton kanal sınıflarına değil, soyutlamaya bağlıdır.

TDD ile, bu testin geçtiği için bir test yazarak başlayacaksınız. – tasarım bir e-postanın “sent” olduğunu ifade eden basit bir test (belki bir casus aracılığıyla) daha sonra bu testin başarıyla tamamlanması için yeterli kod yazabilirsiniz.

Entegrasyon için Pratik İpuçları

Her iki SOLID ve TDD'yi aynı anda kabul etmek, ilk başta ezici hissedebilir. Aşağıdaki somut stratejiler alışkanlık inşa etmenize yardımcı olacaktır.

  • [[Dönetici:0) Tek bir modülle başlayın[Dönetici: Küçük, kendi kendine özgü bir özellik seçin (daha önce bildirim servisi gibi). Testlerini ilk önce yaz. SRP ve DIP'i uygulamanız için kendinizi zorlayın.
  • [FONT:0]Treat test edilebilirliği bir tasarım hedefi olarak algılanır[DÜDÜT:1): Tasarımı geliştirmek için bir test yazdıktan sonra - belki de çok fazla kurulum veya alay gerektirir - kendinize hangi SOLID prensibi ihlal edilir. genellikle cevap DIP (a beton bağımlılığı) veya ISS (a şişman arayüzü).
  • [FONT:0) Testler sırasında bağımlılık enjeksiyon konteynerleri ısıtılır (Döneticiler için): Birim testleri için manuel enjeksiyon veya basit alay çerçeveleri tercih edin. Bu, testleri açık tutar ve SOLID düşünmesini güçlendirir.
  • [FONT:0]Her yeşil testten sonra refaksiyon (DDD'nin "Refak" aşaması, SOLID'ye bağlılık geliştirmek için mükemmel bir zamandır. Örneğin, bir sınıf iki sorumluluk büyürse, yeni bir sınıf (SRP) bir arayüzden birçok yönteme bağlıdır, bu arayüzden ayrılırsa (ISP).
  • [FONT:0)Introduce kodu, bir SOLID checklist ile ilgili incelemeler[D: Takım üyeleriyle yapılan yorumlar, her yeni test paketinin izole edilmiş, tek sorululuk bileşenleri kapsar. Bu, takımdaki ilkeleri güçlendirir.

Ek okuma için, [[0) Robert C. Martin'in orijinal makalesi SOLID ilkeleri) hala TDD'ye daha derin bir atlayış için, [[ENFLT:2).Kent Beck'in Test-Driven Development, seminal iş olarak kalır.

Common Pitfalls Kaçmak için

Deneyimli geliştiriciler bile bu iki metodolojiyi birleştirdiğinde tuzaklara düşebilir. Bu tuzakların farkında olmak sizi zaman kurtaracak.

  • [FONT:0) Çok fazla coarse olan testleri : Tüm bir iş akışı (örneğin, “login ve bir sipariş oluşturmak”) test etmek için SRP'yi ihlal eder, bireysel davranışları hedef alan izole testler.
  • [FONT:0]Her şeyi bitirmek için [DIP için gerekli olsa da, aşırı sağım tasarım kusurları gizleyebilir.Bir sınıf test etmek için beş farklı arayüze sahip olmanız gerekir, bu sınıf muhtemelen çok fazla şeye bağlıdır – bir SOLID ihlalinin işareti.
  • [FONT:0]Refaksiyon adımını görmezden gelir (DD Novices testin geçtiğinde yeniden faktörlemez.Bu, SOLID iyileştirmelerinin asla yeniden faktörlemezseniz, testleriniz bir karmaşaya dönüşür.
  • [FONT:0) Başlangıçta ([DÜDÜ) Genel Kurul: 0 (Çalışanlar) Genel olarak, ilk üretim kodu yazmadan önce beş tane SOLID ilkelerine başvurmaya çalışır. Testlerin basit uygulama ve arayüzlere ihtiyacı açığa çıkar.

Sonuç: Bir Kalite Kültürü

SOLID ilkeleri ve Test-Driven Development arasındaki sinerji, her iki felsefe de ortak bir kök paylaşıyor: anlaşılabilir olan kod yazmak, değiştirilebilir ve doğru. SOLID, yapısal yönergeleri sağlar - “nasıl” iyi bir tasarım sağlar - birlikte uygulanan bir gelişme ritmini üretirler, doğru işlevselliğin “nasıl”ı.

Her iki katı da kabul eden ekipler, bug-fix çevrimlerinde önemli bir azalma rapor ediyor ve TDD'nin döngülerine cevap verme yeteneği daha yüksek.Bir testin ilk önce test etmek ve SOLID ile tasarım yapmak, teknik borçtan birçok kez geri ödeme yapmanızı sağlıyor. Amca Bob'nun kendisinin söylediği gibi, ve kodunuzu size yıllarca teşekkür edecek.