Tipik “dinamik dil hatalarını” nasıl önleyebilirim?


42

Son zamanlarda JavaScript’e birkaç saat ayırdım, çünkü büyük kullanıcı tabanından yararlanmak istedim. Bunu yaparken çoğu insanın dinamik dillere atfedilen bir model fark ettim. İşlerin çok hızlı bir şekilde çalışmasını sağlarsınız, ancak kodunuz belirli bir boyuta ulaştığında, genel olarak yazım ve yazım hataları ile zaman harcarsınız. Bir derleyicinin beni normalden kurtardığı hatalar. Ve başka bir modülde yazım hatası yaptığımda mantıktaki hataları aramamı istemiyorum.

JavaScript'in ve dinamik olarak yazılmış diğer dillerin ardından inanılmaz olanları düşündüğümde, yaklaşımımda yanlış bir şey olduğuna inanmaya başladım. Yoksa bu sadece ödemen gereken bedel mi?

Daha kesin olarak söylemek gerekirse:

  • ~ 2000 LOC ile bir JavaScript'e (ya da bu konuda başka bir dinamik dile) olan projeye nasıl yaklaşıyorsunuz?
  • Bu hataları yapmamı engelleyen araçlar var mı? Facebook ve JSHint'ten gelen akışları denedim, bu biraz yardımcı oldu, ancak yazım hataları yakalamadı.

2
Maliyetleri azaltmak için yollar vardır rağmen orada olan maliyetler .
dcastro

29
Programınızı, Javascript'e derleyen, Typescript, Scala.js veya Elm gibi statik olarak yazılmış bir dilde yazmayı denerdim.
dcastro

6
test etme, test etme, daha fazla test etme ve kapsama alanı raporları.
njzk2

7
~ 2000 LOC küçük bir projedir. Dinamik bir dilin kolayca ve iyi olarak yaptığı şeye kolayca uyması gerekir. Bu türden bir projeyle mücadele ediyorsanız, programlama becerilerinizle ilgili olarak özellikle dinamik dillerle ilgili olan her şeyden daha temel bir sorun yaşarsınız.
Jack Aidley

5
@ JackAidley aynı fikirde değil. OP, bir tanımlayıcının doğru yazıldığından değil, üst düzey problemlere odaklanmak için kullanılır. Bu programlama becerisidir. Doğru yazımın yapılmasını sağlamak bir orta sınıf öğrencisi ve / veya takım desteği ile yapılabilir.
mucaho

Yanıtlar:


37

Özellikle JavaScript'ten bahsederken bunun yerine TypeScript kullanabilirsiniz . Bahsettiğiniz bazı şeyleri sunar. Web sitesinden alıntı:

Türler, JavaScript geliştiricilerin yüksek üretken geliştirme araçları ve JavaScript uygulamaları geliştirirken statik kontrol ve kod yeniden düzenleme gibi uygulamaları kullanmalarını sağlar.

Ve bu sadece JS'nin bir üst kümesidir, yani mevcut kodunuzun bir kısmı TS ile iyi çalışacaktır:

TypeScript, bugün milyonlarca JavaScript geliştiricisinin bildiği sözdiziminden ve anlambilimden başlar. Mevcut JavaScript kodunu kullanın, popüler JavaScript kitaplıklarını ekleyin ve TypeScript kodunu JavaScript'ten çağırın.


11
... ve TypeScript aslında Ecmascript 6’dır.
Robert Harvey,

11
Ah, bu teklif acıtıyor. Sadece Microsoft'un her zaman dinamik dilleri anlamayan statik bir dil şirketi olduğunu gösterir. "Türler etkin… kod yeniden düzenleme"? Gerçekten mi? Microsoft'un PR departmanı, uygulama olarak yeniden kodlamanın Smalltalk'te (dinamik bir dil) icat edildiğini ve bundan önce Forth'da (tipik olmayan bir dilde) bulunduğunun farkında mı? Statik diller bile önce ilk otomatik üstlenmeden aracı, bir Smalltalk IDE parçası olduğunu vardı IDE? Bu modern Smalltalk IDE'lerinde Java, C # ve C ++ kadar olmasa da en az güçlü yeniden yapılandırma araçları var mı? Hadi.
Jörg W Mittag

5
TypeScript kendi başına harika bir dil, neden bu kadar saçmalıklarla denemeyi denemek zorundasın?
Jörg W Mittag

