Coffeescript'in artıları ve eksileri nelerdir? [kapalı]


48

Elbette büyük bir profesyonel, birçok durumda daha kısa koda neden olan sözdizimsel şeker miktarıdır. On http://jashkenas.github.com/coffee-script/ etkileyici örneği vardır. Öte yandan, bu örneklerin karmaşık gerçek dünya uygulamalarının kodunu temsil ettiği konusunda şüphelerim var. Örneğin kodumda asla çıplak nesnelere işlevler eklemiyorum, prototiplerine. Üstelik prototip özelliği kullanıcıdan gizlenmiştir ve deyimsel Javascript yerine klasik OOP'yi önermektedir.

Dizi kavrama örneği kodumda muhtemelen şöyle görünür:

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

7
Bu dizi anlama değil. Bu JQuery.map ().
Rein Henrichs

1
Tabii ki, bu yüzden "dizi anlama" ya da "dizi anlama örneği" den [web sitesinde] "bahsetmiyorum.
Philip

Yeterince adil. Demek istediğim, katlamanın (harita) bazı yönlerden dejenere olmuş bir liste kavrama olayı olduğu (tipik olarak daha güçlüdür).
Rein Henrichs

Temelde bu soruyu soruyorum çünkü bunun için Coffeescript yerine Javascript kullanmanın aptalca bir karar olup olmadığını merak ediyorum. Dizi kavrayışının çok daha güçlü olduğuna katılıyorum, hiç kimse Python'un Ruby dizisinden daha güçlü olduğunu iddia edemez çünkü dizi anlama ve blokları girintili / baştan ziyade girintili olarak işaretler.
Philip

Raylar, kahve betiğini varsayılan bir mücevher yaptı. "Tartışma" kışkırttı github.com/rails/rails/commit/…
generalhenry

Yanıtlar:


53

CoffeeScript'te yakında yayınlanacak bir kitabın yazarıyım:
http://pragprog.com/titles/tbcoffee/coffeescript

Dil, o zamanlar sadece birkaç aylık olmasına ve şimdi olduğundan çok daha fazla pürüzlü kenarlara sahip olmasına rağmen, bir hafta boyunca çalmaya başladıktan sonra kullanmaya değer olduğuna ikna oldum. Resmi site, dilin özelliklerini (çoğu) listelemek için harika bir iş çıkar, bu yüzden buradakileri tekrar etmeyeceğim. Aksine, dilin artılarının:

  1. İyi JavaScript kalıplarının kullanımını teşvik eder
  2. JavaScript anti-patterns cesaretini kırıyor
  3. İyi JavaScript kodunu daha kısa ve daha okunaklı hale getirir

