Як програміст, який використовується для статичних мов, справляється з відсутністю інструментів Javascript


28

Більшу частину своєї кар’єри я програмував виключно на мовах, що складаються, особливо на Java. Однією з моїх улюблених речей щодо Java є те, наскільки продуктивними ви можете бути, і наскільки мало коду потрібно писати, використовуючи такі інструменти, як Eclipse.

Ти можеш:

  • Легко та автоматично переробляйте свої методи та заняття
  • Миттєво переглядайте всі місця, де викликається метод або використовується константа (Відкрита ієрархія викликів / Показати посилання)
  • Статичне введення означає, що ви можете використовувати завершення коду, щоб показати всі параметри / функції, доступні для об'єкта
  • Клацніть клавішею миші на ім’я функції / члена / класу, щоб перейти до її визначення

Всі ці засоби змушують мене відчувати, що ІДЕ - мій найкращий друг. Писати код Java та особливо розуміти програми інших людей стає набагато простіше.

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

Зокрема:

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

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

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

  • І звичайно, JSLint виявляє деякі помилки перед виконанням, але навіть це не так зручно, як червоні хвилясті лінії під вашим кодом безпосередньо у браузері.

Підсумок полягає в тому, що вам майже завжди потрібно мати всю програму в голові. Це масово збільшує пізнавальне навантаження для написання складних програм. І весь цей зайвий матеріал, який потрібно турбувати, залишає в моєму мозку менше місця для фактичної творчості та вирішення проблем.

Звичайно, швидше просто об'єднати об'єкт, а не написати ціле формальне визначення класу. Але хоча програми можуть бути легше і швидше писати, на мій досвід, їх набагато важче читати та налагоджувати.

Моє запитання: як інші програмісти справляються з цими питаннями? Javascript явно зростає у популярності, і читані блоги - про те, наскільки продуктивні люди з ним, а не відчайдушно намагаються знайти рішення цих питань.

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

Що я пропускаю?


8
Моя порада всім Java-розробникам, у яких важко працювати з JS, - це вивчити іншу мову, яка не має синтаксису на основі С. Це допоможе вам подолати подібність синтаксису, коли ви повернетесь до JS, і це може допомогти вам почати дивитися на речі з точки зору компромісів мовного дизайну, а не бачити речі з точки зору єдиного вірного способу написання всього коду та способу всі інші помиляються. І якщо ви отримаєте ідею написати рамку інтерфейсу користувача, будь ласка, вивчіть JavaScript, перш ніж осідати нас ще одним роздутим класом, що каскадує шматок сміття, який незрозуміло легко продати на чіткі CTO.
Ерік Реппен

5
Людина, яким був сноб 2 роки тому. Я спробую бути трохи кориснішим тепер, коли останнім часом я сильніше натиснув на Java. ІДЕ? Ознайомтеся з веб-штурмом Jetbrains (я все ще використовую Scite в першу чергу, але WS - це не погано), але для Інтернету на стороні клієнта інструменти розробників Chrome роблять досить непогану роботу, щоб покрити вас на налагодженню, і він фактично виконує автоматичне завершення під час написання фрагментів код у консолі. Також витрачайте багато часу на роздуми про ООП. IMO, необов'язкові класи та IDE як заміна людської розбірливості абсолютно вбили всю точку OOP у багатьох Java там.
Ерік Реппен

2
Я відчуваю твій біль. Перехід у javascript - це веб-версія, що переходить на мову складання на стороні клієнта. Це, безумовно, може бути цікавим, але набір інструментів слабкий, а продуктивність, безумовно, падає з усією додатковою роботою, яку вам належить виконати. Це життя в програмуванні, хоча. Не все робиться на найвищому рівні абстракції. :-)
Брайан Ноблеуч

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

2
Погляньте на TypeScript. Після того як я почав його використовувати, я вважаю, що кодування на стороні клієнта набагато продуктивніше і приємніше. Важко перемогти належну інтелігенцію та ранні попередження компілятора.
Євгеній

Відповіді:


22

Файли на основі IDE недоступні * в динамічній мові, такі як javascript. Ви повинні навчитися обходитися без них. Вам доведеться замінити підтримку інструментів на кращу конструкцію.

