Statik dilleri kullanan bir programcı Javascript takım eksikliği ile nasıl başa çıkıyor?


28

Dereceli olarak sadece derlenmiş dillerde, özellikle de Java'da, kariyerimin çoğu için programladım. Java ile ilgili en sevdiğim şeylerden biri Eclipse gibi araçları kullanırken ne kadar üretken olabileceğiniz ve gerçekte ne kadar az kod yazmanız gerektiğidir.

Yapabilirsin:

  • Yöntemlerinizi ve sınıflarınızı kolayca ve otomatik olarak yeniden düzenleyin
  • Bir yöntemin çağrıldığı ya da bir sabitin kullanıldığı tüm yerleri anında görüntüleyin (Açık Çağrı Hiyerarşisi / Referansları Göster)
  • Statik yazım, bir nesnede kullanılabilen tüm parametreleri / işlevleri göstermek için kod tamamlamayı kullanabileceğiniz anlamına gelir
  • Doğrudan tanımına geçmek için bir işlev / üye / sınıf adına Control-tıklayın

Bütün bu olanaklar, IDE'nin en iyi arkadaşım gibi hissetmemi sağlıyor. Java kodu yazmak ve özellikle diğer insanların programlarını anlamak çok daha kolay hale geliyor.

Ancak, Javascript'i kullanmaya gittikçe daha fazla çağrı yapıyorum ve şu ana kadarki deneyimim oldukça olumsuzdu.

Özellikle:

  • Bir işlevin giriş noktasını bulmanın hemen bir yolu yok (düz bir metin araması dışında, bu, daha sonra, nereden başladığınızı unuttuğunuzun üç veya üçünden sonra arama hiyerarşisini daha ileriye götüren yöntemler için daha sonra yapılan aramalarla sonuçlanabilir)

  • Parametreler, bu parametrede hangi özelliklerin ve işlevlerin kullanılabilir olduğunu bilmenin hiçbir yolu olmadan, işlevlere iletilir (aslında programı çalıştırmak, işlevin çağrıldığı noktaya gitmek ve tüm özellikleri çıkarmak için console.logs kullanmak). mevcut)

  • Anonim işlevlerin sıkça kullanılması, geri dönüşler olarak kullanılır; bu, sıklıkla hızlı bir şekilde dolaşamayacağınız kafa karıştırıcı kod yolları spagettiğine yol açar.

  • Ve elbette, JSLint çalışma zamanından önce bazı hatalar yakalar, ancak bu bile doğrudan tarayıcınızda kodunuzun altında kırmızı dalgalı çizgiler olması kadar kullanışlı değildir.

Sonuç olarak, tüm programın her zaman kafanızda olması gerekir. Bu, karmaşık programlar yazmak için bilişsel yükü büyük ölçüde arttırır. Ve endişelenecek tüm bu ekstra şeyler beynimde gerçek yaratıcılık ve problem çözme için daha az yer bırakıyor.

Tabii ki, bir bütün resmi sınıf tanımını yazmak yerine bir nesneyi birlikte atmak daha hızlıdır. Ancak programlar biraz daha kolay ve daha çabuk yazılabilir olsa da, benim deneyimime göre okumak ve hata ayıklamak çok daha zor.

Sorum şu, diğer programcılar bu sorunlarla nasıl başa çıkıyor? Javascript, popülaritesinde açıkça artıyor ve okuduğum bloglar umutsuzca bu sorunlara çözüm bulmaya çalışmak yerine, insanların ne kadar üretken olduklarıyla ilgili.

GWT, Java’da Javascript ortamı için kod yazmanıza izin verir, ancak beklediğim kadar yaygın bir şekilde kullanılmıyor gibi görünmektedir; insanlar aslında Javascript'i karmaşık programlar için tercih ediyorlar.

Neyi kaçırıyorum?


8
JS ile zor zaman geçiren tüm Java geliştiricilerine tavsiyem, C tabanlı bir sözdizimi olmayan başka bir dil öğrenmek. JS'ye geri döndüğünüzde, sözdizimi benzerliğini aşmanıza yardımcı olacak ve tüm kodları ve yollarını yazmanın tek ve doğru yollarını görmek yerine, şeyleri dil tasarımındaki değişimler açısından incelemeye yardımcı olabilir. başka herkes yanlış anladı. Ve bir UI çerçevesi yazma fikrini alırsanız, lütfen bize ipucu vermeden CTO'lara pazarlanması ucuza kolay olan başka bir şişirilmiş sınıf basamaklı çöp parçasıyla eyleme geçmeden önce JavaScript'i öğrenin.
Erik Reppen

5
Dostum 2 yıl önce bana bir züppe oldu. Java’ya son zamanlarda daha fazla çarptığım için şimdi biraz daha yardımcı olmaya çalışacağım. IDE? Jetbrains Webstorm'a göz atın (hala Scite kullanıyorum ama WS fena değil), ancak istemci tarafı web için Chrome'un geliştirme araçları hata ayıklama konusunda oldukça iyi bir iş çıkarıyor ve gerçekte en küçük parçalarını yazarken otomatik olarak tamamlanıyor Konsoldaki kodu Ayrıca, OOP hakkında düşünmek için çok zaman harcayın. IMO, isteğe bağlı olmayan sınıflar ve insan okunabilirliğinin yerine geçen IDE'ler, bir çok Java'da OOP'un bütün noktasını kesinlikle öldürdü.
Erik,

2
Acını hissediyorum. Javascript'e bırakılması, müşteri tarafında assembly diline bırakmanın web sürümüdür. Kesinlikle eğlenceli olabilir, ancak araç setleri zayıftır ve verimlilik yapmanız gereken tüm ek işlerle kesinlikle düşer. Yine de programlamada hayat bu. Her şey en üst düzeydeki soyutlama ile yapılmaz. :-)
Brian Knoblauch

2
@ErikReppen Bir Java geliştiricisi olarak başladım ama Ruby, Delphi, C ++, C #, Prolog, PHP, bash programlanan Obj-C konusunda akıcıyım ve hala en çok javascript'i okuyan ve yöneten buluyorum.
Sulthan

