Нам не нужен ваш кофе

http://blog.ponyfoo.com/2013/09/28/we-dont-want-your-coffee
  • Перевод


Это открытое письмо CoffeeScript-сообществу.
Вы можете присоединиться к дискуссии на Hacker News.

Эта тирада, возможно, также справедлива для TypeScript и ему подобных. Чёрт, да даже для asm.js. Я знаю, что asm.js впечатляет в теории, но вы сами пытались пройтись по написанному на нём коду? Это мусор, и вам явно не придётся писать такое в ваших обычных каждодневных исходниках.

Теперь не поймите меня неправильно, меня полностью устраивает то, что вы потягиваете свой модный кофе сами. Проблемы начинаются тогда, когда вы брызгаете этим кофе на всё, чем занимаетесь, или пытаетесь напоить им всех вокруг. Ваш кофе становится заразной болезнью, и вам нужно остановить её распространение. Такие языки, как CoffeeScript, представляет собой проблему сообщества в целом не потому, что язык плох по своей природе, а потому, что вы считаете, что все остальные понимают эту ахинею.
Что? Это не ахинея, это прекрасно! Это JavaScript.
Специальный выпуск новостей: это не JavaScript, он просто компилируется в него. Перестаньте пытаться поработить людей на StackOverflow, отвечая на их JavaScript-вопросы кодом на CoffeeScript. Перестаньте пытаться получить помощь по JavaScript, выкладывая код на Coffee, который мы не понимаем.

Проблема не в самом языке. Хоть мне и не нравится язык сам по себе, я поддерживаю разнообразие, как, впрочем, и все остальные. Проблема в таких как вы, те, кто постит что-либо в сеть так, будто все вокруг знают, как работает CoffeeScript. Конечно, он компилируется в JavaScript. Мы поняли. Но мы не собираемся изучать ваш чудной язык.

(прим. пер.) Далее автор цитирует отрывок из фильма «Телесеть» (Network, 1976), перевод отрывка приведён далее под спойлером.
Мне не нужно говорить вам, что всё плохо, все и так знают, что всё плохо. Будто всё на свете сходит с ума, и поэтому мы больше не выходим на улицы. Мы сидим дома, а мир, в котором мы живём, постепенно сжимается, и всё, что мы говорим, это «пожалуйста, оставьте нас в покое хотя бы в наших гостиных».

Итак, я хочу, чтобы вы сейчас встали.


Перевод отрывка
Мне не нужно говорить вам, что всё плохо, все и так знают, что всё плохо.
Это депрессия. Люди остаются без работы либо боятся её потерять. Доллар идёт по цене пятицентовой монеты, банки закрываются. Продавцы держат стволы за прилавками. Шпана бесчинствует на улицах. Никто нигде не знает, что делать, и этому нет конца. Мы знаем, что воздух стал непригоден для дыхания, а еда — для питания. Мы сидим и смотрим телевизор, в то время как какой-нибудь репортёр рассказывает нам, что произошло 15 убийств и 63 тяжких преступления, как будто так и положено! Мы знаем, что всё плохо. Даже хуже, чем плохо. Они сошли с ума. Всё на свете сходит с ума, и поэтому мы больше не выходим на улицы. Мы сидим дома, а мир, в котором мы живём, постепенно сжимается, и всё, что мы говорим, это:

Пожалуйста, оставьте нас в покое хотя бы в наших гостиных. Оставьте мне мой тостер, мой телевизор и антенну. Я ничего не скажу, просто оставьте нас в покое.

А я не оставлю вас в покое. Я хочу, чтобы вы вышли из себя! Я не хочу, чтобы вы протестовали или бунтовали. Не пишите вашему конгрессмену. Я не знаю, что вам ему написать. Я не знаю, что делать с депрессией, с инфляцией, с русскими, с преступностью на улицах. Всё, что я знаю, это то, что вам нужно рассердиться! Вам нужно сказать: «Я человек, чёрт побери! Моя жизнь имеет ценность!»

Итак, я хочу, чтобы вы сейчас встали. Я хочу, чтобы вы все встали со своих стульев и кресел. Я хочу, чтобы вы встали и подошли к окну, открыли его, высунули в него свою голову и прокричали: «Я зол как чёрт, и я не буду больше это терпеть!».

Вы знали, что некоторые компании на самом деле отворачиваются от Coffee просто потому, что люди по сути не знают языка? Проблема, с которой столкнулись Discourse, состояла в том, что они не получали ожидаемой отдачи от разработчиков просто потому, что их JavaScript был обфусцирован Coffee. Этой причины было достаточно для того, чтобы щёлкнуть выключателем и больше не притрагиваться к CoffeeScript. Проблема ясна: люди, знающие Coffee, должны знать JavaScript, если хотят писать хороший код. В обратную сторону это утверждение уже не так правдиво, у остальной части Вселенной нет причин изучать Coffee, и те из нас, кто не купился на его ощутимые преимущества, остались за бортом.

Я даже не вдаюсь в дебаты «кто лучше?». Мне не очень нравится синтаксис, и опять же, мне всё равно, что кому-то он нравится. Более того, кое-кто пишет довольно длинные статьи на эту тему. Кроме того, первым непроцедурным языком, с которым я познакомился, был Visual Basic, у которого был такой же «человекопонятный» синтаксис, который мы видим в CoffeeScript, чьи перлы вроде one isnt two напоминают мне о временах, когда я тоже отказывался от качества кода в пользу того, чтобы слепо передавать компилятору On Error Resume Next, непонятную конструкцию в VB, которая вела себя, как если бы каждая строка была обёрнута в блок try…catch. Ах, эта радость слепой и наивной отладки.

Проблема с «детским» синтаксисом состоит в том, что он слишком много скрывает, делая код практически недоступным для понимая таких парней как я, не сидящих на кофеине. Не этого мы хотим. Это проблема всех языков, которые компилируются в «веб-языки» (HTML, JS, CSS).

Jade, например, выдаёт чистый HTML, который просто использует CSS-селекторы, с помощью синтаксиса, близкого к тому, что мы знаем как Zen Coding. Сравнивая Jade с чрезвычайно многословной природой HTML (или XML), преимущества становятся видны невооружённым глазом.

Вот немного Jade:

ul#crocodile-items
  li(ng-repeat='foo in bar')
    div {{name}}
    div.details
      div
        span Description
        span {{desc}}
      div
        span Price
        span {{price}}

Набор «руками» такого HTML занял у меня немного больше времени:

<ul id="crocodile-items">
  <li ng-repeat="foo in bar">
    <div>{{name}}</div>
    <div class="details">
      <div>
        <span>Description</span>
        <span>{{desc}}</span>
      </div>
      <div>
        <span>Price</span>
        <span>{{price}}</span>
      </div>
    </div>
  </li>
</ul>

Преимущества использования Jade начинают накапливаться, если принять во внимание такие вещи, как наследование, примеси, JavaScript, ну и тот факт, что вы больше не будете забывать закрывать теги.

Тем временем с Coffee всё наоборот. Что за фигня происходит в скомпилированном JavaScript-коде? Я понятия не имею. Для меня это чёрный ящик. Я не люблю чёрные ящики. Они чёрные и в форме куба. И это всё, что я знаю о чёрных ящиках, они ничего не говорят мне о том, что происходит внутри. Написание JavaScript-кода автоматически означает, что у нас есть полный контроль над тем, что мы делаем, и это дорогого стоит. И напоследок ещё кое-что. Как вы собираетесь использовать ES6, когда он выйдет? Насколько я знаю, он сломает CoffeeScript таким, каким мы знаем его сейчас, и это как бы отстой. Это значит, что вы либо застрянете в языке, который не может использовать последние возможности JavaScript, либо вам придётся перелопатить тонны кода и вернуться к тому, с чего начали. Что касается меня, я лучше не буду запирать себя на замок языком, старающимся помочь мне писать хороший код.

