Temat: Coffe script
Jako osoba ktora sie juz troche CoffeScriptu napisala moge napisac co nieco. A wiec w punktach
- duzo mniej pisania $(document).ready == $->, czasem z przejrzystoscia jest "inaczej" ale jest to kwestia przyzwyczajenia
- standardyzuje zapis obiektowy, prototype, this wydaja sie byc troche niepotrzebna juz przeszloscia, dla mnie jest jeden z wiekszych plusow, bo wreszcie rozni programisci beda pisac OOP w JSie tak samo, bo jak wiadomo mozna to robic na rozne sposoby
- naprawia czesc problemow javascriptu - np kwestie bindowania this-a w eventach
- lata braki - ddodajac np forEach, ulatwia uzywanie wyrazen regularnych itp
- wreszcie nie trzeba laczyc stringow za pomoca miliona plusow
- temat debugowania jest dlugi i nie chce mi sie klocic - generalnie dla mnie jest to bzdura. Generowany kod jest bardzo przejrzysty i jesli nie korzystamy z kompresji :D to odnalezienie odpowiadajacych sobie fragmentow Coffee i zwyklego JSa jest bardzo proste. CS to rozwiazanie stosunkowo nowe i napewno pojawia sie dodatkowe narzedzia do tego :)
- jak wspomnialem generuje bardzo ladny kod, i nie generujac 10k linii jak Google Dart, istnieja juz fajne aplikacje wspierajace kompilacje i ladnie pokazujace bledy np CodeKit
http://incident57.com/codekit/
W projekcie na ktorym w sumie wciaz troche eksperymentuje mam 41 klas i nie wyobrazam sobie pisania tego w JSie. Piszac w nim na powrot czuje delikatnie mowiac malo produktywny. Na koniec maly prosty przyklad bez dziedziczenia i innych gadzetow :)
CS
class Element
x:0
y:0
css_class:"element"
inside_html:"e"
constructor: (@x,@y) ->
@id=Math.random().toString(36).substring(2);
@build()
build: () ->
html="<div id='#{@id}' class='tile element #{@css_class}' style='top:#{@y}px;left:#{@x}px;'>#{@inside_html}</div>"
$(document.body).prepend html
@el=$('#'+@id)
html: (html) ->
@el.html html
toggle_class: (css_class) ->
@el.toggleClass(css_class)
refresh:() ->
get_coordinates:->
{x:@x,y:@y}
JS
Element = (function() {
Element.prototype.x = 0;
Element.prototype.y = 0;
Element.prototype.css_class = "element";
Element.prototype.inside_html = "e";
function Element(x, y) {
this.x = x;
this.y = y;
this.id = Math.random().toString(36).substring(2);
this.build();
}
Element.prototype.build = function() {
var html;
html = "<div id='" + this.id + "' class='tile element " + this.css_class + "' style='top:" + this.y + "px;left:" + this.x + "px;'>" + this.inside_html + "</div>";
$(document.body).prepend(html);
return this.el = $('#' + this.id);
};
Element.prototype.html = function(html) {
return this.el.html(html);
};
Element.prototype.toggle_class = function(css_class) {
return this.el.toggleClass(css_class);
};
Element.prototype.refresh = function() {};
Element.prototype.get_coordinates = function() {
return {
x: this.x,
y: this.y
};
};
return Element;
})();
Paweł Krefta edytował(a) ten post dnia 20.12.11 o godzinie 16:55