it-swarm.asia

Coffeescript'in artıları ve eksileri nelerdir?

Tabii ki büyük bir profesyonel, birçok durumda daha kısa koda yol açan sözdizimsel şeker miktarıdır. http://jashkenas.github.com/coffee-script/ üzerinde etkileyici örnekler var. Öte yandan, bu örneklerin karmaşık gerçek dünya uygulamalarının kodunu temsil ettiğinden şüphe duyuyorum. Örneğin kodumda çıplak nesnelere asla işlevler eklemiyorum, prototiplerine değil. Ayrıca, prototip özelliği kullanıcıdan gizlidir ve deyimsel Javascript yerine classic OOP).

Dizi anlama örneği benim kod muhtemelen şöyle görünür:

cubes = $.map(list, math.cube); // which is 8 characters less using jQuery...
49
Philip

CoffeeScript ile ilgili yeni bir kitabın yazarıyım:
http://pragprog.com/titles/tbcoffee/coffeescript

Dilin o sırada sadece birkaç aylık olmasına ve şimdi olduğundan çok daha pürüzlü kenarlara sahip olmasına rağmen, CoffeeScript'in yaklaşık bir hafta oynadıktan sonra kullanmaya değer olduğuna ikna oldum. Resmi site, dilin özelliklerini (çoğunu) listelemek için harika bir iş çıkarır, bu yüzden burada tekrar etmeyeceğim. Aksine, sadece dilin artıları olduğunu söyleyeceğim:

  1. İyi JavaScript kalıplarının kullanılmasını teşvik eder
  2. JavaScript anti-desenlerini engeller
  3. İyi JavaScript kodunu daha kısa ve daha okunabilir hale getirir

