it-swarm-eu.dev

Jaké jsou klady a zápory Coffeescript?

Jedno velké pro je samozřejmě množství syntaktického cukru, které v mnoha případech vede ke kratšímu kódu. Na http://jashkenas.github.com/coffee-script/ jsou působivé příklady. Na druhé straně mám pochybnosti, že tyto příklady představují kód složitých aplikací ve skutečném světě. Například v mém kódu nikdy nepřidávám funkce k holým objektům, ale spíše k jejich prototypům. Kromě toho je prototypová funkce před uživatelem skryta, což naznačuje klasický OOP) spíše než idiomatický Javascript.

Příklad pochopení pole by vypadal v mém kódu pravděpodobně takto:

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

Jsem autor připravované knihy o CoffeeScript:
http://pragprog.com/titles/tbcoffee/coffeescript

Byl jsem přesvědčen, že CoffeeScript se vyplatí používat asi po týdnu hraní s ním, přestože jazyk byl tehdy jen několik měsíců starý a měl mnohem drsnější hrany než nyní. Oficiální stránka odvádí skvělou práci se seznamem (většiny) jazykových funkcí, takže je nebudu opakovat zde. Spíše řeknu, že klady jazyka jsou:

  1. Podporuje používání dobrých vzorů JavaScriptu
  2. Odradí JavaScriptové vzory
  3. Zkracuje ještě lepší kód JavaScript a je čitelnější

