Dinamik diller çevik gelişim için dezavantajlı mıdır?


12

Çevik gelişimi okuduğumdan genellikle yeniden düzenleme veya mühendislik kodunu diyagramlara dönüştürmeyi içerir. Elbette bundan çok daha fazlası var, ancak bu iki yönteme dayanan uygulamaları düşünürsek, dezavantajlı olarak dinamik olarak yazılmış diller mi?

Statik olarak yazılan diller yeniden düzenleme ve tersine mühendislik işlemlerini çok daha kolay hale getirecek gibi görünüyor.

Dinamik olarak yazılan dillerde imkansız değilse, yeniden düzenleme veya (otomatik) tersine mühendislik zor mu? Gerçek dünya projeleri, çevik metodoloji için dinamik olarak yazılan dillerin kullanımı hakkında ne anlatıyor?


5
Mühendislik kodunu diyagramlara ters çevirmek mi? Bunu neden Agile'da yaptın?
CaffGeek

7
Çevik "önce kod, sonra belge" anlamına gelmez.
Robotu Gort

@CaffGeek: Sıklıkla tavsiye edilen bazı kitaplar, bir beyaz tahtaya şemalar çizmenizi, daha sonra bir sonraki toplantı için şemalara kodlama ve son olarak mühendislik kodunu tersine çevirmeyi önerir.
Gerenuk

1
Bence kuvvetle yazılmış bu sorunun etiketlerinden ve metninden kaldırılmalıdır. Soru, statik vs dinamik değil güçlü vs zayıf hakkındadır.
Winston Ewert

@WinstonEwert - İyi görüşme, etiketleri dynamic-typingve olarak değiştirdimstatic-typing
Carson63000

Yanıtlar:


11

Dinamik diller teorik olarak dezavantajlıdır, diğer her şey eşittir, çünkü kodun nasıl çalıştığı hakkında (kısıtlamaların ne olduğu) daha az belirtirler ve bu nedenle yeniden düzenlemenin daha azı otomatik olarak yapılabilir ve ortaya çıkan problemler de otomatik olarak algılanamaz .

Fakat diğer her şey eşit değildir. En popüler dinamik diller, oldukça kompakt ancak anlaşılabilir bir kod sağlar, bu da genellikle bunları daha hızlı geliştirir ve mantığı (yeniden düzenlemede değişebilir) görsel olarak fark etmeyi kolaylaştırır. Dinamik bir dilde çalışmanın göreceli avantajlarından bazılarını kaybedebilmenize rağmen, özellikle de yeniden düzenlemenizi yine de elle yapmayı planlıyorsanız, yine de öne çıkabilirsiniz.

Öte yandan, dinamik dillerle aynı avantajlara sahip statik olarak yazılmış diller vardır (yani kompakt ve anlaşılabilir - çoğunlukla çıkartılan türlerle, ancak orada çok fazladır): Haskell belki de önde gelen örnektir, ancak OCaML / F #, Scala, ve diğerleri de bu kategoridedir. Ne yazık ki, en popüler statik olarak yazılan dillerden daha az kullanıldıkları için, onlar için (örneğin yeniden düzenleme için) kapsamlı araç setlerine sahip değillerdir.

Sonuç olarak, çoğu dilde çevik metodolojilerle yeterince çalışacağınızı düşünüyorum; Uygulama henüz teoriyi yakalayamadığı için şu anda açık bir kazanan olduğunu söyleyemem.


Bence bu cevap sorunun en önemli noktalarını ele alıyor :) Çevik gelişim için güvenli yeniden düzenleme ve tersine mühendislikin önemini de anlatabilir misiniz? Çok önemli bir rol oynadığını mı sanıyordum? Belki düşündüğümden daha az ve dinamik dil araçları yeterince iyi.
Gerenuk

1
@Gerenuk - Yetkili bir cevap vermek için çevik gelişim konusunda yeterli deneyime sahip değilim (özellikle dinamik dillerde) - yeniden düzenleme yönü vurgulanmış, aynı mı bırakılmış, vb mi? Sürecin diğer ortak yönlerinin (örneğin test odaklı geliştirme), yeniden düzenleme işleminizin kötüye gittiği yeri saptamanıza yardımcı olabileceğini ve tasarım aşamasına biraz daha fazla çaba harcarsanız, ihtiyacınız olmayabileceğini unutmayın. yeniden düzenleme. Belirli bir tekniğin anahtar olduğunu düşünmüyorum - sık sık ve işbirliği içinde dağıtılan tüm araçları el altında tutuyor.
Rex Kerr

14