3 numara, ilk ikisinden çok daha fazla dikkat çekiyor (kitabımda bile), ama ne kadar çok düşünürsem, sadece güzel sözdizimi için atlamayı yapmadığımı farkettim; Atlamayı yaptım çünkü dil beni daha iyi, daha az hataya açık JavaScript'e doğru itti. Birkaç kısa örnek vermek gerekirse:

  • Değişkenler otomatik olarak kapandığı için, var değerini atlayarak, aynı ada sahip bir değişkenin (adlandırılmış bağımsız değişkenler hariç) gölgesini kaldırarak veya etkileşimde bulunan farklı dosyalarda değişkenlere sahip olarak yanlışlıkla globallerin üzerine yazamazsınız (bkz https://stackoverflow.com/questions/5211638/pattern-for-coffeescript-modules/5212449 ).
  • ->, function(){} 'den daha kolay yazılan bir heck olduğundan, geri çağrıları kullanmak daha kolaydır. Anlamsal girinti, geri aramalar iç içe yerleştirildiğinde bunu netleştirir. Ve =>, Uygun olduğunda this 'ın korunmasını kolaylaştırır.
  • İngilizce konuşmacıların unless x, if (!x) 'dan ayrıştırması daha kolay olduğu ve if x?if (x != null)' dan daha kolay olduğu için, yalnızca iki örnek vermek için mantık sözdiziminde daha az beyin döngüsü ve mantığın kendisinde daha fazla beyin döngüsü.

nderscore.js gibi harika bir kütüphane bu sorunların bazılarıyla ilgilenebilir, ancak hepsini değil.

Şimdi eksilerini:

  1. Derleme bir acı olabilir. CoffeeScript derleyicisinin attığı sözdizimi hataları genellikle belirsizdir. Gelecekte bu yolda ilerleme kaydedilmesini bekliyorum. (Derleyicinin savunmasında, genellikle bunları JavaScript'te yazdıysanız, bu kod satırı çalışana kadar hata olarak bulamayacağınız şeyleri yakalar. Bu hataları daha sonra yakalamak daha iyidir.)
  2. Buna bağlı olarak, hata ayıklama bir acı olabilir. Derlenmiş JS hatlarını orijinal CoffeeScript ile eşleştirmenin henüz bir yolu yok (Firefox halkı bunun geleceğine söz verdi).
  3. Değişmeye eğilimlidir. Kodunuz, gelecekteki bir CoffeeScript sürümü altında farklı şekilde çalışabilir veya hiç çalışmayabilir. Tabii ki, çoğu dilde durum budur; Ruby veya Python benzerdir) yeni bir sürümüne geçmek, ancak JavaScript ile ilgili değildir; bugün büyük tarayıcılarda iyi çalışan kodun, bildiğimiz kadarıyla web'de büyük tarayıcılarda iyi çalışmasını bekleyebilirsiniz.
  4. O kadar da tanınmıyor. JavaScript bir lingua franca'dır . CoffeeScript kısa bir süre içinde çok popüler hale geldi, ancak JavaScript kadar geniş bir topluluğun tadını çıkarması pek olası değil.

Açıkçası bence profesyoneller profesyonel eksilerini benim için daha ağır basar, ancak bu her kişi, takım veya proje için geçerli olmayacaktır. (Jeremy Ashkenas bile çok fazla JavaScript yazıyor.) CoffeeScript en iyi şekilde JavaScript yerine ince bir tamamlayıcı olarak görülüyor.

54
Trevor Burnham

Biraz büyük bir JavaScript kod tabanımız var ve yaklaşık bir ay önce CoffeeScript'i denemek istedik. Geliştiricilerimizden biri modüllerimizden birini http://js2coffee.org/ kullanarak JS'den CS'ye geçirmeye başladı. Bu araç oldukça kullanışlıdır ve 1000 şeyden oluşan bir JavaScript satırını taşımak yaklaşık iki veya üç saat sürdü. Bu noktada fark ettiğimiz bazı gözlemler:

  1. Ortaya çıkan CoffeeScript kodu oldukça okunabilirdi.

  2. JavaScript'e geri derledik ve gezinmek ve hata ayıklamak oldukça kolaydı. Bu modülü taşıyorken ekibimizden başka bir geliştirici, içinde bir hata buldu. Bu iki geliştirici, eski JavaScript kodumuzdaki ve CS derleyicisinden çıkan yeni JavaScript kodundaki hatayı düzeltti. Bağımsız olarak çalıştılar ve aynı süreyi aldı (15-20 dakika).

  3. Bir bağlantı noktası olması nedeniyle, ortaya çıkan kod, uygun veya istenen Kahve'ye özgü özellikleri kullanmıyordu. CoffeeScript'te sıfırdan yazarsak, kod daha deyimsel olurdu. Bu nedenle daha sonra mevcut kodu taşımamaya karar verdik.

  4. Genel olarak daha kısa fonksiyon ve daha küçük nesnelerin okunabilirliği bir miktar uzadı. Ancak, daha uzun yöntemler için durum böyle değildi. En büyük şişkinlik tasarrufu -> ve açık return, ancak bunun dışında kodumuz önemli ölçüde daha kısa veya basit değildi. Bazı sözdizimi parçaları oldukça kafa karıştırıcı görünüyordu, özellikle nesne değişmezleri. CS, üye tanımları etrafındaki süslü parantezleri atlar ve bazı kod parçalarının okunmasını oldukça zorlaştıran "her şey bir ifadedir" ve üstü kapalı return ile birleştirilir.

    İşte JavaScript:

    var rabbitGenerator = {
        makeRabbit: function(rabbitName, growCarrots) {
            if (growCarrots) {
                carrots.growMore(10);
            } else {
                carrots.ensureSupply();
            }
            return {
                name: rabbitName, 
                height: 0,
                actions: {
                    jump: function (height) {
                        this.height += height;
                    },
                    eatCarrot: function () {
                        // etc
                    }
                }
            };
        },
        // more members
    }
    

    İşte karşılık gelen CoffeeScript kodu şöyle görünecektir:

    rabbitGenerator = 
      makeRabbit: (rabbitName, growCarrots) ->
        if growCarrots
          carrots.growMore 10
        else
          carrots.ensureSupply()
        name: rabbitName // (*)
        height: 0
        actions: 
          jump: (height) ->
            @height += height
    
          eatCarrot: ->
    

    Şimdi olduğu gibi, dönüş ifadesinin (*) hat. Projemizde ağırlıklı olarak nesne değişmezlerine güveniyoruz: bunları işlev parametreleri olarak geçiriyoruz ve diğer işlevlerden döndürüyoruz. Çoğu durumda bu nesneler oldukça karmaşık olma eğilimindedir: farklı türdeki üyeler ve çeşitli iç içe yerleştirme seviyeleri ile. Bizim durumumuzda genel duygu, CoffeeScript kodunun okunması aslında düz JavaScript kodundan daha zordu.

  5. Her ne kadar CoffeeScript hata ayıklaması beklediğimizden daha kolay görünse de düzenleme deneyimi biraz bozuldu. Bu dil için iyi bir editör/IDE bulamadık. Projemiz için istemci tarafı kodu için editör/IDE üzerinde standardize olmadık ve aslında hepimiz farklı araçlar kullanıyoruz. Aslında bir takımdaki herkes CoffeeScript'e geçtiklerinde araçlarından oldukça zayıf bir destek aldıklarını kabul eder. IDE ve editör eklentileri çok erken şekillidir ve bazı durumlarda bize düzgün bir sözdizimi vurgulama veya girinti desteği bile veremezler. Kod parçacıkları veya yeniden düzenleme hakkında konuşmak değil. WebStorm, Eclipse kullanıyoruz , NetBeans, VisualStudio, Notepad ++ ve SublimeText2.

  6. Araçlardan bahsetmişken, CoffeScript derleyicisinin kendisinin bir Node JS paketi olarak geldiğini belirtmeliyim. Birincil Java/.NET mağazasıyız, bu yüzden herkes Windows kutularında gelişiyor. CoffeeScript derleyicisinin Windows üzerinde çalışmasını sağlayamadık, bu yüzden <script type="text/coffeescript"> etiketleri ve tarayıcı tabanlı anında derleyici.

    Derleyici oldukça hızlıdır ve başlatma süresini fazla arttırmaz. Dezavantajı, ortaya çıkan JavaScript'in eval düzenlenmesi ve tarayıcıların geliştirici araçlarında (özellikle IE8'de) kesme noktaları koymak biraz zor olmasıdır. Hata ayıklama konusunda zor zamanlarımız varsa, yukarıda listelediğim taşıma aracıyla CoffeeScript kodunu önceden derleriz, ancak bu hala çok uygun değildir.

  7. CoffeeScript'in yağ ok operatörü ile otomatik var yerleştirilmesi veya yarı saydam this yönetimi gibi diğer vaatleri (=>) umduğumuz kadar kazanç sağlamadığı ortaya çıktı. JSLint'i derleme sürecimizin bir parçası olarak zaten kullanıyoruz ve ES3 x ES5-Strict dilin alt kümesi. Her neyse, Kahvenin aynı tür "temiz" kodu üretmesi iyi bir şey kodudur. Her sunucu tarafı çerçevesinin de geçerli HTML5 ve CSS3 işaretlemesi üretmesini diliyorum!

    CoffeeScript'in benim için var anahtar kelimeleri koyarak çok fazla zaman kazandırdığını söyleyemem. Eksik var ler JSLint tarafından kolayca yakalanır ve kolayca düzeltilebilir. Ayrıca, bir süre onun tarafından düzeltildikten sonra yine de otomatik olarak iyi JavaScript yazmaya başlarsınız. Bu yüzden Coffee'nin gerçekten that bu konuda yardımcı olduğunu söyleyemem.

