Skip to content

Commit 822b8ad

Browse files
authored
Update article.md
1 parent e6654f8 commit 822b8ad

File tree

1 file changed

+36
-36
lines changed

1 file changed

+36
-36
lines changed

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

Lines changed: 36 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33

44
```quote author="Конфуцій (Бесіди і судження)"
5-
Навчання без міркування — даремне, міркування без навчання — небезпечне
5+
Навчання без міркування — даремне, міркування без навчання — небезпечне.
66
```
77

88
Ніндзя-програмісти минулого використовували ці хитрощі, щоб загострити розум тих, хто буде підтримувати їхній код.
@@ -39,11 +39,11 @@ i = i ? i < 0 ? Math.max(0, len + i) : i : 0;
3939
## Однолітерні змінні
4040

4141
```quote author="Лао-цзи (Дао де цзін)"
42-
Дао безсловесне. Ім’я, яке можна назвати,
43-
не є постійним ім’ям.
42+
Дао безсловесне.
43+
Ім’я, яке можна назвати, не є постійним ім’ям.
4444
```
4545

46-
Ще один спосіб писати стислий код — використовувати однолітерні змінні. Наприклад, `a`, `b` або `c`.
46+
Ще один спосіб писати стислий код — використовувати однолітерні змінні. Наприклад: `a`, `b` або `c`.
4747

4848
Коротка змінна зникає у коді, наче ніндзя у лісі. Ніхто не зможе знайти її використовуючи "пошук" редактора. І навіть якщо її знайдуть, вони не зможуть "розшифрувати" за що саме змінні `a` чи `b` відповідають.
4949

@@ -67,21 +67,21 @@ i = i ? i < 0 ? Math.max(0, len + i) : i : 0;
6767
## Будьте абстрактними
6868

6969
```quote author="Лао-цзи (Дао де цзін)"
70-
Великий квадрат не має кутів,<br>
71-
Великий глек довго ліпиться,<br>
72-
Великий звук не можна почути,<br>
70+
Великий квадрат не має кутів,
71+
Великий глек довго ліпиться,
72+
Великий звук не можна почути,
7373
Великий образ неозорий.
7474
```
7575

7676
Обираючи ім’я, намагайтесь використовувати найбільш абстрактне слово. Прикладом може бути `obj`, `data`, `value`, `item`, `elem` тощо.
7777

78-
- **`data` є ідеальним варіантом для назви змінної.** Використовуйте його всюди, де зможете. І справді, кожна змінна має *дані*, вірно?
78+
- **`data` є ідеальним варіантом для назви змінної.** Використовуйте його всюди, де можете. І справді, кожна змінна має *дані*, вірно?
7979

80-
...Що робити, якщо назва `data` вже зайнята? Спробуйте `value` — вона також універсальна. Врешті-решт, змінна набуває якесь *значення*.
80+
...А що робити, якщо назва `data` вже зайнята? Спробуйте `value` — вона також універсальна. Врешті-решт, кожна змінна набуває якесь *значення*.
8181

8282
- **Добирайте ім’я змінним згідно з їхнім типом: `str`, `num`...**
8383

84-
Спробуйте. Той, що щойно став на шлях ніндзя, може засумніватися чи вони дійсно такі корисні. Авжеж!
84+
Спробуйте. Той, що щойно став на шлях ніндзя, може засумніватися чи дійсно вони такі корисні. Авжеж!
8585

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

@@ -99,45 +99,45 @@ i = i ? i < 0 ? Math.max(0, len + i) : i : 0;
9999

100100
Змішуйте їх всюди, де це можливо.
101101

102-
Швидко прочитати такий код неможливо. А якщо виникла друкарська помилка... Мммм... Це надовго, час випити чаю.
102+
Швидко прочитати такий код неможливо. А якщо стався хибодрук... Мммм... Це надовго, час випити чаю.
103103

104104

105-
## Хитрі синоніми
105+
## Хитромудрі синоніми
106106

107107
```quote author="Лао-цзи (Дао де цзін)"
108108
Істина, яка може бути виражена словами, не є правдива істина. Ім’я, яке може бути названо, не є правдиве ім’я.
109109
```
110110

111-
Використання *схожих* імен для *однакових* речей зробить ваше життя цікавішим і покаже рівень вашої креативності публіці.
111+
Використання *схожих* імен для *однакових* речей зробить життя цікавішим і продемонструє рівень вашої креативності.
112112

113-
Наприклад, розглянемо префікси функцій. Якщо функція показує повідомлення на екрані — почніть назву з `display…` (наприклад, `displayMessage`). І коли інша функція показуватиме щось ще на екрані (скажімо, ім’я користувача), почніть її назву з `show…` (наприклад, `showName`).
113+
Наприклад, розглянемо префікси функцій. Якщо функція виводить повідомлення на екран — почніть назву з `display…`, як то `displayMessage`. А для іншої функції, що показуватиме ще щось на екрані (скажімо, ім’я користувача), оберіть назву з `show…` (наприклад, `showName`).
114114

