Как программист, привыкший к статическим языкам, справляется с отсутствием инструментов Javascript


28

Я программировал почти исключительно на скомпилированных языках, особенно на Java, большую часть своей карьеры. Одна из моих любимых вещей в Java - насколько вы продуктивны и как мало кода на самом деле приходится писать при использовании таких инструментов, как Eclipse.

Вы можете:

  • Легко и автоматически рефакторинг ваших методов и классов
  • Просмотреть мгновенно все места, где вызывается метод или используется константа (Open Call Hierarchy / Show References)
  • Статическая типизация означает, что вы можете использовать автозавершение кода, чтобы показать все параметры / функции, доступные для объекта.
  • Удерживая клавишу Control, щелкните имя функции / члена / класса, чтобы перейти к ее определению.

Все эти возможности заставляют меня чувствовать, что IDE - мой лучший друг. Написание Java-кода и особенно понимание программ других людей становится намного проще.

Однако меня все больше и больше призывают использовать Javascript, и мой опыт до сих пор был довольно негативным.

Особенно:

  • Нет непосредственного способа найти точку входа в функцию (кроме простого текстового поиска, который может затем привести к последующим поискам методов дальше по иерархии вызовов, после двух или трех из которых вы забыли, с чего начали)

  • Параметры передаются в функции без возможности узнать, какие свойства и функции доступны для этого параметра (кроме фактического запуска программы, перехода к точке, в которой вызывается функция, и использования console.logs для вывода всех свойств имеется в наличии)

  • Распространенное использование анонимных функций в качестве обратных вызовов, которое часто приводит к спагетти запутанных путей кода, которые вы не можете быстро перемещаться.

  • И, конечно же, JSLint ловит некоторые ошибки перед выполнением, но даже это не так удобно, как наличие красных волнистых линий под вашим кодом прямо в браузере.

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

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

У меня вопрос, как другие программисты справляются с этими проблемами? Javascript явно растет в популярности, и блоги, которые я читаю, рассказывают о том, насколько продуктивны люди с ним, а не отчаянно пытаются найти решение этих проблем.

GWT позволяет вам писать код для среды Javascript на Java, но, похоже, не так широко используется, как я ожидал; люди действительно предпочитают Javascript для сложных программ.

Чего мне не хватает?


8
Мой совет всем разработчикам Java, испытывающим трудности с JS, - выучить другой язык, не имеющий синтаксиса на основе Си. Это поможет вам преодолеть синтаксическое сходство, когда вы вернетесь в JS, и может помочь вам начать смотреть на вещи с точки зрения компромиссов языкового дизайна, а не смотреть на вещи с точки зрения единственно верного способа написания всего кода и способа все остальные ошибаются. И если у вас возникла идея написать каркас пользовательского интерфейса, пожалуйста, изучите JavaScript, прежде чем обременять нас еще одним раздутым каскадным классом мусора, который необъяснимо легко продвигать на рынок для невежественных CTO.
Эрик Реппен

5
Человек, что сноб меня 2 года назад был. Сейчас я постараюсь быть немного более полезным, так как в последнее время я больше разбираюсь с Java. IDE? Взгляните на Jetbrains Webstorm (я до сих пор использую Scite в первую очередь, но WS неплох), но для веб-приложений на стороне клиента инструменты разработки Chrome отлично справляются с задачей при отладке, и на самом деле выполняют автозаполнение при написании фрагментов кода. код в консоли. Кроме того, потратьте много времени на размышления об ООП. IMO, необязательные классы и IDE как замена разборчивости человека абсолютно уничтожили весь смысл ООП во многих Java.
Эрик Реппен

2
Я чувствую твою боль. Развертывание в javascript - это веб-версия перехода на ассемблер на клиентской стороне. Это, конечно, может быть весело, но наборы инструментов слабы, и производительность определенно падает со всей дополнительной работой, которую вы должны сделать. Это жизнь в программировании, хотя. Не все должно быть сделано на высшем уровне абстракции. :-)
Брайан Кноблаух

2
@ErikReppen Я начинал как Java-разработчик, но я свободно владею Obj-C, программирую на Ruby, Delphi, C ++, C #, Prolog, PHP, bash, и я все еще считаю javascript худшим для чтения и поддержки.
Sulthan

2
Посмотрите на TypeScript. Когда я начинаю использовать его, я считаю, что кодирование на стороне клиента становится намного более продуктивным и приятным. Трудно превзойти правильную интеллигентность и ранние предупреждения компилятора.
Евгений

Ответы:


22