Otomatik yeniden düzenleme, dinamik olarak yazılmış bir dil olan Smalltalk'ta icat edildi. Yani hayır, dinamik olarak yazılmış bir dilde otomatik yeniden düzenleme yapmak imkansız değil. Ne kadar zor olduğu, yazma disiplininin yanı sıra diğer faktörlere de bağlıdır. C ++ ve Java'nın her ikisi de statik olarak yazılmıştır, ancak yeniden düzenleme araçları yalnızca Java için gerçekten mevcuttur. Smalltalk, içgözlemi ve basit sözdizimi ile araçları yeniden düzenleme için gerçekten iyi bir adaydı.

Bazı açılardan, dinamik yazma aslında yeniden düzenlemeyi kolaylaştırır. İyi bir test paketiniz varsa, yeniden düzenleme işlemlerinizin hiçbir şey yapmadığından emin olabilirsiniz. Dinamik olarak yazılan kod tabanı genellikle daha küçüktür. Ayrıca, yeniden düzenleme işlemleri daha az kodu etkileme eğilimindedir. Dinamik kod tabanını manuel olarak yeniden düzenleme çabaları, statik kod tabanından daha azdır.


1
Peki tersine mühendislik ne olacak? Smalltalk, yazım açısından Python'dan farklı mıdır? Python'daki tüm türleri çıkarmak ve böylece hangi yöntemin sadece aynı adı değil, gerçekten aynı olduğunu belirlemek zor bir problem gibi görünüyor.
Gerenuk

2
Smalltalk değil o yazarak açısından Python çok farklı. Bu ise , ancak, önemli ölçüde açısından farklı kalıp . Smalltalk için kullanılabilir araçları ve IDE olan yolu daha iyi Python ve hatta C #, C ++ ve Java için kullanılabilir daha. Python için IDE'lerin kötü olmasının nedeni, Python'un dinamik olarak yazılması değil, Python için IDE'lerin kötü olması. Şimdi Eclipse olarak bildiğimiz IDE'nin bir zamanlar Smalltalk için VisualAge olarak adlandırıldığını unutmayalım. Smalltalk topluluğu IDE oluşturma konusunda 40 yıllık deneyime sahiptir ve bunu Java'ya uygular.
Jörg W Mittag

@Gerenuk, Smalltalk'in yazması python'dan farklı değil. İntrospeksiyon gibi başka şekillerde Smalltalk, yeniden düzenlemeye daha uygun bir özellik kümesi sağlar. Python'da tip çıkarımı iş gerektirecektir, ancak yapıldı, PyPy projesine bakın.
Winston Ewert

1
@WinstonEwert "ancak manuel olarak yeniden düzenleme yapabilirsiniz ve dinamik diller aslında bunu oldukça kolaylaştırır" - Hayır, manuel yeniden düzenleme ölçeklenmez.
Yeniden düzenleme

1
"Dinamik programlamanızın aslında yeniden düzenlemeyi kolaylaştırır" hemen hemen her noktası şüpheli veya sıralı değildir. Dinamik programlama, daha kapsamlı bir test paketine sahip olduğunuz anlamına gelmez, sadece daha büyük bir test paketidir (çünkü bazı şeyler statik olarak yakalanacak testlere ihtiyaç duyar). "Yeniden düzenleme işlemleri daha az kodu etkileme eğilimi" için herhangi bir destek sunmazsınız ("proje zaten küçüktür" e ek olarak, dinamik dillerin mevcut mahsulü göz önüne alındığında büyük olasılıkla doğrudur). Derleyicinizin size yardım etmesine bile izin vermeyeceğiniz anlamına gelmedikçe "elle yeniden düzenleme ile ilgili çaba" yanlış görünüyor !
Rex Kerr

8

Yeniden düzenleme dinamik dillerde icat edildi. Otomatik Yeniden Düzenleme Araçları dinamik dillerde icat edildi. IDE'ler dinamik dillerde icat edildi. Dinamik dillerde birkaç Çevik Metodoloji icat edildi.

Gerçekten herhangi bir sorun görmüyorum.


"Smalltalk, yazım açısından Python'dan o kadar farklı değil. Bununla birlikte, takım açısından oldukça farklı." - Belki de bu değişmeye başlıyor, bkz. Jetbrains.com/pycharm/features/index.html
igouy

3

Unutmayalım ki, Extreme Programming (XP) olarak bilinen "Agile" çalışma şekli bir Smalltalk projesinde oluşturuldu (ve Smalltalk kesinlikle "dinamik" bir dil olarak sayılır).

Dinamik olarak yazılan bir dille sağlanan bir yeniden düzenleme aracının endüstriyel kullanımına ilişkin bir örnek olay incelemesi:

Cargill'de tahıl asansörlerinin çalışmasını ve buna bağlı emtia ticareti faaliyetlerini desteklemek için çok büyük bir Smalltalk uygulaması geliştirildi. Smalltalk istemci uygulamasında 385 pencere ve 5.000'in üzerinde sınıf bulunmaktadır. Bu uygulamadaki yaklaşık 2.000 sınıf erken (1993 dolaylarında) veri erişim çerçevesiyle etkileşime girdi. Çerçeve, dinamik olarak nesne özniteliklerinin veri tablosu sütunlarına eşlenmesini gerçekleştirmiştir.

