SlideShare a Scribd company logo
1 of 28
Download to read offline
Real Life CoffeeScript
What is CoffeeScript?
   CS is a language that compiles into
   JavaScript (like HAML and SASS)

  Not a superset of JS (not like SCSS)

Not a JS framework (not a replacement for
                jQuery)
From the maker
CoffeeScript is a little language that compiles into JavaScript. Underneath all of those
embarrassing braces and semicolons, JavaScript has always had a gorgeous object
model at its heart. CoffeeScript is an attempt to expose the good parts of JavaScript
in a simple way. - Josh Ashkenas
Why all the fuss?
CS will be a standard part of Rails 3.1 (along
                 with SASS)

        It makes JS more like Ruby!

 CS is an npm package, hence a gateway
      drug to Node.js and Socket.IO
Why use CS?
 compiles to lint-free JS, nothing fancy

easy to write "good parts javascript" that
               looks clean

  makes good practices less tedious

HAML and SASS are awesome and now
        you're using those...
What are the features?
Easy variable declaration (lexical scoping)

   Easy class inheritance and binding

   Easy instance variables @name =>
               this.name

       Implicit return from functions

         "String #{interpolation}"
Semantic Shortcuts
      -> and => instead of function(){}

execute() if that is thing1 and that isnt thing2

         and/or/not instead of &&/||/!

            that = thing1 or thing2

                that or= thing3
Conditionals
 if condition? (no parantheses, ? is .nil? not
                   .blank?)

   if condition?() to evaluate if a function
                 returns null

throwAFit() unless @name in ["Paul", "John"]
How much more?
      list traversal: for result in results

return (transform result for result in results)

        switch/when/else instead of
            switch/case/default

        yes/no, on/off for true/false
Show me some code!
Some ugly JavaScript
var sortFunction = function(a,b) {
    if (typeof(a[sort_col]) === 'number') {
        // numeric sort
        if (sort_dir === 'up') return (a[sort_col] - b[sort_col]);
        else                   return (b[sort_col] - a[sort_col]);
    } else {
        // string sort
        var aName = a[sort_col].toLowerCase(), bName = b[sort_col].toLowerCase();
        if (sort_dir === 'up') return (aName > bName);
        else return (bName > aName);
    }
}

this.getResults = function(){
    // here is the place to apply filter
    var results = parent.results;
    if (filter_text) {
        results = $.makeArray($.map(results, function(result, i){
             var haystack = [result.name, result.brands, result.address, result.city].join(', ')
             return (haystack.indexOf(filter_text) != -1) ? result : null;
        }));
    }
    if (sort_col && sort_dir) {
        results = results.sort(sortFunction);
    }
    return results;
}
class Results
    setSort: (col, dir) ->
        if col? and dir?
            results = _(@results).sortBy (result) -> result[col]
            @results = if dir is 'down' then results.reverse() else results
    setFilter: (filter) ->
        if filter?
            matching = (needle) ->
                haystack = _.join needle.name, needle.brand_list, needle.address, needle.city
                _(haystack).includes(needle)
            @results = _.select @results, matching
