2. Me
• Zarar Siddiqi
• Agile Coach with a developer’s itch
• http://www.linkedin.com/in/zararsiddiqi
• zarar_siddiqi@epam.com
• Confluence page for This Week @:
• https://kb.epam.com/pages/viewpage.action?pageId=107875299
• Next week: Agile Games!
3. Agenda
• Why Bother?
• Basic Concept
• Simple But High ROI Features
• Other Nice Features
• Code Playground
• Windows Installation
• Examples
• Conclusion (or something like it)
• Discussion
6. #2: Problems with JavaScript
• Ambiguous constructs leading to verbosity
• function, prototype, extend, var, (function() {});
• Error-prone with late visibility
• Trailing commas, string concatenation, context binding, equality
• Limited features
• List comprehension, string interpolation, conditional modifiers
• Namespace pollution
• All <script> files loaded in one global scope
• PHP Problems
• Easy to get started; easy to go downhill
7. The math is simple
Lots of
JS
Easy to
write
messy
JS
Lots of
messy
JS
9. How it works
file.coffee Compile file.js
page.html
<script> tag
Analogous to less for CSS - http://lesscss.org/
10. Benefits
• .coffee has less code to maintain – 35-45% less
• Produces JSLint validated code (http://jslint.com)
• http://javascript.crockford.com/code.html
• Easy-to-read code (Influenced by Ruby, Python, Haskell)
• Focuses on JavaScript: The Good Parts (Douglas Crockford):
http://amzn.to/176RA4
• Written by smart people, very strong community support,
mature (3.5 years)
• Easy to unit test (Jasmine) - http://pivotal.github.io/jasmine/
12. #1: Defining classes
- Some ways of defining objects in JavaScript:
- Using function
- Using prototype
- var obj = {}
Let’s look at some examples…
13. Here’s one way…
// Using a function
function Apple (country) {
this.country = country;
this.color = "red";
this.getInfo = getAppleInfo;
}
function getAppleInfo() {
return this.country + ' has ' +
this.color + 'apples'.;
}
14. Here’s another…
// Using the prototype
function Apple (country) {
this.country = country;
this.color = "red";
}
Apple.prototype.getInfo = function() {
return this.country + ' has '
+ this.color + 'apples'.;
};
15. This will work too…
// Using object literals
var apple = {
country: "Sweden",
color: "red",
getInfo: function () {
return this.country + ' has '
+ this.color + 'apples'.;
}
}
16. Equivalent CoffeeScript class
class Apple
constructor: (@country) ->
@color = "red"
getInfo: ->
"{@country} has {@color} apples"
class BakedApple extends Apple
constructor: ->
super(“Canada”)
@color = “brown”
// No method keyword
// @ instead of this
// Implicit assignment
// Indentation
// Sensible class
declaration
// Interpolation
// Implicit returns
// Easy inheritance model
17. #2: The var problem
Example 1
function foo() {
var name = “Bob”;
age = 29;
}
alert(name);
alert(age);
Example 2
function printTen() {
for (i=0; i<10; i++) {
console.log(i);
}
return true
}
printTen();
alert(i);
18. CoffeeScript default scope is local
CoffeeScript
foo: ->
name = "Bob"
age = 29
JavaScript
printTen: function() {
var i, _i;
for (i = _i = 0; _i <= 10; i = _i += 1) {
console.log(i);
}
return true;
}
printTen();
alert(i);
function foo() {
var age, name;
name = "Bob";
age = 29;
}
printTen: ->
for i in [0..10] by 1
console.log i
return true
printTen()
alert(i)
23. A spoonful of sugar…
# Existence checking
if happy?
console.log "clap your hands"
# Skip null checks
truck.getTires()?.change()
# Tuple-like assignments
[a, b] = [1, 2]
if (truck.getTires() != null)
truck.getTires().change()
if (typeof happy !== "undefined"
&& happy !== null)
24. Some more sugar…
# Iterate over a list with index
for item, i in someList
alert “Item #{i} is #{item}“
# Conditional modifiers
# Conditional modifiers
turnOn() if buttonPressed is true
status = 'expired' unless withinRange()
25. A whole jar of sugar…
• http://coffeescript.org/
27. Installation
After downloading and installing NodeJS from
http://nodejs.org/download/
Execute following from command prompt:
C:>npm -g install coffee-script
C:>coffee
coffee>
29. As with everything…
• Use the right tool for the right job
• If it’s a small piece of JS, don’t bother. If it’s a JS-heavy
project, consider it
• Philosophical Debate:
Highly disciplined developers following a style guide
vs.
A language that helps standardize the produced code
30. Resources
• CoffeeScript Home Page
• http://coffeescript.org/
• JS2Coffee (Coffee2JS)
• http://js2coffee.org/
• Should you learn CoffeeScript?
• http://net.tutsplus.com/articles/interviews/should-you-learn-
coffeescript/
• Google Search – CoffeeScript Sucks
• http://goo.gl/MNQrY
• Brendan Eich
• https://brendaneich.com/2011/05/my-jsconf-us-presentation/
• The Little Book on CoffeeScript
• http://arcturo.github.io/library/coffeescript/
Editor's Notes
LibrariesUsed by pretty much everyone for even the simplest use caseUsed to the point where they’re a crutch – need jQuery for everything (add a CSS class name to a div)54% of websites have one of these librariesMVVMModel and view aspects are shifted to JS, allowing for responsive, rich UI applicationsInstead of the occasional <script> tag mixed in with your HTML, you’re basically writing our app in JSUSA Today, Walmart, Airbnb, Souncloud, Hulu, Wordpress, Disqus, Khan AcademyMobileHTML5 is the most popular choice for write-once-deploy anywhere applications Transferable skill-set from web to mobile – varying successPhoneGap now called CordovaMarmalade is the exceptionServerLast but not leastHigh volume applications demanding low-latency, strong failover (e.g., APIs) are being written using JS
Constructsfunction can be used to describe a class or a methodprototype vs. extend confusion regarding class creationvar can be used to define an object in global and local scope, function wrappingError-proneContext binding leads to function $.bindAll, bind – every library has themPHP ProblemsEasy to get startedEasy to go downhillThat’s when the pain strikes
CoffeeScript doesn’t quite come to the rescue, but more to the aid of those developers writing extensive JavaScript applications that require long-term maintenance.
A coffee file translates to a js file (by default)That js file is included in the pageCreated by Jeremy Ashkenas (Backbone)3.5 years old
Crockford: Inventor of JSONGood parts: functions, loose typing, dynamic objects, object literal notationBad parts: scoping, convoluted inheritance modelMore Ruby, Python developers are writing JavaScript, and a need to improve its production has emerged
- Looking at any code base you’ll find instances of each one
No braces!Implicit assignment (think Backbone models)@ instead of this - Ruby