Č. 3 získává mnohem více pozornosti než první dva (dokonce v mé knize), ale čím více o tom přemýšlím, tím více si uvědomuji, že jsem neudělal skok jen kvůli pěkné syntaxi; Udělal jsem skok, protože jazyk mě vtáhl k lepšímu, méně náchylnému k chybám JavaScript. Uveďte několik rychlých příkladů:

  • Protože proměnné mají automatický rozsah, nemůžete náhodou přepsat globály vynecháním var, stínovat proměnnou se stejným názvem (kromě pojmenovaných argumentů) nebo mít proměnné v různých souborech, které interagují (viz https://stackoverflow.com/questions/5211638/pattern-for-coffeescript-modules/5212449 ).
  • Protože -> Je sakra mnohem snazší zapisovat než function(){}, je jednodušší používat zpětná volání. Sémantické odsazení objasňuje, když jsou zpětná volání vnořena. A => Usnadňuje uchování this, je-li to vhodné.
  • Protože unless x Je pro anglické reproduktory snazší analyzovat než if (!x), a if x? Je snazší než if (x != null), uveďte pouze dva příklady, můžete tedy utratit méně mozkových cyklů v logické syntaxi a více v samotné logice.

Skvělá knihovna jako nderscore.js se může postarat o některé z těchto problémů, ale ne o všechny.

Nyní pro nevýhody:

  1. Kompilace může být bolest. Chyby syntaxe, které vyvolává kompilátor CoffeeScript, jsou často vágní. Očekávám, že na této trati bude v budoucnu dosaženo pokroku. (Na obranu kompilátoru často zachycuje věci, které - pokud jste je napsali v JavaScriptu - byste neobjevili jako chybu, dokud se tento řádek kódu nerozběhl. Je lepší chytit tyto chyby dříve než později.)
  2. Podobně může být ladění bolestí. Zatím neexistuje způsob, jak porovnat zkompilované řádky JS s původním kódem CoffeeScript (ačkoli lidé Firefoxu slíbili, že se to blíží).
  3. Je náchylné ke změně. Váš kód se může v budoucí verzi CoffeeScript spouštět odlišně nebo vůbec. Samozřejmě je tomu tak u většiny jazyků - přechod na novou verzi Ruby nebo Python je podobný - ale není tomu tak u JavaScriptu, kde můžete rozumně očekávat, že kód, který dnes funguje ve velkých prohlížečích, bude běžet ve velkých prohlížečích tak dlouho, dokud bude existovat web, jak jej známe.
  4. Není to tak známé. JavaScript je lingua franca . CoffeeScript se stal velmi populární v krátkém čase, ale je nepravděpodobné, že by si někdy užil tak rozsáhlou komunitu jako JavaScript.

Samozřejmě si myslím, že výhody převyšují nevýhody pro mě osobně, ale to nebude případ pro každého člověka, tým nebo projekt. (Dokonce i Jeremy Ashkenas píše hodně JavaScriptu.) CoffeeScript se nejlépe považuje za skvělý doplněk JavaScriptu, nikoli jako náhradu.

54
Trevor Burnham

Máme poněkud velkou kódovou základnu JavaScriptu a asi před měsícem jsme se rozhodli vyzkoušet CoffeeScript. Jeden z našich vývojářů začal s migrací jednoho z našich modulů z JS na CS pomocí http://js2coffee.org/ . Tento nástroj byl docela užitečný a trvalo asi dvě nebo tři hodiny, než se přeneslo 1000 řádků JavaScriptu. V této chvíli jsme si všimli několika pozorování:

  1. Výsledný kód CoffeeScript byl docela čitelný.

  2. Zkompilovali jsme ji zpět do JavaScriptu a bylo docela snadné navigovat a ladit. Zatímco jsme portovali tento modul, v něm našel chybu jiný vývojář z našeho týmu. Tito dva vývojáři tuto chybu opravili v našem starém kódu JavaScript a v novém kódu JavaScript, který vyšel z kompilátoru CS. Pracovali samostatně a trvalo jim to přibližně stejnou dobu (15-20 minut).

  3. Vzhledem k tomu, že se jednalo o port, výsledný kód nepoužíval funkce specifické pro kávu, které byly vhodné nebo žádoucí. Pokud bychom psali v CoffeeScript od začátku, kód by byl více idiomatický. Z tohoto důvodu jsme se později rozhodli, že stávající kód nebudeme portovat.

  4. Obecně se do určité míry zvýšila čitelnost kratších funkcí a menších objektů. U delších metod však tomu tak vůbec nebylo. Největší úspory naděje pocházely z -> a explicitně return, ale kromě toho se náš kód výrazně nezkrátil ani zjednodušil. Některé kousky syntaxe vypadaly docela matoucí, zejména objektové literály. CS vynechává složené závorky kolem definic členů a kombinované s „vše-je-an-výraz“ a implicitní return, díky kterému jsou některé kousky kódu docela obtížně čitelné.

    Zde je 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
    }
    

    A tady by vypadal odpovídající kód CoffeeScript:

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

    Nyní je docela obtížné zjistit, že návratový příkaz začíná na (*) řádek. V našem projektu se silně spoléháme na objektové literály: předáváme je jako funkční parametry a vrací je od ostatních funkcí. V mnoha případech bývají tyto objekty poměrně složité: s členy různých typů a několika úrovněmi vnoření. V našem případě byl celkový pocit, že kód CoffeeScript byl ve skutečnosti těžší číst než prostý kód JavaScript.

  5. Přestože se ukázalo, že ladění CoffeeScript je snazší, než jsme očekávali, střihový zážitek se poněkud zhoršil. Pro tento jazyk jsme nenašli dobrého editora/IDE. Nestandardizovali jsme editor/IDE pro kód na straně klienta pro náš projekt a ve skutečnosti všichni používáme různé nástroje. Ve skutečnosti každý v týmu souhlasí s tím, že když přejdou na CoffeeScript, dostanou od svého nástroje dost špatnou podporu. IDE a editorové pluginy jsou ve velmi rané formě a v některých případech nám dokonce nemohou poskytnout řádnou podporu zvýraznění syntaxe ani odsazení). Nemluvíme o úryvcích kódu nebo refaktoringu. Používáme WebStorm, Eclipse , NetBeans, VisualStudio, Notepad ++ a SublimeText2.

  6. Když už mluvíme o nástrojích, měl bych zmínit, že samotný kompilátor CoffeScript přichází jako balíček Node JS balíček. Jsme primárním obchodem Java/.NET, takže se každý vyvíjí v krabicích Windows. Až donedávna podpora Windows byla téměř ne - v Node se nám nepodařilo spustit kompilátor CoffeeScript, takže jsme se prozatím rozhodli zůstat s <script type="text/coffeescript"> tagy a kompilátor on-the-fly založený na prohlížeči.

    Kompilátor je poměrně rychlý a příliš nezvyšuje dobu spuštění. Nevýhodou je, že výsledný JavaScript je evaled a je trochu obtížné do něj vložit body zlomu ve vývojářských nástrojích prohlížečů (zejména v IE8). Pokud máme s laděním potíže, předkompilujeme CoffeeScript kód se stejným migračním nástrojem, jaký jsem uvedl výše, ale to stále není příliš pohodlné.

  7. Další přísliby CoffeeScript, jako je automatické var vkládání nebo poloprůhledná správa this s tlustou šipkou (=>) ukázalo se, že nedává tolik zisku, jak jsme doufali. Již používáme JSLint jako součást našeho procesu sestavování a kód zapisujeme do ES3 x ES5-Strict podmnožina jazyka. Skutečnost, že káva produkuje stejný druh „čistého“ kódu, je dobrá věc . Přál bych si, aby každý rámec na straně serveru vytvořil platné značkování HTML5 a CSS3!

    To znamená, že bych neřekl, že CoffeeScript ušetří spoustu času vložením klíčových slov var. Chybějící vars jsou snadno zachyceny JSLint a jsou snadno opravitelné. Navíc, jakmile se tím na nějakou dobu opravíte, začnete psát dobrý JavaScript automaticky. Takže bych neřekl, že káva je v tomto ohledu skutečně užitečná .

Hodnotili jsme CoffeeScript asi týden. Všichni členové týmu v něm psali kód a sdíleli jsme si mezi sebou své zkušenosti. Napsali jsme s ním nový kód a přenesli jsme nějaký existující kód, když jsme to považovali za vhodné. Naše pocity ohledně jazyka byly smíšené.