2
TypeScript'e bir göz atın. Kullanmaya başladığımda, müşteri tarafı kodlamayı çok daha verimli ve eğlenceli buluyorum. Doğru intellisense ve erken derleyici uyarıları yenmek zor.
Evgeni

Yanıtlar:


22

IDE tabanlı nişler, javascript gibi dinamik bir dilde * bulunmaz. Onlarsız yapmayı öğrenmek zorundasın. Takım desteğini daha iyi tasarımla değiştirmeniz gerekecektir.

Bir modül kalıbı kullanın - elle veya bir şey gerektiren bir araçla . Modülleri küçük tutun, böylece kolayca anlaşabilirsiniz.

Çok fazla tip tanımlamayın - görüşme noktasına yakın oluşturulan anonim nesneleri kullanın. Sonra arayanı ve arayanı inceleyebilir ve neler olduğunu bilirsiniz.

Kodunuzu DOM ile eşleştirmekten kaçının - Kodunuzda yaptığınız DOM işleme miktarını sınırlandırmayı deneyin. Seçicilerden veya jQuery koleksiyonlarından geçebilirseniz, kodunuzu sayfa yapısı hakkında bilmek yerine bunu yapın.

* Popüler bir kütüphane kullanıyorsanız, sahte otomatik tamamlama özelliği elde edebilirsiniz ancak bu, "bu nesnenin hangi özelliklere sahip olduğu" özelliklerinden çok, "tüm jquery yöntemlerini göster" gibidir. Yazmadan tasarruf sağlar, ancak doğruluk garantisi vermez.


Bunu, takım eksikliği ile nasıl başa çıkılacağı konusunda yapıcı tavsiye için kabul etmek.
funkybro 28:11

3
"Onlarsız yapmayı öğrenmek zorundasın." YA DA javascript üreten ve uygun araçlara sahip olan üst düzey bir dil kullanın.
Den

@Den: Gelişmiş araçlar ile üst seviye bir dil önerin var mı? Tecrübelerime göre popüler diller için gelişmiş araçlar üretildi. Javascript'i oluşturan hangi üst düzey dil bu tür araçlara sahip olacak kadar popüler?
Sean McMillan

1
@SeanMcMillan: Bazı .NET (C # / F #) örnekleri jsil.org , projects.nikhilk.net/ScriptSharp , sharpkit.net , websharper.com
Den

1
@SeanMcMillan Java ayrıca, bkz. GWT developers.google.com/web-toolkit
funkybro

24

Son zamanlarda bazı iyi, kötü ama çoğunlukla çirkin Java ile truding yaptığım ve Java ve Java devs vs JS hakkında genel olarak aşırı genelleştirmelerden oluşan yepyeni bir dolgunluğa sahip olduğum için bu soruya bir cevap eklemek istiyorum. JS, aslında faydalı gerçeğe belli belirsiz benzeyen bir şeye dayanıyor olabilir.

IDE'ler Var Ama Niçin Fazla Olmadığını Anlamak Yararlı Olabilir

Ben şimdi Webstorm'u deniyorum, kendimi Düğüm geliştirmeye çekiyordum ve gerçekten de satın almam yeterince kötü değil ama hala js dosyalarını Scite'de WS'den daha sık açma eğilimindeyim. Bunun nedeni, JS'de çok daha azıyla çok daha fazlasını yapabilmenizdir ancak UI çalışması anında geri bildirimde bulunduğundan, tarayıcı araçları (özellikle Chrome ve Firebug) gerçekten mükemmeldir ve (tarayıcı dışı bağlamlar için muhasebe) ) değiştirilmiş kodun tekrar çalıştırılması derleme adımına gerek kalmadan hızlı ve kolaydır.

Oldukça ikna olduğum bir diğer şey de, IDE'lerin JavaScript'te gerçekten göze alamayacağınız özensiz kodları etkinleştirerek temelde kendi taleplerini yaratmalarıdır. JS'de nasıl yönettiğimizi öğrenmek ister misiniz? Bir IDE'siz Java'da önemsiz olmayan bir şeyler yazmaya çalışarak başlamak ve bir IDE'siz hareket etmeden bu kodu sürdürmek / değiştirmek için yapmak ve düşünmek zorunda olduğunuz şeylere yakından dikkat etmek yardımcı olabilir. iletin. IMO, aynı şeyleri bir IDE olsun veya olmasın, bakımı yapılabilir kod yazmak için hala çok önemlidir. 4 yıllık bir programlama müfredatı yazmak zorunda kalsaydım, ilk iki yıl için bükülmüş alet ve bağımlılık alamaması için bir IDE'ye dokunmanıza izin vermezdi.

yapı

Karmaşık uygulamalarla uğraşan deneyimli JS dev'leri kodlarını yapılandırabilir ve yapabilir. Aslında, bizim için kodu okumak için IDE'lerin bulunmadığı erken bir tarihte daha iyi olma eğiliminde olduğumuz, ancak aynı zamanda güçlü biçimde ifade eden dillerin, düşünceli bir şekilde kodlamadığınız takdirde, tamamen sürdürülemez felaket kodlarını çok hızlı bir şekilde ifade edebildikleri için daha iyi olma eğiliminde olduğumuz bir şey.

Aslında son zamanlarda Java kod temeli- mizi anlamada oldukça dik bir öğrenme eğrisi yaşadım ve sonunda hiçbirinin uygun OOP olmadığını fark ettim. Sınıflar, çekirdeklerde veya DTO'larda veya statik alıcılar / ayarlayıcılarda yer alan küresel olarak mevcut verileri değiştiren gevşek bağlantılı yöntemlerden başka bir şey değildi. Temel olarak OOP'un değiştirmesi gereken eski canavardı. Bu yüzden temelde kod hakkında bakmak ve düşünmek durdu. Kısayol tuşlarını yeni öğrendim ve dağınıklıkları takip ettim ve her şey çok daha sorunsuz geçti. Zaten alışkanlıkta değilseniz, OOD hakkında çok daha fazla düşünün.

