Advertencia: Este artículo tiene la intención de fomentar un estilo de codificación (léase preferencias) que puede hacer su vida más fácil. Algunos de estas sugerencias podrían hacer que se parezca a ciertos lenguajes que pueden o no ser de su agrado de los lectores -o incluso ofenderlos. Venimos en paz, sin ánimo de faltarle el respeto a nadie.

Javascript es la única opción que tenemos como lenguaje interpretado por el navegador. Aunque potente, codificar la sintaxis JS pura, puede llegar a ser complicado, especialmente para los que vienen de lenguajes orientados a objetos como Ruby o Python. Coffescript aborda este problema con una solución transparente: un hermoso lenguaje que compila a JS. Como yo lo veo, CS tiene la intención de dejarlo hacer las cosas a manera de Ruby. Es decir, escribir menos, hacer más.

¿Qué ganamos?

Más lectura, menos LOC, menos dolor. Vamos a iterar un poco sobre algunas de sus características.

  • Paréntesis( () ) son opcionales.
  • (...)-> syntax:

javascript:

f = function() {
  return x(Math.pow(x, 3) + 4);
}

coffeescript:

f = (x)-> Math.pow(x, 3) + 4

Los bloques de código se infieren de la sangría (identation), hay una gran flexibilidad para pasar argumentos. Esto se puede apreciar mucho más cuando se trabaja con una lista de argumentos complejos que podrían tener funciones como parámetros. Ejemplo de la vida real:

javascript:

$('#query_form a').on('click', function() {
  var $query;
  $query = $(this).parent().find('input[name="query"]').val();
  if ($query === "") {
    return alert("NO ò_ò");
  }
  return $.get("/posts/query", {
    query: $query
  }, function(data) {
    return $.each(data.json, function() {
      var $link;
      $link = $('<a>').attr({
        href: "posts/show/" + this.id,
        "class": 'act'
      }).html(this.title);
      $query_container.append($('<p>').html($link));
      return $query_container.append($('<p>').html(this.body));
    });
  });
});

coffeescript:

$('#query_form a').on 'click', ->
  $query = $(this).parent().find('input[name="query"]').val()
  return alert "NO ò_ò" if $query is ""
  $.get "/posts/query", query: $query, (data) ->
    $.each data.json, ->
      $link = $('<a>').attr(
        href: "posts/show/#{@id}"
        class: 'act').html @title
      $query_container.append $('<p>').html $link
      $query_container.append $('<p>').html @body

Tratar de depurar esta última pieza de código a simple vista, puede asesinar sus ojos. Perder un solo corchete y estás acabado. Aunque LOC no parece caer muy bajo en este ejemplo, la legibilidad puede ahorrar preciosos minutos -o incluso horas- de su tiempo.

  • El compilador se encarga del ámbito (scope) léxico. Basta de declaraciones var . Las palabras claves return también son opcionales.
outer = 1
changeNumbers = ->
  inner = -1
  outer = 10
inner = changeNumbers()
  • Sintaxis para la mayoría de las características del lenguaje: coffeescript:
person.sing() if person.happy
returns se envía automáticamente en cada rama de la posible ejecución, por lo que sus ruby:
def greet # Los returns no son necesarios
  hs = Time.now.strftime("%k")
  "Good #{hs === 6..19 ? 'night' : 'day'}"
end

se convierte en CoffeeScript: (sí! la interpolación de cadenas de texto es soportada)

greet = ->
  hs = (new Date()).getHours
  "Good #{(hs in [6..19]) ? 'day' : 'night'}"

alert greet()

Sería redundante mencionar todas las características de CoffeeScript aquí. Compruebe Coffeescript.org para obtener más información sobre sus extras, o divertirse convirtiendo sus JS en coffeescript y ver como es aquí . Ahora, la verdadera pregunta es, ¿Debe utilizar CS? Seguro que se ha encontrado una variedad de información acerca de por qué o por qué no utilizar CS. Todas estas personas han (más o menos) tiene argumentos igualmente válidos, pero me gustaría destacar una: Maggie Longshore comentó un caso contra coffescript

Reemplazar C de CS y Assembler por JS y entonces estos argumentos me recuerdan cuando los programadores de Assembler comenzaban a utilizar C para escribir programas, C era mucho más rápido de escribir y más fácil de leer, sabíamos ensamblador dentro y por fuera. La depuración había que hacerla en el nivel de ensamblado (sistemas empotrados). Así que tuvimos que depurar en código Assembler que no habíamos escrito, si escribimos los programas en C o podríamos escribir y depurar toda la aplicación en ensamblador. Afortunadamente, teníamos fragmentos de código fuente con C y Assembler, junto con las direcciones asignadas para facilitar entrar al código y escribir parches sobre la marcha para la prueba. Escribir en C era menos propenso a errores, y consumìa mucho menos tiempo en depuración, que eran mucho más productivas en C. La herramienta fue mejor y no había vuelta atrás. No sé si el CS va a sobrevivir o no, pero si los desarrolladores son productivos en él, entonces la utilización y la historia de depuración se puede mejorar con el tiempo.

En cualquier caso, si sos nuevo en Javascript, te sugiero no saltar al Coffeescript hasta que tener los fundamentos cubiertos o -como muchas otras personas señalaron- que harás todo mal. Al final Coffescript es otra forma de escritura Javascript y (espero) una mejor.

Ruby on Rails developer at Altoros Argentina