Використовуйте шаблон модуля - вручну або з таким інструментом, як Requjs . Зберігайте модулі невеликими, щоб ви могли легко міркувати про них.

Не визначайте стільки типів - використовуйте анонімні об'єкти, створені поблизу точки виклику. Потім ви можете подивитися на абонента та позивача і дізнатися, що відбувається.

Постарайтеся уникати зв'язку вашого коду з DOM - Намагайтеся дуже обмежити кількість маніпуляцій DOM, які ви робите у своєму коді. Якщо ви можете передати колекції селекторів або jQuery, зробіть це, а не знати код про структуру сторінки.

* Якщо ви використовуєте популярну бібліотеку, ви можете отримати підроблене автозаповнення, але це більше схоже на "показати всі методи jquery", ніж як "якими властивостями володіє цей об'єкт". Це економить при введенні тексту, але не дає гарантій правильності.


Прийняття цього за конструктивними порадами щодо того, як боротися з нестачею інструментів.
funkybro

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-диски проти JS та JS devs, які насправді могли б базуватися на чомусь невиразному, що нагадує корисну правду.

Є ІДЕ, але це може бути корисно зрозуміти, чому їх не було багато

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

Ще одна річ, в якій я досить переконаний - це те, що IDE в основному створюють власний попит, включаючи неохайний код, який ви справді не можете дозволити собі в JavaScript. Хочете дізнатися, як нам керувати в JS? Це може допомогти почати, намагаючись написати щось нетривіальне на Java без IDE і звернути пильну увагу на те, що потрібно почати робити і думати, щоб насправді мати можливість підтримувати / змінювати цей код без переміщення IDE вперед. ІМО, ті самі речі все ще вирішальні для написання постійного коду, є у вас IDE чи ні. Якби мені довелося писати 4-річну програму програмування, це не дозволить вам торкатися IDE протягом перших двох років, щоб не отримати інструментів та залежностей.

Будова

Досвідчені розробники JS, що займаються складними додатками, можуть і структурувати свій код. Насправді це одне, що нам, як правило, доводиться мати кращу історію, де не вистачало IDE, щоб прочитати нам код, але також тому, що потужно виразні мови можуть дуже швидко висловити абсолютно нездійсненні бази катастроф, якщо ви не задумливо кодуєте.

Нещодавно у мене була досить крута крива навчання в розумінні нашої кодової бази Java, поки я нарешті не зрозумів, що жодне з них не є належним OOP. Заняття були не що інше, як пучки нестабільно пов’язаних методів, що змінюють загальнодоступні дані, що сидять навколо в зернах або DTO, або статичних геттерах / сеттерах. Це в основному той самий старий звір, який повинен був замінити ООП. Тому я перестав шукати і думати про код в основному. Я просто дізнався клавіші швидкого доступу і простежив через меси, і все пройшло набагато гладше. Тож якщо у вас вже немає звички, подумайте набагато складніше про OOD.

Добре структурована програма JS на найвищому рівні, як правило, складається із складних функцій (наприклад, jQuery) та об'єктів, що взаємодіють між собою. Я можу стверджувати, що ознака добре структурованої програми, що легко підтримується, на будь-якій мові - це те, що вона є абсолютно розбірливою, незалежно від того, чи дивитесь ви її за допомогою IDE або Notepad ++. Це одна з головних причин, що я дуже критичний до ін'єкцій залежностей і до початку тестування ТДД.

І нарешті, відпустіть заняття. Дізнайтеся про успадкування прототипів. Насправді це дуже елегантно легко реалізувати, коли насправді потрібно спадкування. Я вважаю, що підходи до створення композиції, як правило, працюють набагато краще в JS, і я особисто починаю хворіти і маю нічні страхіття EXTJS в будь-який час, коли я бачу більше ніж один або два рівні спадкування будь-якою мовою.

Основні принципи

Я говорю про основні речі, які повинні випливати з усіх інших добрих практик: DRY, YAGNI, принцип найменшого здивування, чітке розділення проблемних доменів, запис в інтерфейс та написання людського розбірливого коду - це моє особисте ядро. Що-небудь трохи складніше, що виступає за відмову від цих практик, слід вважати Kool Aid будь-якою мовою, але особливо такою мовою, як JavaScript, де можна легко залишити спадщину дуже заплутаного коду для наступного хлопця. Скажімо, вільне з'єднання - це чудовий матеріал, поки ви не відведете його так далеко, що навіть не можете сказати, де відбувається взаємодія між об'єктами.

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