115-
Тобто натякніть, що є деяка тонка різниця між цими функціями, хоча насправді її немає.
115+
Натякніть, що є деяка тонка відмінність між цими функціями, хоча насправді її немає.
116116

117-
Домовтесь зі своїми ніндзя-колегами, що якщо Іван починає називати функції, що показують щось, використовуючи `display...`, тоді Петро може використовувати `render..`, а Ганна — `paint...`. Зауважте, наскільки цікавим та різноманітним став ваш код.
117+
Домовтесь зі своїми ніндзя-колегами, що якщо Іван починає називати функції, що показують щось, використовуючи `display...`, тоді Петро може використовувати `render..`, а Ганна — `paint...`. Зауважте, наскільки цікавим та різноманітним став код.
118118

119119
...А тепер коронний прийом!
120120

121-
Для функцій, у яких дійсно є важлива різниця, використовуйте однаковий префікс!
121+
Для функцій, у яких дійсно є важливі відмінності, використовуйте однаковий префікс!
122122

123-
Наприклад, функція `printPage(page)` використовуватиме принтер. А `printText(text)` виводитиме текст на екран. Нехай люди, що неосвічені у вашому коді, здогадуються щодо схожої функції `printMessage`: "Куди буде виведено повідомлення? На принтер чи на екран?". Для збільшення ефекту неочікуваності, функція `printMessage(message)` повинна вивести повідомлення в нове вікно!
123+
Наприклад, функція `printPage(page)` використовуватиме принтер. А `printText(text)` виводитиме текст на екран. Нехай люди, що неосвічені у вашому коді, розмірковують щодо схожої функції `printMessage`: "Куди буде виведено повідомлення? На принтер чи на екран?". Будьте послідовними, функція `printMessage(message)` повинна вивести повідомлення в нове вікно!
124124

125125
## Використовуйте імена повторно
126126

127127
```quote author="Лао-цзи (Дао де цзін)"
128-
При встановленні порядку<br>
129-
з’явилися імена.<br>
130-
Оскільки виникли імена,<br>
128+
При встановленні порядку
129+
з’явилися імена.
130+
Оскільки виникли імена,
131131
потрібно знати межу їх використання.
132132
```
133133

134134
Вводіть нову змінну тільки тоді, коли це вкрай необхідно.
135135

136-
Натомість, використовуйте повторно наявні змінні. Просто записуйте у них нові значення.
136+
Натомість, використовуйте наявні змінні повторно. Просто записуйте у них нові значення.
137137

138138
У функції намагайтесь використовувати лише змінні, що були передані у якості параметрів.
139139

140-
Це суттєво ускладнить розуміння того, що саме міститься у змінній *зараз*, і звідки воно там. Метою цих дій є розвиток інтуїції та пам’яті людини, котра прочитає цей код. Людина зі слабкою інтуїцією аналізуватиме такий код рядок за рядком і слідкуватиме за змінами у кожному блоці коду.
140+
Це суттєво ускладнить розуміння того, що саме міститься у змінній *зараз*, і звідки воно там. Метою цих дій є розвиток інтуїції та пам’яті людини, котра читає цей код. Людина зі слабкою інтуїцією аналізуватиме такий код рядок за рядком і слідкуватиме за змінами у кожному блоці коду.
141141

142142
**Просунутим варіантом такого підходу є непомітна (!) заміна значення змінної на щось дуже схоже всередині циклу або функції.**
143143