En üst düzeyde iyi yapılandırılmış bir JS uygulaması, karmaşık işlevlerden (örneğin, jQuery) ve birbiriyle etkileşime giren nesnelerden oluşma eğiliminde olacaktır. Herhangi bir dilde iyi yapılandırılmış, kolayca tutulan bir uygulamanın işaretinin, bir IDE veya Notepad ++ ile bakıp bakmamanın tamamen okunaklı olduğunu savunuyorum. Bağımlılık enjeksiyonu ve testte ilk TDD'yi aşırı derecede kritik bir şekilde eleştirmemin temel sebeplerinden biri budur.

Ve nihayet dersleri bırak. Prototip kalıtımını öğrenir. Miras almanız gerektiğinde uygulanması oldukça kolaydır. Bununla birlikte, kompozisyon yaklaşımlarının JS'de çok daha iyi çalışma eğilimi gösterdiğini düşünüyorum, ancak kişisel olarak hastalanmaya başladım ve herhangi bir dilde bir veya iki kalıtım seviyesinden daha fazla kalıtım gördüğümde EXTJS gece terörlerine maruz kaldım.

İlk Temel İlkeler

Diğer tüm iyi uygulamaların çıkarması gereken temel konulardan bahsediyorum: DRY, YAGNI, en az şaşkınlık ilkesi, sorunlu alanların temiz bir şekilde ayrılması, bir arayüze yazma ve okunaklı kod yazma benim kişisel çekirdeğim. Bu uygulamaların terk edilmesini savunan biraz daha karmaşık olan herhangi bir şey, herhangi bir dilde Kool Aid olarak düşünülmelidir, fakat özellikle bir sonraki adam için kafa karıştırıcı bir kod mirası bırakmanın çok kolay olduğu JavaScript gibi bir dilde olmalıdır. Örneğin gevşek kavrama, nesneler arasındaki etkileşimin nerede olduğunu bile söyleyemediğiniz kadar uzağa götürene kadar harika şeylerdir.

Dinamik Yazma Korkma

JavaScript'te çok fazla çekirdek türü yok. Çoğunlukla, dinamik döküm kuralları pratik ve açıktır, ancak bunları öğrenmek için ücret öder; böylece gereksiz akışlar ve anlamsız doğrulama rutinleri olmadan veri akışını yönetmeyi daha iyi öğrenebilirsiniz. Güven Bana. Sıkı tipler, performans ve derleme problemlerini tespit etmek için mükemmeldir ancak sizi hiçbir şeyden korumazlar.

JS İşlevleri ve Kapanışları Çıkmazını Öğrenin

JS'nin birinci sınıf işlevleri, tartışmasız temel olarak JS'nin "Müşteri Tarafı Web'e Ödülle Tek Dokunuşa Değer" dilini kazandırmasının temel nedenidir. Ve evet, aslında rekabet vardı. Aynı zamanda JS'nin merkezi bir özelliğidir. Onlarla nesneler inşa ediyoruz. Her şey fonksiyonlarla ilgilidir. Ve kullanışlı özelliklere sahipler. Parametreleri arguments anahtar sözcüğü ile inceleyebiliriz. Bunları geçici olarak başka nesnelerin yöntemleri olma bağlamında ekleyebilir ve ateşleyebiliriz. Ve olay odaklı yaklaşımları müstehcen şekilde uygulanması kolay hale getiriyor. Kısacası, JS'yi kaynağın karmaşıklığını azaltmada ve JS'nin (ancak çoğunlukla DOM API'sinin) farklı uygulamalarını kaynakta uyarlarken mutlak bir canavar yaptılar.

Kabul Etmeden Önce Kalıpları / Uygulamaları Yeniden Değerlendirin

Birinci sınıf fonksiyonlar ve dinamik tipler, JS'de tamamen karmaşık ve hantal olan daha karmaşık tasarım desenlerinin çoğunu oluşturur. Bununla birlikte, daha basit kalıpların bazıları, verilen JS'nin oldukça esnek yapısını uygulamak için inanılmaz derecede faydalı ve uygulaması kolaydır. Adaptörler ve dekoratörler özellikle kullanışlıdır ve oluşturdukları kullanıcı arayüzü öğeleri için etkinlik yöneticileri olarak da çalışan karmaşık kullanıcı arayüzü fabrikaları için singleton'ları faydalı buldum.

Dilin Liderini Takip Edin ve Daha Azıyla Daha Çok Şey Yapın

Java kafa honcho'larından birinin, herhangi bir yerde ayrıntıların tüm taraflar için kodun anlaşılmasını kolaylaştıran olumlu bir özellik olduğu iddiasını bir yere getirdiğine inanıyorum. Hogwash. Bu doğru olsaydı, hukukçu okumak daha kolay olurdu. Sadece yazar yazdıklarını daha kolay anlaşılır hale getirebilir ve bunu sadece kendini başkalarının yerine koyarken yapabilirsin. Öyleyse bu iki kuralı benimseyin. 1. Mümkün olduğunca doğrudan ve açık olun. 2. Şimdiden lanet noktaya gelin. Kazanç, temiz, özlü kodun, tetikleyiciden gerçek istenen eyleme ulaşmak için yirmi beş katı geçmeniz gereken bir şeyden daha kolay anlaşılması ve sürdürülmesidir. Bu tür şeyleri daha katı dillerde savunan çoğu model, aslında JavaScript'in sahip olmadığı sınırlamalar için geçici çözümlerdir.

Herşey Dövülebilir ve Bu Tamam

JS muhtemelen popüler kullanımdaki en az korumacı dillerden biridir. Onu kucakla. İyi çalışıyor. Örneğin, bir yapıcı işlevinde normal değişkenler bildirerek erişilemeyen kalıcı "özel" değişkenlere sahip nesneler yazabilirsiniz ve bunu sık sık yapıyorum. Ancak, kodumu veya kullanıcılarını "kendisinden" korumak zorunda değiller (çalışma zamanı boyunca sadece kendi sürümleriyle değiştirebiliyorlardı). Ama bunun yerine niyetin işaret etmesidir, çünkü varsayım, diğer adamın herhangi bir bağımlılığı çözmek istemeyecek kadar yetkin olduğu ve belki de doğrudan iyi bir sebepten doğrudan elde etmek istemediğinizi göreceğidir.