3 numara, ilk ikisinden daha fazla dikkat çeker (benim kitabımda bile), ama ne kadar çok düşünürsem, o kadar güzel sözdizimi için atlamayı yapmadığımın farkındayım; Atlamayı yaptım çünkü dil beni daha iyi, daha az hataya açık JavaScript'e çevirdi. Birkaç hızlı örnek vermek gerekirse:

  • Değişkenler otomatik olarak kapsamlı olduğundan, yanlışlıkla atlayarak globelerin üzerine yazamaz var, aynı ada sahip bir değişkeni (adlandırılmış argümanlar hariç) gölgeleyemez veya etkileşimli farklı dosyalarda değişkenlere sahip olamazsınız (bkz. Https://stackoverflow.com/questions) / 5211638 / kahve kalıbı modeli / modüller / 5212449 ).
  • Çünkü ->bir çok bir halt daha yazma daha kolaydır function(){}, bu kullanım geri aramaları daha kolay. Anlamsal girintiler, geri aramalar ne zaman iç içe geçerse onu netleştirir. Ve uygun olduğunda =>korumayı kolaylaştırır this.
  • Çünkü unless xİngilizce konuşanlar için ayrıştırmak daha kolaydır if (!x)ve sadece iki örnek vermek gerekirse, mantık sözdiziminde daha az beyin döngüsü ve mantığın kendisinde daha fazlasını harcayabilirsiniz.if x?if (x != null)

Underscore.js gibi harika bir kütüphane bu sorunların bazılarıyla ilgilenebilir, ancak hepsiyle ilgilenemez.

Şimdi eksilerini için:

  1. Derleme bir acı olabilir. CoffeeScript derleyicisinin fırlattığı 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ının çalışmasına kadar bir hata olarak keşfedemeyeceğiniz şeyler yakalar. Bu hataları daha sonradan yakalamak daha iyidir.)
  2. Buna bağlı olarak, hata ayıklama bir ağrı olabilir. Derlenmiş JS satırlarını orijinal CoffeeScript ile eşleştirmenin henüz bir yolu yoktur (Firefox'un bunun geleceğine söz vermesine rağmen).
  3. Değişime yatkın. Kodunuz, gelecekteki bir CoffeeScript sürümü altında farklı şekilde çalışabilir veya hiç çalışmayabilir. Tabii ki, bu çoğu dilde olduğu gibi - Ruby veya Python'un yeni bir sürümüne geçmek benzer - ancak bugün büyük tarayıcılarda iyi çalışan kodun tüm ülkelerde iyi bir şekilde çalışacağını makul bir şekilde bekleyebileceğiniz JavaScript ile durum böyle değil. web tarayıcıları, bildiğimiz kadarıyla varlığını sürdürür.
  4. O kadar iyi tanınmıyor. JavaScript bir lingua franca'dır . CoffeeScript kısa sürede çok popüler hale geldi, ancak JavaScript kadar geniş bir topluluktan zevk alması pek mümkün değil.

Açıkçası, profesyonellerin benim için eksileri şahsen daha ağırladığını düşünüyorum, ancak bu her kişi, takım veya proje için geçerli olmayacak. (Jeremy Ashkenas bile çok fazla JavaScript yazıyor.) CoffeeScript, en iyi yerine JavaScript değil, JavaScript'i tamamlıyor.


2
Whoa whoa whoa, dünyadaki =>belgeleri nasıl özledim ? Bu harika . (Diğer noktalar da iyiydi - dürüst bir eksiler listesiyle çok iyi tarafsız bir cevap. :)
Michelle Tilley

Ayrıntılı cevabınız için teşekkür ederim. Kabul etmek için biraz bekleyeceğim halde, farklı OOP yaklaşımlarını dikkate alarak profesyonellerin / eksilerin olması ilginç olacaktır.
Philip

2
CoffeeScript'in sınıf modelinin yeni başlayanlar için JavaScript'in prototip modelinden daha erişilebilir olduğunu ve iyi uygulamaları desteklediğini söyleyebilirim (özellikle, prototiplerinizi Foo.prototype.bar = ...çılgınlık olan her yere saçmak yerine tek bir yerde tanımlamak !). Kodu temiz bir şekilde düzenlemenin harika bir yolu. Öte yandan, işlevsel bir yaklaşım çok daha şık olsa bile, insanların OOP kullanmasına neden olabilir.
Trevor Burnham

Girinti mantığından bazıları beklendiği gibi davranmıyor, bunun tamamen garip bir şey yaptığını görmek için alttaki JS'ye bakmak zorundasınız. Py, ve bunun önlenmesi gerekenlerden daha ince böcekler üretebileceğini gördüm. Yine de CoffeeScript kullanıyorum
sa93

1
1 ve 2 numaralı noktaların detaylara ihtiyacı var. Bence Andrew’un cevabı karışık poşet olarak # 3 güzel bir örnek. Madde işaretleri ile aynı fikirde değilim: Unutma var aptalca ve ilk etapta çarpışmak için çok fazla küresel var var olmamalıdır, 'işlev' zor değil - önceden tanımlanmış adlandırılmış yöntemler daha az, 'eğer (! X ) 'kısa ve tatlıdır ve' daha 'daha ayrıntılı hale getirmediği sürece (kendi önceki merminize ve 3. maddeye bakınız) ve insan dili benzerliği aslında programlama dillerinde tarihsel olarak çok başarılı olan bir tasarım hedefi değildir. İnsan ve makine ile iletişim halinde olmamız gerekiyor.
Erik Reppen

30

Biraz büyük bir JavaScript kod tabanımız var ve yaklaşık bir ay önce CoffeeScript'i denemeye karar verdik. Geliştiricilerimizden biri http://js2coffee.org/ kullanarak modüllerimizden birini JS'den CS'ye geçirmeye başladı . Bu araç oldukça kullanışlıdır ve 1000 satırlık bir JavaScript satırını yerleştirmek yaklaşık iki ya da üç saat sürdü. Bu noktada dikkatimizi çeken bazı gözlemler:

  1. Ortaya çıkan CoffeeScript kodu oldukça okunaklıydı.

  2. JavaScript'e geri derledik ve gezinmek ve hata ayıklamak oldukça kolaydı. Bu modülü taşırken ekibimizden bir başka geliştirici de bir hata buldu. Bu iki geliştirici bu hatayı eski JavaScript kodumuzda ve CS derleyicisinden çıkan yeni JavaScript kodunda düzeltti. Bağımsız olarak çalıştılar ve onları aynı miktarda (15-20 dakika) aldı.

  3. Bir liman olması nedeniyle ortaya çıkan kod, uygun veya istenen Kahveye özgü özellikleri kullanmıyordu. CoffeeScript'te sıfırdan yazarsak kod daha salak olurdu. Bu nedenle daha sonra mevcut kodu taşımayacağımıza karar verdik.

  4. Genel olarak, kısa fonksiyon ve daha küçük nesnelerin okunabilirliği bir dereceye kadar artmıştır. Ancak, daha uzun yöntemler için durum böyle değildi. En büyük şişkinlik tasarrufu geldi ->ve açıkça ortaya çıktı return, ancak bunun dışında kodumuzun önemli ölçüde kısaltılması veya basitleştirilmesi yoktu. Bazı sözdizimi parçaları oldukça kafa karıştırıcı görünüyordu, özellikle değişmez nesnelere. CS, üye tanımları etrafındaki kıvrımlı parantezleri atlar ve "her şey bir ifadedir" ifadesiyle birlikte kullanılır ve returnbazı kod parçalarını okumayı zorlaştırır.

    İş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
    }

    Ve işte karşılık gelen CoffeeScript kodunun neye benzeyeceği:

    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, return ifadesinin (*)satırda başladığını anlamak oldukça zor . Projemizde nesne değişmezlerine büyük ölçüde güveniyoruz: onları işlev parametreleri olarak iletiyoruz ve diğer işlevlerden döndürüyoruz. Çoğu durumda, bu nesneler oldukça karmaşık olma eğilimindedir: farklı türdeki üyelerle ve çeşitli iç içe geçme düzeyleriyle. Bizim durumumuzda genel duygu, CoffeeScript kodunun okunması düz JavaScript kodundan zordur.

  5. Her ne kadar hata ayıklama CoffeeScript beklediğimizden daha kolay olduğu ortaya çıktı, ancak düzenleme deneyimi biraz azalmıştır. Bu dil için iyi bir editör / IDE bulamadık. Projemiz için müşteri tarafı kodu için editör / IDE standartlaştırmadık ve aslında hepimiz farklı araçlar kullanıyoruz. Aslında bir takımdaki herkes CoffeeScript'e geçtiğinde araçlarından oldukça zayıf bir destek aldıklarını kabul eder. IDE ve editör eklentileri çok erken durumda ve bazı durumlarda bize doğru sözdizimi vurgulama veya girinti desteği bile veremiyorlar. Kod parçacıkları veya yeniden düzenleme hakkında konuşmamak. WebStorm, Eclipse, NetBeans, VisualStudio, Notepad ++ ve SublimeText2 kullanıyoruz.

  6. Araçlardan bahsetmişken, CoffeScript derleyicisinin kendisinin bir Node JS paketi olarak geldiğinden bahsetmeliyim. Birincil Java / .NET mağazasıyız, böylece herkes Windows kutularını geliştiriyor. Yakın zamana kadar Windows desteği Node'da neredeyse yoktu. CoffeeScript derleyicisini Windows üzerinde çalıştıramadık, bu yüzden şu an için <script type="text/coffeescript">etiketlere ve tarayıcı tabanlı anında derleyicilere yapıştırmaya karar verdik .

    Derleyici oldukça hızlıdır ve başlangıç ​​zamanını fazla arttırmaz. Dezavantajı, sonuçta ortaya çıkan JavaScript’in evalediniyor olması ve sınırlayıcıları tarayıcının geliştirici araçlarına (özellikle IE8’de) koymak biraz zor. Hata ayıklama konusunda zamanımız varsa, yukarıda listelenen aynı taşıma aracıyla CoffeeScript kodunu önceden derleriz, ancak bu hala çok uygun değildir.

  7. CoffeeScript'in otomatik varekleme veya yarı thisok yönetimi gibi yağ ok operatörüyle ( =>) olduğu gibi diğer vaatler de umduğumuz kadar kazanç sağlamadığı ortaya çıktı. JSLint'i derleme sürecimizin bir parçası olarak kullanıyoruz ES3 x ES5-Strictve dilin alt kümesinde kod yazıyoruz . Her neyse, kahvenin aynı "temiz" kodları üretmesi iyi bir şey . Her sunucu tarafı çerçevenin de geçerli HTML5 ve CSS3 işaretlemesi üretmesini diliyorum!

    Bu, benim variçin anahtar kelimeler koyarak CoffeeScript çok fazla zaman kazandırdığını söyleyemeyeceğimi söyledi . Eksik vars JSLint tarafından kolayca yakalanır ve kolayca sabitlenebilir. Dahası, bir süre düzeltildikten sonra, yine de otomatik olarak iyi JavaScript yazmaya başlarsınız . Böylece, Kahve'nin bu konuda gerçekten bu kadar yardımcı olduğunu söyleyemem .

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

