Skip to content

Commit cc6e3ed

Browse files
committed
Ниндзя код
1 parent 0186d28 commit cc6e3ed

1 file changed

Lines changed: 83 additions & 10 deletions

File tree

1-js/03-code-quality/04-ninja-code/article.md

Lines changed: 83 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,69 @@
1818
Многие пытались пойти по пути ниндзя. Мало тех, кто преуспел.
1919
```
2020

21+
## Соглашения – по настроению
22+
23+
```quote author="Сериал Симпсоны, серия Helter Shelter"
24+
Рабочий-чистильщик осматривает дом:
25+
"…Вот только жук у вас необычный…
26+
И чтобы с ним справиться, я должен жить как жук, стать жуком, думать как жук."
27+
(грызёт стол Симпсонов)
28+
```
29+
30+
Чтобы помешать другому программисту исправить ваш код, вы должны понять путь его мыслей.
31+
32+
Представьте, перед ним – ваш большой скрипт. И ему нужно поправить его. У него нет ни времени ни желания, чтобы читать его целиком, а тем более – досконально разбирать. Он хотел бы по-быстрому найти нужное место, сделать изменение и убраться восвояси без появления побочных эффектов.
33+
34+
Он рассматривает ваш код как бы через трубочку из туалетной бумаги. Это не даёт ему общей картины, он ищет тот небольшой фрагмент, который ему необходимо изменить. По крайней мере, он надеется, что этот фрагмент будет небольшим.
35+
36+
**На что он попытается опереться в этом поиске – так это на соглашения, принятые в программировании, об именах переменных, названиях функций и методов…**
37+
38+
Как затруднить задачу? Можно везде нарушать соглашения – это помешает ему, но такое могут заметить, и код будет переписан. Как поступил бы ниндзя на вашем месте?
39+
40+
**…Правильно! Следуйте соглашениям "в общем", но иногда – нарушайте их.**
41+
42+
Тщательно разбросанные по коду нарушения соглашений с одной стороны не делают код явно плохим при первом взгляде, а с другой – имеют в точности тот же, и даже лучший эффект, чем явное неследование им!
43+
44+
## Пример из jQuery
45+
46+
```warn header="jQuery / DOM"
47+
Этот пример требует знаний jQuery/DOM, если пока их у вас нет – пропустите его, ничего страшного, но обязательно вернитесь к нему позже. Подобное стоит многих часов отладки.
48+
```
49+
50+
Во фреймворке jQuery есть метод [wrap](http://api.jquery.com/wrap/), который обёртывает один элемент вокруг другого:
51+
52+
```js
53+
var img = $('<img/>'); // создали новые элементы (jQuery-синтаксис)
54+
var div = $('<div/>'); // и поместили в переменную
55+
56+
img.wrap(div); // обернуть img в div
57+
div.append('<span/>');
58+
```
59+
60+
Результат кода после операции `wrap` – два элемента, один вложен в другой:
61+
62+
```html
63+
<div>
64+
<img/>
65+
</div>
66+
```
67+
68+
А что же после `append`?
69+
70+
Можно предположить, что `<span/>` добавится в конец `div`, сразу после `img`… Но ничего подобного!
71+
72+
Искусный ниндзя уже нанёс свой удар и поведение кода стало неправильным, хотя разработчик об этом даже не подозревает.
73+
74+
Как правило, методы jQuery работают с теми элементами, которые им переданы. Но не здесь!
75+
76+
Внутри вызова `img.wrap(div)` происходит клонирование `div` и вокруг `img` оборачивается не сам `div`, а его клон. При этом исходная переменная `div` не меняется, в ней как был пустой `div`, так и остался.
77+
78+
В итоге, после вызова получается два независимых `div'а`: первый содержит `img` (этот неявный клон никуда не присвоен), а второй – наш `span`.
79+
80+
Объяснения не очень понятны? Написано что-то странное? Это просто разум, привыкший, что соглашения уважаются, не допускает мысли, что вызов `wrap` – неявно клонирует элемент. Ведь другие jQuery-методы, кроме `clone` этого не делают.
81+
82+
Как говорил [Учитель](https://ru.wikipedia.org/wiki/%D0%9A%D0%BE%D0%BD%D1%84%D1%83%D1%86%D0%B8%D0%B9): "В древности люди учились для того, чтобы совершенствовать себя. Нынче учатся для того, чтобы удивить других".
83+
2184
## Краткость – сестра таланта!
2285

2386
Пишите "как короче", а не как понятнее. "Меньше букв" – уважительная причина для нарушения любых соглашений. Ваш верный помощник – возможности языка, использованные неочевидным образом.
@@ -49,6 +112,16 @@ i = i ? i < 0 ? Math.max(0, len + i) : i : 0;
49112

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

115+
## Русские слова и сокращения
116+
117+
Если вам *приходится* использовать длинные, понятные имена переменных – что поделать… Но и здесь есть простор для творчества!
118+
119+
**Назовите переменные "калькой" с русского языка или как-то "улучшите" английское слово.**
120+
121+
В одном месте напишите `var ssilka`, в другом `var ssylka`, в третьем `var link`, в четвёртом – `var lnk`… Это действительно великолепно работает и очень креативно!
122+
123+
Количество ошибок при поддержке такого кода увеличивается во много раз.
124+
52125
## Будьте абстрактны при выборе имени.
53126

54127
```quote author="Лао-цзы"
@@ -112,6 +185,16 @@ i = i ? i < 0 ? Math.max(0, len + i) : i : 0;
112185

113186
А теперь, пусть читающий код думает: "Куда же выводит сообщение printMessage?". Особый шик – добавить элемент неожиданности. Пусть `printMessage` выводит не туда, куда все, а в новое окно!
114187

188+
## Словарь терминов – это еда!
189+
190+
Ни в коем случае не поддавайтесь требованиям написать словарь терминов для проекта. Если же он уже есть – не следуйте ему, а лучше проглотите и скажите, что так и былО!
191+
192+
Пусть читающий ваш код программист напрасно ищет различия в `helloUser` и `welcomeVisitor` и пытается понять, когда что использовать. Вы-то знаете, что на самом деле различий нет, но искать их можно о-очень долго.
193+
194+
**Для обозначения посетителя в одном месте используйте `user`, а в другом `visitor`, в третьем – просто `u`. Выбирайте одно имя или другое, в зависимости от функции и настроения.**
195+
196+
Это воплотит сразу два ключевых принципа ниндзя-дизайна – *сокрытие информации и подмена понятий*!
197+
115198
## Повторно используйте имена
116199

117200
```quote author="Лао-цзы"
@@ -221,13 +304,3 @@ function render() {
221304
- Следуйте нескольким из них – и ваш код станет полон сюрпризов.
222305
- Следуйте многим – и ваш код станет истинно вашим, никто не захочет изменять его.
223306
- Следуйте всем – и ваш код станет ценным уроком для молодых разработчиков, ищущих просветления.
224-
225-
https://learn.javascript.ru/write-unmain-code
226-
добавить
227-
Соглашения – по настроению
228-
Русские слова и сокращения
229-
Словарь терминов – это еда!
230-
231-
поменялись ряд цитат
232-
не все цитаты переведены точно
233-
нет примера jquery

0 commit comments

Comments
 (0)