Особенности на основе IDE недоступны * на динамическом языке, таком как javascript. Вы должны научиться обходиться без них. Вам придется заменить поддержку инструмента на лучший дизайн.

Используйте шаблон модуля - либо вручную, либо с помощью инструмента, подобного requirejs . Держите модули небольшими, чтобы вы могли легко рассуждать о них.

Не определяйте как можно больше типов - используйте анонимные объекты, созданные рядом с точкой вызова. Затем вы можете посмотреть на звонящего и вызываемого и узнать, что происходит.

Старайтесь не связывать свой код с DOM. Постарайтесь ограничить количество манипуляций с DOM, которые вы делаете в своем коде. Если вы можете передать селекторы или коллекции jQuery, сделайте это, вместо того, чтобы ваш код знал о структуре страницы.

* Если вы используете популярную библиотеку, вы можете получить поддельное автозаполнение, но это больше похоже на «показать все методы jquery», чем на «какие свойства имеет этот объект». Это экономит набор текста, но не дает никаких гарантий правильности.


Принятие этого за конструктивный совет о том, как бороться с нехваткой инструментов.
фанкибро

3
«Вы должны научиться обходиться без них». ИЛИ удалите это ИЛИ используйте язык более высокого уровня, который генерирует JavaScript и имеет надлежащие инструменты.
День

@Den: У вас есть предложение для языка более высокого уровня с продвинутыми инструментами? По моему опыту, продвинутые инструменты сделаны для популярных языков. Какой язык более высокого уровня, который компилируется в javascript, достаточно популярен, чтобы иметь такие инструменты?
Шон Макмиллан

1
@SeanMcMillan: некоторые .NET (C # / F #) примеры jsil.org , projects.nikhilk.net/ScriptSharp , sharpkit.net , websharper.com
Ден

1
@SeanMcMillan Java также, см. GWT developers.google.com/web-toolkit
funkybro

24

Я хотел бы добавить ответ на этот вопрос, так как в последнее время я бродил по некоторой хорошей, плохой, но в основном уродливой Java, и у меня появилась новая огромная нагрузка от грубых обобщений в отношении Java и разработчиков Java против JS и Разработчики JS, которые могли бы основываться на чем-то, смутно напоминающем полезную правду.

Есть IDE, но может быть полезно понять, почему их не было много

Я пробовал Webstorm сейчас, когда я был привлечен к разработке Node, и это не так уж и плохо, что я действительно купил его, но я по-прежнему склонен открывать js-файлы в Scite чаще, чем WS. Причина этого в том, что вы можете сделать намного больше с гораздо меньшими затратами в JS, но также потому, что работа пользовательского интерфейса дает немедленную обратную связь, инструменты разработки для браузера (в частности, Chrome и Firebug) на самом деле довольно хороши, и (учитывая контексты, не связанные с браузером) ) повторное выполнение измененного кода быстро и легко без этапа компиляции.

Еще одна вещь, в которой я полностью убежден, это то, что IDE в основном создают свои собственные требования, используя небрежный код, который вы действительно не можете позволить себе в JavaScript. Хотите узнать, как мы справляемся в JS? Это может помочь начать с попытки написать что-то нетривиальное в Java без IDE и обратить пристальное внимание на то, что вы должны начать делать и думать, чтобы реально иметь возможность поддерживать / изменять этот код без перемещения IDE вперед. IMO, те же самые вещи по-прежнему важны для написания поддерживаемого кода независимо от того, есть ли у вас IDE или нет. Если бы мне пришлось написать 4-летнюю программу обучения программированию, это не позволило бы вам в первые два года касаться среды IDE, чтобы избежать искажения инструментов и зависимостей.

Состав

Опытные разработчики JS, работающие со сложными приложениями, могут и действительно структурировать свой код. На самом деле это одна вещь, которую мы склонны делать лучше с ранней историей, в которой не было IDE для чтения кода для нас, но также и потому, что мощно выразительные языки могут очень мощно выражать полностью не поддерживаемые кодовые базы аварий, если вы не будете вдумчиво кодировать.

У меня на самом деле была довольно крутая кривая обучения в понимании нашей кодовой базы Java в последнее время, пока я, наконец, не понял, что ничего из этого не было правильным ООП. Классы были не более чем набором свободно связанных методов, изменяющих глобально доступные данные, сидящие в bean-компонентах, DTO или статических геттерах / сеттерах. Это в основном тот же самый старый зверь, которого ООП должен был заменить. Поэтому я перестал искать и думать о коде в принципе. Я только что выучил сочетания клавиш и проследил путаницы, и все прошло гораздо более гладко. Так что, если вы уже не в привычке, подумайте об ООП.