Genel olarak, gelişmemizi hızlandırmadığını ancak bizi de yavaşlatmadığını söyleyebilirim. Daha az yazma ve daha az hata yüzeyine bağlı olarak bazı hız kazanımları, diğer araçlardaki yavaşlamalar, çoğunlukla takım desteği ile dengelenmiştir. Bir hafta sonra CoffeeScript kullanımını zorunlu kılmayacağımıza karar verdik, ancak bunu yasaklamayız . Özgür bir seçim göz önüne alındığında, pratikte hiç kimse onu kullanmıyor, en azından şimdilik. Zaman zaman içinde bazı yeni özelliklerin prototiplendiğini düşünüyorum ve daha sonra daha hızlı bir başlangıç ​​yapmak için projenin geri kalanıyla bütünleşmeden önce kodu JavaScript'e dönüştürürüm, ancak henüz bu yaklaşımı denemedim.


10

Artıları

görüntülemek Trevor Burnham'ın cevabı .

Ayrıca, kendinizi javascript ile karıştırmak yerine, modaya uygun şeyler yapan bir kalça adamı olarak düşünebilirsiniz.

Eksileri

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 daha basittir.

Sıkı bir şeyler için - gerekir senin orta anlıyoruz. Ve medyanız HTML, DOM ve CSS'dir, Javascript sadece onları birbirine bağlayan bir araçtır, ancak tüm API'ler Javascript için özel olarak yazılmıştır. Daha sonra "gerçek" olana derlenecek başka bir dil kullanmak Java - GWT, Dart veya CoffeeScript olsun oldukça riskli.

