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ı?
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ı?
Yanıtlar:
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.
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.
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ı.
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.
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'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.
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.