У JavaScript не так багато основних типів. Здебільшого, динамічні правила кастингу практичні та непередбачувані, але варто їх вивчити, щоб ви могли краще навчитися керувати потоком даних без зайвих кастингу та безглуздих процедур перевірки. Довірся мені. Строгі типи чудово підходять для продуктивності та виявлення проблем під час компіляції, але вони не захищають вас ні від чого.

Дізнайтеся, як виходите з функцій та замикань JS

Першокласні функції JS - це, мабуть, головна причина, коли JS виграв "Єдину мову, який вартий торкання веб-сторінки клієнта з нагородою". І так, насправді була конкуренція. Вони також є центральною особливістю JS. Ми конструюємо з ними об’єкти. Все розбито на функції. І вони мають зручні функції. Ми можемо вивчити парами за допомогою ключового слова аргументи. Ми можемо тимчасово прикріпити їх та звільнити їх у контексті того, що вони є методами інших об'єктів. І вони роблять події, орієнтовані на події, нецензурно прості у здійсненні. Коротше кажучи, вони зробили JS абсолютним звіром при зменшенні складності та адаптуванні різних реалізацій самого JS (але в основному API DOM) прямо у джерела.

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

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

Дотримуйтесь лідерства мови та робіть більше з меншою кількістю

Я вважаю, що один із гончов язиків Java десь аргументує, що багатослівність насправді є позитивною ознакою, яка полегшує розуміння коду для всіх сторін. Хогваш. Якби це було правдою, легалійський було б легше читати. Тільки письменник може зробити те, що вони написали, простіше зрозуміти, і ти можеш це зробити, лише час від часу вдягаючи себе в черевики іншого хлопця. Тож прийміть ці два правила. 1. Будьте максимально прямими і чіткими. 2. Доберись вже до чортової точки. Виграш полягає в тому, що чистий, лаконічний код - це наряди легші для розуміння та підтримки, ніж те, де вам доведеться пройти двадцять п’ять шарів, щоб дістатися від тригера до фактично потрібної дії. Більшість моделей, які виступають за подібні речі на більш суворих мовах, насправді є способом вирішення обмежень, яких у JavaScript немає.

Все ковче і все гаразд

JS - це, мабуть, одна з найменш протекціоністських мов у популярному користуванні. Прийняти це. Це чудово працює. Наприклад, ви можете записувати об'єкти з важкодоступними постійними "приватними" параметрами, просто оголосивши регулярні vars у функції конструктора, і я це часто роблю. Але це не захищати мій код або користувачів його "від себе" (вони могли просто замінити його власною версією під час виконання). Але, скоріше, це сигналізувати про наміри, оскільки припущення полягає в тому, що інший хлопець достатньо компетентний, щоб не хотіти заплутати ніяких залежностей і побачить, що ви не призначені для того, щоб потрапити на це безпосередньо, можливо, з поважної причини.

Обмежень розміру немає, лише проблемні домени

Найбільша проблема, з якою я бачив усі коди Java, що я бачив, - це надмірність файлів класів. Перш за все, SOLID - це лише заплутане повторення того, що ви вже повинні знати про OOP. Клас повинен вирішувати конкретний набір пов'язаних із цим проблем. Не одна проблема з одним методом. Це просто прийняття старого поганого ланцюгового коду func-spaghetti C лише з додаванням до завантаження всіх безглуздих синтаксисів класу. Немає обмежень щодо розміру чи методу. Якщо є сенс додати щось до вже тривалої функції чи класу чи конструктора, це має сенс. Візьміть jQuery. Це цілий набір інструментів довжиною бібліотеки в одній функції, і в цьому немає нічого поганого. Чи потрібен нам ще jQuery - це розумні дискусії, але з точки зору дизайну,

Якщо Java - це все, що ви знаєте, поспішайте в чомусь із синтаксисом, що не базується на С