Хорошо структурированное приложение JS на самом высоком уровне будет состоять из сложных функций (например, jQuery) и объектов, взаимодействующих друг с другом. Я бы сказал, что отличительной чертой хорошо структурированного, легко поддерживаемого приложения на любом языке является то, что оно легко читаемо, смотрите ли вы на него с помощью IDE или Notepad ++. Это одна из основных причин, по которым я крайне критичен к внедрению зависимостей и тестированию TDD, доведенному до крайности.

И, наконец, отпустить занятия. Изучите прототип наследования. Это на самом деле довольно элегантно легко реализовать, когда вам действительно нужно наследование. Однако я считаю, что в JS подходы к компоновке работают намного лучше, и я лично начинаю болеть и переживаю ночные кошмары EXTJS каждый раз, когда вижу более одного или двух уровней наследования на любом языке.

Основные принципы Сначала

Я говорю об основных вещах, которые должны быть извлечены из всех других хороших практик: СУХОЙ, ЯГНИ, принцип наименьшего удивления, четкое разделение проблемных областей, запись в интерфейс и написание разборчивого кода - мое личное ядро. Все, что немного сложнее, что защищает от отказа от этих практик, следует рассматривать как помощь Kool на любом языке, но особенно на таком языке, как JavaScript, где очень легко оставить наследие очень запутанного кода для следующего парня. Например, слабая связь - это отличная вещь, пока вы не зайдете так далеко, что не сможете даже определить, где происходит взаимодействие между объектами.

Не бойтесь динамического набора текста

В JavaScript не так много основных типов. По большей части, правила динамического приведения являются практичными и простыми, но стоит изучить их, чтобы вы могли лучше научиться управлять потоком данных без ненужных приведений и бессмысленных процедур проверки. Доверьтесь мне. Строгие типы отлично подходят для производительности и выявления проблем при компиляции, но они не защищают вас от чего-либо.

Изучите дерьмо из функций и замыканий JS

Первоклассные функции JS являются, пожалуй, главной причиной, по которой JS выиграл «Единственный язык, который стоит прикасаться к клиентскому веб-сайту». И да, на самом деле была конкуренция. Они также являются центральной особенностью JS. Мы строим объекты с ними. Все ограничено функциями. И у них есть удобные функции. Мы можем проверить параметры через ключевое слово arguments. Мы можем временно прикрепить и запустить их в контексте методов других объектов. И они делают управляемые событиями подходы к вещам непристойно легкими для реализации. Короче говоря, они сделали JS абсолютным чудовищем в снижении сложности и адаптации различных реализаций самого JS (но в основном DOM API) прямо в источнике.

Переоценка моделей / практики перед принятием

Функции первого класса и динамические типы делают многие более сложные шаблоны проектирования совершенно бессмысленными и громоздкими в JS. Однако некоторые из более простых шаблонов невероятно полезны и просты в реализации, учитывая очень гибкий характер JS. Адаптеры и декораторы особенно полезны, и я нашел синглтоны полезными для сложных фабрик виджетов пользовательского интерфейса, которые также действуют как менеджеры событий для элементов пользовательского интерфейса, которые они создают.

Следуйте указаниям языка и делайте больше с меньшими затратами

Я полагаю, что один из руководителей Honchos из Java где-то утверждает, что многословие на самом деле является положительной чертой, облегчающей понимание кода всеми сторонами. Фигня. Если бы это было правдой, было бы легче читать юридический. Только писатель может сделать то, что он написал, легче для понимания, и вы можете сделать это только иногда, ставя себя на место другого парня. Итак, примите эти два правила. 1. Будьте максимально прямыми и ясными. 2. Добраться до чертовой точки уже. Выигрыш в том, что чистый, лаконичный код на несколько порядков легче понять и поддерживать, чем то, где вам нужно пройти двадцать пять уровней, чтобы перейти от триггера к реальному желаемому действию. Большинство шаблонов, которые поддерживают такие вещи в более строгих языках, на самом деле являются обходными путями для ограничений, которых нет в JavaScript.

Все податливое и все в порядке

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

Нет ограничений по размеру, есть только проблемные домены