Anti-kalıplar veya dil kurallarının banal cehaleti, iki iyi kitabın okunması ile düzeltilebilir. Ve Coffeescript'in kendine özgü kalıpları olduğundan eminim.

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



JavaScript, büyük ölçüde, oldukça dinamik web uygulamalarında, yalnızca "onları birbirine bağlayacak bir araç" dan çok daha fazlasıdır. React veya Angular gibi kütüphanelerdeki JS miktarı, hatta jQuery, bunun bir örneğidir.
Andy,

6

Aklımdaki en büyük profesyonel:

Basit bir tabir yazmanız gereken , fakat yazmamış olmanız gereken , javascript içinde derlenir .

Javascript'in sadece köşelerden kaçınan bazı kötü köşeleri var - kafamın tepesinden örnekler:

  • prototipi doğru ayarlamak
  • == yerine === kullanarak
  • null denetimi
  • tüm değişkenlerin var ile bildirilmesi
  • her şeyi kendi kendine çalışan bir anonim işlevde kaydırma.

Kahve metni yazarsanız, bunlar sizin için otomatik olarak yapılır .

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

  • Hata ayıklama bir ağrıdır
  • Daha az sayıda kahve programcısı var
  • Belgeleri javascript'ten coffeescript'e çevirmek zorundasınız.

