Комментарии 45
КофиСкрипт — получается, это не фреймворк, а отдельный скриптовый язык, компилируемый в ЯваСкрипт? Интересно. Конструкции языка чем-то похожи на Питон.
В чем преимущество такого подхода перед использованием ЯваСкриптовых фреймворков?
В чем преимущество такого подхода перед использованием ЯваСкриптовых фреймворков?
Это язык для упрощенной генерации Javascript. CoffeeScript не отменяет использования javascript фреймворков и прекрасно работает с ними, только синтаксит становится удобнее, а в остольном вы так же используете свой любимый JQuery или что то другое. Если вы работает с HAML + SASS, вам должно быть это знакомо
Даже опытные профи часто делают подобную ошибку, особенно когда объявляют переменные сцеплением: var a = 1, b = 2 и присваивают новое значение, глобальной переменной b.
весьма странное предположение
все уже исправлено, спасибо andy128k, за то, что написал мне об этом в ЛС, как я и просил…
Всё равно предположение осталось странным. Профи путают запятую и точку с запятой? Я и новичком-то их никогда не путал.
Дополнил статью собственным, более реальным примером
Оба примера притянуты за уши:

Более того, в разделе "Lexical Scoping and Variable Safety" видно, что, в CoffeeScript, в отличии от JavaScript нифига не понятно!
Смотрим пример:
Во что оно трансилоровалось?
Прекрасно! Иннер взялась из внутреннего контекста, и аутер — из внешнего. И в большой коде, если где-то затесался счётчик — всё сломается. Мы не контролируем область видимости, а надеемся, что CoffeeScript нас правильно поймёт
Рефакторинг спасёт вас, а не CoffeeScript. В CoffeeScript точно так же можно допустить ошибку, так что это лукавство:
Разделите на методы, как завещал старый, но умный дедушка Фаулер:
А если принципиально не создавать метод — воспользуйтесь новым методом «bind» ( + compatibility для старых браузеров )
Не аргумент.
Короче, рубисты не хотят учить JavaScript, потому сделали из прекрасного языка что-то похожее на Руби. Осуждаю.

Более того, в разделе "Lexical Scoping and Variable Safety" видно, что, в CoffeeScript, в отличии от JavaScript нифига не понятно!
Смотрим пример:
changeNumbers = ->
inner = -1
outer = 10
inner = changeNumbers()
Во что оно трансилоровалось?
changeNumbers = function() {
var inner;
inner = -1;
return outer = 10;
};
Прекрасно! Иннер взялась из внутреннего контекста, и аутер — из внешнего. И в большой коде, если где-то затесался счётчик — всё сломается. Мы не контролируем область видимости, а надеемся, что CoffeeScript нас правильно поймёт
Асинхронный функционал
Рефакторинг спасёт вас, а не CoffeeScript. В CoffeeScript точно так же можно допустить ошибку, так что это лукавство:
for i in [1..3]
setTimeout (-> console.log i), 0
Разделите на методы, как завещал старый, но умный дедушка Фаулер:
loop: function () {
for (var i = 1; i <= 3; i++) {
this.asyncLog(i);
}
},
asyncLog: function (i) {
setTimeout(function() { console.log(i); }, 0);
}
А если принципиально не создавать метод — воспользуйтесь новым методом «bind» ( + compatibility для старых браузеров )
for (var i = 1; i <= 3; i++) {
setTimeout(console.log.bind(console, i), 0);
}
Не аргумент.
Короче, рубисты не хотят учить JavaScript, потому сделали из прекрасного языка что-то похожее на Руби. Осуждаю.
толсто.
транслируется в
или вам нужны какие-то лишние переменные в контексте? тогда удачи.
стыд, позор и общественное порицание вам. жир утрите с монитора
changeNumbers = ->
inner = -1
outer = 10
inner = changeNumbers()
inner()
транслируется в
(function() {
var changeNumbers, inner;
changeNumbers = function() {
var inner, outer;
inner = -1;
return outer = 10;
};
inner = changeNumbers();
inner();
}).call(this);
или вам нужны какие-то лишние переменные в контексте? тогда удачи.
стыд, позор и общественное порицание вам. жир утрите с монитора
Идиот, перейди по ссылке jashkenas.github.com/coffee-script/, перейди к разделу «Lexical Scoping and Variable Safety» и посмотри первый пример. Если переменная есть в глобальном контексте, то в локальном ей не будет добавляться «var». Я специально дал ссылку и точное название раздела, но ты или тугой, или слепой.
Когда посмотришь пример протри слюни с монитора.