CoffeeScript'i yaklaşık bir hafta boyunca değerlendirdik. Tüm ekip üyeleri içine kod yazıyordu ve deneyimlerimizi birbirimizle paylaştık. Onunla yeni bir kod yazdık ve uygun gördüğümüzde bazı mevcut kodları taşıdık. Dil hakkındaki duygularımız karışıktı.

Genel olarak gelişimimizi hızlandırmadığını, ancak bizi de yavaşlatmadığını söyleyebilirim. Daha az yazım ve daha az hata yüzeyi nedeniyle bazı hız kazanımları, çoğunlukla araç desteği olmak üzere diğer alanlarda yavaşlamalarla dengelenmiştir. Bir hafta sonra CoffeeScript kullanımını zorunlu kılmayacağımıza karar verdik, ancak bunu da yasaklamayız. Ücretsiz bir seçim göz önüne alındığında, pratikte hiç kimse bunu kullanmaz, en azından şimdilik. Zaman zaman içinde bazı yeni özellikleri prototiplemeyi ve ardından geri kalanıyla entegre olmadan önce kodu JavaScript'e dönüştürmeyi düşünüyorum proje daha hızlı bir başlangıç ​​yapmak için ama henüz bu yaklaşımı denemedim.

Artıları

görünüm Trevor Burnham'ın cevabı .

artı, kendinizi javascript kiriyle uğraşmak yerine, modaya uygun şeyler yapan kalça adamı olarak düşünebilirsiniz.

Dezavantajları

CoffeeScript, sözdizimsel şeker ve pembe gözlüklerden başka bir şey değildir.

Kolay şeyler için - CoffeeScript gereksizdir, çünkü kolay şeyler yapmak her dilde kolaydır. Ve jQuery muhtemelen CoffeeScript'ten bile daha basittir.

