TDD tasarımla ilgiliyse neden ona ihtiyacım var? [kapalı]


10

TDD gurusu gittikçe daha fazla bize TDD'nin testlerle ilgili olmadığını, tasarımla ilgili olduğunu söylüyor . TDD olmadan gerçekten harika tasarımlar yaratan bazı geliştiriciler biliyorum. O zaman TDD'yi uygulamalılar mı?


14
Eğer onsuz iyi gidiyorlarsa, buna ihtiyaç duymazlar. Her "en iyi uygulama" herkes için geçerli değildir.
Kale

Yanıtlar:


18

TDD sadece en iyi nihai tasarıma gelmeme yardımcı olmakla kalmıyor, aynı zamanda daha az denemede bulunmamı sağlıyor.

Hangi tasarımın en iyi olduğunu düşündüğüme karar vermeden önce bir problemde iki veya üç bıçak vardı. Şimdi, aynı zaman testler yazmak ve zihnimi doğru tasarıma odaklamakla geçiyor. Ve bir bonus olarak, beni tekrarlanabilir testler grubuyla bırakıyor. Kazan!

Bununla birlikte, kaçınılmaz olarak TDD'nin hiçbir şey sunmadığı insanlar olacak. Sonunda hala otomatik, tekrarlanabilir testlere sahip oldukları sürece, bu iyi.


4
daha az denemede, gerçekten mi?
SiberianGuy

3
Evet gerçekten. TDD beni bir sınıfı arama kodu ve işlevselliği açısından düşünmeye zorluyor, çünkü sınıfı tüketmek için yazmayı beklediğiniz kodu yazarak başlıyorsunuz. Bir sınıf "kör" yazarken, çağıran sınıfın beklediğinden daha fazlasını yaptığına odaklanma eğilimindeyim, ki bu neredeyse her zaman bir hatadır.
pdr

4
Bak yine bir kelime var forced. TDD ile ilgili tartışmalarda olduğu gibi, insanların neden "zorla" kelimesinin sıklığından daha sık rahatsız olmadıklarını bilmiyorum. Kişinin bir şeyi doğru bir şekilde tasarlamaya zorlanması gerekmez ; şeyleri doğru bir şekilde nasıl tasarlayacaklarını öğrenmeli ve daha sonra zorlanmadan yapmaya devam etmelidirler , özellikle bu zorlama eylemi inanılmaz derecede zaman alıcı olduğunda.
Rei Miyasaka

3
@Rei: İnsanlar daha sık rahatsız olmuyorlar çünkü diğer kişinin gerçekten "itilmiş" veya "güdümlü" anlamına geldiğini biliyorlar ... . Ve evet, bazıları doğal olarak, düşünmeden bu şekilde düşündüklerini bulabilirler. Ama yine de yazılımınızı test etmeniz gerekiyor, böylece o kadar iyi değilsiniz.
pdr

3
Birisi "modüler tasarımı zorlar" dediğinde, gerçekten zorlanırlar. TDD ile birleştirilemez bir tasarım yapmak çok zor (imkansız değilse de) ve bu iyi bir şey. Sorun zor olmanın bu sonucu değildir; bu ani ve kaba çaba gerektiriyor. Uygun tasarım öğretilebilir ve öğrenilebilir bir beceridir ve öğrenmeye zaman harcanmalıdır. Ayrıca, TDD için yazılan testler, hataları yakalamak için yazılan testlere pek benzemez. Eğer yaparlarsa, bir şeyler yanlıştır .
Rei Miyasaka

12

Bu belirli TDD gurusunun gerçekten söylemeye çalıştığı şey, TDD'nin bir tasarım süreci olmadığı anlamına gelir (ancak bazı insanlar maalesef bu şekilde yorumlamıştır). Buradaki mesaj, eğer doğru yaparsanız, TDD gibi bir işlem kullanmanın genel tasarımınızı geliştirme eğiliminde olacağıdır.

Temel kavram TDD'den çok daha eskidir; test edilebilirlik için tasarım . SOLID ilkelerine, özellikle de Tek Sorumluluk İlkesine sıkı sıkıya bağlı kalırsanız , kodu test etmek çok kolay bulacaksınız. Öte yandan, tasarımınızda biraz daha terbiyeli olma eğilimindeyseniz, muhtemelen bunu daha sık yapmaya zorlamak için (a) neyin gerekli olduğunu bulmaktan kaçınmak için birim testleri yazma sürecini bulacaksınız . (b) bağımlılıkları ayarlamak için gerçek testleri yazmaktan daha fazla zaman harcamak.