29
@ Jörg yeterince Smalltalk bilmem ama gördük JavaScript veya Python I için her IDE mil Java veya C # için iyi bir IDE yapabileceklerini arkasında. Ayrıca, dinamik bir dilde yapılması gerçekten imkansız olan bazı şeyler var (gerçekten en popüler yeniden yapılanmalardan bazıları): Genel bir işleve sahip olduğunuzu foo(x) { return x.bar;}veya bunun gibi bir şey olduğunu söyleyin . Tip bilgisi olmadığından ve fonksiyon herkese açık olduğundan (tüm arayanları bilemezsiniz), bazı sınıfları yeniden adlandırmanız durumunda çubuğun baz olarak yeniden adlandırılıp değiştirilmeyeceğini çözmeniz imkansızdır.
Voo

10
Bu cevap, "dinamik dil hatalarına" çözümün dinamik bir dil kullanmak olmadığını söylüyor.
bgusach

19

Yardımcı olabilecek bazı yaklaşımlar var:

Birim testi

Mümkünse birim testleri yazınız. Yalnızca manuel testlere dayanmak ya da vahşi yaşamdaki hataları bulmak çok zor.

Çerçeveleri kullan

Kendinizinkini yuvarlamak ve hataların ortaya çıkmasını riske atmak yerine, mümkün olan yerlerde belirlenmiş çerçeveleri kullanın.

CSS / yüksek seviye dilleri tercih et

İşlevselliği CSS'e veya yazdığınız herhangi bir üst seviyedeki dile nasıl bırakabilirsiniz.

Elden Geçirme

Kod miktarını azaltmak için refactor. Daha az kod = işlerin ters gitmesi için daha az yer.

Yeniden

Var olan kodu tekrar kullanın. Kod tam bir eşleşme olmasa bile, yeni bir şeyler yazmak yerine kopyalamak, yapıştırmak ve değiştirmek daha iyi olabilir.

IDE

Modern IDE'ler genellikle en azından bazı Javascript desteğine sahiptir. Bazı metin editörleri ayrıca Javascript farkındadır.


5
Doğru olsa da, tavsiyen temelde her programlama dili için geçerli ve temelde dinamik dillerden kaynaklananlardan ziyade mantıksal hataları düzeltmeyi hedefliyor .
edmz

1
"tavsiyeniz her programlama diline temelde geçerlidir" . Çok doğru - hobi projelerinden, tam yağlı işletme çözümlerine giden viteslerden geçmeye benzer şekilde, artan miktarda striktür gerektirir, benzer şekilde - ne kadar Javascript yazılırsa, tekerlekler gitmezse ne kadar disipline ihtiyaç duyarsa hızla çıkmak. Eric Lippert bunu çok iyi anlatıyor.
Robbie Dee

4
"CSS / yüksek seviye dilleri tercih et" - Bu bitin JavaScript ile ilgili ne anlama geldiğini gerçekten anlamadım: Öğeleri (belki de animasyon gibi mi?) JS kodu yerine stil sayfalarına mı taşıyorsunuz? CSS'nin üst düzey dillerle ilişkisi nedir?
başka bir gün

@anotherdave Sık sık Javascript alanı olarak kullanılanların çoğu artık CSS3'te sağlanabilir. Bazı işlevler muhtemelen daha katı denetimlere tabi tutulacak daha yüksek bir dile de taşınabilir.
Robbie Dee