Самая большая проблема, с которой я столкнулся во всех кодовых базах Java, - это переизбыток файлов классов. Прежде всего, SOLID - это просто запутанное повторение того, что вы уже должны знать об ООП. Класс должен обрабатывать определенный набор связанных проблем. Не одна проблема с одним методом. Это просто берет старый дрянной код на func-spaghetti C только с добавлением всего бессмысленного синтаксиса классов для загрузки. Нет ограничений по размеру или методу. Если имеет смысл добавить что-то к уже длинной функции, классу или конструктору, это имеет смысл. Возьми jQuery. Это полный набор инструментов длиной библиотеки в одной функции, и в этом нет ничего плохого. Нужны ли нам все еще jQuery - это спорные вопросы, но с точки зрения дизайна,

Если Java - это все, что вы знаете, балуйтесь чем-то с синтаксисом, не основанным на C

Когда я начал возиться с Python, потому что мне понравилось то, что я слышал о Django, я научился отделять синтаксис от языкового дизайна. В результате стало проще понимать Java и C как сумму их частей проектирования языка, а не как сумму вещей, которые они делают по-разному с одинаковым синтаксисом. Приятным побочным эффектом является то, что чем больше вы понимаете другие языки с точки зрения дизайна, тем лучше вы будете понимать сильные / слабые стороны того, который вы знаете лучше всего по контрасту.

Вывод

Теперь, учитывая все это, давайте поразим все ваши проблемные моменты:

  • Нет непосредственного способа найти точку входа в функцию (кроме простого текстового поиска, который может затем привести к последующим поискам методов дальше по иерархии вызовов, после двух или трех из которых вы забыли, с чего начали)

Chrome и Firebug действительно имеют функцию отслеживания вызовов. Но посмотрите также мои пункты о структуре и сохранении вещей краткими и прямыми. Чем больше вы можете думать о своем приложении как о больших хорошо инкапсулированных конструкциях, взаимодействующих друг с другом, тем легче будет понять, чья это вина, когда что-то идет не так. Я бы сказал, что это верно и для Java. У нас есть классоподобные конструкторы функций, которые идеально подходят для традиционных задач ООП.

function ObjectConstructor(){
    //No need for an init method.
    //Just pass in params and do stuff inside for instantiation behavior

    var privateAndPersistent = true;

    //I like to take advantage of function hoisting for a nice concise interface listing
    this.publicAndPointlessEncapsulationMurderingGetterSetter
    = publicAndPointlessEncapsulationMurderingGetterSetter;
    //Seriously though Java/C# folks, stop with the pointless getter/setters already

    function publicAndPointlessEncapsulationMurderingGetterSetter(arg){
        if(arg === undefined){
            return privateAndPersistent;
        }
        privateAndPersistent = arg;
    }

}

ObjectConstructor.staticLikeNonInstanceProperty = true;

var instance = new ObjectConstructor();//Convention is to  capitalize constructors

В моем коде я почти никогда не использую объектные литералы в {}качестве структурных компонентов приложения, поскольку они не могут иметь внутренние (частные) переменные, и вместо этого предпочитаю резервировать их для использования в качестве структур данных. Это помогает установить ожидание, которое поддерживает ясность намерений. (если вы видите кудри, это данные, а не компонент архитектуры приложения).

  • Параметры передаются в функции без возможности узнать, какие свойства и функции доступны для этого параметра (кроме фактического запуска программы, перехода к точке, в которой вызывается функция, и использования console.logs для вывода всех свойств имеется в наличии)

Опять же, посмотрите современные инструменты браузера. Но также, почему это такой облом, чтобы снова запустить программу? Перезагрузка - это то, что веб-разработчик на стороне клиента обычно делает каждые несколько минут, потому что это абсолютно ничего не стоит. Это снова, еще один момент, с которым структура приложения может быть полезна, но это один из отрицательных компромиссов JS, который вы должны выполнить свою собственную проверку, когда принудительное выполнение контрактов является критически важным (то, что я делаю только в конечных точках, подверженных другим вещам, которые моя кодовая база не делает не контролирую). ИМО, компромисс стоит своих выгод.

  • Распространенное использование анонимных функций в качестве обратных вызовов, которое часто приводит к спагетти запутанных путей кода, которые вы не можете быстро перемещаться.

Да, это плохо на что-нибудь нетривиальное. Не делай этого. Назовите ваши функции, дети. Также легче отслеживать вещи. Вы можете определить, оценить (необходимо назначить) и назначить простую тривиальную функцию в строке:

doSomethingWithCallback( (function callBack(){}) );

Теперь Chrome будет иметь имя для вас, когда вы будете отслеживать звонки. Для нетривиальной функции я бы определил ее вне вызова. Также обратите внимание, что анонимные функции, назначенные переменной, все еще являются анонимными.

  • И, конечно же, JSLint ловит некоторые ошибки перед выполнением, но даже это не так удобно, как наличие красных волнистых линий под вашим кодом прямо в браузере.