Analizler, dinamik aramanın istemci yürütme süresinin% 40'ını tüketmesine rağmen, gereksiz olduğunu gösterdi.

Business class'ın açıkça kodlanmış bir yöntemle sütun eşlemesine nesne niteliğini sağlamasını gerektiren yeni bir veri katmanı arayüzü geliştirildi. Testler, bu arayüzün daha hızlı büyüklük sırası olduğunu gösterdi. Sorun, veri katmanının 2.100 business class kullanıcısını nasıl değiştireceğiydi.

Geliştirilmekte olan büyük bir uygulama, bir arabirimin dönüşümü oluşturulurken ve test edilirken kodu dondurmaz. Dönüşümleri, kod deposunun paralel bir dalında ana geliştirme akışından oluşturmak ve test etmek zorunda kaldık. Dönüşüm tamamen test edildiğinde, tek bir işlemle ana kod akışına uygulandı.

17.100 değişiklikte 35'den az hata bulundu. Tüm hatalar üç haftalık bir sürede hızla çözüldü.

Değişiklikler manuel olarak yapıldıysa, dönüşüm kurallarının geliştirilmesi için 235 saat ile karşılaştırıldığında 8.500 saat süreceğini tahmin ediyoruz.

Görev, Yeniden Yazma Kuralları kullanılarak beklenen sürenin% 3'ünde tamamlandı. Bu 36 faktörlü bir gelişmedir.

"Uygulama veri katmanının dönüşümü" nden Will Loew-Blosser OOPSLA 2002

Ayrıca - "İmkansız değişiklikler yapmak için araçlar - büyük Smalltalk programlarını dönüştürmek için bir araçla deneyimler"


1

İlkelerin bana doğru geldi .

C # gibi güçlü yazılan diller, sürekli olarak yeniden faktoring gerektiren bir kod tabanı için iyi adaylardır. Temel olarak piyasadaki çoğu yeniden faktoring aracı (Resharper, JustCode vb.) Statik olarak yazılan programlama dillerinde çok etkilidir.

Gerçek dünya projeleri, çevik metodoloji için dinamik olarak yazılan dillerin kullanımı hakkında ne anlatıyor?

Çevik / Scrum metodolojisini uygulayan geliştirme ekibi için, zırh altında iyi bir yeniden faktoring aracı setine sahip olmak çok yararlı (hatta kritik). Aksi takdirde, gelecek süratteki tüm ani değişiklikler, değiştirilmesi veya yeniden tasarlanması için bir kabus olabilir.

Bu nedenle, çevik metodoloji statik olarak yazılan dillere veya dinamiklere bir kez avantaj sağlamaz. Sağladığı, sağlam bir uygulama oluşturmak için yinelemeli bir yaklaşımdır.


4
Dinamik diller, C # bulunmadan çok önce ve Not Defteri hala en güçlü Java IDE olduğunda Otomatik Yeniden Düzenleme Araçları'na sahipti.
Jörg W Mittag

4
Bu cevap benim deneyimim tarafından tamamen desteklenmiyor. Dinamik diller genellikle daha hızlı daha geleneksel statik olarak yazılan olanlardan daha şeyler yapmak için vardır (ı var var Haskell veya ML ya da bazen böyle şeyler öğrenmek için). Ayrıca aniden ihtiyaç duyulursa değiştirilmeleri çok daha hızlıdır, bu da Common Lisp'in ne yaptığınızı gerçekten bilmediğinizde en iyi dil olduğu sonucuna varmamı sağladı. Dahası, yeniden düzenlemenin nerede başladığını düşünüyorsunuz?
David Thornley

1
neden böyle düşünüyorsunuz, örneğin javascript dinamik bir dildir, ancak Re-sharpper, C # ile aynı kaygan işi yapmaz. İkincisi, "dinamik diller işleri yapmak için daha yavaş" demedim.
Yusubov

IntelliJ IDEA - PyCharm - "Yeniden adlandırmayı yeniden adlandır, genel kod değişikliklerini güvenli ve anında gerçekleştirmenizi sağlar. Bir dosyadaki yerel değişiklikler yerinde gerçekleştirilir. Yeniden düzenleme işlemleri düz Python ve Django projelerinde çalışır. Alan / Sabit ve Satır İçi Yerel, bir yöntem içindeki kod yapısını geliştirmek için, Uzun yöntemleri ayıklamak için Ayıkla Yöntemi, Üst Sınıfı Ayıkla, Yukarı ve Aşağı, Yönlendir ve Taşı yöntem ve sınıfları taşıyın. " jetbrains.com/pycharm/features/index.html
igouy

@igouy, cevabımda Resharper ve JustCode'dan bahsediyorum. Böylece, atıfta bulunulan bağlam için doğrudur.
Yusubov
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.