From 1ed9eb183f1ab335ece12fa38d253881ba0288eb Mon Sep 17 00:00:00 2001 From: Serhii Shramko Date: Sun, 3 Mar 2024 20:38:16 -0600 Subject: [PATCH] feat: add failfast.ukraine.md --- README.ukrainian.md | 8 +-- sections/errorhandling/failfast.ukraine.md | 65 ++++++++++++++++++++++ 2 files changed, 69 insertions(+), 4 deletions(-) create mode 100644 sections/errorhandling/failfast.ukraine.md diff --git a/README.ukrainian.md b/README.ukrainian.md index 4b858e3d2..c1ed61d52 100644 --- a/README.ukrainian.md +++ b/README.ukrainian.md @@ -374,13 +374,13 @@ Read in a different language: [![CN](./assets/flags/CN.png)**CN**](./README.chin

-## ![✔] 2.11 Fail fast, validate arguments using a dedicated library +## ![✔] 2.11 Швидко виявляйте помилки, валідуйте аргументи за допомогою спеціальної бібліотеки -**TL;DR:** Assert API input to avoid nasty bugs that are much harder to track later. The validation code is usually tedious unless you are using a very cool helper library like [ajv](https://www.npmjs.com/package/ajv) and [Joi](https://www.npmjs.com/package/joi) +**Коротко:** Перевіряйте вхідні дані API, щоб уникнути неприємних помилок, які потім набагато важче відстежити. Код валідації зазвичай нудний, якщо ви не використовуєте дуже круту допоміжну бібліотеку, таку як [ajv](https://www.npmjs.com/package/ajv) та [Joi](https://www.npmjs.com/package/joi) -**Otherwise:** Consider this – your function expects a numeric argument “Discount” which the caller forgets to pass, later on, your code checks if Discount!=0 (amount of allowed discount is greater than zero), then it will allow the user to enjoy a discount. OMG, what a nasty bug. Can you see it? +**В іншому випадку:** Уявіть таку ситуацію – ваша функція очікує числовий аргумент "Знижка", який викликаюча сторона забуває передати, потім ваш код перевіряє, чи Знижка!=0 (розмір дозволеної знижки більший ніж нуль), тоді він дозволить користувачу отримати знижку. О боже, яка неприємна помилка. Бачите її? -🔗 [**Read More: failing fast**](./sections/errorhandling/failfast.md) +🔗 [**Читати більше: швидке виявлення помилок**](./sections/errorhandling/failfast.md)

diff --git a/sections/errorhandling/failfast.ukraine.md b/sections/errorhandling/failfast.ukraine.md new file mode 100644 index 000000000..69a16de4e --- /dev/null +++ b/sections/errorhandling/failfast.ukraine.md @@ -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); // кидає помилку, якщо валідація не пройшла + // тут інша логіка +} +``` + +### Антипатерн: без валідації з'являються неприємні помилки + +
+Javascript + +```javascript +// якщо знижка позитивна, тоді перенаправимо користувача роздрукувати його купони на знижку +function redirectToPrintDiscount(httpResponse, member, discount) { + if (discount != 0) { + httpResponse.redirect(`/discountPrintView/${member.id}`); + } +} + +redirectToPrintDiscount(httpResponse, someMember); +// забули передати параметр знижки, чому, біса, користувач був перенаправлений на екран зі знижкою? +``` +
+ +
+Typescript + +```typescript +// якщо знижка позитивна, тоді перенаправимо користувача роздрукувати його купони на знижку +function redirectToPrintDiscount(httpResponse: Response, member: Member, discount: number) { + if (discount != 0) { + httpResponse.redirect(`/discountPrintView/${member.id}`); + } +} + +redirectToPrintDiscount(httpResponse, someMember, -12); +// Ми передали негативний параметр знижки, чому, біса, користувач був перенаправлений на екран зі знижкою? +``` +
+ +### Цитата з блогу: "Слід кидати ці помилки негайно" + +З блогу: Joyent + +> Дегенеративний випадок - це коли хтось викликає асинхронну функцію, але не передає зворотний виклик. Ці помилки слід кидати негайно, оскільки програма зламана і найкращий шанс налагодити її включає отримання принаймні трасування стеку і в ідеалі основного файлу в місці помилки. Для цього ми рекомендуємо проводити валідацію типів всіх аргументів на початку функції. \ No newline at end of file