Коли я почав возитися з 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 # devs) Якщо бачення помилок під час роботи все-таки турбує вас через 2 роки, я хочу, щоб ви сіли та перезавантажили спам у браузері, поки він не зануриться. Там це не розділення часу на компіляцію / час виконання (ну все одно не видно - JS зараз запускається на JIT). Виявляти помилки під час запуску не лише добре, це надзвичайно вигідно так дешево та легко перезавантажувати спам та виявляти помилки на кожній точці зупинки, до якої ви потрапляєте.

І поламайте ці інструменти для розробників Chrome. Вони вбудовані безпосередньо у веб-код. Клацніть правою кнопкою миші в Chrome. Перевірити елемент. Вивчіть вкладки. Існує безліч потужностей налагодження з можливістю зміни коду в консолі під час виконання, який є одним з найпотужніших, але менш очевидних варіантів. Відмінно підходить для тестування.

У відповідній примітці помилки - ваші друзі. Ніколи не пишіть порожню заяву про вилов. У JS ми не приховуємо і не ховаємо помилок (або, принаймні, не мусимо кашляти ЮІ / кашель ). Ми відвідуємо їх. Все, що менше, призведе до налагодження болю. І якщо ви все-таки пишете заяву про вилов, щоб приховати потенційні помилки у виробництві, принаймні мовчки записуйте помилку та документуйте, як отримати доступ до журналу.


3
Запрошення розміру відповіді ...
Флоріан Маргайн

5

Те, що ви говорите, - це просто загальна особа, що думає Java, яка дивиться на JavaScript.

Давайте спочатку відповімо на ваше запитання ...

... моє питання, як інші програмісти справляються з цими питаннями ...

Відповідь: Вони НЕ. Вони вивчають філософію JavaScript, попередньо відмовляючись від культу Java.

Ви повинні розуміти це приміщення ... JavaScript НЕ Java. Це просто не про синтаксис - це більше про філософію.

Тепер давайте розглянемо деякі з них ...

  • Миттєво переглядайте всі місця, де викликається метод або використовується константа (Відкрита ієрархія викликів / Показати посилання)

    Клацніть клавішею миші на ім’я функції / члена / класу, щоб перейти до її визначення

    Все це доступно - просто виберіть гідну IDE.

  • Статичне введення означає, що ви можете використовувати завершення коду, щоб показати всі параметри / функції, доступні для об'єкта

    Це не проблема, з якою ви справляєтесь . Це те, що вимагає зміни вашого світогляду щодо програмування. Сипуча система - одна з сильних сторін JavaScript. Зрозумійте, що вільно друкуєте - і навчіться цінувати це. Крім того, завершення коду дуже добре працює з JS.

  • І звичайно, JSLint виявляє деякі помилки перед виконанням, але навіть це не так зручно, як червоні хвилясті лінії під вашим кодом безпосередньо у браузері.

    Firebug, Chrome / Safari і навіть IDE роблять все це та БІЛЬШЕ.

    Є JSHint, який може зробити прекрасний статичний аналіз, до якого звикли програмісти Java.

  • Підсумок полягає в тому, що вам майже завжди потрібно мати всю програму в голові. Це масово збільшує пізнавальне навантаження для написання складних програм.

    Неправильно! Навпаки, JavaScript - це "легка" мова програмування - і заохочує вас мати більш прості програми. Як каже Дуг Крокфорд ... це "покарає" вас, якщо ви спробуєте написати сильно модельовані програми на JavaScript.

  • хоча програми можуть бути легше і швидше писати, на мій досвід, їх набагато важче читати та налагоджувати.

    Зовсім неправильно! Як ви вирішите читабельність на основі мови програмування? Програми читаються (чи ні) - НЕ мовами. Крім того, у JavaScript є фантастичні налагоджувачі.

Вибачте мене, якщо я прозвучав трохи грубо - але правда, ви повинні змінити свій настрій Java, щоб зрозуміти JavaScript.

Тільки "зрілі" Java-програмісти можуть оцінити JavaScript - і ви не можете оволодіти тим, чого ви не цінуєте. Знову вибачте за те, що відверто тупили.