Когда посмотришь пример протри слюни с монитора.

умный вы наш, куски кода копипастить без контекста. по ссылке вашей никто ходить не будет, все будут смотреть в код и испражняться кирпичами
если переменная есть в глобальном контексте, то называть её так же в локальном не комильфо, мягко говоря. если так делаете, то у вас с кодом что-то не то.
удачи по жизни в конструктивном общении, ага
если переменная есть в глобальном контексте, то называть её так же в локальном не комильфо, мягко говоря. если так делаете, то у вас с кодом что-то не то.
удачи по жизни в конструктивном общении, ага
Отладку делать всё равно в нормальном javascript и тут мозги вскипят: весь код вроде бы тот же, да не тот.
[irony]Код true-программистов не нуждается в отладке...[/irony]
Восторженные возгласы резко сменятся гневом после обнаружения первой же ошибки компилятора.
Восторженные возгласы резко сменятся гневом после обнаружения первой же ошибки компилятора.
ну… как бэ одна из основных фич TDD — это перенести процесс отладки в процесс написание тестов.
Т.е. есть баг — пишешь тест, проявляющий баг, фиксишь, тестишь, еще раз фиксишь, проверяешь чтоб тест не валился.
Так что не такой уж это и «ирони» как казалось-бы :)
Т.е. есть баг — пишешь тест, проявляющий баг, фиксишь, тестишь, еще раз фиксишь, проверяешь чтоб тест не валился.
Так что не такой уж это и «ирони» как казалось-бы :)
А «фиксишь» не подразумевает отладки?
Даже странно, но в теории — нет (на практике мне лично все-же иногда приходится дебажить чтоб узнать почему именно получился такой результат вместо ожидаемого, но это скорее из-за плохой организации той системы, с которой я работаю).
Под «фиксишь» я имел ввиду именно изменение кода, необходимое для того, чтоб тест не зафейлился.
А отличие TDD от просто наличия тестов во время правки багов заключается в том, что сначала пишется тест, в котором заключается описание бага. Типа ожидали вот это. И еще во время написания теста уже приходит мысля как именно исправить код, чтоб тест прошел.
Под «фиксишь» я имел ввиду именно изменение кода, необходимое для того, чтоб тест не зафейлился.
А отличие TDD от просто наличия тестов во время правки багов заключается в том, что сначала пишется тест, в котором заключается описание бага. Типа ожидали вот это. И еще во время написания теста уже приходит мысля как именно исправить код, чтоб тест прошел.
это не теория. это религия. баги не пишут только те, кто ничего не делает. 100% покрыть тестами можно только абсолютную пустоту. а баги не всегда так очевидны, чтобы достаточно было взглянуть на код. да и на какой код смотреть — это ещё предстоит узнать.
narod.ru/disk/12010544001/%D0%9B%D0%BE%D0%B2%D1%83%D1%88%D0%BA%D0%B0%20%D0%B4%D0%BB%D1%8F%20%D0%B1%D0%B0%D0%B3%D0%BE%D0%B2.pptx.html
narod.ru/disk/12010544001/%D0%9B%D0%BE%D0%B2%D1%83%D1%88%D0%BA%D0%B0%20%D0%B4%D0%BB%D1%8F%20%D0%B1%D0%B0%D0%B3%D0%BE%D0%B2.pptx.html
Извините, не хочу показаться грубым, но заходя в ваш профиль я был уверен что вам за 30-ть. И по видимому не ошибся.
До знакомства с CoffeeScript, я пару лет пользовался HAML(язык разметки для упрощённой генерации XHTML) и не разу у меня не возникало никаких проблем с отладкой. Более того, отладка упростилась. То же можно сказать и про SASS
На данную тему есть отличная статья, "Очнитесь, на дворе XXI век", она подходит для любого языка, если читать между строк.
До знакомства с CoffeeScript, я пару лет пользовался HAML(язык разметки для упрощённой генерации XHTML) и не разу у меня не возникало никаких проблем с отладкой. Более того, отладка упростилась. То же можно сказать и про SASS
На данную тему есть отличная статья, "Очнитесь, на дворе XXI век", она подходит для любого языка, если читать между строк.
ыть… а что, сейчас «за 30-ть» — это критерий?
Я вот прямо скажу — мне «за 30-ть», но слежу за с++0x (даж gcc 4.6 ради этого прикрутил), node.js, GAE, GWT, стараюсь следить за алгоритмами, базами данных — редиску у себя на компе крутил так и сяк, HTML5+CSS3 курю… Вот после 10+ лет использования MS-продуктов перешел дома на ubuntu.
Хотя работаю я с enterprise-level .NET: C#, ASP.NET, Win7/Server, MSSQL и прочие прелести.
Так что вот не надо, пожалуйста, про «за 30-ть».
ПС. это был оффтоп, но вместо «у меня не возникало никаких проблем» можно было бы ссылочку на то как именно дебажить кофискрипт по кофискриптовскому исходнику а не по JS, который получился.
Я вот прямо скажу — мне «за 30-ть», но слежу за с++0x (даж gcc 4.6 ради этого прикрутил), node.js, GAE, GWT, стараюсь следить за алгоритмами, базами данных — редиску у себя на компе крутил так и сяк, HTML5+CSS3 курю… Вот после 10+ лет использования MS-продуктов перешел дома на ubuntu.
Хотя работаю я с enterprise-level .NET: C#, ASP.NET, Win7/Server, MSSQL и прочие прелести.
Так что вот не надо, пожалуйста, про «за 30-ть».
ПС. это был оффтоп, но вместо «у меня не возникало никаких проблем» можно было бы ссылочку на то как именно дебажить кофискрипт по кофискриптовскому исходнику а не по JS, который получился.
Но ведь там та же конструкция не принимает обратный смысл? ;-)
(подразумеваю var, вернее его отсутствие)
(подразумеваю var, вернее его отсутствие)
Очень смущает "->" и "=>". Делая часто код ревью скажу, что если язык пропускает похожие символы не меняя семантики (т.е. компилироваться будет + даже запускаться иногда без проблем будет пока не заюзают "@"), то это приводит к очень неприятным трудноуловимым последствиям.
Да, конечно, краткость — сестра таланта. Но имея продвинутые IDE (с хорошей системой дополнений) и снипетов с генераторами, лучше иметь чуть больше кода, чем потом сидеть и всматриватся в симолы ловя отличия между "-" и "=".
Очень не хочется поиметь еще один язык, позволяющий писать write-only конструкции.
ПС. В принципе то же относится к "(" и "{" — если синтаксис языка позволяет подменять одно на другое, но от этого сильно меняется результат — это тоже не есть гуд.
К примеру кусок из статьи:
setTimeout (-> console.log i), 0
не знаю, как в кофи-скрипте, но выглядит это как вызов функции setTimeout с одним параметром и потом простое выражение «0». Если это не так, и ",0" — второй парамтр, то появляется вопрос как читать вот такие конструкции:
somefunc param1, another_func param2, param3
А именно param3 передется первой функции или второй.
Ну и плюс
somefunc (x), y = y + 1
и т.д.
В общем, очень интересно, но немного пугает кажущаяся неоднозначность языка (да, можно читать мануалы, но...)
Да, конечно, краткость — сестра таланта. Но имея продвинутые IDE (с хорошей системой дополнений) и снипетов с генераторами, лучше иметь чуть больше кода, чем потом сидеть и всматриватся в симолы ловя отличия между "-" и "=".
Очень не хочется поиметь еще один язык, позволяющий писать write-only конструкции.
ПС. В принципе то же относится к "(" и "{" — если синтаксис языка позволяет подменять одно на другое, но от этого сильно меняется результат — это тоже не есть гуд.
К примеру кусок из статьи:
setTimeout (-> console.log i), 0
не знаю, как в кофи-скрипте, но выглядит это как вызов функции setTimeout с одним параметром и потом простое выражение «0». Если это не так, и ",0" — второй парамтр, то появляется вопрос как читать вот такие конструкции:
somefunc param1, another_func param2, param3
А именно param3 передется первой функции или второй.
Ну и плюс
somefunc (x), y = y + 1
и т.д.
В общем, очень интересно, но немного пугает кажущаяся неоднозначность языка (да, можно читать мануалы, но...)
Поправки:
1) очень многие проблемы JavaScript решаются с помощью «use strict», в том числе, — неявное объявление переменной недопустимо;
2) С выходом Rails 3.1 выбор останется, просто CoffeeScript будет включен по умолчанию. Никто не мешает его убрать из Gemfile. Вообще, там целый холивар — github.com/rails/rails/commit/9f09aeb8273177fc2d09ebdafcc76ee8eb56fe33#comments