Boyut Sınırı Yok, Yalnızca Sorunlu Etki Alanları

Gördüğüm tüm Java kod tabanlarında karşılaştığım en büyük sorun, sınıf dosyalarının çoğalmasıdır. Her şeyden önce SOLID, OOP hakkında zaten bilmeniz gerekenlerin kafa karıştırıcı bir tekrarıdır. Bir sınıf, belirli bir dizi ilgili problemi ele almalıdır. Tek bir yöntemle ilgili bir sorun değil. Bu sadece eski eski func-spagetti C kodunu, sadece önyükleme yapmak için bütün anlamsız sınıf sözdizimlerinin eklenmesiyle alıyor. Boyut veya yöntem sınırı yoktur. Zaten uzun bir işleve veya sınıfa ya da yapıcıya bir şey eklemek mantıklıysa, mantıklı olur. JQuery'i al. Tek bir fonksiyondaki bütün bir kütüphane uzunluğu araç setidir ve bunda yanlış bir şey yoktur. JQuery'e hala ihtiyacımız var mı, makul bir tartışmaya bağlı, ancak tasarım açısından.

Eğer Java Hepiniz Biliyorsanız, C Tabanlı Olmayan Sözdizimi Olan Bir Şeyde Dabble

Python ile uğraşmaya başladığımda, çünkü Django hakkında duyduğum şeyi sevdim, sözdizimini dil tasarımından ayırmaya başladım. Sonuç olarak, Java ve C'yi, aynı sözdizimiyle farklı yaptıkları şeylerden ziyade, dil tasarım bölümlerinin toplamı olarak anlamak kolaylaştı. Güzel bir yan etki, tasarım açısından diğer dilleri ne kadar iyi anlarsanız, kontrast yoluyla en iyi bildiğiniz dillerin güçlü / zayıf yönlerini o kadar iyi anlarsınız.

Sonuç

Şimdi, bunların hepsini göz önünde bulundurarak, tüm problemlerinize değinelim:

  • Bir işlevin giriş noktasını bulmanın hemen bir yolu yok (düz bir metin araması dışında, bu, daha sonra, nereden başladığınızı unuttuğunuzun üç veya üçünden sonra arama hiyerarşisini daha ileriye götüren yöntemler için daha sonra yapılan aramalarla sonuçlanabilir)

Chrome ve Firebug aslında arama izlemeye sahip. Ama aynı zamanda yapı ve noktaların özlü ve doğrudan tutulması konusundaki puanlarıma da bakın. Uygulamanızı birbiriyle etkileşime giren daha iyi kapsüllenmiş yapılar olarak ne kadar çok düşünürseniz, işler ters gittiğinde kimin suçu olduğunu bulmak o kadar kolay olur. Bunun Java için de geçerli olduğunu söyleyebilirim. Geleneksel OOP endişeleri için kusursuz bir şekilde hizmet verebilecek sınıf benzeri işlev yapıcılarımız var.

function ObjectConstructor(){
    //No need for an init method.
    //Just pass in params and do stuff inside for instantiation behavior

    var privateAndPersistent = true;

    //I like to take advantage of function hoisting for a nice concise interface listing
    this.publicAndPointlessEncapsulationMurderingGetterSetter
    = publicAndPointlessEncapsulationMurderingGetterSetter;
    //Seriously though Java/C# folks, stop with the pointless getter/setters already

    function publicAndPointlessEncapsulationMurderingGetterSetter(arg){
        if(arg === undefined){
            return privateAndPersistent;
        }
        privateAndPersistent = arg;
    }

}

ObjectConstructor.staticLikeNonInstanceProperty = true;

var instance = new ObjectConstructor();//Convention is to  capitalize constructors

Kodumda {}, neredeyse hiçbir zaman nesne değişmezlerini yapısal uygulama bileşenleri olarak kullanmam çünkü içsel (özel) değişkenlere sahip olamazlar ve bunun yerine veri yapıları olarak kullanılmak üzere ayrılmayı tercih ederler. Bu, niyetin netliğini koruyan bir beklentinin belirlenmesine yardımcı olur. (Eğer eğrileri görürseniz, bu uygulama mimarisinin bir bileşeni değil, verileridir).

  • Parametreler, bu parametrede hangi özelliklerin ve işlevlerin kullanılabilir olduğunu bilmenin hiçbir yolu olmadan, işlevlere iletilir (aslında programı çalıştırmak, işlevin çağrıldığı noktaya gitmek ve tüm özellikleri çıkarmak için console.logs kullanmak). mevcut)

Yine, modern tarayıcı araçlarına bakın. Ancak, programı tekrar çalıştırmak neden bu kadar sersem? Yeniden yükle, bir istemci tarafı web dev genellikle birkaç dakikada bir vurur, çünkü size kesinlikle yapacak hiçbir şey yapmaz. Yine bu, uygulama yapısının yardımcı olabileceği bir başka nokta ancak sözleşmeleri yürürlüğe sokmak için kendi validasyonunuzu uygulamanız gereken JS'nin aşağı yönlü bir taklididir (sadece kod tabanımın maruz kaldığı uç noktalarda yaptığım bir şey) kontrol etmeyin). IMO, tradeoff'un faydalarına değer.

  • Anonim işlevlerin sıkça kullanılması, geri dönüşler olarak kullanılır; bu, sıklıkla hızlı bir şekilde dolaşamayacağınız kafa karıştırıcı kod yolları spagettiğine yol açar.

Evet önemsiz olmayan her şeyde kötü. Yapma bunu. İşlevlerinize çocuklar verin. Bir şeyleri izlemek de daha kolay. Aşağıdakiler ile aynı çizgide tanımlayabilir, değerlendirebilir (atamanız gerekir) ve basit bir önemsiz işlev atayabilirsiniz:

doSomethingWithCallback( (function callBack(){}) );