2
Чи є у вас приклад JavaScript IDE, де я можу "натиснути на функцію / член / ім'я класу, щоб перейти до його визначення"? Я використовую Eclipse для Java та Scala, але не вистачає хорошого IDE / редактора для JavaScript.
Йонас

11
Готувався критикувати, але деякі речі тут зовсім неправильні. Якщо я створю об’єкт, а потім передаю його у функцію, я можу клацнути по параметру та натиснути клавішу ctrl і переглянути його властивості? Ні, я не можу, тому що об'єктом може бути що завгодно. Якщо я неправильно написати одне з імен властивостей об'єкта, воно попередить мене? Ні, це не буде, тому що це не помилка в JS, хоча це, мабуть, ніколи не те, що ви хочете. Корисне заповнення коду неможливо. Виявлення, якими властивостями володіє параметр функції, включає перевірку коду, на який посилається функція, щоб дізнатися, де створений об'єкт.
funkybro

3
Ви можете поскаржитися, що спосіб побудови JS ускладнює IDE для вас. Я б поскаржився, що в Java я не можу просто дотримуватися динамічних властивостей, щоб прокляття біля всього, що я хочу, або робити самоаналіз на об'єктах все під час виконання. Дві мови у філософії сильно відрізняються. Я думаю, що таким чином створюється більший відключення між розробниками Java та JS, ніж між JS та більшості інших мов. Мені особисто здається, що C легше адаптуватися, ніж Java, і я вважаю, що працюю з роздутим IDE.
Ерік Реппен

2
Навіть Java-розробники Java не можуть здавати голову від Java під час написання JS. sitepoint.com/google-closure-how-not-to-write-javascript
Ерік Reppen

3
Ви пишете: JavaScript НЕ Ява, і ви повинні змінити свою диспозицію на 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, що значно покращує продуктивність, зменшуючи когнітивне навантаження та надаючи менше речей для роздумів?
funkybro

2

Раніше я не любив JavaScript (і його динамічне введення тексту), але я зрозумів його орієнтацію на об'єкти, закриття та функціональне програмування . Крім того, його глобальні об'єкти та усунення тихого перетворення були подихом свіжого повітря, коли я вперше знайшов їх.

Моя улюблена ідея для JavaScript - це штурм веб-штормів, тому що легко працювати з jQuery intellitext (ганьба це не безкоштовно).

Крім того, я б не сказав, що його зростання - вже всюдисущий.

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

Немає безпосереднього способу пошуку точки входу функції

Я цього не розумію, як це могло бути простіше?

Параметри передаються функціям, не знаючи, які властивості та функції доступні для цього параметра

Якщо ви налаштуєте свою ідею для включення визначення об'єктів, властивості об'єкта будуть доступні через intellitext (але я, можливо, тут пропустив вашу точку).

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

Загальне використання? Якщо вам не подобаються анонімні функції, не використовуйте їх. Або ви маєте на увазі jQuery, який їх значно використовує? jQuery, мабуть, вважається більшістю веб-розробників як найбільша заставка в історії веб-розробок .

JSLint виявляє деякі помилки перед виконанням

Це ловить їх усіх, ви можете включити його у свою ідею . Або Webstorm включає його за замовчуванням (я думаю).


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

ОК, можливо, мені потрібно уточнити ... я мав на увазі "зростаючу популярність" більше в контексті розвитку поза браузером / DOM. Тобто він звикає там, де є інші альтернативи. Під точкою введення функції я мав на увазі розташування точки в коді, в якому викликається функція. Властивості параметрів: немає можливості для IDE дізнатись про властивості певного об'єкта перед початком виконання! Анонімні функції: Мені можуть не подобатися, але інші, чий код мені потрібно підтримувати. JSLint, наприклад, не знає, чи я неправильно ввів ім'я властивості даного об'єкта.
funkybro

@funkybro "немає можливості для IDE знати властивості певного об'єкта перед виконанням" Є, просто включіть "whatMyObjectIs.js" як посилальний скрипт у ide, а для помилкових імен властивостей спробуйте веб-штурм це робить (якщо я правильно пам’ятаю).
NimChimpsky