1) очень многие проблемы JavaScript решаются с помощью «use strict», в том числе, — неявное объявление переменной недопустимо;
2) С выходом Rails 3.1 выбор останется, просто CoffeeScript будет включен по умолчанию. Никто не мешает его убрать из Gemfile. Вообще, там целый холивар — github.com/rails/rails/commit/9f09aeb8273177fc2d09ebdafcc76ee8eb56fe33#comments
Про «нет выбора» — мне кажется надо как-то пометить, что это шутка. А то многие прочитаю, подумают что dhh совсем ебанулся и заставляет всех учить кофескрипт, а иначе вон из профессии.
Там просто он по-умолчанию предлагается. Во-первых, никто не заставляет юзать, во-вторых, поддежку тоже можно убрать удалив одну строку из гемфайла.
Там просто он по-умолчанию предлагается. Во-первых, никто не заставляет юзать, во-вторых, поддежку тоже можно убрать удалив одну строку из гемфайла.
> Конечно, если вы обновитесь до Rails 3.1, у вас не будет выбора
то, что написано на том сайте по ссылке, грубо говоря, — бред. как уже говорили выше, никто не запрещает стеререть одну строчку в Gemfile, или вовсе ничего не удаляя, продолжить писать в обычные JS файлы.
белки_истерички.jpg
то, что написано на том сайте по ссылке, грубо говоря, — бред. как уже говорили выше, никто не запрещает стеререть одну строчку в Gemfile, или вовсе ничего не удаляя, продолжить писать в обычные JS файлы.
белки_истерички.jpg
По-моему какие-то надуманные проблемы. Особенно с var, this и setTimeout.
не больше, не меньше як просто адаптация синтаксиса под Ruby. Если хорошо понимаешь тонкости языка, то можешь использовать их во благо ;)
По этим примерам, у меня напрашивается вывод, что CoffeeScript не нужен если понимаешь JS.
Много лишних запятых. Очень. Вы прям маньяк.
Хочется CoffeeScript для PHP…
«Я стал писать код быстрее, и с меньшим количеством ошибок, потому что он, стал намного чище.» Я бросил нудную работу и нашел новую с высокой зарплатой. Я познакомился с прекрасной женщиной, которая стала матерью моих замечательных детей. Теперь у меня есть квартира с пентхаусом, красная феррари, личный вертолет и солидный счет в швейцарском банке.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
CoffeeScript в деле — Пять вещей, которые можно сделать и с JavaScript