Я никогда не трогаю вещи. Крокфорд поделился с сообществом некоторыми хорошими вещами, но JSLint переходит грань в стилистические предпочтения и предполагает, что определенные элементы JavaScript являются плохими частями без особой причины, IMO. Обязательно игнорируйте одну вещь о классах regEx и отрицании, за которыми следуют * или +. Подстановочные знаки работают хуже, и вы можете легко ограничить повторение с помощью {}. Кроме того, игнорируйте все, что он говорит о конструкторах функций. Вы можете легко обернуть их в фабричный функционал, если вас беспокоит новое ключевое слово. CSSLint (не Крокфорда) еще хуже в плане плохих советов. Всегда берите людей, которые много выступают с солью. Иногда я клянусь, что они просто хотят установить авторитет или создать новый материал.

И опять же, вы должны отучиться от того, что вы узнали с этим беспокойством во время выполнения, которое у вас есть. (это обычное явление, которое я видел у многих разработчиков Java / C #) Если появление ошибок во время выполнения по-прежнему беспокоит вас 2 года спустя, я хочу, чтобы вы сели и перезагрузили спам в браузере, пока он не утонул. нет разделения по времени компиляции / времени выполнения (ну, во всяком случае, не видимое - JS теперь работает на JIT). Не только хорошо обнаруживать ошибки во время выполнения, но и очень выгодно так дешево и легко перезагружать спам и обнаруживать ошибки в каждой точке остановки, к которой вы попадаете.

И взломайте эти инструменты разработчика Chrome. Они встроены непосредственно в webkit. Щелкните правой кнопкой мыши в Chrome. Осмотрите элемент. Исследуйте вкладки. Там есть много возможностей для отладки с возможностью изменять код в консоли во время выполнения, что является одним из самых мощных, но менее очевидных вариантов. Отлично подходит для тестирования тоже.

С другой стороны, ошибки ваши друзья. Никогда не пишите пустое выражение catch. В JS мы не скрываем и не хороним ошибки (или, по крайней мере, мы не должны кашлять YUI / кашлять ). Мы заботимся о них. Все, что меньше, приведет к боли отладки. И если вы действительно напишите оператор catch, чтобы скрыть потенциальные ошибки в работе, по крайней мере, молча зарегистрируйте ошибку и запишите, как получить доступ к журналу.


3
Голосование за размер ответа ...
Флориан Маргейн

5

То, что вы говорите, является обычным явлением для единомышленников Java, которые смотрят на JavaScript.

Давайте сначала ответим на ваш вопрос ...

... мой вопрос, как другие программисты справляются с этими проблемами ...

Ответ: они не делают. Они изучают философию JavaScript, сначала отказавшись от культа Java.

Вы должны понять эту предпосылку ... JavaScript НЕ ЯВА. Дело не в синтаксисе, а в философии.

Теперь давайте рассмотрим некоторые из них ...

  • Просмотреть мгновенно все места, где вызывается метод или используется константа (Open Call Hierarchy / Show References)

    Удерживая клавишу Control, щелкните имя функции / члена / класса, чтобы перейти к ее определению.

    Все это доступно - просто выберите достойную IDE.

  • Статическая типизация означает, что вы можете использовать автозавершение кода, чтобы показать все параметры / функции, доступные для объекта.

    Это не проблема, с которой вы справляетесь . Это то, что требует изменения вашего взгляда на программирование. Свободная система типов - одна из сильных сторон JavaScript. Поймите свободную печать - и научитесь ценить это. Кроме того, завершение кода очень хорошо работает с JS.

  • И, конечно же, JSLint ловит некоторые ошибки перед выполнением, но даже это не так удобно, как наличие красных волнистых линий под вашим кодом прямо в браузере.

    Firebug, консоль Chrome / Safari и даже IDE делают все это и многое другое.

    Существует JSHint, который может выполнять изящный статический анализ, к которому привыкли Java-программисты.

  • В результате вам в значительной степени необходимо постоянно держать в голове всю программу. Это значительно увеличивает когнитивную нагрузку при написании сложных программ.

    Неправильно! Напротив, JavaScript является «легковесным» языком программирования и поощряет вас иметь более простые программы. Как говорит Дуг Крокфорд ... это "накажет" вас, если вы попытаетесь писать программы на основе моделей в JavaScript.

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

    Совершенно неправильно! Как вы решаете удобочитаемость на основе языка программирования? Программы читабельны (или нет) - НЕ языки. Кроме того, в JavaScript есть фантастические отладчики.

Извините, если я звучу немного грубо - но правда в том, что вы должны изменить свой настрой Java, чтобы понимать JavaScript.

Только «зрелые» Java-программисты могут ценить JavaScript - и вы не можете освоить то, что вы не цените. Опять извините за откровенную тупость.


2
У вас есть пример JavaScript IDE, где я могу «щелкнуть по элементу управления именем функции / члена / класса, чтобы перейти непосредственно к его определению»? Я использую Eclipse для Java и Scala, но мне не хватает хорошей IDE / Editor для JavaScript.
Джонас

11
Готов принять некоторую критику, но некоторые вещи здесь совершенно не так. Если я создаю объект, а затем передаю его в функцию, я могу щелкнуть левой кнопкой мыши по параметру и просмотреть его свойства? Нет, я не могу, потому что объект может быть чем угодно. Если я напишу одно из имен свойств объекта, это предупредит меня? Нет, не будет, потому что это не ошибка в JS, хотя, вероятно, это никогда не то, что вы хотите. Полезное завершение кода невозможно. Чтобы выяснить, какими свойствами обладает параметр функции, необходимо тщательно продублировать код, вызвавший функцию, чтобы выяснить, где был создан объект.
фанкибро

3
Вы можете пожаловаться на то, что построение JS затрудняет кодирование IDE для вас. Я бы пожаловался, что в Java я не могу просто привязать динамические свойства к чему-либо, что я хочу, или сделать самоанализ объектов во время выполнения. Эти два языка очень разные по философии. Я думаю, что таким образом создается большее разобщение между разработчиками Java и JS, чем между JS и большинством других языков. Я лично нахожу, что C легче адаптируется, чем Java, и мне не нравится работать с раздутой IDE.
Эрик Реппен

2
Даже Java-разработчики Google не могут выкинуть голову из Java при написании JS. sitepoint.com/google-closure-how-not-to-write-javascript
Эрик Реппен,

3
Вы пишете: JavaScript - это НЕ Java, и вы должны изменить свое расположение Java, чтобы понять JavaScript, а затем: Только «зрелые» Java-программисты могут ценить JavaScript ... Поэтому, чтобы понять Javascript, я должен сначала освоить Java, а затем забыть все о Это?
Калеб

3

В общем, трудно иметь инструменты, которые вы упомянули для динамического языка (если только IDE не является частью среды выполнения - то есть Smalltalk). Сказав это, как только вы изучите действительно хороший текстовый редактор, большинство IDE выглядят менее привлекательно - это, по крайней мере, мой опыт.


2

Это цена, которую мы платим за использование плохо типизированных языков. Можно только удивляться, почему эта мерзость стала настолько популярной. Недостатки значительно перевешивают преимущества плохо типизированных языков.

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


3
«плохо типизированные языки» - многие программисты с вами не согласятся.
Шон Макмиллан

7
+1, единственная причина популярности Javascript в том, что он был в нужном месте в нужное время.
maple_shaft

2
Оу, ребята, вам просто грустно, что Node.js имеет привязки к C ++ вместо Java, не так ли?
Эрик Реппен

1
Я не уверен, что подразумевается под "плохо типизированными языками". JavaScript не «плохо напечатан». Он динамически типизирован, и операции могут вызывать приведение типов. Не вините язык, потому что ваш редактор / IDE не знает тип переменной - вы все равно должны это знать.
Райан Кинал

3
@RyanKinal Действительно? Вы должны знать все свойства и методы всех объектов и классов в пределах всего вашего приложения, а также API вашего языка и любых библиотек, которые вы используете, по памяти ? Вы отвергаете идею о том, что автозавершение кода в IDE значительно повышает производительность, снижая когнитивную нагрузку и давая вам меньше материала для размышлений?
фанкибро

2

Раньше мне не нравился javascript (и его динамическая типизация), но я вырос, чтобы оценить его объектную ориентацию, замыкания и функциональное программирование . Кроме того, его глобальные объекты и удаление бесшумного преобразования типов были глотком свежего воздуха, когда я впервые их нашел.

Мой любимый идеал для javascript - веб-шторм, так как легко заставить работать intellitext в jQuery (позор, что он не бесплатный).

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

Ваши конкретные моменты:

Нет непосредственного способа найти точку входа функции

Я не понимаю этого, как это может быть проще?

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

Если вы настроите свой идеал на включение определения объектов, свойства объекта будут доступны через intellitext (но я мог пропустить вашу точку зрения здесь).

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

Общее использование? Если вам не нравятся анонимные функции, не используйте их. Или вы имеете в виду jQuery, который использует их в основном? jQuery, вероятно, рассматривается большинством веб-разработчиков как самая большая экономия времени в истории веб-разработки .

JSLint ловит некоторые ошибки перед выполнением

Он ловит их всех, вы можете включить их в свой идеал . Или Webstorm включает его по умолчанию (я думаю).


Чтобы быть честным вездесущим и популярным, не обязательно то же самое! ;-) В любом случае, webstorm - отличная среда разработки для JavaScript (и хотя она не бесплатная, она довольно дешевая). Я не использовал его, но я считаю, что IntelliJ (также из Jetbrains) содержит те же функции, которые могут быть полезны, если вы из Java-фона и хотите использовать одну IDE.
FinnNk