3

profesyoneller

  1. CoffeeScript, JavaScript hakkında daha fazla bilgi edinmeme yardımcı oldu
  2. karmaşık iç içe geçmiş aramalar için bile okunması oldukça kolaydır.
  3. javascript’in bazı dil sorunlarının tespitini zorlaştıran bazı durumlarda güvenlik sağlar

Andrew’un yukarıdaki çalışma örneği aydınlatıcı olarak bulundu. Var olan nesne değişmez geri dönüşlerinin okunabilirliğinin, dönüşü yalnızca el ile tanımlayarak artırılacağına inanıyorum.

dönüş

// burada değişmez

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

Eksileri

Tarayıcı yorumladı CoffeeScript hata ayıklamak için zor olabilir.

Bu, geliştiricilerin biraz anlayışı ve değerlendirilmesini gerektiren ek bir JavaScript katmanıdır.


0

profesyoneller

  1. genel davaları sözdizimsel olarak optimize ettiler, aslında, CoffeeScript, "yaygın" kullanılan en özlü dilden biri değilse, http://redmonk.com/dberkholz/2013/03/25/programming-languages-ranked- yan ifade gücü /
  2. JavaScript’in kötü bölümlerini gizler (otomatik baskı ==, gizli küreler, daha geleneksel sınıf sistemi, genel işleri kolaylaştırır)
  3. Python / Ruby programcıları için öğrenmesi çok kolay
  4. çok satırlı adsız işlevler + boşluk alanı sözdizimi

Eksileri

  1. çıkarılması var demektir ki `var fall_back_to_js bir nesne kullanmadan bir iç kapsamında bir dış kapsam değişkeni değiştirmek ya da değil;` kesmek [neden başka bir atama tablosu ': =' Sadece obj.naem çok bir değer atar: = 5 yazım hatası kolay hata ayıklama]
  2. JavaScript hata ayıklamak istemediğiniz sürece, her araca bu konuda bilgi vermeniz gerekir :(; btw: kaynak haritalar için destek ekleyerek CoffeeScript'i Chrome'dan hata ayıklayabilirsiniz; CoffeeScript
  3. isteğe bağlı statik yazma yok (bir sonraki EcmaScript standardı için beklemelisiniz)
  4. hala bir modül sistemi için üçüncü taraf kütüphanelere ihtiyaç duyuyor
  5. dikkat edilmesi gereken sözdizimi tuzakları: örtük geri dönüşler, abgo , a (b (g (o))) , fp, b: 2, c: 8, f yerine f (p, {b: 2, c: 8}) anlamına gelir. (p, {b: 2}, {c: 8})
  6. bozuk JavaScript sayı / tür sistemini değiştirmez
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.