standard jQuery with object binding
$('#view_as_table').click => @.setViewType('Table', true)
$('#view_as_thumbs').click => @.setViewType('Thumb', true)
$('#view_as_list').click   => @.setViewType('List', true)
Big Long jQuery Call
var makeSortable = function(){
    $('#widgets .col').sortable({
        items: 'div.widget',
        dropOnEmpty: true,
        handle: '.header h3',
        appendTo: 'body',
        connectWith: '.col',
        ...
    });
makeSortable = ->
    $('#widgets .col').sortable
        items: 'div.widget'
        dropOnEmpty: yes
        handle: '.header h3'
        appendTo: 'body'
        connectWith: '.col'
        revert: yes
        cursor: 'move'
        placeholder: 'drag-over'
        stop: updateWidgetOrder
class JKT.GoogleLoader
    constructor: (callback) ->
        @callback = callback
        if google? then @loadComponent() else @loadGoogle()
    loadComponent: -> return
    loadGoogle: () ->
        script = document.createElement "script"
        script.src = "http://www.google.com/jsapi?key=#{JKT.google_api_key}&sensor=false"
        script.type = "text/javascript"
        if script.attachEvent? # IE
             script.attachEvent 'onreadystatechange', =>
                 if script.readyState in ['loaded', 'complete']
                     @loadComponent()
        else
             script.onload = => @loadComponent()
        document.getElementsByTagName("head")[0].appendChild(script)

class JKT.MapLoader extends JKT.GoogleLoader
    loadComponent: ->
        google.load 'maps', '3',
            other_params: "sensor=false"
            callback: @callback
        return
super Is Super
class JKT.Search.TableRenderer
    constructor: (results) -> @results = results
    render: ->
        $('#results').html $('#listing_grid').render [{foo:"bar"}]
        $('#results tbody').html $('#listing_grid_row').render(@results)

class JKT.Search.MapRenderer extends JKT.Search.TableRenderer
    render: ->
        super
        if @results.length <= 300
            $('#results tbody tr').each ->
                ...
class Results
    ...
    paginate: (start, end) ->
        if start? and end?
            @results = @results[start..end]
    toSentence: ->
        size = _.size(@results) or 0
        if size is 1 then "1 result" else 
            "#{size} results"

    enoughForMap: -> _.size(@results) < 300
    any         : -> _.isArray(@results) and _.any(@results)
Sources of resistance?
I already know JavaScript
          Kudos to you. I do too.

      Not a substitute for knowing JS.

Your own JS isn't as clean as the compiled
                    JS

Unless your last name is Resig or Crockford
It looks weird.
 It's the bastard child of Ruby and Python.

Once you get used to it, it's the JS that looks
                 whack.
I don't write JS, I write
        jQuery.
  No you write JS using jQuery.

        I use jQuery too.

 CS makes your jQuery cleaner.
Sugar Allergies
 Are you allergic to "syntactic sugar"?

        CS is more than that.

We need a better name because we all
     know sugar is bad for you.

        Line Noise Reduction
Sugar = Noise Reduction
Bad line noise highly affects the readability of our code. It is true we get used to them,
but once you remove it, there's no way back. - Jose Valim
Indentation Allergies
                  "I like my curly braces"

          CS uses Pythonic whitespace

         You get used to it - cost/benefit

      I really don't understand why using indentation level for blocks is so
  controversial. You do indentation anyway; you don't want to violate OAOO; it
 avoids hard-to-spot errors where indentation and begin/end or {/} differ; it looks
 cleaner; there's no way to have unmatched braces; and I never get indentation
  wrong, but sometimes I do have to count braces. In other words, don't let this
issue stop you from trying out Python; indentation-denoted blocks are very easy
                        to get used to. -- Falk Bruegmann
Firebug Will Break
You lose the correspondence between your
     code and line numbers in Firebug

           There is no FireCoffee

Use small coffee files to get approximate line
              correspondence

The compiled JS is not magical - you can still
                  read it
What about syntax
     highlighting?
    No plugin for Eclipse/Aptana

Use TextMate, jEdit, gEdit, vim, emacs

    The TextMate bundle is great!
Maybe on the next project
Unless your current project is almost done
     and will never be maintained...

Porting that project is just what you need to
                  learn CS.

  It's not "all or nothing": one file at a time

If you don't like it you can keep the change.
Where do I start?
Don't just dive in or you'll be coding before
                 you're ready

    Read the CS overview a few times
(http://jashkenas.github.com/coffee-script)

   Install CS and the TextMate bundle

         Port a project's JS to CS

        Write some new CS code

More Related Content

What's hot

Beginning Object-Oriented JavaScript
Beginning Object-Oriented JavaScriptBeginning Object-Oriented JavaScript
Beginning Object-Oriented JavaScriptStoyan Stefanov
 
Ruby on Rails Presentation
Ruby on Rails PresentationRuby on Rails Presentation
Ruby on Rails Presentationadamcookeuk
 
Moose - YAPC::NA 2012
Moose - YAPC::NA 2012Moose - YAPC::NA 2012
Moose - YAPC::NA 2012xSawyer
 
Ruby Programming Language
Ruby Programming LanguageRuby Programming Language
Ruby Programming LanguageDuda Dornelles
 
Dan Shappir "JavaScript Riddles For Fun And Profit"
Dan Shappir "JavaScript Riddles For Fun And Profit"Dan Shappir "JavaScript Riddles For Fun And Profit"
Dan Shappir "JavaScript Riddles For Fun And Profit"Fwdays
 
Effecient javascript
Effecient javascriptEffecient javascript
Effecient javascriptmpnkhan
 
Understanding Object Oriented Javascript - Coffee@DBG June
Understanding Object Oriented Javascript - Coffee@DBG JuneUnderstanding Object Oriented Javascript - Coffee@DBG June
Understanding Object Oriented Javascript - Coffee@DBG JuneDeepu S Nath
 
Perl.Hacks.On.Vim
Perl.Hacks.On.VimPerl.Hacks.On.Vim
Perl.Hacks.On.VimLin Yo-An
 
Fundamental JavaScript [In Control 2009]
Fundamental JavaScript [In Control 2009]Fundamental JavaScript [In Control 2009]
Fundamental JavaScript [In Control 2009]Aaron Gustafson
 
Javascript Common Design Patterns
Javascript Common Design PatternsJavascript Common Design Patterns
Javascript Common Design PatternsPham Huy Tung
 
Extreme Swift
Extreme SwiftExtreme Swift
Extreme SwiftMovel
 
Programming Language Swift Overview
Programming Language Swift OverviewProgramming Language Swift Overview
Programming Language Swift OverviewKaz Yoshikawa
 
Good Evils In Perl
Good Evils In PerlGood Evils In Perl
Good Evils In PerlKang-min Liu
 
Backbone js
Backbone jsBackbone js
Backbone jsrstankov
 

What's hot (20)

Beginning Object-Oriented JavaScript
Beginning Object-Oriented JavaScriptBeginning Object-Oriented JavaScript
Beginning Object-Oriented JavaScript
 
Ruby on Rails Presentation
Ruby on Rails PresentationRuby on Rails Presentation
Ruby on Rails Presentation
 
Moose - YAPC::NA 2012
Moose - YAPC::NA 2012Moose - YAPC::NA 2012
Moose - YAPC::NA 2012
 
Ruby Programming Language
Ruby Programming LanguageRuby Programming Language
Ruby Programming Language
 
Dan Shappir "JavaScript Riddles For Fun And Profit"
Dan Shappir "JavaScript Riddles For Fun And Profit"Dan Shappir "JavaScript Riddles For Fun And Profit"
Dan Shappir "JavaScript Riddles For Fun And Profit"
 
Effecient javascript
Effecient javascriptEffecient javascript
Effecient javascript
 
Understanding Object Oriented Javascript - Coffee@DBG June
Understanding Object Oriented Javascript - Coffee@DBG JuneUnderstanding Object Oriented Javascript - Coffee@DBG June
Understanding Object Oriented Javascript - Coffee@DBG June
 
Factory Girl
Factory GirlFactory Girl
Factory Girl
 
Scala vs Ruby
Scala vs RubyScala vs Ruby
Scala vs Ruby
 
Introduction to es6
Introduction to es6Introduction to es6
Introduction to es6
 
Perl.Hacks.On.Vim
Perl.Hacks.On.VimPerl.Hacks.On.Vim
Perl.Hacks.On.Vim
 
Fundamental JavaScript [In Control 2009]
Fundamental JavaScript [In Control 2009]Fundamental JavaScript [In Control 2009]
Fundamental JavaScript [In Control 2009]
 
Javascript Common Design Patterns
Javascript Common Design PatternsJavascript Common Design Patterns
Javascript Common Design Patterns
 
Extreme Swift
Extreme SwiftExtreme Swift
Extreme Swift
 
Moose
MooseMoose
Moose
 
Programming Language Swift Overview
Programming Language Swift OverviewProgramming Language Swift Overview
Programming Language Swift Overview
 
Ruby on Rails for beginners
Ruby on Rails for beginnersRuby on Rails for beginners
Ruby on Rails for beginners
 
Good Evils In Perl
Good Evils In PerlGood Evils In Perl
Good Evils In Perl
 
Jquery 1
Jquery 1Jquery 1
Jquery 1
 
Backbone js
Backbone jsBackbone js
Backbone js
 

Similar to Real life-coffeescript

Rails-like JavaScript using CoffeeScript, Backbone.js and Jasmine
Rails-like JavaScript using CoffeeScript, Backbone.js and JasmineRails-like JavaScript using CoffeeScript, Backbone.js and Jasmine
Rails-like JavaScript using CoffeeScript, Backbone.js and JasmineRaimonds Simanovskis
 
Single Page Web Applications with CoffeeScript, Backbone and Jasmine
Single Page Web Applications with CoffeeScript, Backbone and JasmineSingle Page Web Applications with CoffeeScript, Backbone and Jasmine
Single Page Web Applications with CoffeeScript, Backbone and JasminePaulo Ragonha
 
HTML5 for the Silverlight Guy
HTML5 for the Silverlight GuyHTML5 for the Silverlight Guy
HTML5 for the Silverlight GuyDavid Padbury
 
DIWE - Programming with JavaScript
DIWE - Programming with JavaScriptDIWE - Programming with JavaScript
DIWE - Programming with JavaScriptRasan Samarasinghe
 
Introduction to Client-Side Javascript
Introduction to Client-Side JavascriptIntroduction to Client-Side Javascript
Introduction to Client-Side JavascriptJulie Iskander
 
JavaScript: The Good Parts Or: How A C# Developer Learned To Stop Worrying An...
JavaScript: The Good Parts Or: How A C# Developer Learned To Stop Worrying An...JavaScript: The Good Parts Or: How A C# Developer Learned To Stop Worrying An...
JavaScript: The Good Parts Or: How A C# Developer Learned To Stop Worrying An...Doug Jones
 
What can be done with Java, but should better be done with Erlang (@pavlobaron)
What can be done with Java, but should better be done with Erlang (@pavlobaron)What can be done with Java, but should better be done with Erlang (@pavlobaron)
What can be done with Java, but should better be done with Erlang (@pavlobaron)Pavlo Baron
 
Uses & Abuses of Mocks & Stubs
Uses & Abuses of Mocks & StubsUses & Abuses of Mocks & Stubs
Uses & Abuses of Mocks & StubsPatchSpace Ltd
 
Polyglot Programming in the JVM
Polyglot Programming in the JVMPolyglot Programming in the JVM
Polyglot Programming in the JVMAndres Almiray
 
CoffeeScript - A Rubyist's Love Affair
CoffeeScript - A Rubyist's Love AffairCoffeeScript - A Rubyist's Love Affair
CoffeeScript - A Rubyist's Love AffairMark
 
jQuery & 10,000 Global Functions: Working with Legacy JavaScript
jQuery & 10,000 Global Functions: Working with Legacy JavaScriptjQuery & 10,000 Global Functions: Working with Legacy JavaScript
jQuery & 10,000 Global Functions: Working with Legacy JavaScriptGuy Royse
 

Similar to Real life-coffeescript (20)

Rails-like JavaScript using CoffeeScript, Backbone.js and Jasmine
Rails-like JavaScript using CoffeeScript, Backbone.js and JasmineRails-like JavaScript using CoffeeScript, Backbone.js and Jasmine
Rails-like JavaScript using CoffeeScript, Backbone.js and Jasmine
 
Wakanday JS201 Best Practices
Wakanday JS201 Best PracticesWakanday JS201 Best Practices
Wakanday JS201 Best Practices
 
Single Page Web Applications with CoffeeScript, Backbone and Jasmine
Single Page Web Applications with CoffeeScript, Backbone and JasmineSingle Page Web Applications with CoffeeScript, Backbone and Jasmine
Single Page Web Applications with CoffeeScript, Backbone and Jasmine
 
HTML5 for the Silverlight Guy
HTML5 for the Silverlight GuyHTML5 for the Silverlight Guy
HTML5 for the Silverlight Guy
 
"Javascript" por Tiago Rodrigues
"Javascript" por Tiago Rodrigues"Javascript" por Tiago Rodrigues
"Javascript" por Tiago Rodrigues
 
DIWE - Programming with JavaScript
DIWE - Programming with JavaScriptDIWE - Programming with JavaScript
DIWE - Programming with JavaScript
 
Introduction to Client-Side Javascript
Introduction to Client-Side JavascriptIntroduction to Client-Side Javascript
Introduction to Client-Side Javascript
 
JavaScript: The Good Parts Or: How A C# Developer Learned To Stop Worrying An...
JavaScript: The Good Parts Or: How A C# Developer Learned To Stop Worrying An...JavaScript: The Good Parts Or: How A C# Developer Learned To Stop Worrying An...
JavaScript: The Good Parts Or: How A C# Developer Learned To Stop Worrying An...
 
What can be done with Java, but should better be done with Erlang (@pavlobaron)
What can be done with Java, but should better be done with Erlang (@pavlobaron)What can be done with Java, but should better be done with Erlang (@pavlobaron)
What can be done with Java, but should better be done with Erlang (@pavlobaron)
 
Einführung in TypeScript
Einführung in TypeScriptEinführung in TypeScript
Einführung in TypeScript
 
SQL -PHP Tutorial
SQL -PHP TutorialSQL -PHP Tutorial
SQL -PHP Tutorial
 
JDBC – Java Database Connectivity
JDBC – Java Database ConnectivityJDBC – Java Database Connectivity
JDBC – Java Database Connectivity
 
Lettering js
Lettering jsLettering js
Lettering js
 
Scala introduction
Scala introductionScala introduction
Scala introduction
 
Refactoring
RefactoringRefactoring
Refactoring
 
Uses & Abuses of Mocks & Stubs
Uses & Abuses of Mocks & StubsUses & Abuses of Mocks & Stubs
Uses & Abuses of Mocks & Stubs
 
Polyglot Programming in the JVM
Polyglot Programming in the JVMPolyglot Programming in the JVM
Polyglot Programming in the JVM
 
CoffeeScript - A Rubyist's Love Affair
CoffeeScript - A Rubyist's Love AffairCoffeeScript - A Rubyist's Love Affair
CoffeeScript - A Rubyist's Love Affair
 
ES6: The Awesome Parts
ES6: The Awesome PartsES6: The Awesome Parts
ES6: The Awesome Parts
 
jQuery & 10,000 Global Functions: Working with Legacy JavaScript
jQuery & 10,000 Global Functions: Working with Legacy JavaScriptjQuery & 10,000 Global Functions: Working with Legacy JavaScript
jQuery & 10,000 Global Functions: Working with Legacy JavaScript
 

Recently uploaded

How to convert PDF to text with Nanonets
How to convert PDF to text with NanonetsHow to convert PDF to text with Nanonets
How to convert PDF to text with Nanonetsnaman860154
 
Understanding the Laravel MVC Architecture
Understanding the Laravel MVC ArchitectureUnderstanding the Laravel MVC Architecture
Understanding the Laravel MVC ArchitecturePixlogix Infotech
 
IAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsIAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsEnterprise Knowledge
 
Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024BookNet Canada
 
The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024Rafal Los
 
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 3652toLead Limited
 
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...Patryk Bandurski
 
AI as an Interface for Commercial Buildings
AI as an Interface for Commercial BuildingsAI as an Interface for Commercial Buildings
AI as an Interface for Commercial BuildingsMemoori
 
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptxHampshireHUG
 
Presentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreterPresentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreternaman860154
 
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmaticsKotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmaticscarlostorres15106
 
The Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptxThe Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptxMalak Abu Hammad
 
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationFrom Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationSafe Software
 
Unblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen FramesUnblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen FramesSinan KOZAK
 
Install Stable Diffusion in windows machine
Install Stable Diffusion in windows machineInstall Stable Diffusion in windows machine
Install Stable Diffusion in windows machinePadma Pradeep
 
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...HostedbyConfluent
 
Pigging Solutions in Pet Food Manufacturing
Pigging Solutions in Pet Food ManufacturingPigging Solutions in Pet Food Manufacturing
Pigging Solutions in Pet Food ManufacturingPigging Solutions
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerThousandEyes
 
Scaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationScaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationRadu Cotescu
 
08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking MenDelhi Call girls
 

Recently uploaded (20)

How to convert PDF to text with Nanonets
How to convert PDF to text with NanonetsHow to convert PDF to text with Nanonets
How to convert PDF to text with Nanonets
 
Understanding the Laravel MVC Architecture
Understanding the Laravel MVC ArchitectureUnderstanding the Laravel MVC Architecture
Understanding the Laravel MVC Architecture
 
IAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsIAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI Solutions
 
Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
 
The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024
 
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365
 
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
 
AI as an Interface for Commercial Buildings
AI as an Interface for Commercial BuildingsAI as an Interface for Commercial Buildings
AI as an Interface for Commercial Buildings
 
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
 
Presentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreterPresentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreter
 
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmaticsKotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
 
The Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptxThe Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptx
 
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationFrom Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
 
Unblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen FramesUnblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen Frames
 
Install Stable Diffusion in windows machine
Install Stable Diffusion in windows machineInstall Stable Diffusion in windows machine
Install Stable Diffusion in windows machine
 
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...
 
Pigging Solutions in Pet Food Manufacturing
Pigging Solutions in Pet Food ManufacturingPigging Solutions in Pet Food Manufacturing
Pigging Solutions in Pet Food Manufacturing
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 
Scaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationScaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organization
 
08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men
 

Real life-coffeescript

  • 2. What is CoffeeScript? CS is a language that compiles into JavaScript (like HAML and SASS) Not a superset of JS (not like SCSS) Not a JS framework (not a replacement for jQuery)
  • 3. From the maker CoffeeScript is a little language that compiles into JavaScript. Underneath all of those embarrassing braces and semicolons, JavaScript has always had a gorgeous object model at its heart. CoffeeScript is an attempt to expose the good parts of JavaScript in a simple way. - Josh Ashkenas
  • 4. Why all the fuss? CS will be a standard part of Rails 3.1 (along with SASS) It makes JS more like Ruby! CS is an npm package, hence a gateway drug to Node.js and Socket.IO
  • 5. Why use CS? compiles to lint-free JS, nothing fancy easy to write "good parts javascript" that looks clean makes good practices less tedious HAML and SASS are awesome and now you're using those...
  • 6. What are the features? Easy variable declaration (lexical scoping) Easy class inheritance and binding Easy instance variables @name => this.name Implicit return from functions "String #{interpolation}"
  • 7. Semantic Shortcuts -> and => instead of function(){} execute() if that is thing1 and that isnt thing2 and/or/not instead of &&/||/! that = thing1 or thing2 that or= thing3
  • 8. Conditionals if condition? (no parantheses, ? is .nil? not .blank?) if condition?() to evaluate if a function returns null throwAFit() unless @name in ["Paul", "John"]
  • 9. How much more? list traversal: for result in results return (transform result for result in results) switch/when/else instead of switch/case/default yes/no, on/off for true/false
  • 10. Show me some code!
  • 11. Some ugly JavaScript var sortFunction = function(a,b) { if (typeof(a[sort_col]) === 'number') { // numeric sort if (sort_dir === 'up') return (a[sort_col] - b[sort_col]); else return (b[sort_col] - a[sort_col]); } else { // string sort var aName = a[sort_col].toLowerCase(), bName = b[sort_col].toLowerCase(); if (sort_dir === 'up') return (aName > bName); else return (bName > aName); } } this.getResults = function(){ // here is the place to apply filter var results = parent.results; if (filter_text) { results = $.makeArray($.map(results, function(result, i){ var haystack = [result.name, result.brands, result.address, result.city].join(', ') return (haystack.indexOf(filter_text) != -1) ? result : null; })); } if (sort_col && sort_dir) { results = results.sort(sortFunction); } return results; }
  • 12. class Results setSort: (col, dir) -> if col? and dir? results = _(@results).sortBy (result) -> result[col] @results = if dir is 'down' then results.reverse() else results setFilter: (filter) -> if filter? matching = (needle) -> haystack = _.join needle.name, needle.brand_list, needle.address, needle.city _(haystack).includes(needle) @results = _.select @results, matching
  • 13. standard jQuery with object binding $('#view_as_table').click => @.setViewType('Table', true) $('#view_as_thumbs').click => @.setViewType('Thumb', true) $('#view_as_list').click => @.setViewType('List', true)
  • 14. Big Long jQuery Call var makeSortable = function(){ $('#widgets .col').sortable({ items: 'div.widget', dropOnEmpty: true, handle: '.header h3', appendTo: 'body', connectWith: '.col', ... }); makeSortable = -> $('#widgets .col').sortable items: 'div.widget' dropOnEmpty: yes handle: '.header h3' appendTo: 'body' connectWith: '.col' revert: yes cursor: 'move' placeholder: 'drag-over' stop: updateWidgetOrder
  • 15. class JKT.GoogleLoader constructor: (callback) -> @callback = callback if google? then @loadComponent() else @loadGoogle() loadComponent: -> return loadGoogle: () -> script = document.createElement "script" script.src = "http://www.google.com/jsapi?key=#{JKT.google_api_key}&sensor=false" script.type = "text/javascript" if script.attachEvent? # IE script.attachEvent 'onreadystatechange', => if script.readyState in ['loaded', 'complete'] @loadComponent() else script.onload = => @loadComponent() document.getElementsByTagName("head")[0].appendChild(script) class JKT.MapLoader extends JKT.GoogleLoader loadComponent: -> google.load 'maps', '3', other_params: "sensor=false" callback: @callback return
  • 16. super Is Super class JKT.Search.TableRenderer constructor: (results) -> @results = results render: -> $('#results').html $('#listing_grid').render [{foo:"bar"}] $('#results tbody').html $('#listing_grid_row').render(@results) class JKT.Search.MapRenderer extends JKT.Search.TableRenderer render: -> super if @results.length <= 300 $('#results tbody tr').each -> ...
  • 17. class Results ... paginate: (start, end) -> if start? and end? @results = @results[start..end] toSentence: -> size = _.size(@results) or 0 if size is 1 then "1 result" else "#{size} results" enoughForMap: -> _.size(@results) < 300 any : -> _.isArray(@results) and _.any(@results)
  • 19. I already know JavaScript Kudos to you. I do too. Not a substitute for knowing JS. Your own JS isn't as clean as the compiled JS Unless your last name is Resig or Crockford
  • 20. It looks weird. It's the bastard child of Ruby and Python. Once you get used to it, it's the JS that looks whack.
  • 21. I don't write JS, I write jQuery. No you write JS using jQuery. I use jQuery too. CS makes your jQuery cleaner.
  • 22. Sugar Allergies Are you allergic to "syntactic sugar"? CS is more than that. We need a better name because we all know sugar is bad for you. Line Noise Reduction
  • 23. Sugar = Noise Reduction Bad line noise highly affects the readability of our code. It is true we get used to them, but once you remove it, there's no way back. - Jose Valim
  • 24. Indentation Allergies "I like my curly braces" CS uses Pythonic whitespace You get used to it - cost/benefit I really don't understand why using indentation level for blocks is so controversial. You do indentation anyway; you don't want to violate OAOO; it avoids hard-to-spot errors where indentation and begin/end or {/} differ; it looks cleaner; there's no way to have unmatched braces; and I never get indentation wrong, but sometimes I do have to count braces. In other words, don't let this issue stop you from trying out Python; indentation-denoted blocks are very easy to get used to. -- Falk Bruegmann
  • 25. Firebug Will Break You lose the correspondence between your code and line numbers in Firebug There is no FireCoffee Use small coffee files to get approximate line correspondence The compiled JS is not magical - you can still read it
  • 26. What about syntax highlighting? No plugin for Eclipse/Aptana Use TextMate, jEdit, gEdit, vim, emacs The TextMate bundle is great!
  • 27. Maybe on the next project Unless your current project is almost done and will never be maintained... Porting that project is just what you need to learn CS. It's not "all or nothing": one file at a time If you don't like it you can keep the change.
  • 28. Where do I start? Don't just dive in or you'll be coding before you're ready Read the CS overview a few times (http://jashkenas.github.com/coffee-script) Install CS and the TextMate bundle Port a project's JS to CS Write some new CS code