ОК, может быть, мне нужно уточнить ... Я имел в виду «рост популярности» в контексте разработки с использованием браузера / DOM. То есть он используется там, где есть другие альтернативы. Под «точкой входа функции» я подразумевал нахождение точки в коде, в которой вызывается функция. Параметр свойства: нет никакого способа для IDE , чтобы знать свойство данного объекта перед его выполнением! Анонимные функции: они могут мне не нравиться, но другие, чей код мне нужно поддерживать, делают. JSLint не знает, например, неправильно ли я набрал имя свойства данного объекта.
фанкибро

@funkybro "у IDE нет возможности узнать свойства заданного объекта до времени выполнения". Просто включите "whatMyObjectIs.js" в качестве ссылочного скрипта в ide, а для имен свойств с ошибками введите попробуйте webstorm: (если я правильно помню).
НимЧимпский

3
Нет! Рассмотрим следующий код: var myFunc = function(param) { ... }; var myObj1 = { fooProp: fooVal, barProp: barVal}; var myObj2 = { catProp: catVal, dogProp: dogVal}; myFunc(myObj1); myFunc(myObj2); Как может IDE предложение завершения кода на myFunc«S paramпараметра? paramможет быть любой объект любого типа, с любыми свойствами.
фанкибро

Да, но, вероятно, параметры, которые вы передаете, действительно доступны в этом контексте. Парсер может разобраться с этим, не будучи собственным полноценным интерпретатором JS.
Эрик Реппен