@@ -153,9 +153,9 @@ function ninjaFunction(elem) {
153153
}
154154
```
155155

156-
Програміст, в якого буде бажання використати `elem` у другій частині коду, буде здивований... Тільки під час налагодження, після розбору коду він зрозуміє, що працює з клоном!
156+
Колега-програміст, в якого буде бажання використати `elem` у другій частині коду, буде здивований... Тільки під час налагодження, після розбору коду він зрозуміє, що працює з клоном!
157157

158-
Таке трапляється доволі часто. Ефективний прийом, навіть проти досвідчених ніндзя.
158+
Таке трапляється доволі часто. Вбивчий прийом, навіть проти досвідчених ніндзя.
159159

160160
## Підкреслення задля розваги
161161

@@ -175,7 +175,7 @@ function ninjaFunction(elem) {
175175
## Перекриття зовнішніх змінних
176176

177177
```quote author="Ґуань Їнь-цзи"
178-
Той, що перебуває на світлі, не може нічого побачити в темряві.<br>
178+
Той, що перебуває на світлі, не може нічого побачити в темряві.
179179
Той, що перебуває у темряві, побачить все, що перебуває на світлі.
180180
```
181181

@@ -201,40 +201,40 @@ function render() {
201201

202202
## Побічні ефекти всюди!
203203

204-
Є функції, які начебто нічого не змінюють. Наприклад, `isReady()`, `checkPermission()`, `findTags()`... Припускається, що такі функції виконують обчислення та повертають результат без впливу на те, що міститься за межами функції. Іншими словами, без "побічних ефектів".
204+
Є функції, які начебто нічого не змінюють. Наприклад: `isReady()`, `checkPermission()`, `findTags()`... Припускається, що такі функції виконують обчислення та повертають результат без впливу на те, що міститься за межами функції. Іншими словами, без "побічних ефектів".
205205

206-
**Дійсно, гарним прийомом є додавати "корисну" дію до них, окрім їхньої основної задачі.**
206+
**Дійсно гарним прийомом є додавати "корисну" дію до них, окрім їхньої основної задачі.**
207207

208208
Вираз приголомшеного подиву на обличчі вашого колеги, коли він побачить, що функція з ім’ям `is..`, `check..` чи `find...` щось змінює, неодмінно розширить межі його розуму.
209209

210210
**Іншим способом здивувати є повернення нестандартного результату.**
211211

212212
Покажіть своє оригінальне мислення! Нехай виклик функції `checkPermission` поверне не `true/false`, а складний об’єкт з результатом перевірки.
213213

214-
Розробники, що намагатимуться написати `if (checkPermission(..))`, будуть цікавитись, чому воно не працює. Скажіть їм: "Читайте документацію!". І дайте їм почитати цю статтю.
214+
Розробники, що намагатимуться написати `if (checkPermission(..))`, будуть дивуватись, чому воно не працює. Скажіть їм: "Читайте документацію!". І дайте їм почитати цю статтю.
215215

216216

217217
## Могутні функції!
218218

219219
```quote author="Лао-цзи (Дао де цзін)"
220-
Вічне Дао пронизує Собою все.<br>
220+
Вічне Дао пронизує Собою все.
221221
Воно є і праворуч, і ліворуч.
222222
```
223223

224224
Не треба обмежувати алгоритм функції лише тим, що пов’язано з її ім’ям. Мисліть ширше.
225225

226226
Наприклад, функція `validateEmail(email)` може (окрім перевірки адреси електронної пошти на відповідність правилам) показувати повідомлення про помилку та пропонувати ввести нову адресу.
227227

228-
Додаткові дії не мусять бути зрозумілими з імені функції. Справжній ніндзя розробник зробить їх також неочевидними і в самому коді.
228+
Додаткові дії не мусять бути зрозумілими з імені функції. Справжній ніндзя-розробник зробить їх також неочевидними і в самому коді.
229229

230230
**Поєднання декількох дій в одну захищає ваш код від повторного використання.**
231231

232-
Уявіть собі, що інший розробник захоче тільки перевірити адресу електронної пошти без виводу жодних повідомлень. Ваша функція `validateEmail(email)` робить обидві ці дії, а, значить, не підійде йому. Тому вони не потурбують вас під час медитації питаннями щодо цієї функції.
232+
Уявіть собі, що інший розробник захоче тільки перевірити адресу електронної пошти без виводу жодних повідомлень. Ваша функція `validateEmail(email)` робить ці обидві дії, тому не підійде йому. Отже, ніхто не потурбує вас під час медитації питаннями щодо цієї функції.
233233

234234
## Підсумки
235235

236-
Всі "поради", зазначені вище, взяті з реального коду... Який іноді писали навіть досвідчені розробники. Можливо, навіть досвідченіші за вас ;)
236+
Всі "поради", зазначені вище, взяті з реального коду... Іноді написаного доволі досвідченими розробниками. Можливо, навіть досвідченішими за вас ;)
237237

238-
- Дотримуйтесь їх — і ваш код буде мати повно несподіванок.
239-
- Дотримуйтесь їх усіх, і ваш код буде дійсно вашимніхто не захоче його читати, і тим паче — змінювати.
240-
- Дотримуйтесь їх усіх — і ваш код стане цінним уроком для молодих розробників, які шукають просвітлення.
238+
- Дотримуйтесь деяких з цих порад — і у вашому коді буде повно несподіванок.
239+
- Дотримуйтесь більшості з цих порад — і ваш код буде дійсно вашим; ніхто не захоче його читати, тим паче — змінювати.
240+
- Дотримуйтесь усіх порад — і ваш код стане неоціненним уроком для молодих розробників, які шукають просвітлення.

0 commit comments

Comments
 (0)