4 ms·
Am I the only one that has trouble parsing this CoffeeScript? I thought the syntax was suppose to be cleaner than plain javascript: MyApp.president = Ember.Obj
by jtchang 14y ago
Am I the only one that has trouble parsing this CoffeeScript? I thought the syntax was suppose to be cleaner than plain javascript:
MyApp.president = Ember.Object.create
fullName: (->
@get('firstName') + ' ' + @get('lastName')
).property('firstName', 'lastName')
How the hell am I suppose to read that?
- aroman 14y agoAre you familiar with CoffeeScript? I've been developing in it for more than 6 months now and that code is perfectly readable to me. Granted, I wouldn't say it's very good code -- I would probably split that into two lines just so it looks less intimidating. But I can assure you, once you get into the swing of it, that's not some intelligible mess -- you can most certainly understand it. And if you don't? Just take a peek at the compiled JS. Someone said that CoffeeScript is designed to be more writable than readable, and I'd tend to agree with that. But frankly, after having worked with it for the better part of a year, I prefer reading it than JS for just about everything. It's an acquired taste, but don't knock it till you try it :)
- cubicle67 14y agoEdit: previous example was incorrect as pointed out by klibertp below. Hopefully they're correct now... it's not exactly a shining example of good coffeescript, but I think this is equivalent js MyApp.president = Ember.Object.create({ fullName: function(){ return this.get('firstName') + ' ' + this.get('lastName'); }.property('firstName', 'lastName') }) I'd probably write it in cs as MyApp.president = Ember.Object.create fullName: ( -> "#{@get 'firstName'} #{@get 'lastName'}" ).property('firstName', 'lastName') (ie multi line rather than a single line) but that's very much just stylistic choice. It's also a lousy example of the benefits of cs as the cs version doesn't add any benefit over the plain js one.
- klibertp 14y agoYou're wrong. The 'property' is a method on the Function prototype - take a closer look. Anyway, style does matter and were this line written with readability in mind you wouldn't make this mistake. Also, I would definitely abstract over @get and property: makeProperty = (attrs...) -> func = () -> (@get(x) for x in attrs).join(" ") func.property(attrs...) MyApp.president = Ember.Object.create( fullName: makeProperty("firstName", "lastName") ) The parens after create are not needed, the next indented line should tell us that this is a function with arguments, but I don't mind them here.
- cubicle67 14y agogah! you're right! I've attempted to update my comment with corrected code, but given my caffeine and sleep deprived state there's a good chance it's just as wrong as my original effort :/
- knieveltech 14y agoIf it takes that much effort to gin up example code I think the point has been made.
- klibertp 14y agoYou're joking, right? If not, then you're trying to generalize one line of shitty code and one mistake of a tired programmer to the whole language - and I don't believe you'd want to do that!
- avenger123 14y agoClever or hard to read code is just that. I don't use CoffeeScript but I wouldn't use this example to be mean about it. At the end of the day, it is an acquired taste. My only concern is I don't have the time to invest to make a decision on it and I would suspect others are in the same boat. So, by default we choose a tentative no.
- nahname 14y agoIf you were to read the equivalent javascript as a one liner it would be hard to read too. Probably more so. Really, all you are pointing out is that you can write shitty code in any language. No language protects you. If you write beautiful javascript, you will write beautiful coffeescript and it will be 20-60% smaller. Reading less lines is less reading, this helps me.
- TazeTSchnitzel 14y agoNonsense. The equivalent JavaScript is clearer, albeit more verbose.
- callil 14y agoI think that's the point, verbose is usually "containing more words than necessary"
- deleted 14y ago[deleted]
- nahname 14y agoNeither is very palatable. MyApp.president = Ember.Object.create(({fullName: (function() {return this.get('firstName')+' '+this.get('lastName');}).property('firstName', 'lastName')})); MyApp.president = Ember.Object.create fullName: (-> @get('firstName') + ' ' + @get('lastName') ).property('firstName', 'lastName')
- TazeTSchnitzel 14y agoAt least I can look at the first one and it's more obvious to me what it does. The braces help.