2

Чего мне не хватает?

Вам не хватает двух огромных преимуществ, которые Javascript имеет перед Java:

  • Код Javascript составляет около одной четвертой размера эквивалентного кода Java.
  • Вам никогда не придется ждать компиляции и перезапуска сервера.

Я работаю по-разному в Javascript. Я добавляю немного кода за раз, насколько это возможно, и могу обновить браузер и протестировать его. С jQuery, пара строк Javascript - это все, что мне нужно в большинстве случаев.

Я обнаружил, что программирование на Java относительно непродуктивно , и сейчас пишу весь свой серверный код на Groovy по тем же двум причинам.


5
«Код Javascript составляет примерно одну четвертую от размера эквивалентного кода Java» <- это проблема! Конечно, это быстро - просто создавать анонимные функции, добавлять дополнительные свойства к объектам и разносить их, как конфетти. Но что делать, когда кто-то другой посещает ваш код и пытается выяснить, что происходит? Кроме того, больше кода в Java не обязательно соответствует большему количеству ввода ... Eclipse так много пишет для вас.
фанкибро

3
@funkybro: Eclipse пишет это ... тогда я застрял, глядя сквозь него на всю жизнь проекта. Если это требуется, но тривиальный плагин может его сгенерировать, это запах языка. Вы правы, что классы Javascript требуют немного больше документации. Но просто знание сигнатуры метода Java также недостаточно.
Кевин Клайн

1
Это не обязательно! Вы можете смоделировать Javascript в Java, всегда вызывая методы с отражением и используя только простые объекты, списки и карты, если вы действительно этого хотите. Однако большинство разработчиков IME (не все, признаюсь!) Решают определять значимые типы данных, так как считают, что это помогает им писать поддерживаемый, самодокументированный код!
фанкибро

1
Позволяет ли отражение Java изменять объекты во время выполнения? Как насчет закрытия? Изучите язык, прежде чем критиковать его или предположить, что Java, самый закрытый парадигмальный язык вне сборки, способен эмулировать его.
Эрик Реппен

1
Downvoters: это не референдум по Java против Javascript. Это грубо, чтобы понизить голос без причины.
Кевин Клайн

0

Я знаю, что этот вопрос старый, но как программист на C ++ / C #, у которого были те же чувства, но который в последние 10 лет много писал на JavaScript, моей первой рекомендацией было бы попробовать Visual Studio Code .

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