Sen yok olması bu yararları elde etmek için TDD takip etmek, ancak does testleri yazmak için yardıma erken - Eğer değilse önce veya sırasında, bir sınıf uygulamak tercihen çok kısa bir süre sonra. Çok uzun süre beklerseniz, yazarın bahsettiği "kirli melez" testlerin riskini alırsınız, bu da çok fazla değere sahip değildir çünkü kırılgandırlar ve zararsız yeniden düzenleme sırasında kırılmaya eğilimlidirler - daha büyük yapmaktan bahsetmiyorum - ölçek zorlu bir süreci yeniden tasarlar.

Test yazmazsanız gerçekten test edilebilirlik için tasarlayıp tasarlamadığınızı bilemezsiniz ve yalnızca% 15 kod kapsamı olan gelişigüzel "özellik testleri" sayılmaz.

Tabii ki sen yapabilirsiniz şimdiye kadar tek bir testi yazmadan iyi tasarımlar yaratmak - ama onlar konum harika tasarımlar emin misin? Testlerle açıkça belirtilmemişlerse, nasıl biliyorsunuz? Test sorunları bir sürü ortaya çıkarır ve KG süreci görünür hatalar bulabilir ederken, onlar olmayacak ortaya çıkarmaya yoksul tasarım kararları.


1
İyi bir tasarımın amacı sadece test edilmemektedir. Ancak evet, TDD hatalı tasarımları tespit etmek için iyi bir araçtır.
deadalnix

4

TDD öğrenmek için çabalayan birinden gelen basit cevap: Buna ihtiyacınız yoktur , ancak size sağladığı en büyük fayda, oldukça basittir : Uygulamanızın çalıştığına olan güven . Kullanım örneklerinin karşılandığına olan güven. "Foobar" modülü için mantığınızın sağlam olduğundan emin olun. CEO'nun okuduğu bazı yeni çılgın özellikler eklemek istediğinde, kodunuzun yol boyunca altı ay boyunca genişletilebilir ve genişletilebilir olacak şekilde yapılandırıldığından emin olun. Başvurunuz büyüdüğünde, mimarinin parçalanmaması veya yeni özellikleri juri-teçhiz etmek için dağınık hack'lere ihtiyaç duymamasının temeli atıldı.

Yukarıdakilerin biraz evangelik geldiğini anlıyorum ama TDD'nin faydasını bu şekilde görüyorum. TDD kullanarak iyi, sağlam, iyi tasarlanmış tasarımlar yaratabilseniz bile, elinizi doğru şeyleri yapmaya zorlar ve sonra işlerin doğru yapıldığını kanıtlar ve daha da önemlisi işleri doğru tutmak için bir temel sağlar . TDD'de dabbled çok az, bunu kullanarak kodu temiz yapmak ve uygun yazılım mühendisliği kavramları takip etmek için beni zorladı, aksi takdirde ben genellikle dağınık "kesmek" kodu ile sonuçlanan "mümkün olan en hızlı şey" yapacağım.


+1 TDD geri bildirimdir. Geri bildirim ölçütlerinin çoğu gittikçe, oldukça objektif ve tamamen otomatiktir, bu nedenle tüm beceri seviyelerinden ekip üyeleri tarafından paylaşılabilir. TDD'den önce, iyi kod "hissettiğiniz" bir şeydi ya da kullanıcılar yazılımı aldıktan bir süre sonra onaylandı. Döngü ne kadar kısa olursa, kendinizi o kadar güvende hissedersiniz. Ne yazık ki TDD, iyi bir tasarımı "hissetmek" olarak aşırı güce yatkındır, ancak kendini düzeltmek çok daha kolaydır.
Steve Jackson

2

