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