-
Notifications
You must be signed in to change notification settings - Fork 10.3k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Serhii Shramko
committed
Mar 4, 2024
1 parent
c2829fd
commit 1ed9eb1
Showing
2 changed files
with
69 additions
and
4 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,65 @@ | ||
# Швидко відмовляйте, валідуйте аргументи за допомогою спеціальної бібліотеки | ||
|
||
### Пояснення за один абзац | ||
|
||
Ми всі знаємо, наскільки важливо перевіряти аргументи та швидко відмовляти, щоб уникнути прихованих помилок (дивіться приклад коду антипатерну нижче). Якщо ні, прочитайте про експліцитне програмування та оборонне програмування. Насправді ми часто уникаємо цього через незручності кодування (наприклад, подумайте про валідацію ієрархічного JSON-об'єкта з полями, як-от email та дати) – бібліотеки на кшталт Joi та Validator перетворюють це нудне завдання на легкий процес. | ||
|
||
### Вікіпедія: Оборонне Програмування | ||
|
||
Оборонне програмування - це підхід до покращення програмного забезпечення та вихідного коду з точки зору загальної якості - зменшення кількості програмних помилок та проблем. Роблення вихідного коду зрозумілим - вихідний код має бути читабельним і зрозумілим, тому він має бути схвалений при аудиті коду. Призводить програмне забезпечення до прогнозованої поведінки, незважаючи на непередбачені входи чи дії користувача. | ||
|
||
### Приклад коду: валідація складного JSON введення за допомогою ‘Joi’ | ||
|
||
```javascript | ||
const memberSchema = Joi.object().keys({ | ||
password: Joi.string().regex(/^[a-zA-Z0-9]{3,30}$/), | ||
birthyear: Joi.number().integer().min(1900).max(2013), | ||
email: Joi.string().email() | ||
}); | ||
|
||
function addNewMember(newMember) { | ||
// перші з'являються переконання | ||
Joi.assert(newMember, memberSchema); // кидає помилку, якщо валідація не пройшла | ||
// тут інша логіка | ||
} | ||
``` | ||
|
||
### Антипатерн: без валідації з'являються неприємні помилки | ||
|
||
<details> | ||
<summary><strong>Javascript</strong></summary> | ||
|
||
```javascript | ||
// якщо знижка позитивна, тоді перенаправимо користувача роздрукувати його купони на знижку | ||
function redirectToPrintDiscount(httpResponse, member, discount) { | ||
if (discount != 0) { | ||
httpResponse.redirect(`/discountPrintView/${member.id}`); | ||
} | ||
} | ||
|
||
redirectToPrintDiscount(httpResponse, someMember); | ||
// забули передати параметр знижки, чому, біса, користувач був перенаправлений на екран зі знижкою? | ||
``` | ||
</details> | ||
|
||
<details> | ||
<summary><strong>Typescript</strong></summary> | ||
|
||
```typescript | ||
// якщо знижка позитивна, тоді перенаправимо користувача роздрукувати його купони на знижку | ||
function redirectToPrintDiscount(httpResponse: Response, member: Member, discount: number) { | ||
if (discount != 0) { | ||
httpResponse.redirect(`/discountPrintView/${member.id}`); | ||
} | ||
} | ||
|
||
redirectToPrintDiscount(httpResponse, someMember, -12); | ||
// Ми передали негативний параметр знижки, чому, біса, користувач був перенаправлений на екран зі знижкою? | ||
``` | ||
</details> | ||
|
||
### Цитата з блогу: "Слід кидати ці помилки негайно" | ||
|
||
З блогу: Joyent | ||
|
||
> Дегенеративний випадок - це коли хтось викликає асинхронну функцію, але не передає зворотний виклик. Ці помилки слід кидати негайно, оскільки програма зламана і найкращий шанс налагодити її включає отримання принаймні трасування стеку і в ідеалі основного файлу в місці помилки. Для цього ми рекомендуємо проводити валідацію типів всіх аргументів на початку функції. |