Zor şeyler için - ortamınızı anlamalısınız. Ve ortamınız HTML, DOM ve CSS'dir, Javascript sadece bunları birbirine bağlamak için bir araçtır, ancak tüm API'lar Javascript için özel olarak yazılmıştır. Java (GWT), Dart veya CoffeeScript olsun, daha sonra "gerçek" olana derlenecek başka bir dil kullanmak oldukça risklidir.

Anti-desenler veya dil kurallarının banal cehaleti, bir-iki iyi kitap okunarak düzeltilebilir. Ve Coffeescript'in kendi anti-desenleri olduğundan eminim.

Coffeescript için IDE desteği JS'den daha kötüdür.

11
c69

En büyük profesyonel, bence:

Basit coffescript, yazmanız gereken javascript'i derler yazmış, ancak basit değildir.

Javascript'in sadece uyanıklıkla önlenen bazı kötü köşeleri var - başımın üstünden örnekler:

  • prototipi doğru şekilde ayarlama
  • == yerine === kullanma
  • null için kontrol
  • var ile tüm değişkenleri bildirmek
  • kendi kendini yürüten anonim bir işlevde her şeyi sarma.

Eğer kahve yazıyorsanız, tüm bunlar sizin için işlenir otomatik olarak.

Eksileri, IMO, çoğunlukla küçük:

  • Hata ayıklama bir acıdır
  • Daha az kahve programcısı var
  • Belgeleri javascript'ten kahveye çevirmelisiniz.
7
Sean McMillan

profesyoneller

  1. CoffeeScript, JavaScript hakkında daha fazla bilgi edinmeme yardımcı oldu
  2. karmaşık iç içe geçmiş geri çağrılar için bile okunması oldukça kolaydır
  3. javascript’in dil sorunlarını izlemesi zor

Yukarıdaki Andrew çalışan örneği aydınlatıcı bulundu. Mevcut nesne değişmez değerlerinin okunabilirliğinin, yalnızca dönüşü manuel olarak tanımlayarak artırılacağına inanıyorum

dönüş

// burada nesne değişmezi

IDE araçları geliştirildi, TextMate ve Cloud9 CoffeeScript'i destekliyor. Kuşkusuz Windows desteği gecikiyor (genel olarak web geliştirme için doğru değil mi?)

eksileri

Tarayıcı tarafından yorumlanan CoffeeScript, hata ayıklamak için zor olabilir.

JavaScript'in üstünde, geliştiricilerin biraz anlayıp düşünmesini gerektiren ek bir katman.

3
user38265

profesyoneller

  1. ortak vakaları sözdizimsel olarak gerçekten optimize ettiler, aslında, CoffeeScript, "yaygın olarak kullanılan" en özlü dil değilse bile http://redmonk.com/dberkholz/2013/03/25/programming- dil sıralarda-by-anlatımcılığa /
  2. javaScript'in kötü kısımlarını gizler (auto-coercion ==, örtülü globaller, daha geleneksel sınıf sistemi ortak şeyleri kolaylaştırır)
  3. python/Ruby programcıları için öğrenmesi son derece kolay
  4. çok satırlı anonim işlevler + boşluk sözdizimi

eksileri

  1. var öğesinin kaldırılması, bir nesne kullanmadan iç kapsam içindeki bir dış kapsam değişkenini değiştiremeyeceğiniz veya `var fall_back_to_js;` hacks [neden başka bir atama ifadesi değil ': =' sadece bir değeri yeniden atar böylece obj.naem: = 5 yazım hatalarının ayıklanması daha kolay]
  2. javaScript :(; btw: Chrome kaynak haritaları için destek ekleyerek ChromeScript'te hata ayıklayabilirsiniz); yeoman (npm install yeoman) yardımcı olabilir. CoffeeScript için gulp veya grunt yapılandırma dosyası yazarsınız
  3. isteğe bağlı statik yazım yok (bir sonraki EcmaScript standardını beklemek zorundasınız)
  4. hala bir modül sistemi için üçüncü taraf kitaplıklara ihtiyaç var
  5. sözdizimi tuzakları dikkatli olun: örtük getiri, abgo a (b (g (o))) anlamına gelir , fp, b: 2, c: 8, f (p, {b: 2}, {c: 8} yerine f (p, {b: 2, c: 8}) anlamına gelir )
  6. bozuk JavaScript sayı/tür sistemini değiştirmez
0
aoeu256