Obecně bych řekl, že to nezrychlilo náš vývoj, ale nezpomalilo nás to. Některé zrychlení v důsledku menšího psaní a menšího chybového povrchu byly kompenzovány zpomalením v jiných oblastech, většinou s podporou nástrojů. Po týdnu jsme se rozhodli, že nebudeme používat CoffeeScript, ale nezakazujeme to ani . Vzhledem k volnému výběru to v praxi nikdo nepoužívá, alespoň prozatím. Čas od času přemýšlím o prototypování nějaké nové funkce v něm a poté převeďte kód do JavaScriptu před integrací se zbytkem projektu, abyste získali rychlejší start, ale tento přístup jsem ještě nezkusil.

Pros

zobrazit Trevor Burnhamova odpověď .

plus, můžete myslet na sebe jako na hip chlapa, který dělá módní věci, místo toho, aby si pohrával se špínou javascriptu.

Nevýhody

CoffeeScript není nic jiného než syntaktický cukr a růžové brýle.

Pro snadnější věci - CoffeeScript je nadbytečný, protože dělat jednoduché věci je snadné v jakémkoli jazyce. A jQuery je pravděpodobně ještě jednodušší než CoffeeScript.

Pro tvrdé věci - musíte rozumět svému médiu. A vaše médium je HTML, DOM a CSS, Javascript je pouze nástrojem, jak je propojit - všechna API jsou napsána speciálně pro Javascript. Použití jiného jazyka, který by byl potom zkompilován do „skutečného“ jazyka, je docela riskantní, ať už jde o Java (GWT), Dart nebo CoffeeScript.

Anti-vzory nebo banální neznalost jazykových pravidel lze opravit čtením dvou dobrých knih. A jsem si docela jistý, že Coffeescript má své vlastní anti-vzory.

Podpora IDE pro Coffeescript je ještě horší než pro JS.

11
c69

Největší profík v mé mysli je:

Přímočarý coffescript se kompiluje do javascriptu, který jste měli napsat, ale ne, protože to nebylo jednoduché.

Existuje několik ošklivých rohů javascriptu, kterým se vyhýbáme pouze s ostražitostí - příklady z horní části mé hlavy:

  • správné nastavení prototypu
  • pomocí === místo ==
  • kontrola nulové hodnoty
  • deklarovat všechny proměnné var
  • zabalení všeho do self-vykonávající anonymní funkce.

Pokud píšete coffeescript, jsou všechny zpracovány za vás automaticky.

Nevýhody jsou, IMO, většinou menší:

  • Ladění je bolest
  • Existuje méně programátorů coffeescript
  • Musíte přeložit dokumentaci z javascriptu do coffeescript.
7
Sean McMillan

klady

  1. CoffeeScript mi ​​pomohl dozvědět se více o JavaScriptu
  2. je poměrně snadno čitelný, a to i pro složitá zpětná volání
  3. poskytuje bezpečnost v případě některých obtížně vyhledávaných jazykových problémů s javascriptem

Výše uvedený pracovní příklad Andrewa jsem zjistil, že je poučný. Věřím, že čitelnost jejich stávajících doslovných návratů objektu by byla posílena jednoduchou ruční identifikací návratu

vrátit se

// objekt doslovný zde

Nástroje IDE byly vylepšeny, TextMate a Cloud9 podporují CoffeeScript. Je pravda, že podpora oken je zpožděná (není to však pravda pro vývoj webových aplikací obecně?)

nevýhody

Prohlížeč interpretovaný CoffeeScript může být náročné ladit.

Je to další vrstva v horní části JavaScriptu vyžadující určité porozumění a zvážení od vývojářů.

3
user38265

klady

  1. skutečně optimalizovali běžné případy synteticky, ve skutečnosti je CoffeeScript jedním z, ne-li nejsrozumnějším jazykem, který se „běžně“ používá http://redmonk.com/dberkholz/2013/03/25/programming- jazyky seřazené podle expresivity /
  2. skrývá špatné části JavaScriptu (auto-donucení ==, implicitní globály, tradiční systém tříd usnadňuje běžné věci)
  3. pro programátory Python/Ruby je to velmi snadné
  4. víceřádkové anonymní funkce + mezera

nevýhody

  1. odstranění var znamená, že nemůžete změnit proměnnou vnějšího rozsahu uvnitř vnitřního oboru bez použití objektu, nebo `var fall_back_to_js;` hacks [proč ne další přiřazovací příkaz ': =', který pouze přiřadí hodnotu, takže obj.naem: = 5 překlepů snadněji laditelných]
  2. musíte o tom vědět každý nástroj, pokud nechcete ladit JavaScript :(; btw: můžete ladit CoffeeScript z Chrome přidáním podpory pro zdrojové mapy; yeoman (npm install yeoman) může pomoci píšete gulp nebo grunt konfigurační soubor pro CoffeeScript
  3. žádné volitelné statické psaní (musí počkat na další standard EcmaScript)
  4. stále potřebují knihovny třetích stran pro modulový systém
  5. syntaktické pasti, na které je třeba dát pozor: implicitní návraty, abgo znamená a (b (g (o))) , fp, b: 2, c: 8 znamená f (p, {b: 2, c: 8}) spíše než f (p, {b: 2}, {c: 8} )
  6. nemění nefunkční systém čísla nebo typu JavaScript
0
aoeu256