3
Немає! Розглянемо цей код: var myFunc = function(param) { ... }; var myObj1 = { fooProp: fooVal, barProp: barVal}; var myObj2 = { catProp: catVal, dogProp: dogVal}; myFunc(myObj1); myFunc(myObj2); Як IDE може запропонувати заповнення коду за параметром myFuncs param? paramможе бути будь-який об'єкт будь-якого типу, з будь-якими властивостями.
funkybro

Так, але, мабуть, парами, які ви передаєте, насправді доступні в цьому контексті. Аналізатор може розібратися в цьому, не будучи власним повноцінним перекладачем JS.
Ерік Реппен

2

Що я пропускаю?

Вам не вистачає двох величезних переваг, які Javascript має над Java:

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

Я працюю по-іншому в Javascript. Я додаю за часом трохи коду, якомога менше я можу протестувати, та оновлюю браузер і тестую його. З jQuery пара рядків Javascript - це все, що мені потрібно більшість часу.

Я вважав, що програмування Java є відносно малопродуктивним , і тепер я пишу весь свій серверний код у Groovy з тих самих двох причин.


5
"Код Javascript приблизно на чверть еквівалентного коду Java" <- у цьому проблема! Переконайтеся, що швидко створити анонімні функції та додати додаткові властивості до об'єктів, і швидко перекидати їх, як конфетті. Але як бути, коли хтось інший відвідує ваш код і намагається з’ясувати, що відбувається? Крім того, більше коду на Java не обов'язково дорівнює більшому набору тексту ... Eclipse пише так багато для вас.
funkybro

3
@funkybro: Eclipse пише це ... тоді я застряг, дивлячись повз нього протягом життя проекту. Якщо це потрібно, але тривіальний плагін може створити його, це запах мови. Ви праві, що для Javascript-класів потрібно трохи більше документації. Але просто знання підпису методу Java також недостатньо.
кевін клайн

1
Це не потрібно! Ви можете імітувати Javascript у Java, завжди викликаючи методи відображення, і не використовуючи нічого, крім простих об'єктів, списків та карт, якщо цього дійсно хотіли. Однак більшість розробників IME (не все, що я зізнаюся!) Вирішили визначити значущі типи даних, оскільки вони виявляють, що це допомагає їм писати ремонтопридатний код, що самодокументує!
funkybro

1
Чи дозволяє відображення Java змінювати об'єкти під час виконання? Як щодо закриття? Вивчіть мову, перш ніж критикувати її чи припускати Java, найбільш закрита парадигма поза монтажем здатна наслідувати її.
Ерік Реппен

1
Покровитель: це не референдум щодо Java проти Javascript. Це грубо безпричинно.
кевін клайн

0

Я знаю, що це питання давнє, але як програміст C ++ / C #, який відчував ті самі почуття, але в даний час зробив багато JavaScript за останні 10 років, моєю першою рекомендацією було б спробувати Visual Studio Code .

Звичайно, він не може запропонувати будь-яку функцію, яку можна додати сильно набраною мовою, але вона підходить досить близько.

Він також може брати інформацію про тип із typecript і застосовувати його до JavaScript. Навіть якщо ви ніколи не використовуєте машинопис, під час введення JavaScript ви можете отримати завершення коду та документацію на тони API.

Тож до ваших питань

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

Здається, вирішено здебільшого у VSCode?

  • Параметри передаються функціям, не знаючи, які властивості та функції доступні для цього параметра

Це вирішується для багатьох IDE шляхом документування вашого коду або з коментарями стилю JSDoc, або з машинописним шрифтом. Редактори прочитають коментарі та дадуть вам те саме завершення, до якого ви звикли

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

Оскільки анонімні функції програміста на C # також є загальними і вони додані до C ++. Я думаю, що це те, до чого просто треба звикнути.

Крім того, хоча зворотні виклики в основному були замінені обіцянками, асинхронізуванням / очікуванням, і якщо у вас є api, який використовує зворотний виклик, ви можете швидко завершити його, щоб використати обіцянку, а потім використати async / очікувати, щоб ця проблема відмовилася.

І звичайно, JSLint виявляє деякі помилки перед виконанням, але навіть це не так зручно, як червоні хвилясті лінії під вашим кодом безпосередньо у браузері.

У Visual Studio Code ви отримаєте хвилясті лінії. Мало того, але якщо увімкнути інтеграцію 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.