Sadece deneyimlerimden konuşabilirim. TDD benim için geliştirme tarzı alışkanlıkları araç kutumda daha önce sahip olmadığım bazı şeyleri getirdi. Yine de, TDD'nin her şeye çözüm olmadığını tekrar söylemeye değer. Keşif ve üretime hazır uygulamayı her zaman ayırmaya çalışıyorum. Arama aşamasında TDD'ye kesinlikle gerek yoktur ve hatta yavaşlamaktadır. Öte yandan üretime hazır kod için kısa ve uzun vadede geliştiricilerin ruh sağlığı ve projenin karması için çok değerli olan çeşitli faydalar getirir.

  • TDD uygulamadan önce beni düşündürüyor, bu da çok ateş ve unut çözümlerini önleyen çok iyi bir uygulamadır
  • Birbirine uyan küçük parçalara çözümü ayırmaya zorlayarak, küçük sorunlarda düşünmemi sağlıyor.
  • Bu bana çok ayrışmış kod yazma yapar çünkü ne zaman stub / alay / sahte bir soruna uymayan bir şey yapmak zorunda kaldım doğal olarak bir "WTF atmak zorundayım, neden onunla birleştirmek zorunda kalmazsam bunu yapmalıyım?" . Ve işler arasındaki bağlantıları daha iyi anlamamı sağlıyor.
  • Bana benim kod için kolayca çalıştırılabilir kontroller kümesi verir, bu yüzden kod hata ayıklama acı "var_dump", "p", "pp", "echo" tarzı geçmesi gerekmez. Sadece neyin yanlış olduğunu, neyin yanlış olduğunu rapor eder. Ve henüz bir kontrolüm yoksa, tekrar tekrar kontrol etmek için basit bir test eklemek önemlidir.
  • Tüm testler dağıtılmadan önce geçerse kodumun çalıştığından emin olurum. Sonra tırnaklarımı yemek yerine kek yemeye, kahve içmeye ve öğleden sonralarımın tadını çıkarmaya gidiyorum.
  • Yüksek seviyeli testler, bir şeyi yeniden düzenlemek zorunda olduğunuz durumlarda çok güzel. Modülümün dış dünyaya bazı işlevler sağlaması gerekiyorsa ve düzgün çalıştığını kanıtlamak için işlevsel / entegrasyon / salatalık testleri geliştirdiysem, bu kodun cehennemini yeniden düzenlemek için çok cesur olacağım. Birkaç kez testler yoktu ve onu yeniden düzenleme ihtiyacı kodu ile karşı karşıya kaldı. Bu durumda, uygulamaya geçmenin iki yolu vardı. 1) kodu bırakın 2) değişiklikleri atlayın ve olduğu gibi bırakın.

TDD'nin düzeltmediği bir şey var. Yaptığınız şeyi nasıl inşa edeceğinizi bilmiyorsanız, TDD sizin için çözüm üretmeyecektir. Zor bir "tasarım" veya sorun ve çözüm hakkında genel bakış olması gerekir. TDD, daha kaliteli kodla daha zarif ve sürdürülebilir bir şekilde uygulamanızı sağlayacaktır.

Sonunda, TDD uygulamalarına dayanan BDD terimleriyle düşünmeyi tercih ediyorum. BDD, alan adındaki kelimeleri kullanarak çözüm uygulamamı ve yazılımı soruna daha iyi uydurmamı sağlıyor.


1

Harika bir tasarım elde etmenin birçok yolu olabilir ve “harika” - hatta “iyi” neyi oluşturan şeyin tartışmasız birçok farklı yorumu vardır. Çoğu TDD'nin tanım konusunda seninle aynı fikirde olmayacağından şüpheliyim - eğer koda baktığımızda harika olduğunu düşünürsek, harikadan daha az düşünürüz. TDD bizi bazı çok spesifik niteliklere yönlendirir ve bu nitelikler nadiren TDD olmayan kodda bulunur.

Ahlaksızlık, açıkçası, bu niteliklerden ve kapsayıcı niteliklerden biridir. Son derece küçük yöntemler ve sınıflar belki de bir alt karakteristiktir ve bu mükemmel isimlendirmeye yol açar. TDD yapmadan bu niteliklere ulaşan programcıları biliyorsunuzdur, ama bilmiyorum.


1
Neredeyse kesinlikle aynı nitelikleri bir şelale süreci tarafından üretilen kodda bulabilirdiniz, örneğin askeri, uzay, vb. İçin. günlük projeler için çoğu organizasyon.
Aaronaught

@Aaronaught Bunu Mars Climate Orbiter ekibine söyle . :-)
Eric King

90'lı yıllarda silahsız askeri projelerle ilgili şelale süreci ve ayrıca diğer askeri uygulamaların gazileri ile çok sayıda su soğutucu tartışması yaşadım. Genel fikir birliği şelale metodolojisi ve maliyet artı faturalandırmanın bakımı çok zor olan buggy sistemleri üretmesiydi.
kevin cline
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.