Моё предложение к вам состоит даже не в том, чтобы перестать использовать CoffeeScript, но быть более внимательными к тем, кто ничего не знает о вашем прелестном языке. Всегда компилируйте свой код в JavaScript перед тем, как задавать вопрос на StackOverflow, или отвечать на пост в блоге. Возможно, вы даже узнаете что-то о самом JavaScript.
Поделиться публикацией
AdBlock похитил этот баннер, но баннеры не зубы — отрастут

Подробнее
Реклама
Комментарии 445
  • +26
    А отличная идея — в более широком смысле — вообще запретить окружающим: говорить непонятные мне слова, т.к. «я их не понимаю», оперировать непонятными мне концепциями, т.к. «они мне не знакомы» и т.д. Далеко пойдет автор :)
    • +66
      По-моему в контексте статьи ( вопросы и ответы на SO) аналогия не вполне корректна. Ведь если вы спрашиваете о правилах построения предложений на русском, то ответ о таких правилах на языке эсперанто вас не очень устроит. Особенно если их будут пытаться выдать за правила для русского языка.
      • –18
        Но автор-то даже и спрашивать на эсперанто запрещает. Это вообще, по-моему, за гранью.

        Насчет ответов — с одной стороны, соглашусь, на js общепонятнее будет.

        С другой стороны — ответ на SO дело добровольное, как и чтение такого ответа. И если человек хочет потратить свое время на ответ, и в качестве «платы» желает популяризовать что-то, например, любимый диалект, почему он не вправе? Не понимаете coffee/typescript/… — пропускайте этот, читайте другие ответы. Давший ответ ничем не обязан вам, чтобы вы ему условия ставили, правда ведь?
        • +21
          … и в качестве «платы» желает популяризовать ...

          в качестве платы на SO — рейтинг, кстати купите слона, а? (в качестве платы за коммент)

          Автор запрещает спрашивать о JS приводя пример на CS и наоборот, потому что JS isnt CS.
          • –14
            Ну может этот гипотетический популяризатор готов обменять свой рейтинг (который ему не поставят coffee-
            • –9
              Ну может этот наш гипотетический популяризатор готов пожертвовать своим рейтингом (который ему не поставят нелюбители coffee) на эту фразу. А может, ему любители кофе еще и добавят, кто знает. Слава Богу, это решает сообщество, плюсуя, а не авторитарные личности с призывами «запретить». Спасибо, слон уже есть :)

              А как можно спрашивать о JS, приводя пример на CS? Ведь такой вопрос можно автоматом считать про CS, да и все.
              • +19
                Ну судя по тому, что автор пишет:
                Перестаньте пытаться поработить людей на StackOverflow, отвечая на их JavaScript-вопросы кодом на CoffeeScript. Перестаньте пытаться получить помощь по JavaScript, выкладывая код на Coffee, который мы не понимаем.
                такие случаи имеют место быть.
                • 0
                  Слава Богу, это решает сообщество, плюсуя, а не авторитарные личности с призывами «запретить».

                  Вот были бы минуса…
              • +2
                Эсперанто, в данном случае, — это JavaScript.
            • +36
              В статье указана конкретная проблема — не нужно пытаться поить и брызгаться. Я лично сталкивался с этой проблемой, и полностью поддерживаю. Не имею ничего против кофе, но уместно его использовать когда остальные члены команды владеют ним, а не когда один человек начинает навязывать. И почему то часто, люди, его использующие, фанатеют и пытаются сделать из других членов команды фанатов, чем тормозят процесс разработки.
              • –1
                Согласен, в команде конечно же нужно следовать общим политикам, тут и говорить нечего.
                • +4
                  В целом верно — но есть одно но: Следуя вашей логике как мы вообще получили ЯВУ(языки высокого уровня)? Условно говоря вся команда пишет с 0 и 1 А я тут такой раз и на ассемблере что-то написал и начал всем говорить что это круто. Это и стало круто — и на вопросы 1010101010101 ??? Мне стали все отвечать ассемблером. А потом прошло время и появился С — и все пошло по тойже схеме. Таким образом я думаю и появляются новые языки программирования, которые мы все сейчас знаем. Так что если сообществу нравится и оно пишет на чем-то — то почему люди не должны писать на кофе? Другой вопрос если человек пишет на кофе и не представляет кто-такой js, НО причем тут coffeescript? Если кто-то чего-то не знает — не надо валить на плохия языки, и вообще соседа — знать или не знать решаешь сам. И многие из нас стали забывать как выглядит в ассемблере написанный нами код…
                  • +9
                    Неверный принцип выбора технологий, совсем неверный.

                    Выбирать технологии под знания *всей* команды — это прямой путь к отставанию от прогресса. «Мы этого не знаем» — это вообще не аргумент. Аргумента может быть два:

                    — Нам эта технология подходит (и тогда мы ее изучаем и используем)
                    — Нам эта технология не подходит (и тогда мы ее в этом проекте не используем, даже если знаем)

                    Команда, которая будет пытаться иметь равные компетенции и избегать вещей, непонятных хоть кому-то из ее членов будет хранически на несколько лет отставать от актуальных технологий, т.к. пока нечто новое узнают и освоят (без пинков, как я понимаю) *все* — пройдет очень много времени.

                    Специалистов нужно слегка подталкивать к развитию своих знаний и навыков, даже если им этого не особо-то и хочется, но в проекте это нужно.
                    • +1
                      А какие есть проекты где js подходит а кофескрипт внезапно не подходит? Имхо кофескрипт это просто удобная штука, которая заменяет чистый js. Я так понимаю что кофескрипт это не технология а просто удобство, вдобавок к технологии js(в данном контексте)
                      • +2
                        Вопрос в том, действительно ли она удобная. А если удобная, то не достигается ли это удобство ценой (значимой) потери эффективности. Не забываем, что в подавляющем большинстве случаев речь идёт о выполнении в неконтролируемой среде, даже минимальные требования обычно не можем заявить.
                        • 0
                          Вопрос в том, действительно ли она удобная

                          Ну раз народ использует — то наверное удобная. Конечно могут быть мазахисты, но не все же ))
                          А если удобная, то не достигается ли это удобство ценой (значимой) потери эффективности.

                          Конечно любой интерпритатор на выходе напишет == или хуже чем знающий человек ручками. Этот момент даже и не оспаривается. С другой стороны а на сколько хуже(время отработки кода с учетом что его стало больше на пару килобайт, байт) js, который выдаст coffeescript? Я пологаю в 99% случаев разница пренебрежительна мала и действильно не играет роли на данном этапе развития хардваре и скорости интернета. Возможно у меня не такие проекты были за время существования кофескрипта, но ниразу проблем с его использованием не было в плане эффективности(Конечно никто не говорит о минифицированных js библиотеках и тому подобных вещах — просто обычные веб проект со своей внутренней логикой)
                          • 0
                            Ну раз народ использует — то наверное удобная.

                            На их проектах это может быть удобно, на других нет.
                            разница пренебрежительна мала и действильно не играет роли на данном этапе развития хардваре и скорости интернета.

                            Как минимум есть нетоповые смартфоны и планшеты с медленной мобильной связью.

                            Ну и я не только про эффективность выполнения, но и про цикл разработки. Писать может быть и удобно, и эффективно, но усложняются процессы деплоя и обновления.
                      • +2
                        Выбирать технологии под знания *всей* команды — это прямой путь к отставанию от прогресса. «Мы этого не знаем» — это вообще не аргумент. <...>
                        Специалистов нужно слегка подталкивать к развитию своих знаний и навыков, даже если им этого не особо-то и хочется, но в проекте это нужно.

                        А нельзя ли тот же принцип применить и к читабельности кода? Чтобы не заставлять каждого писать так, чтобы было с первого взгляда понятно любому дураку, а «слегка подталкивать» остальных к умению быстро понять код любой сложности?
                    • +5
                      У меня такие же чувства были когда я пытался изучить JavaScript в поиске примеров для тех или иных решений. Я и так ничерта не понимал, а мне постоянно «подсовывали» код для jQuery и это уже совсем добивало. С тех пор стараюсь по максимуму делать все самостоятельно без всяких «черных ящиков». С этого имею большой плюс — полный контроль над собственной разработкой.
                      • –1
                        Простите а комп вы сами собирали? Ну чтоб уж был полный контроль без черных ящиков( конечно можно не знать как собрать руду и выплавить необходимы сплавы — но уж архитектура, пайка сборка и тд это я надеюсь вы сами ) Я это к тому что черных ящиков хватает и если уж предоставляют достатчно хороший ящик так почему бы его не использовать. А если есть желаение убрать черный ящик — можно в него и заглянуть и прояснить что к чему в нем(зачастую ящики пишут несколько человек и не за один два дня, а вы один — отсюда можно заключить что без яшиков сложновато будет)
                        • 0
                          Еще не вечер :) Вот подучусь, еще и его соберу :)
                          • 0
                            Но суть не изменится ) Элементы платы будут покупаться и вообще надо творить материей — ведь предметы это тот же черный ящик))
                            • 0
                              Я свои чипы спроэктирую) А творить материю, измерения и другие вселенные в следующей жизни)
                              • 0
                                ОК — При первом результате фотки в студию )) А слудующую жизнь можно классифицировать как черный ящик — надо свою изобретать ))
                  • +12
                    Меня зовут Артур, и я поставил "+" Жду камней.
                  • +6
                    Ну конечно не так категорично как заявляет автор, и не сказать что я прям супер-пупер-гуру разработчик, но мне тоже ненравится идея «кофеина»
                    • +11
                      [offtop] еще бы «не» было написано отдельно, а то только с третьего раза понял, что все-таки «не нравится», а не «нравится» [/offtop]
                      а в чем его идея?
                    • –11
                      > Нам не нужен ваш кофе
                      Отлично, переходите на чай =)

                      > Как вы собираетесь использовать ES6, когда он выйдет?
                      Пару коммитов быстро решат проблему, останется только пересобрать все asset. А вообще, просто внезапно ES6 не вкатится, в любом случае его нужно будет включать руками или наоборот отключать специально.

                      > Что за фигня происходит в скомпилированном JavaScript-коде? Я понятия не имею.
                      1-2 недели разработки на Coffe сделают вашу жизнь проще, а ящик прозрачней.

                      > Моё предложение к вам состоит даже не в том, чтобы перестать использовать CoffeeScript
                      Вообще стоит перестать использовать JS, там больше кода, нужно дольше печатать, тунельный синдром одобряет.
                      • +12
                        Пару коммитов быстро решат проблему, останется только пересобрать все asset. А вообще, просто внезапно ES6 не вкатится, в любом случае его нужно будет включать руками или наоборот отключать специально.

                        CoffeeScript, с вероятностью 99%, никогда не будет поддерживать блочную область видимости (let) и разряженные шаблоны деструктуризации (let [a,, b] = [1, 2, 3]; a==1, b == 3), т.к. символ запятой "," означает в CS совсем другое нежели в JS.

                        А если копнуть глубже, то выясняется, что конструкции for-of из ES6 и for-of из CS сильно отличаются. for-of из ES6 итерируется по объекту используя его встроенное свойство «iterator», тогда как for-of из CS это скорее сахар для for-in. Сильно сомневаюсь, что без ввода дополнительных конструкций языка в CS появится аналог for-of из ES6.

                        Да и аналога генераторов, по крайней мере в доке на coffeescript.org, я найти не могу.

                        В таком случае, после внедрения ES6, CS останется в роли догоняющего, и не факт, что майнтейнеры захотят сильно менять язык и быстро вводить новые фичи. В своё время, люди не довольные скоростью развития CS создали LiveScript, а это о многом говорит.

                        CoffeeScript хороший язык, но я лично предпочту TypeScript или EcmaScript6
                        • +4
                          Часто используете for-of? Я за два года разработки на коффе ни одного раза, есть удобный each, другого и не надо. И если у объекта есть свойство iterator, то функции перебора будут его использовать. И вообще перебор редко используется, чаще всякие map, every, reduce…

                          let [a,, b] = [1, 2, 3]
                          не сильно отличается от CoffeeScript
                          [a, _, b] = [1, 2, 3]
                          [a, t, b] = [1, 2, 3] (eсли _ занято underscope.js)
                          • +1
                            [a, _, b] = [1, 2, 3]

                            Согласен, но всё-таки смысл в том, что синтаксис деструктуризации отличается в CS и ES6. И это печалит.
                            Часто используете for-of?

                            В ES6 for-of /будет/ очень полезный. Особенно в сочетании с итераторами и генераторами. Так что я буду всё больше и больше его использовать.
                      • +21
                        1. Обфусцирован? Компилятор CoffeeScript генерирует код, который отличается от кода, который напишет человек, но он вполне читабельный. Но обфусцированный?! Неа:)

                        2. Полностью согласен с утверждением, что код на CS нужно дублировать кодом на JS.
                        Впрочем, не везде, на рельсах например CS есть по умолчанию, и большинство девелоперов-рельсовиков его знает :)

                        3. Странный наезд на алиас isnt(!==) и конструкцию из VB. Какой то консерватизм, как аргументы против выделения кодом отступами. JS сам по себе не самый легкочитаемый и вообще простой язык с классным синтаксисом. Благо, это исправляется новыми версиями
                        isnt добавлен в язык для придачи ему большей человечности (пожалуй, как и конструкция из VB), и легко читается, если девелопер хоть чуть-чуть знает английский, это разумная эволюция, а если ваш глаз привык цепляться за = , то любой редактор выделяет isnt совершенно тем же цветом. Ну а то, что автор пихал конструкцию из VB куда не надо и потом весело дебагил — его проблемы.

                        4. Не знаю где автор увидел черный ящик. Используя диалект языка, предполагается, что девелопер знает этот самый язык, и то, во что выльется подслащенная конструкция. Документация у Coffee очень понятная, читается буквально за пару часов, и даже в IDE лезть не надо, на сайте уже есть интерактивный shell.

                        Короче, единственный нормальный аргумент — дублируйте код на CS кодом на JS.
                        • +20
                          5. Наезд на ASM.JS показывает непрофессиональность автора: ASM.JS не для написания кода ручками, а для транслирования кода из других языков, например.
                          • +2
                            Для написания тоже. Иногда есть отдельные небольшие куски, которые имеет смысл писать на asm.js ради оптимизации.
                            • +1
                              Это извращение, поверьте. Сам писал, десяток подводных камней, скорость выросла, но не существенно.
                              Для написания он предназначен так же, как ваза для забивания гвоздей)
                          • +6
                            Этот последний нормальный аргумент можно продолжить: а раз уж всё равно вам придётся писать на JS, зачем вообще заморачиваться с CS?
                            • +1
                              Используя диалект языка

                              Разве это диалект, а не другой язык?
                            • +16
                              Одна из самых ужасных статей, которые попадали на HN с того времени, как я на него подписан. Для тех кто работал с большими проектами на JS очевидно, что язык проектировался не на такие масштабы.

                              А автор оригинальной статьи настолько невежествен, что даже не знает, что на диалекте asm.js не предполагается ничего писать и уж тем более изучать код транслированный из него. Автор просто ленится потратить от силы две недели на изучение такого просто языка как Coffee. Что уж тогда обвинять людей в том, что они не хотят выучить хоть один функциональный язык для разнообразия.
                              • +7
                                Автор просто ленится потратить от силы две недели на изучение такого просто языка как Coffee.

                                Не хочу показаться бахвальным, но за три вечера переписал проект на CS, хотя до этого никогда его в глаза не видел. Практика, практика и эта инструкция вам в помощь ;)
                                P.S.: Чем ему isnt не угодил? Не часто встречаемая конструкция, но вот is not — действительно круто и ёмко выглядит!
                                • +2
                                  Во-первых, его никто не заставляет использовать ее в CS, во-вторых, очень сомневаюсь, что наличие isnt хоть как-то затрудняет чтение кода. Это просто ханжество по поводу синтаксического захара.
                                  • +2
                                    На самом деле is и isnt очень крутая штука, она оберегает от случающихся даже у опытных программистов проблем с написанием = вместо ==.
                                    • +3
                                      ага, а
                                      struct?.substruct?.field
                                      экономит нервные клетки
                                      • +1
                                        От проблем с написанием «=» вместо «==» можно и другим способом избавиться, не переходя с JavaScript на другой язык.

                                        Я, например, для этой цели прогоняю джаваскриптовый код через JSHint до тех пор, пока JSHint не перестанет находить ошибки в коде.
                                        • +2
                                          как говорится, «от перестановки слагаемых»…
                                          if (5=q) — опа, ошибка синтаксиса, lvalue нельзя присвоить
                                          if (5==q) — то, что мы хотели написать
                                          • +2
                                            А вот этой RTL-практики я избегаю, потому что меняется шило на мыло. (Ценою ловли ошибок становится некоторое падение читаемости.)

                                            Конечно, если кто принадлежит к такому народу, которому читать справа налево сызмальства привычно, то у него может другое быть впечатление о читаемости.

                                            Но это не мой случай, так что продолжу уж лучше JSHint пробавляться.
                                            • 0
                                              От перестановки мест слагаемых сумма не изменяется. К «читать справа налево» это отношения не имеет. А, имхо, читаемость даже повышается, если вместо q стоит сложное выражение.
                                              • 0
                                                Ставить сложные выражения прямо в условный оператор — моветон. Всё равно лучше вынести в отдельную переменную с содержательным именем. Что касается условий Yoda-style, то я их не использую, т.к.:
                                                1) Никогда не ошибаюсь с = вместо ==
                                                2) Если всё же ошибусь, компилятор ругнётся
                                                3) Снижается читабельность: всё же приучать себя читать «5 равно x» как «x равно 5» — это как дать себе в глаз, а потом класть туда лёд
                                            • 0
                                              if(b = a) { ... }
                                              

                                              вместо
                                              if(b == a) { ... }
                                              

                                              и всё…

                                              Yoda-expressions помогают только пока одним из элементов сравнения не является lvalue.
                                            • +1
                                              У меня частенько написано if(а=б), и это именно то, что я имею в виду, так что Хинт не всегда поможет.
                                              • 0
                                                Зря вы так пишете.
                                                • 0
                                                  Ну как. Я просто знаю, что у меня в коде на CS только 'is' и 'isnt', и знак равенства может обозначать только присваивание, и у меня нет рефлекса воспринимать это как сравнение.
                                                  • 0
                                                    Это потому, что вы один работаете над проектом. Когда разработчиков несколько, приходишь к выводу, что лучше написать три строки, но в которых ошибка видна сразу, чем одну мудрёную и вот с такими неочевидными местами.
                                      • +23
                                        А автор оригинальной статьи настолько невежествен, что даже не знает, что на диалекте asm.js не предполагается ничего писать и уж тем более изучать код транслированный из него.
                                        Неа. Автор статьи настолько невежественен, что начинает своё повествование со ссылки на реальный код из реального проекта, который реально руками написано на asm.js.

                                        Но тут приходит мегагуру весь в белом и объясняет, что того, что мы видим на экране в природе не бывает, просто у всех коллективная галлюцинация — и всем становится леко на душе. Ну действительно, зачем на факты из реального мира? Давайте лучше теоретически обсуждать столетиями сколько ног у мухи, вместо того, чтобы их взять и посчитать.
                                        • +2
                                          А вы в С-коде ассемблерные вставки никогда не встречали?
                                          Надо заметить, что повествующий автор указал ссылку на асм.js реализацию математического по сути алгоритма, который без асм.js был бы записан в том коде абсолютно точно так же (за исключением специфичных определений типов переменных).
                                          • 0
                                            Ага. И обращения к элементам массива тоже писались бы как H[j<<2>>2]? Ню-ню.
                                            • 0
                                              Хм, а как бы вы по-другому записали это выражение?
                                              • 0
                                                В нормальных языках как бы принято его записывать как H[j] всё-таки. Или если уж так хотите указать тип, то H[j|0]. Но H[j<<2>>2], извините, ни в какие ворота не лезет.
                                                • 0
                                                  Я, если честно, не очень понял смысл этой операции в контексте индекса массива, но похоже на сброс двух старших битов.
                                                  В спеках asm.js указано, что таким маневром можно привести выражение к signed, однако это делается и через |0.
                                                  Сомневаюсь, что алгоритм вычисления хэша использует массив на 4 гигабайта и в старших двух битах может оказаться что-то существенное.
                                                  Может кто знает в чем тайный смысл?
                                                  • 0
                                                    Вопрос в том, какого типа j. Если знаковый — то это распространение старшего бита на два следующих. В применении к индексу массива — довольно бессмысленная операция. Если беззнаковый, то на не RISC платформах дешевле написать эквивалент H[j&0x3FFFFFFF].
                                                    Кстати, кто-нибудь понял, что там за константы? 1518500249 = sqrt(2)*2^30, 1859775393 = sqrt(3)*2^30. Но что такое 1894007588 и 899497514?
                                                    Я немного сомневаюсь, что код был написан руками. В лучшем случае — отредактирован. Впрочем, я не знаю JS, так что, возможно, всё не так.
                                                    • 0
                                                      Но что такое 1894007588 и 899497514

                                                      Вопрос снимается, всё очевидно… но почему они такие? В описании алгоритма даются без объяснения.
                                                      • 0
                                                        Потому что это константы из определения SHA-1?
                                                        • 0
                                                          Хорошо, но в более развёрнутом виде вопрос выглядит так. Почему в определении SHA-1 выбрали именно константы sqrt(k)*2^30 для k=2,3,5,10? Есть ли за этим какие-нибудь математические доводы, или просто разработчикам это показалось хорошей идеей? Приводится ли где-нибудь выражение этих констант через квадратные корни, или люди должны догадываться сами? Быстрый поиск ничего про происхождение констант не дал.
                                                          • +2
                                                            Википедия говорит, потому что какие-то константы были нужны, а если константы брать «с потолка», могут возникнуть подозрения на бэкдор.
                                                            The constant values used are chosen as nothing up my sleeve numbers: the four round constants k are 230 times the square roots of 2, 3, 5 and 10.
                                                            • +1
                                                              Спасибо. Не заметил этой фразы. Надо будет взять это объяснение на вооружение — тогда никому не придёт в голову искать секретные соотношения между параметрами.
                                                    • 0
                                                      Я, если честно, не очень понял смысл этой операции в контексте индекса массива, но похоже на сброс двух старших битов.
                                                      Неа. Похоже на asm.js. Вот тут же уже писали: если этого не сделать, то asm.js будет считать, что вы обращаетесь к байтам, а не к 32битным int'ам.
                                                      • 0
                                                        Это ещё один довод в пользу того, что код писался не вручную. Если бы его писал человек, то сразу бы работал с учетверёнными переменными i,j,k и константами смещений, и не пришлось бы каждый раз писать <<2. Код стал бы несколько понятнее.
                                                        • 0
                                                          О боги! Я понимаю, что «доктор сказал в морг — значит в мог», но есть же какие-то пределы. Вот как раз написание кода человеком к таким ужасам и проводит.

                                                          Компилятор автоматически порождает учетверённые переменные потому как у него это не индекс в масиве, а совсем даже наоборот: «адрес переменной». А чтобы получить-таки индекс в мессиве адрес переменной положено делить на 4 (комиляторы в asm.js обычно складывают все переменные в один массив). На чём в результате и настаивает asm.js.

                                                          А человеку, знаете ли, свойственно оперировать индексами, а не учетверёнными индексами. Louter (с хабра) написал точно такой же код, только с <<3>>3 вместо <<2>>2) в своей статье.
                                                          • 0
                                                            Если человек полез на этот уровень оптимизации, то работать с учетверёнными индексами ему ничего не стоит. Когда в ассемблере ещё не было этих новомодных [eax+ebx*4], то люди нормально работали и с удвоенными-учетверенными индексами, и с адресами — в отличие от компиляторов, которые по любому поводу тупо считали адрес через сдвиги и сложения.
                                                            • 0
                                                              Если человек полез на этот уровень оптимизации, то работать с учетверёнными индексами ему ничего не стоит.
                                                              Ок, понял. Значит Louter не человек. Сообщите администрации, чтобы его забанили или посмотрим как долго этому роботу удастся вводить людей в заблуждение?

                                                              в отличие от компиляторов, которые по любому поводу тупо считали адрес через сдвиги и сложения.
                                                              Вы бы ещё про компиляторы Фортрана 60х годов вспомнили! Современные компиляторы, как бы, самую малось поумнели и уже давным-давно такого не делают.

                                                              • 0
                                                                Так современные процессоры сами умеют умножать индекс на 4 в пределах одной команды. И компиляторам работать с адресами больше не нужно, они предпочитают индексы. И получается эффективнее.
                                                                А что касается той статьи — вы что, серьёзно думаете, что там приведена настоящая программа? С такой строчкой:
                                                                tp[(i << 3) >> 2] = +(+2 * tp[((i - 1) << 3) >> 3]);
                                                                

                                                                Судя по тексту статьи, на неё будет выдан type error с требованием сдвига на 3 бита.

                                                                • 0
                                                                  В ссылке на настоящую программу этой ошибки уже нет. Тогда непонятно, почему было не пустить циклы с шагом 8. И быстрее, и кода набирать меньше.
                                                                  • 0
                                                                    Именно потому что что это человек писал! Он сначала написал это на JavaScript'е, а потом начал переписывать на asm.js. Получилось то, что получилось. А для того, чтобы писать нормально прямо на asm.js нужно гораздо дольше с ним общаться и эти программы будут ещё дальше от JavaScript'а — об чём, собственно, и статья.
                                                                  • 0
                                                                    Смотря какие процессоры. ARM и MIPS, к примеру, не умеют. Насчёт индексов — по разному бывает, иногда компилятору удаётся от них избавиться.

                                                                    А в статье — да, там есть в конце настоящая программа.
                                          • +13
                                            Если батхерт по поводу Кофе еще как-то обоснован, то при чем тут asm.js, вообще не понятно.
                                            • +3
                                              Вы на ссылку кликали? Там asm.js написанный руками. И как вы, спрашивается, будете подобный проект поддерживать? И сильно вам помогут заявляния о том, что asm.js — это просто подмножество JS, если у вас в проекте такое встретится?

                                              Ну откуда берётся мода критиковать статьи их не читая?
                                              • +1
                                                Ну наверное кто-то пишет руками asm.js, разработчики трансляторов в него, например. Какое это имеет отношение к coffescript и прочим? Что, на stackoverflow кто-то ответы на asm.js оставляет?
                                                • 0
                                                  Пока нет, ну так со времени его создания не прошло ещё и года.
                                                • 0
                                                  Это примерно так же, как, увидев рукописную ассемблерую вставку, заявить что «С++ — говно, смотрите во что он транслируется! Как вы будете это поддерживать?!!!111».
                                                  Автор элементарно не понял к чему там это.
                                                  • 0
                                                    Автор как раз понял, это вы не поняли. Я не видел ни одного человека, который бы считал, что C с ассемблерными вставками — это просто C. Нет, это другой язык и для его понимания нужны другие книжки (нужна документация на ассемблер, как минимум). Но я видел кучу народу, которые «бьют себя пяткой в грудь» и вопят, что asm.,js — это «всего-навсего JavaScript» и потому можно одновременно катить баллоны на Google за то, что он добавляет в Chrome свои вещи, которые никто больше не поддерживает (например HTML5 filesystem) и при этом добавлять поделки подобные asm.js в свой браузер ни с кем ни о чём не советуясь.
                                              • НЛО прилетело и опубликовало эту надпись здесь
                                                • –4
                                                  если на SO ответить на вопрос с CoffeeScript кодом на JS, то вопрошающий будет удовлетворён

                                                  То есть вы предполагаете, что тот, кто пишет на CS обязан знать JS?
                                                  • НЛО прилетело и опубликовало эту надпись здесь
                                                    • –4
                                                      Думаю, такие люди есть уже. Те, кто, скажем, начал учиться (веб-)программировать недавно и начал с RoR.
                                                      • –1
                                                        Если человек освоил такую не самую легковесную платформу, как RoR, документация к которой занимает мегабайты текста, описывающие тысячи методов, неужто он не способен прочесть один листок доков про CS за 15 минут?

                                                        Кофи это не фреймворк, не язык и не диалект, это препроцессор, он не вводит никакой семантики, он просто даёт вам написать то, что вы имеете в виду, а не подсчитывать скобки. Изучить его можно за время, заметно меньшее потраченного автором на этот рант, а переводчиком на его перевод.

                                                        Прошёл год, пока я более или менее уверенно стал себя ощущать в экосистеме RoR. За это время успела смениться мажорная версия. А вот когда появился CS, я переписал все свои клиентские части на нём и подумал, а ведь жаваскрипт-то классный язык, как оказалось! И ушёл с RoR на ноде.
                                                        • +2
                                                          Все мимо. Разговор про людей, знающий cs, но не знающих js.
                                                          • НЛО прилетело и опубликовало эту надпись здесь
                                                            • 0
                                                              Мне все равно. Я лишь указал, что комментарий bubuq был не по адресу.
                                                          • 0
                                                            Я про людей, которые начали изучение программирования с RoR, включая CS, а ни строчки на JS и не написали ни разу.
                                                    • +1
                                                      Это Вы еще Ember.js не видели, там сплошная магия.
                                                      • НЛО прилетело и опубликовало эту надпись здесь
                                                        • НЛО прилетело и опубликовало эту надпись здесь
                                                          • НЛО прилетело и опубликовало эту надпись здесь
                                                            • НЛО прилетело и опубликовало эту надпись здесь
                                                              • НЛО прилетело и опубликовало эту надпись здесь
                                                                • НЛО прилетело и опубликовало эту надпись здесь
                                                      • +29
                                                        • +9
                                                          Тем временем с Coffee всё наоборот. Что за фигня происходит в скомпилированном JavaScript-коде? Я понятия не имею. Для меня это чёрный ящик. Я не люблю чёрные ящики. Они чёрные и форме куба. И это всё, что я знаю о чёрных ящиках, они ничего не говорят мне о том, что происходит внутри. Написание JavaScript-кода автоматически означает, что у нас есть полный контроль над тем, что мы делаем, и это дорогого стоит

                                                          Я бы предложил автору статьи срочно выкинуть свою Linux/Windows/Mac, ведь это чёрные ящики. JavaScript тоже надо выкинуть, ведь v8/spidermonkey/любой_другой_движок написаны на C/C++, которые тоже чёрные ящики, ведь они генерят непонятный ассемблерный код. В общем, всегда же есть сердцу любимый ассемблер, на нём и надо писать, как в старые времена. И ассемблер запускать с магнитной ленты из монитора, никаких ОС.
                                                          • +1
                                                            некоторые могут не доверять даже ассемблерам и писать в машинных кодах.
                                                          • +6
                                                            В выходные как раз переводил проект с JS на TypeScript. Получилось быстро и код, генерируемый компилятором, весьма чистый и аккуратный. Плюс нормальный тайп чекинг и интеллисенс. Единственное, что пока не хватает это protected при наследовании.
                                                            Причем если уж смотреть на ES6, то порт будет просто элементарным… но это имхо канешн…
                                                            • +5
                                                              > Вот немного Jade:

                                                              Пусть нажмёт DEL в начале произвольной строки, пусть за него это сделает кто-то другой.
                                                              Не надо говорить, что такого не бывает, потому что не бывает никогда, такое случается, потому что может случиться.

                                                              Незакрытый тег найдёт IDE, а кто исправит порушенную структуру?
                                                              • +6
                                                                git bisect?
                                                                
                                                                • 0
                                                                  неужели IDE не научились контролировать отступы? Одним пробелом ведь не обойдется, надо либо 2 либо 4.
                                                                  • +5
                                                                    Пайтоновские IDE очень даже научились контролировать отступы :) как и те, которые поддерживают yaml, jade и прочие подобные языки.
                                                                  • 0
                                                                    смените ваш текстовый редактор на человеческую IDE
                                                                    image
                                                                    • 0
                                                                      Можно поинтересоваться, что это за IDE/редактор?
                                                                      • +1
                                                                        Pycharm. Подозреваю что остальные от IDEA (WebStorm, PHPStorm etc) имеют ту-же функциональность.
                                                                • –15
                                                                  Если автор не может осилить такой простой язык, то ему явно не место в индустрии.
                                                                  • +5
                                                                    I am as mad as hell, and I am not gonna take this anymore!
                                                                  • +8
                                                                    Немного не согласен с тем что JavaScript это такой белый ящик, а CoffeeScript это такой черненький. Если у coffee нет проблем с синтаксисом, то черным ящиком он может быть только с точки зрения производительности, но вообще говоря сам JavaScript является таким черным ящиком где разные браузеры показывают разную производительность (например есть две альтернативные конструкции для достижения одной цели, в разных браузера будет выигрывать либо одна либо другая конструкция).

                                                                    С основным тезисом я правда согласен, т.к. сам я кстати coffeescript решил не осиливать.
                                                                    • –1
                                                                      Автор, а что в вашем понимании черный ящик?
                                                                      • +14
                                                                        Не думаю, что Nicolas Bevacqua читáет Хабрахабр.
                                                                        • 0
                                                                          Позволю себе ответить за него — не очевидные: поведение компилятора, внутреннее устройство функций, конструкций языка и т.д. (Это не упрек в сторону кофе, я его не знаю чтобы судить, но это то, от чего мне становиться страшно, когда я слышу его критиков и причина моего незнания)
                                                                          • +4
                                                                            Извиняюсь, пропустил первые строчки поста.

                                                                            В оригинале забавен вот этот комментарий:
                                                                            well, since javascript is the new assembler, no wonder people HAVE to use something more sane :)
                                                                            • +3
                                                                              Очень правильный подход, браузеры считай сменили ОСи, так что javascript вполне себе язык ядра, чтобы нечто выше уровнем было признано это нечто должно быть не хуже С, про кофе такого впечатления нет.
                                                                        • +6
                                                                          Я не понял, как ES6 должен сломать coffeescript. Все спецификации ecmascript обратно совместимы, и уже это гарантирует, что с кодом на coffeescript ничего не случится.

                                                                          Ну а в целом странный пост. Язык завоевал популярность, по читаемости сгенерированного js-кода он один из лучших, там нечего расшифровывать. И как бы ни хотелось автору или кому-то еще, coffeescript есть и будет. Постить скомпилированный coffeescript — тоже не самая хорошая идея, т.к. не очень красиво будет, и уж тем более не очень понятно, т.к. наружу вылезет куча внутренних переменных.

                                                                          По поводу «не заставляйте меня учить ваш язык». Возможно и стоило поучить, благо спецификация у языка миниатюрная, заодно стало бы понятно, почему другие программисты его использовать любят.
                                                                          • –1
                                                                            Так и не смог понять то ли это тонкий стёб, то ли дань невежеству.
                                                                            • –1
                                                                              Прочитайте про автора: «I started building all kinds of web applications using C#, and developed a great interest in JavaScript,» человека который пришел в фронтенд через Си сложно заподозрить в слепом невежестве, скорее наоборот он подозревает фанатов кофе в таковом и боится, что они побегут по граблям которые уже давно известны в других языках и решил потроллить чутка, чтоб решить стоит обратить на этот кофе внимание или он исключительно для дикарей, которым не интересны perfomance, отладка, поддержка и т.п.
                                                                              • +1
                                                                                пришел в фронтенд через Си


                                                                                Сишарп — это не Си, не надо путать. ;)
                                                                            • +10
                                                                              Согласен с автором статьи.
                                                                              Почему большенство пишет, что он не хочет учить CoffeeScript? Мне кажется идея его поста не в этом. Любой хороший разработчик побежит учить новый диалект если это сохранит ему время и поможет ему (все мы лентяи). Мне кажется большенство js-разработчиков интересовались и пробовали Coffee, но не всем нравится его синтаксис и не всем он полезен. И я один из них. Я сделал несколько проектов на Coffee, но я все же предпочту чистый JS (я говорю о синтаксисе, а не использовании библиотек и фреймворков).

                                                                              <вброс>
                                                                              Когда только начал интересоваться Coffee. Меня до глубины души поразила конструкция вида:
                                                                              # Conditions:
                                                                              number = -42 if opposite
                                                                              

                                                                              она мне до сих пор снится в кошмарах.
                                                                              </вброс>

                                                                              Очень интересно было бы посмотреть на результаты такого опроса (поиском не нашел):

                                                                              В проектах используется преимущественно:
                                                                              — TypeScript
                                                                              — CoffeeScript
                                                                              — Другой диалект (Caffeine) например
                                                                              — Только Хардкор! JavaScript

                                                                              Если я буду начинать проект буду писать на:
                                                                              — TypeScript
                                                                              — CoffeeScript
                                                                              — Другой диалект (Caffeine) например
                                                                              — Только Хардкор! JavaScript

                                                                              У кого есть это самое, сделайте пожалуйста.
                                                                              • –5
                                                                                JQuery забыли, как раз по моему успех, о котором и мечтает кофе. JavaScript топики на StackOverflow полны его и никому не приходит в голову ругаться.
                                                                                • +5
                                                                                  не путайте диалекты языка с библиотеками и фреймворками. jQuery тут не причем.
                                                                                  • +7
                                                                                    Де-юре это библиотека, но де-факто, судя по размеру влияния оказываемого на исходный код — вполне себе диалект.
                                                                                    • +2
                                                                                      JS, написанный в расчете на использование jQuery остается им же… это не что-то, что преображается во что-то неведомое, и только потом исполняется.
                                                                                      • +1
                                                                                        В этом и есть часть претензии автора: «What? It's not non-sense, it's beautiful! It's JavaScript.», что его позиционируют именно как тот же JS, а не как что-то неведомое. Так что если уж сравнивать, то должен быть этот пункт.
                                                                                  • +4
                                                                                    Я может быть сейчас скажу что-то крамольное, но, по моему, jQuery больше не нужен. По крайней мере в новых проектах, где используется декларативный подход, jQuery только мешает. Да, я понимаю, что во многих декларативных фреймворках jQuery используется «по капотом» — ну так пусть он там и остаётся. Раздражает, когда люди продолжают использовать $.proxy, $.each, $.inArray и иже с ними.
                                                                                    • 0
                                                                                      Что значит не нужен, что опять по пол страницы для создания XMLHttpRequest писать? $.each мне не нужен, но я не могу представить современный сайт, в которой можно обойтись без jQuery, не переписывая существующих там функций для всяких полезных свистелок.
                                                                                      • –1
                                                                                        Что значит не нужен, что опять по пол страницы для создания XMLHttpRequest писать?

                                                                                        Ну зачем вы так утрируете?
                                                                                        let xhr = new XMLHttpRequest({anon: true});//anonymous request
                                                                                        xhr.open("GET", "api.site.com");
                                                                                        xhr.responseType = "json";
                                                                                        xhr.onload = function(){
                                                                                            xhr.response;//this is JSON object
                                                                                        }
                                                                                        xhr.send();
                                                                                        

                                                                                        Посылает анонимный запрос и получает ответ в JSON формате. Да, я согласен, что этот код без полифилов работать не будет, да и вызов `open` избыточен, но это не пол страницы.

                                                                                        В современных web-приложениях больше необходим socket.io и подобные, чем $.ajax.

                                                                                        Что ещё остаётся?
                                                                                        $.css — менять стили в js-коде это быдлокод, нужно пользоваться css-классами
                                                                                        $.[add/remove/toggle]Class — node.classList.[add/remove/toggle] удобнее и быстрее, да и менять классы в js-коде это моветон — нужно использовать БЭМ модификаторы, методов работы с которыми в jQuery нету.
                                                                                        $.bind и $.trigger — это полный провал и в версии 2.0 они их не улучшили. Можно продолжать использовать только по привычке, и то, с декларативным подходом, вам не понадобится /часто/ использовать $.bind
                                                                                        Выбор ($.find) и манипулирование DOM-элементами ($.append, $.after и т.д.) — эти функции должен предоставлять Декларативный фреймворк, а то, что он «по капотом» использует jQuery не должно вас волновать.

                                                                                        Остаётся только $.Deferred, но его хотят добавить в следующую версию DOM4 API, поэтому он будет поддерживаться браузерами нативно.

                                                                                        Я не говорю, что нужно прекратить использовать jQuery, нет. Просто большинство декларативных фреймворком предоставляют API отличное от jQuery и говорить, что jQuery это неотъемлемая часть языка (тут я утрирую и преувеличиваю, но всё же) это неправильно.
                                                                                        • +3
                                                                                          Понятно, вопрос только в терминологии, просто ваше: «Давайте использовать фреймворк, у которого jQuery внутри» для меня не значит: «jQuery больше не нужен».
                                                                                          • +2
                                                                                            XMLHttpRequest не кроссбраузерный. Сейчас, конечно, времена не те, но изначально приходилось два разных объекта создавать. Кроме того, если необходимо создавать два разных запроса, то необходимо создавать два разных экземпляра класса, в каждом из которых используется свой XMLHttpRequest.
                                                                                            В общем, там подводных камней то ещё количество. Решением может быть своя мини-библиотека, да, но jQuery сейчас весит меньше некуда.
                                                                                    • +4
                                                                                      В дополнение к опросу, еще было бы не плохо видеть, кроме использования, в проектах вопрос:

                                                                                      Я знаю синктаксис и могу писать проекты на: (Checkbox'ы)
                                                                                      — JavaScript (просто для сравнения, а вдруг кто-то может только на Coffee писать)
                                                                                      — CoffeeScript
                                                                                      — TypeScript
                                                                                      — другой диалект

                                                                                      • +2
                                                                                        А что не так с конструкцией? Издавна используется в руби и всех там радует, собственно оттуда и перешла в CS. Если не знаете в каких случаях ее применяют, не значит, что она плоха.
                                                                                        • –3
                                                                                          Я писал на Pascal, C/C++, Delphi, PHP, JS, сейчас начинаю учить Python. Могу ошибаться но ни в одном из этих языков я не видел подобных конструкций. Для меня вобще дико видеть в ЯП конструкцию вида: определение-условие (statement-condition). Для меня более логично выглядит условие-определение. Никто не мешает не использовать такие конструкции, но наверное именно по этому мне Ruby тоже не нравится. мое субъективное мнение

                                                                                          Назовите еще один ЯП, где используется такая конструкция?
                                                                                          • 0
                                                                                            Ну, это вы читая видите определение-условие, транслятор видит как условие-определение. Пример применения, собираем длинную строку, предположим uri:
                                                                                            uri  = "http://"
                                                                                            uri += site_name
                                                                                            uri += "/"
                                                                                            uri += resource
                                                                                            uri += utm_source unless admin?
                                                                                            


                                                                                            Удобно, код читаемый и простой (даже unless), легко поддерживается.

                                                                                            Собственно определение (присвоение, биндинг и т.д.) это тоже действие, и ничем не отличается от:
                                                                                            do_this if that
                                                                                            • +6
                                                                                              Ну мы же с вами не трансляторы. Транслятору можно скормить и такое:
                                                                                              ++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++
                                                                                              .>+.+++++++..+++.>++.<<+++++++++++++++.>.+++.
                                                                                              ------.--------.>+.>.
                                                                                              А ну да...

                                                                                              По поводу удобства использования, давайте наверное оставим эту тему, вам удобно мне нет.

                                                                                              Включая C, Python, PHP, JS.

                                                                                              Можно примеры такого кода на перечисленных языках?
                                                                                              JS:
                                                                                               var a = some || "data";
                                                                                              

                                                                                              не в счет, это не тоже самое что var a = some if(some)
                                                                                              Когда видишь конструкцию c if инстинктивно понимаешь что дальше должен быть код условия.
                                                                                              Один из минусов такого кода: В не знакомом коде я вижу вашу конструкцию:

                                                                                              uri  = "http://"
                                                                                              uri += site_name
                                                                                              uri += "/"
                                                                                              
                                                                                              ... еще много строк
                                                                                              
                                                                                              uri += resource
                                                                                              uri += utm_source unless admin?
                                                                                              

                                                                                              но по коду мне нужна была только ветка которая отработает при не определенном admin. Возникает вопрос, на кой я это читал, и зачем было так писать.

                                                                                              тернарный условный оператор

                                                                                              даже Wiki дает определение логическое выражение ? выражение 1 : выражение 2
                                                                                              • –1
                                                                                                Зависит от кода, тут вам ветки не нужны. Admin тут вполне определен (true или false).
                                                                                                • 0
                                                                                                  Мне кажется, что я, наверное, неточно выразился, раз не только вы меня неправильно понимаете. Смотрите, классическое определение: логическое выражение ? выражение 1 : выражение 2, вы просто убираете выражение 2 и у вас остается логическое выражение ? выражение 1, формой чего и является do_this if that. Варианта выражение 2 нету, ни null, ни false, ни undef. Выражение 1 просто не выполняется.
                                                                                                  • +1
                                                                                                    вы даже неправильно понимаете эту конструкцию

                                                                                                    > Выражение 1 просто не выполняется.
                                                                                                    Дак в этом и проблема. Потому что до того, как «вы просто убираете выражение 2» Выражение 1 всегда выполняется.
                                                                                                    • +1
                                                                                                      Если логическое выражение правдиво, если ложно, выполняется выражение 2.
                                                                                                      • +1
                                                                                                        Вы правы, тут я фигню написал. «that ? do_this» и «do_this if that» отличаются порядком следования выражений.
                                                                                                • +6
                                                                                                  В чем удобство? В том, что выглядит красиво, все ровно в столбик? Любой человек, бегло взглянув на этот кусок, будет уверен, что url всегда собирается из 5 частей. Это очень опасная конструкция.
                                                                                                  • –9
                                                                                                    Ага, в этом удобство. И если не перегружать этим код, то все очень приятно и всем понятно. Не вижу причины не использовать это.
                                                                                                    • +14
                                                                                                      > Ага, в этом удобство.
                                                                                                      Дак это не удобство, а красота. Вам лучше заняться рисованием, в таком случае.

                                                                                                      > и всем понятно
                                                                                                      При беглом взгляде непонятно.
                                                                                                      • –8
                                                                                                        Взрослые слова, взрослого мужчины!
                                                                                                • –4
                                                                                                  О, да, на вопрос где еще. Везде где синтаксис разрешает использовать тернарный условный оператор. Включая C, Python, PHP, JS. Только это не везде считается хорошей практикой из-за возможной неоднозначности. В Руби неоднозначность просто разрешают убрать (else).
                                                                                                  • +7
                                                                                                    Ну вот видите, вы даже неправильно понимаете эту конструкцию. Это не тернарный оператор с опущенным else, это вывернутое на изнанку условный оператор. Т.е.
                                                                                                    a = b if that
                                                                                                    означает
                                                                                                    if that a = b
                                                                                                    а не
                                                                                                    a = that ? b : null

                                                                                                    Такого нет в перечисленных вами языках.
                                                                                                    • –4
                                                                                                      Python:
                                                                                                      a = "b" if 1 > 0 else "c"
                                                                                                      
                                                                                                      • +4
                                                                                                        Езе раз: вы даже неправильно понимаете эту конструкцию.

                                                                                                         a = b if that

                                                                                                        означает
                                                                                                        if that
                                                                                                          a = b

                                                                                                        а не
                                                                                                        a = (b if that else null)
                                                                                                        • –5
                                                                                                          Поменяйте null на undefined, и будет ровно то же самое.
                                                                                                          • +6
                                                                                                            А так?
                                                                                                            a = c
                                                                                                            a = b if that

                                                                                                            И так?
                                                                                                            killAllHumans() if that

                                                                                                            Что, ровно то же самое?
                                                                                                          • –4
                                                                                                            Собственно выбросьте else, потому что если do_this if that, если that не истинно ничего не выполниться. Я изначально не говорил, что это тернарный оператор, это был пример определение-условие.
                                                                                                            • +4
                                                                                                              > Собственно выбросьте else

                                                                                                              Откуда? Из вашего примера на Питоне?
                                                                                                              >>> a = "b" if 1 > 0
                                                                                                              SyntaxError: invalid syntax


                                                                                                              >>> Назовите еще один ЯП, где используется такая конструкция?
                                                                                                              >> Везде где синтаксис разрешает использовать тернарный условный оператор.
                                                                                                              > Я изначально не говорил, что это тернарный оператор.

                                                                                                              Что, простите?
                                                                                                              • –5
                                                                                                                Вопрос изначально стоял в том, что: a = b if that больно уж дивно, а = b if that else this, нет. Я не совсем понимаю, почему первый вариант это странно и ужасно, а второй с гораздо более сложной логикой, очень даже ок.
                                                                                                                • +6
                                                                                                                  Ну потому что вы не понимаете принципиальных различий этих конструкций.

                                                                                                                  Во втором варианте написано «а ровно». Справа написано чему: «тому или тому». При любом исходе выражение «а ровно» будет исполнено.

                                                                                                                  В первом варианте тоже написано «а ровно», но на самом деле «а может и не равно, и вообще я передумал, эта строчка ничего не делает». Хорошо когда выражение состоит из трех слов. Но потом оно разростается, условие переносится на вторую или третью строчку.

                                                                                                                  Никто не спорит, что «а ровно тому или тому» это проще и удобнее чем «если что-то то а равно тому, иначе а ровно другому», но тут другая история.
                                                                                                                  • –2
                                                                                                                    Я понимаю, просто я, наверное, не правильно выразился. Суть была не в том, что это одно и тоже, а в том, что это выглядит похоже и помещается в одну строчку и что оба варианта имеют право на жизнь. Вот, более развернутый ответ.
                                                                                                                    • +6
                                                                                                                      Эти выржаения похожи и делают принципиально разные действия. Это кстати еще одна проблема, в том, что эток кошмар с условным оператором после выражения похож на безобидный тернарный оператор.
                                                                                                                      • –2
                                                                                                                        Ну как по мне, так оба этих выражения одинаково предсказуемы. Я никогда не испытывал проблем ни с одним из них.
                                                                                                                        • +4
                                                                                                                          А вам надо неприменно испытать проблемы? У конструкции есть объективный недостаток: она затрудняет чтение кода. Выше я вам написал «Любой человек, бегло взглянув на этот кусок кода, будет уверен, что url всегда собирается из 5 частей». Это просто есть, спорить тут бесполезно. Разве этого недостаточно, чтобы её не использовать?
                                                                                                                          • +2
                                                                                                                            Если вы пишете на руби, то ничего подобного вам в голову не прийдет. Потому что руббист отлично понимает, что если do_this if that, то это trailing conditional или statement modifier (простите, не уверен как правильно перевести). С вполне предсказуемым поведением. Ничем не хуже:

                                                                                                                            if that
                                                                                                                              do_this
                                                                                                                            end
                                                                                                                            
                                                                                                                            • НЛО прилетело и опубликовало эту надпись здесь
                                                                                                                              • –3
                                                                                                                                Ну если вы не пишете на языке который позволяет использовать trailing conditional'ы вы и не увидите такого кода.
                                                                                                                                • +6
                                                                                                                                  Вы всё время апеллируете к руби в духе «раз в руби есть, значить и в других можно».

                                                                                                                                  Тут проблем две: во-первых, не факт, что то, что хорошо в руби, хорошо в других случаях. А во-вторых, не факт, что это хорошо в руби.

                                                                                                                                  Вообще я лично не принимаю никак апелляцию к руби. Я нахожу его синтаксис трудно воспринимаемым. Ну, т.е. «в руби отлично видно» — неправда, ничего там не видно.

                                                                                                                                  Можно, пожауйста, видеть обоснование нереального удобства этой фичи (с trailing conditional) без привлечения руби?