Он также может взять информацию о типе из машинописного текста и применить ее к JavaScript. Даже если вы никогда не используете машинописный текст, вы можете получить завершение кода и документацию по множеству API, поскольку вы печатаете на JavaScript.

Так что на ваши вопросы

  • Нет непосредственного способа найти точку входа в функцию (кроме простого текстового поиска, который может затем привести к последующим поискам методов дальше по иерархии вызовов, после двух или трех из которых вы забыли, с чего начали)

Кажется, в основном решается в VSCode?

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

Это решается для многих IDE путем документирования кода с помощью комментариев в стиле JSDoc или машинописного текста. Редакторы прочтут комментарии и дадут вам то же завершение, к которому вы привыкли

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

Как программист C #, анонимные функции также распространены и были добавлены в C ++. Я думаю, что к этому нужно привыкнуть.

Кроме того, хотя обратные вызовы в основном были заменены обещаниями и async / await, и если у вас есть API, который использует обратный вызов, вы можете быстро обернуть его, чтобы использовать обещание, а затем использовать async / await, чтобы устранить проблему.

И, конечно же, JSLint ловит некоторые ошибки перед выполнением, но даже это не так удобно, как наличие красных волнистых линий под вашим кодом прямо в браузере.

Вы получите волнистые линии в коде Visual Studio. Кроме того, если вы включите интеграцию с ESLint, вы получите массу удивительных предупреждений и ошибок, выделенных в вашем редакторе. Больше, чем я видел на других языках. Мой опыт заключается в том, что линкеры для C / C # / Java были довольно жестко запрограммированы, поскольку ESLint является как массивно настраиваемым, так и массово расширяемым, и поэтому такие популярные библиотеки могут даже интегрироваться, чтобы давать вам советы и предупреждения о конкретном использовании библиотеки в редакторе. Что-то, чего я лично не видел на других языках (хотя, может быть, сейчас это распространено и на других языках?)

Это также 2018 год, и ES7 - новая норма, так что вы получите class. Вы всегда используете строгий режим. Вы никогда не используете varи всегда используете constи letмножество других вещей, которые программисты C ++ / C # / Java с трудом привыкли к исчезновению. Включите no-undefправило в ESLint и исчезнет еще больше проблем

Тем не менее, изучите, как на thisсамом деле работает и как на самом деле работают функции и методы, потому что это не то же самое, что C ++ / C # / Java.

Мои первые 2-3 года JavaScript были разочарованы. В какой-то момент все щелкнуло. Я перестал пытаться заставить его быть C ++ / C # / Java, и теперь я разочарован, возвращаясь назад, когда вещи, которые занимают 15 строк в JavaScript, занимают 150 в этих других языках.


-1

Если вам нравятся IDE и вы используете их для затмения, проверьте Aptana как IDE для JavaScript. Я думаю, что это может сделать многое из того, что вы хотите. (Я лично ненавижу IDE, но это другой разговор).

Что касается анонимных функций, я считаю, что они являются наиболее мощной функцией в JavaScript, и попытка работать на языке, в котором их нет, на данный момент довольно болезненна.

Если вам нужно что-то еще, что можно скомпилировать в JavaScript, есть множество вариантов, CofffeeScript, Clojure и GWT - все это приходит на ум, но есть и другие.


2
Я попробовал Aptana один раз, и это действительно плохо. У него даже нет автоматического отступа, и он уничтожает все настройки проекта, установленные другими редакторами Eclipse, например, окраску и прочее, если я использую Eclipse и Aptana в одном проекте.
Джонас

1
Я использовал это некоторое время и ненавидел, но, как я уже сказал, я ненавижу IDE, я делаю форматирование с помощью инструмента командной строки и редактирую в GVIM или emacs (в зависимости от того, что я делаю)
Zachary K

Сбои в первые несколько часов, и у меня нет ничего, кроме нескольких файлов? Буг до свидания.
Эрик Реппен

Веб-буря не плохая. Я по-прежнему использую Scite большую часть времени, но я начинаю чувствовать себя более IDE, когда пишу материал для Node.js, и у меня нет преимуществ от видимой обратной связи браузера и инструментов разработки.
Эрик Реппен

-1

Я еще не использовал его сам, но я видел некоторые демонстрации, и я очень впечатлен Cloud 9 как JavaScript IDE.

Вы можете выбрать модель онлайн-сервиса или скачать его с GitHub.

И как доказательство его качества в качестве IDE, Cloud9 был написан с использованием ... Cloud9!

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.