4
@anotherdave İnsanların JavaScript ile yapmaya çalıştıklarının çoğu yabancı ve uygunsuz. Standart dil araçları sağlayan kütüphaneler, standart HTML öğelerini çok daha fazlasını sağlayan çerçeveler, çapalar, MVC emülasyonu, stil oluşturma, DOM yeniden uygulama, AJAX soyutlama, önemsiz nesneler oluşturma (SVG'yi yeniden uygulama), çoklu doldurma özellikleri oluşturma gibi temel işlevleri yineleyen kod Kullanıcının yararına… Yazdığınız JS miktarını en aza indirmelisiniz. JS olmadan yapabilirsiniz, JS olmadan yapın.
bjb568

2

Henüz belirtilmeyen bir araç basit, dosya yerel veya proje çapında metin aramadır .

Kulağa basit geliyor, ancak bazı düzenli ifadeler eklediğinizde, temel olarak gelişmiş filtrelemeyi yapabilirsiniz; örneğin, belgelerde veya kaynak kodda bulunan kelimeleri arayın.

Bu benim için etkili bir araç oldu (statik analizörlerin yanı sıra) ve bence özellikle büyük olmayan 2k LOC proje büyüklüğünüzü vermesi umuduyla harikalar yaratmalı.


2
grepuzun bir yola gider. Çok tuhaf dinamik şeyler yapmazsanız hile yapar. Ancak, statik yazılan diller için IDE'lere alıştıysanız çok el ile hissediyor.
bgusach

1

Şu anda büyük bir AngularJS projesinde birkaç bin kod satırını yeniden düzenliyorum. En büyük zorluklardan biri, verilen bir işlevin kesin sözleşmesini çözmektir. Bazen API belgelerini okudum, çünkü ham API yanıtının öğeleri, değiştirilmeden önce 6 kod katmanından geçen ve 6 kod katmanından daha sonra gelen değişkenlere atandı.

İlk tavsiyem sözleşme ile tasarlamaktır . Özel girdiler alın, özel çıktılar üretin, yan etkilerden kaçının ve TypeScript veya en azından JSDoc kullanarak bu beklentileri belgeleyin.

İkinci tavsiyem mümkün olduğunca çok sayıda kontrol uygulamaktır. AirBnB standardını takip ediyoruz ve tüm kod tabanımızda eslint kullanıyoruz. Taahhüt kancaları her zaman standarda uyduğumuzu doğrular. Doğal olarak, bir birim batarya ve kabul testlerine sahibiz ve tüm taahhütler bir akran tarafından gözden geçirilmelidir.

Bir metin düzenleyiciden (Sublime Text) uygun bir IDE'ye (WebStorm) geçmek de genel olarak kodla çalışmayı çok kolaylaştırdı. WebStorm, JSDoc'u beklenen parametre tipleri hakkında ipucu vermek ve yanlış tipi tedarik etmek ya da bir dönüş değerini yanlış şekilde kullanmak durumunda hatayı artırmak için kullanır.

JavaScript'te, semboller ve alıcı / ayarlayıcılar gibi yeni özellikler değişken atamaya iddialar ekleyerek belirli bir kalite seviyesinin uygulanmasına yardımcı olabilir (örneğin, tamsayının aralık dahilinde olduğundan veya veri nesnesinin belirli özelliklere sahip olduğundan emin olun).

Ne yazık ki, dinamik dil hatalarını önlemek için doğru bir çözüm olduğunu düşünmüyorum, sadece sıklıklarını azaltmaya yardımcı olabilecek bir dizi önlem olduğunu düşünüyorum.


0

“2000 LOC ile bir JavaScript'e (veya bu konuda başka herhangi bir dinamik dile)” projesine nasıl yaklaşıyorsunuz?

PDF form uygulamaları geliştiriyorum. JavaScript yazılım geliştirme projeme (kaynak kodun boyutuna bakmaksızın) Petri'nin net unsurlarını ve ek açıklamalarını kullanarak yaklaşıyorum. Yöntem, herhangi bir programlama dili teknolojisine bağlı değildir. Bu nedenle diğer “programlama dilleri” için kullanılabilir.

Uygulama mantığının bir diyagramını oluşturuyorum. Diyagramı düzensiz tutmak için Ek açıklamalarımın çoğunu diyagramla birlikte kullandığım bir forma ekliyorum. Formdaki girişler özelliklere veya işlevlere referanslar içerir. Daha sonra şemadaki bilgilere ve formdaki girişlere dayanarak kaynak kodunu yazarım. Yöntem sistematiktir, çünkü yazılan her kaynak kod doğrudan diyagramdan ve formdaki girişlerden eşlenir. Kaynak kodu kolayca kontrol edilebilir, çünkü kodu yazarken adlandırma ve kodlama kurallarını da takip ediyorum.

Örneğin, tüm fonksiyonların prototip olduğu bir kural seçtim. Performans bir sorun haline gelirse, yapıcıdaki işlevleri bildirerek iyileştirilebilir. Bazı özellikler için dizileri kullanıyorum. Yine performans bir sorun haline gelirse, doğrudan referanslar kullanılarak iyileştirilebilir.

Ayrıca eval kullanıyorum. Bu, kaynak kodunun boyutunu büyük ölçüde azaltabilir. Performans sorunları nedeniyle, başvurumun başlangıcında veya ilklendirme bölümünde eval kullanıyorum; Asla “çalışma zamanı mantığında” kullanmıyorum - bu benim takip ettiğim başka bir kodlama kuralı.

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.