Artık, çağrıları takip ederken Chrome'un sizin için bir adı olacak. Önemsiz olmayan işlev için onu aramanın dışında tanımlarım. Ayrıca, bir değişkene atanan tek işlevli fonksiyonların hala adsız olduğunu unutmayın.

  • Ve elbette, JSLint çalışma zamanından önce bazı hatalar yakalar, ancak bu bile doğrudan tarayıcınızda kodunuzun altında kırmızı dalgalı çizgiler olması kadar kullanışlı değildir.

Ben asla eşyalara dokunmam. Crockford topluluğa bazı iyi şeyler verdi, ancak JSLint çizgiyi stilistik tercihlere dönüştürüyor ve JavaScript'in bazı unsurlarını IMO'nun özellikle iyi bir nedenden ötürü kötü parçaları olduğunu öne sürüyor. RegEx ve negatif sınıfları ile ilgili bir şeyi kesinlikle * veya + ile yok sayın. Joker karakterler daha düşük performans gösteriyor ve tekrarlamayı {} ile kolayca sınırlandırabilirsiniz. Ayrıca, fonksiyon yapıcıları hakkında söylediği her şeyi görmezden gelin. Yeni anahtar kelime sizi rahatsız ediyorsa, bunları kolayca bir fabrika fonksiyonuna sartabilirsiniz. CSSLint (Crockford'ın değil) kötü tavsiye cephesinde bile daha kötü. Her zaman çok fazla konuşma yapan insanlara tuz ekin al. Bazen yemin ederim ki sadece otorite kurmaya ya da yeni malzemeler üretmeye çalışıyorlar.

Ve yine, bu çalışma zamanı kaygınızla öğrendiklerinizi öğrenmelisiniz. (Çok fazla Java / C # devs ile karşılaştığım yaygın bir durum.) Çalışma zamanında hataları görmek hala 2 yıl sonra sizi rahatsız ediyorsa, oturmanızı ve istenmeyen bir tarayıcıyı batıncaya kadar yeniden yüklemenizi istiyorum. derleme zamanı / çalışma zamanı bölünmesi yok (yine de görünmez olanı değil - JS şimdi JIT'de çalışıyor). Çalışma zamanında hataları keşfetmek sadece sorun değil, aldığınız her durma noktasındaki böcekleri yeniden yüklemek ve bu kadar ucuz ve kolay bir şekilde spam yüklemek için oldukça faydalıdır.

Ve şu Chrome geliştirme araçlarını kırmaya çalış. Doğrudan web kitinde yerleşikler. Chrome'da sağ tıklayın. Elemanı inceleyin. Sekmeleri keşfedin. Konsoldaki kodu çalışma süresi boyunca değiştirebilme yeteneğine sahip çok sayıda hata ayıklama gücü, en güçlü ancak daha az belirgin olan seçeneklerden biri. Test için de harika.

İlgili bir notta, hatalar arkadaşlarınızdır. Asla boş bir yakalama ifadesi yazma. JS biz değil hide yapmak veya hataları gömmek (ya da en azından biz olmamalı öksürük YUI / öksürük ). Onlara katılıyoruz. Daha az bir şey hata ayıklama ağrısına neden olur. Ve üretimdeki olası hataları gizlemek için bir catch deyimi yazarsanız, en azından hatayı sessizce kaydedin ve günlüğe nasıl erişileceğini belgeleyin.


3
Cevabın boyutu için upvoting ...
Florian Margaine

5

Söyleyeceğin şey, JavaScript'i inceleyen Java fikirli bir kişinin yalnızca sıkıntısı.

İlk önce sorunuza cevap verelim ...

... sorum şu, diğer programcılar bu sorunlarla nasıl başa çıkıyor ?

Cevap: Yapmazlar. Java felsefesini önce Java kültünden vazgeçerek öğrenirler.

Bu öncülü anlamalısın ... JavaScript Java değil. Bu sadece sözdizimi ile ilgili değil - daha çok felsefe ile ilgili.

Şimdi bazılarını alalım ...

  • Bir yöntemin çağrıldığı ya da bir sabitin kullanıldığı tüm yerleri anında görüntüleyin (Açık Çağrı Hiyerarşisi / Referansları Göster)

    Doğrudan tanımına geçmek için bir işlev / üye / sınıf adına Control-tıklayın

    Bunların hepsi mevcut - iyi bir IDE seçin.

  • Statik yazım, bir nesnede kullanılabilen tüm parametreleri / işlevleri göstermek için kod tamamlamayı kullanabileceğiniz anlamına gelir

    Bu başa çıkacağın bir problem değil . Bu programlama konusundaki görüşünüzü değiştirmenizi gerektiren bir şeydir. Gevşek tip sistem, JavaScript'in güçlü yönlerinden biridir. Gevşek yazmayı anlama - ve takdir etmeyi öğren. Ayrıca, kod tamamlama JS ile çok iyi çalışır.

  • Ve elbette, JSLint çalışma zamanından önce bazı hatalar yakalar, ancak bu bile doğrudan tarayıcınızda kodunuzun altında kırmızı dalgalı çizgiler olması kadar kullanışlı değildir.

    Firebug, Chrome / Safari konsolu ve hatta IDE'ler hepsini ve DAHA FAZLASI yapar.

    Java programcılarının alıştığı şık statik analizleri yapabilen JSHint vardır.

  • Sonuç olarak, tüm programın her zaman kafanızda olması gerekir. Bu, karmaşık programlar yazmak için bilişsel yükü büyük ölçüde arttırır.

    Yanlış! Aksine, JavaScript "hafif" bir programlama dilidir - ve daha basit programlara sahip olmanızı teşvik eder. Doug Crockford'un dediği gibi ... JavaScript'te ağır model tabanlı programlar yazmaya çalıştıysanız, sizi "cezalandırır".

  • programlar yazmak biraz daha kolay ve daha çabuk olsa da, benim deneyimime göre okumak ve hata ayıklamak çok daha zor.

    Tamamen yanlış! Programlama diline dayalı okunabilirliğe nasıl karar veriyorsunuz? Programlar okunabilir (ya da değil) - diller değil. Ayrıca, JavaScript'in harika hata ayıklayıcıları var.

Kusura bakma, biraz kaba bir ses çıkardıysam - ama gerçek şu ki, JavaScript'i anlamak için Java konumunuzu değiştirmelisiniz .

Yalnızca "olgun" Java programcıları JavaScript’i takdir edebilir - ve beğenmediğiniz bir konuda ustalaşamazsınız. Yine düpedüz kör olduğum için üzgünüm.


2
"Doğrudan tanımına gitmek için bir işlev / üye / sınıf adını kontrol ederek tıklatabildiğim" bir JavaScript IDE örneği var mı? Eclipse'i Java ve Scala için kullanıyorum ancak JavaScript için iyi bir IDE / Editör yok.
Jonas

11
Bazı eleştiriler almaya hazırlanan, ancak bazı şeyler burada yanlıştır. Eğer bir nesne yaratıp sonra bir fonksiyona geçirirsem, parametreye ctrl-tıklayıp özelliklerini görüntüleyebilir miyim? Hayır yapamam, çünkü nesne herhangi bir şey olabilir. Eğer nesne özellik isimlerinden birini yanlış yazarsam, beni uyaracak mı? Hayır olmaz, çünkü JS'de bir hata değildir, muhtemelen hiç bir zaman istediğinizde olmamasına rağmen. Yararlı kod tamamlama mümkün değildir. Bir işlevin parametresinin hangi özelliklere sahip olduğunu bulmak, nesnenin nerede oluşturulduğunu bulmak için işlevin çağrıldığı kod aracılığıyla yazılmayı içerir.
funkybro 27:11

3
JS'nin inşa edilmesinin IDE'lerin sizin için kodlamasını zorlaştırdığından şikayet edebilirsiniz. Java’da, sadece istediğim herhangi bir şeyi lanetlemek veya tüm çalışma sırasında nesneler üzerinde iç gözlem yapmak için dinamik özellikleri yapıştıramadığımdan şikayet edeceğim. İki dil felsefede çok farklı. Java ile JS devs arasında JS ve diğer dillerin çoğundan daha büyük bir bağlantı kopmasına neden olacak şekilde düşünüyorum. Şahsen C'yi uyarlamak için Java'dan daha kolay buluyorum ve şişirilmiş bir IDE ile çalışmaktan çekiniyorum.
Erik,

2
Google’ın Java geliştiricileri bile JS yazarken başlarını Java’dan çıkaramıyor gibi görünüyor. sitepoint.com/google-closure-how-not-to-write-javascript
Erik Reppen

3
Yazıyorsunuz: JavaScript Java değil ve JavaScript'i anlamak için Java konumunuzu değiştirmeniz gerekiyor : Sadece "olgun" Java programcıları JavaScript'i değerlendirebilir ... Bu yüzden Javascript'i anlamak için önce Java'yı ustalaştırmalıyım, sonra hepsini unutmalıyım o?
Caleb

3

Genel olarak, dinamik bir dil için bahsettiğiniz araçlara sahip olmak zordur (IDE çalışma zamanının bir parçası değilse - yani Smalltalk). Bunu söyledikten sonra, gerçekten iyi bir metin editörü öğrendikten sonra, çoğu IDE daha az çekici görünüyor - en azından benim deneyimim.


2

Kötü yazılmış dilleri kullanmak için ödediğimiz bedel budur. Kişi yalnızca bu kötü muamelenin neden bu kadar popüler hale geldiğini merak edebilir. Dezavantajları, kötü yazılmış dillerin avantajlarından çok daha ağır basar.

Belki de işbirliği yapmama ilkesini ortadan kaldırmak için bu önemsizliğe uygulamalıyız.


3
"kötü yazılmış diller" - Birçok programcı size katılmıyor.
Sean McMillan

7
+1, Javascript'in popüler olmasının tek nedeni, doğru zamanda doğru yerde olmasıydı.
maple_shaft

2
Siz çocuklar Node.js'nin Java yerine C ++ 'a bağlanması nedeniyle üzgünsünüz, değil mi?
Erik,

1
"Kötü yazılmış diller" ile neyin kastedildiğinden emin değilim. JavaScript "kötü yazılmış" değil. Dinamik olarak yazılmış ve işlemler tür zorlamaya neden olabilir. Dili suçlamayın, çünkü editörünüz / IDE değişkenin tipini bilmiyor - yine de bilmelisiniz.
Ryan Kinal

3
@RyanKinal Gerçekten mi? Uygulamanızın içindeki tüm nesnelerin ve sınıfların ve dilinizin API'sinin ve kullandığınız kitaplıkların tüm özelliklerini ve yöntemlerini bellek olarak mı bilmelisiniz ? Bilişsel yükü azaltarak ve düşünmeniz için daha az şey vererek, IDE kod tamamlama fikrini büyük ölçüde üretkenlik fikrini reddedersiniz?
funkybro

2

Javascript'ten (ve dinamik yazımından) hoşlanmadım ama nesnenin oryantasyonunu, kapanışlarını ve işlevsel programlamasını takdir etmek için büyüdüm . Ayrıca, küresel nesneler ve sessiz tip dönüşümün kaldırılması, onları ilk bulduğumda temiz bir nefes aldı.

Javascript için tercih ettiğim ide, jQuery intellitext çalışmasını kolaylaştıracağı için web fırtınası (ücretsiz değil).

Ayrıca, onun büyümesini söyleyemem - zaten her yerde.

Özel puanlarınız:

Bir fonksiyonun giriş noktasını bulmanın hemen bir yolu yok

Bunu anlamıyorum, nasıl daha basit olabilirdi?

Parametreler, bu parametrede hangi özelliklerin ve fonksiyonların mevcut olduğunu bilmenin bir yolu olmadan fonksiyonlara aktarılır.

Kimliğinizi nesneler tanımını içerecek şekilde ayarlarsanız, nesnenin özelliklerine intellitext aracılığıyla erişilebilecektir (ancak buradaki noktanızı kaçırmış olabilirim).

Anonim işlevlerin sıkça kullanılması, geri dönüşler olarak kullanılır; bu, sıklıkla hızlı bir şekilde dolaşamayacağınız kafa karıştırıcı kod yolları spagettiğine yol açar.

Genel kullanım ? Anonim işlevlerden hoşlanmıyorsanız, bunları kullanmayın. Yoksa onları esas olarak kullanan jQuery'den mi bahsediyorsunuz? jQuery muhtemelen çoğu web geliştiricisi tarafından, web geliştirme tarihindeki en büyük zaman kazandıran kişi olarak kabul edilir .

JSLint çalışma zamanından önce bazı hatalar yakaladı

Hepsini yakalar, ide içine dahil edebilirsiniz . Veya Webstorm varsayılan olarak içerir (bence).


Her yerde adil ve popüler olmak için mutlaka aynı değil! ;-) Her neyse, webstorm JavaScript için mükemmel bir IDE'dir (ve ücretsiz olmasa da oldukça ucuzdur). Kullanmadım ama IntelliJ'in (Jetbrains'ten de) Java arka planındaysanız ve tek bir IDE kullanmak istiyorsanız ilgili olabilecek aynı işlevi içerdiğine inanıyorum.
FinnNk

Tamam belki açıklığa kavuşturmalıyım ... Tarayıcı / DOM dışında geliştirme bağlamında daha fazla "popülerlik kazanma" demek istedim. Yani başka alternatiflerin olduğu yerlerde kullanılır. "Fonksiyonun giriş noktası" derken, bir fonksiyonun çağrıldığı koddaki noktayı bulmak istedim. Özelliklerinde Parametre: orada hiçbir şekilde çalışma zamanı öncesinde verilen bir nesnenin özelliklerini bilmek bir IDE için! Anonim işlevler: Onları sevmeyebilirim, ancak kodunu korumam gereken diğerlerini de. JSLint yok değil ben mesela, belli nesnenin bir özellik adı yanlış yazmış olmadığını biliyoruz.
funkybro

@funkybro "bir IDE'nin çalışma zamanından önce belirli bir nesnenin özelliklerini bilmesi mümkün değil" ide'de başvurulan bir komut dosyası olarak sadece "whateverMyObjectIs.js" ifadesini ekleyin ve yanlış yazılmış özellik adları için web kamerasını deneyin. (Eğer doğru hatırlıyorsam).
NimChimpsky

3
Yok! Bu kodu göz önünde bulundurun: var myFunc = function(param) { ... }; var myObj1 = { fooProp: fooVal, barProp: barVal}; var myObj2 = { catProp: catVal, dogProp: dogVal}; myFunc(myObj1); myFunc(myObj2); Bir IDE myFunc'nin paramparametresi üzerinde kod tamamlamayı nasıl sağlayabilir ? paramherhangi bir özelliğe sahip, herhangi bir özelliğe sahip herhangi bir nesne olabilir.
funkybro

Evet, ama muhtemelen girdiğiniz paragraflar aslında bu bağlamda mevcuttur. Bir ayrıştırıcı, kendi tam gelişmiş JS tercümanı olmadan bunu çözebilir.
Erik Reppen

2

Neyi kaçırıyorum?

Javascript'in Java'ya göre sahip olduğu iki büyük avantajı kaçırıyorsunuz:

  • Javascript kodu eşdeğer Java kodunun yaklaşık dörtte biri kadardır.
  • Bir derleme için beklemek zorunda değilsiniz ve sunucunun yeniden başlatılması.

Javascript'te farklı çalışıyorum. Bir seferde biraz kod ekleyebiliyorum, tarayıcıyı test edip yenileyebiliyorum ve test ediyorum. JQuery ile Javascript'in birkaç satırı çoğu zaman ihtiyacım olan tek şey.

Java programlamanın nispeten verimsiz olduğunu buldum ve şimdi aynı iki nedenden dolayı tüm sunucu tarafı kodumu Groovy'de yazıyorum.


5
"Javascript kodu yaklaşık Java kodunun dörtte biri kadardır" <- sorun bu! Sadece anonim işlevler oluşturmanın ve nesnelere ekstra özellikler eklemenin ve konfeti gibi etrafa atmanın hızlı olduğundan emin olun. Peki ya başkası kodunuzu ziyaret ettiğinde ve neler olduğunu anlamaya çalıştığında? Ayrıca, Java'daki daha fazla kod mutlaka daha fazla yazmaya gerek yok ... Eclipse sizin için çok fazla yazar.
funkybro 27:11

3
@funkybro: Eclipse bunu yazıyor ... sonra projenin yaşamı boyunca onu geride bırakıp sıkışıp kaldım. Gerekirse, ancak önemsiz bir eklenti bunu üretebilir, bu bir dil kokusu. Javascript sınıflarının biraz daha fazla belge gerektirdiği konusunda haklısın. Ancak yalnızca bir Java yöntemi imzasını bilmek de yeterli değildir.
kevin cline

1
Bu gerekli değil! Java'da Javascript'i her zaman yansıma yöntemlerini çağırarak ve gerçekten isterseniz düz nesneler, listeler ve haritalar dışında hiçbir şey kullanarak simüle edebilirsiniz. Bununla birlikte çoğu geliştirici IME (itiraf edemem!) Anlamlı veri türlerini tanımlamayı seçer ;
funkybro 27:11

1
Yansıma, Java'nın çalışma sırasında nesneleri değiştirmesine izin veriyor mu? Kapanmaya ne dersin? Eleştirmeden önce dili öğrenin veya Java'yı kabul edin, meclis dışındaki en kapalı paradigma dili öykünme yeteneğine sahiptir.
Erik Reppen

1
Seçmenler: Bu, Java ile Javascript'te referandum değildir. Sebepsiz yere düşürmek kabalıktır.
kevin cline

0

Bu sorunun eski olduğunu biliyorum ama aynı duyguları olan ancak son 10 yıldır çok fazla JavaScript yapan bir C ++ / C # programcısı olarak ilk önerim Visual Studio Kodunu denemek olacaktır.

Elbette, güçlü bir şekilde yazılmış bir dille eklenebilecek her özelliği sunamaz, ancak oldukça yakın hale gelir.

Ayrıca, typecript'ten type bilgisi alabilir ve bunu JavaScript'e uygulayabilir. Asla typescript kullanmasanız bile, JavaScript'i yazarken tonlarca API ile ilgili kod tamamlama ve dokümantasyon alabilirsiniz.

Yani sorularınız için

  • Bir işlevin giriş noktasını bulmanın hemen bir yolu yok (düz bir metin araması dışında, bu, daha sonra, nereden başladığınızı unuttuğunuzun üç veya üçünden sonra arama hiyerarşisini daha ileriye götüren yöntemler için daha sonra yapılan aramalarla sonuçlanabilir)

VSCode'da çoğunlukla çözülmüş görünüyor?

  • Parametreler, bu parametrede hangi özelliklerin ve fonksiyonların mevcut olduğunu bilmenin bir yolu olmadan fonksiyonlara aktarılır.

Bu, birçok IDE için kodunuzu JSDoc tarzı yorumlar veya daktilo ile belgeleyerek çözülür. Editörler yorumları okuyacak ve alışık olduğunuz aynı işlemi size verecek

Anonim işlevlerin sıkça kullanılması, geri dönüşler olarak kullanılır; bu, sıklıkla hızlı bir şekilde dolaşamayacağınız kafa karıştırıcı kod yolları spagettiğine yol açar.

Bir C # programcısı olarak anonim işlevler de yaygındır ve C ++ 'a eklenmiştir. Bence bu alışman gereken bir şey.

Ayrıca geri aramalar çoğunlukla vaatlerle ve zaman zaman async / await ile değiştirilmiş olsa da ve bir geri arama kullanan bir api'niz varsa, hızlı bir şekilde bir söz kullanmak üzere sarar ve daha sonra async / await kullanabilirsiniz.

Ve elbette, JSLint çalışma zamanından önce bazı hatalar yakalar, ancak bu bile doğrudan tarayıcınızda kodunuzun altında kırmızı dalgalı çizgiler olması kadar kullanışlı değildir.

Visual Studio Kodunda dalgalı çizgiler göreceksiniz. Yalnızca bu değil, ESLint entegrasyonunu açarsanız, editörünüzde vurgulanan tonlarca şaşırtıcı uyarılar veya hatalar elde edersiniz. Aslında diğer diller için gördüğümden daha fazla. Benim deneyimlerim, C / C # / Java için linters, ESLint'in hem kitlesel bir şekilde konfigüre edilebildiği hem de büyük ölçüde genişletilebildiği ve popüler kütüphanelerin editördeki özel kütüphane kullanımı hakkında öneri ve uyarılar verecek şekilde entegre olabileceği yerlerde oldukça zor kodlanmış. Kişisel olarak diğer dillerde görmediğim bir şey (belki de şu anda diğer diller için de yaygın olabilir mi?)

Aynı zamanda 2018 ve ES7 ise yeni norm class. Her zaman katı mod kullanırsınız. Asla kullanmazsın varve her zaman kullanırsın.const ve letve C ++ / C # / Java programcılarının kaybolmaya alışmakta zorlandıkları şeyleri kullanırsınız. no-undefESLint’te kuralı açın ve daha fazla sorun yok

thisC ++ / C # / Java ile aynı olmadığından, gerçekten nasıl çalıştığını ve fonksiyonların ve metotların gerçekten nasıl çalıştığını öğrendiğini söyledi .

JavaScript’in ilk 2-3 senesinde hayal kırıklığına uğradım. Bir noktada olsa da tıkladı. Onu C ++ / C # / Java olmaya zorlamaya çalışmayı bıraktım ve şimdi JavaScript’te 15 satır alan şeyler diğer dillerde 150 aldığında hayal kırıklığına uğradım.


-1

IDE'leri seviyorsanız ve güneş tutulması için kullanılıyorsa, Aptana'yı JavaScript For IDE olarak işaretleyin. Sanırım istediğinin çoğunu yapabilir. (Şahsen IDE'lerden nefret ediyorum ama bu farklı bir konuşma.)

Anonim işlevlere gelince, bunların JavaScript'teki en güçlü özellik olduğunu ve bu noktalara sahip olmayan bir dilde çalışmanın oldukça acı verici olduğunu düşünüyorum.

JavaScript'i derleyebilecek başka bir şey istiyorsanız, bir sürü seçenek var, CofffeeScript, Clojure ve GWT'nin hepsi akla geliyor ama diğerleri de var.


2
Bir kere Aptana'yı denedim ve bu gerçekten kötü. Otomatik girintiye bile sahip değil ve aynı projede Eclipse ve Aptana kullanıyorsam, diğer Eclipse editörleri tarafından ayarlanan tüm proje ayarlarını, ör. Renklendirme ve malzeme yok eder.
Jonas

1
Bir süre kullandım ve nefret ettim ama dediğim gibi IDE'lerden nefret ediyorum komut satırı aracı ile biçimlendiriyorum ve GVIM veya emacs'de düzenleme yapıyorum (yaptığım şeye bağlı olarak)
Zachary K

İlk birkaç saatte çöküyor ve bir avuç dosyadan başka açık bir şeyim yok? Hoşça kal.
Erik,

Web fırtınası fena değil. Hala çoğu zaman Scite kullanıyorum, ancak Node.js sayfalarını yazarken IDE olayını daha fazla hissetmeye başlıyorum ve görünür tarayıcı geri bildirimlerinden ve yazılım araçlarından yararlanamadım.
Erik,

-1

Henüz kendim kullanmadım ama bazı demolar gördüm ve çok etkilendim Cloud 9'dan JavaScript IDE olarak .

Hem çevrimiçi hizmet modeline gidebilir ya da GitHub'dan indirebilirsiniz.

Ve bir IDE olarak kalitesinin kanıtı olarak, Cloud9 kullanılarak yazılmış ... Cloud9!

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.