Update README.md

This commit is contained in:
Kirill Poddubnyi 2025-05-01 11:15:19 +02:00 committed by GitHub
parent 5eff6da09e
commit 8c8e819674
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -657,7 +657,7 @@ createMenu({ body: 'Bar' });
Щоб уникнути будь-яких побічних ефектів і неочікуваної поведінки передаючи явно значення `undefined` або `null`, ви можете вказати компілятору TypeScript не дозволяти це.
Дивіться опцію [`--strictNullChecks`](https://www.typescriptlang.org/docs/handbook/release-notes/typescript-2-0.html#--strictnullchecks) в TypeScript.
**[ повернутися до змісту](#table-of-contents)**
**[ повернутися до змісту](#зміст)**
### Не використовуйте прапорці як параметри функцій
@ -688,7 +688,7 @@ function createFile(name: string) {
}
```
**[ повернутися до змісту](#table-of-contents)**
**[ повернутися до змісту](#зміст)**
### Уникайте побічних ефектів (частина 1)
@ -730,7 +730,7 @@ const encodedName = toBase64(name);
console.log(name);
```
**[ повернутися до змісту](#table-of-contents)**
**[ повернутися до змісту](#зміст)**
### Уникайте побічних ефектів (частина 2)
@ -764,7 +764,7 @@ function addItemToCart(cart: CartItem[], item: Item): CartItem[] {
};
```
**[ повернутися до змісту](#table-of-contents)**
**[ повернутися до змісту](#зміст)**
### Не пишіть до глобальних функцій
@ -798,7 +798,7 @@ class MyArray<T> extends Array<T> {
}
```
**[ повернутися до змісту](#table-of-contents)**
**[ повернутися до змісту](#зміст)**
### Віддавайте перевагу функціональному програмуванню над імперативним
@ -853,7 +853,7 @@ const totalOutput = contributions
.reduce((totalLines, output) => totalLines + output.linesOfCode, 0);
```
**[ повернутися до змісту](#table-of-contents)**
**[ повернутися до змісту](#зміст)**
### Інкапсулюйте умови
@ -877,7 +877,7 @@ if (canActivateService(subscription, account)) {
}
```
**[ повернутися до змісту](#table-of-contents)**
**[ повернутися до змісту](#зміст)**
### Уникайте негативних умов
@ -905,7 +905,7 @@ if (!isEmailUsed(email)) {
}
```
**[ повернутися до змісту](#table-of-contents)**
**[ повернутися до змісту](#зміст)**
### Уникайте умов
@ -970,7 +970,7 @@ class Cessna extends Airplane {
}
```
**[ повернутися до змісту](#table-of-contents)**
**[ повернутися до змісту](#зміст)**
### Уникайте перевірки типів
@ -1000,7 +1000,7 @@ function travelToTexas(vehicle: Vehicle) {
}
```
**[ повернутися до змісту](#table-of-contents)**
**[ повернутися до змісту](#зміст)**
### Не оптимізуйте надмірно
@ -1024,7 +1024,7 @@ for (let i = 0; i < list.length; i++) {
}
```
**[ повернутися до змісту](#table-of-contents)**
**[ повернутися до змісту](#зміст)**
### Видаляйте мертвий код
@ -1057,7 +1057,7 @@ const req = requestModule;
inventoryTracker('apples', req, 'www.inventory-awesome.io');
```
**[ повернутися до змісту](#table-of-contents)**
**[ повернутися до змісту](#зміст)**
### Використовуйте ітератори та генератори
@ -1139,7 +1139,7 @@ itiriri(fibonacci())
.forEach(fib => console.log(fib));
```
**[ повернутися до змісту](#table-of-contents)**
**[ повернутися до змісту](#зміст)**
## Об'єкти та структури даних
@ -1205,7 +1205,7 @@ const account = new BankAccount();
account.balance = 100;
```
**[ повернутися до змісту](#table-of-contents)**
**[ повернутися до змісту](#зміст)**
### Створюйте об'єкти з приватними/захищеними членами
@ -1248,7 +1248,7 @@ class Circle {
}
```
**[ повернутися до змісту](#table-of-contents)**
**[ повернутися до змісту](#зміст)**
### Віддавайте перевагу незмінності
@ -1346,7 +1346,7 @@ const result = readonlyData(100);
result.value = 200; // помилка
```
**[ повернутися до змісту](#table-of-contents)**
**[ повернутися до змісту](#зміст)**
### type проти interface
@ -1404,7 +1404,7 @@ class Square implements Shape {
}
```
**[ повернутися до змісту](#table-of-contents)**
**[ повернутися до змісту](#зміст)**
## Класи
@ -1448,7 +1448,7 @@ class Dashboard {
// ...
```
**[ повернутися до змісту](#table-of-contents)**
**[ повернутися до змісту](#зміст)**
### Висока згуртованість і низька зв'язність
@ -1528,7 +1528,7 @@ class UserNotifier {
}
```
**[ повернутися до змісту](#table-of-contents)**
**[ повернутися до змісту](#зміст)**
### Віддавайте перевагу композиції перед успадкуванням
@ -1597,7 +1597,7 @@ class EmployeeTaxData {
}
```
**[ повернутися до змісту](#table-of-contents)**
**[ повернутися до змісту](#зміст)**
### Використовуйте ланцюжок методів
@ -1679,7 +1679,7 @@ const query = new QueryBuilder()
.build();
```
**[ повернутися до змісту](#table-of-contents)**
**[ повернутися до змісту](#зміст)**
## SOLID
@ -1734,7 +1734,7 @@ class UserSettings {
}
```
**[ повернутися до змісту](#table-of-contents)**
**[ повернутися до змісту](#зміст)**
### Принцип відкритості/закритості (OCP)
@ -1827,7 +1827,7 @@ class HttpRequester {
}
```
**[ повернутися до змісту](#table-of-contents)**
**[ повернутися до змісту](#зміст)**
### Принцип підстановки Лісков (LSP)
@ -1944,7 +1944,7 @@ const shapes = [new Rectangle(4, 5), new Rectangle(4, 5), new Square(5)];
renderLargeShapes(shapes);
```
**[ повернутися до змісту](#table-of-contents)**
**[ повернутися до змісту](#зміст)**
### Принцип розділення інтерфейсу (ISP)
@ -2025,7 +2025,7 @@ class EconomicPrinter implements Printer {
}
```
**[ повернутися до змісту](#table-of-contents)**
**[ повернутися до змісту](#зміст)**
### Принцип інверсії залежностей (DIP)
@ -2122,7 +2122,7 @@ const reader = new ReportReader(new JsonFormatter());
const report = await reader.read('report.json');
```
**[ повернутися до змісту](#table-of-contents)**
**[ повернутися до змісту](#зміст)**
## Тестування
@ -2140,7 +2140,7 @@ const report = await reader.read('report.json');
3. Вам не дозволяється писати більше виробничого коду, ніж достатньо для проходження одного невдалого модульного тесту.
**[ повернутися до змісту](#table-of-contents)**
**[ повернутися до змісту](#зміст)**
### Правила F.I.R.S.T.
@ -2156,7 +2156,7 @@ const report = await reader.read('report.json');
- **Timely** (Своєчасні) модульні тести повинні бути написані до виробничого коду. Якщо ви пишете тести після виробничого коду, ви можете виявити, що написання тестів занадто складне.
**[ повернутися до змісту](#table-of-contents)**
**[ повернутися до змісту](#зміст)**
### Одна концепція на тест
@ -2206,7 +2206,7 @@ describe('AwesomeDate', () => {
});
```
**[ повернутися до змісту](#table-of-contents)**
**[ повернутися до змісту](#зміст)**
### Назва тесту повинна розкривати його намір
@ -2240,7 +2240,7 @@ describe('Calendar', () => {
});
```
**[ повернутися до змісту](#table-of-contents)**
**[ повернутися до змісту](#зміст)**
## Асинхронність
@ -2311,7 +2311,7 @@ downloadPage('https://en.wikipedia.org/wiki/Robert_Cecil_Martin', 'article.html'
`Promise.all` особливо корисний, коли існує потреба запускати завдання паралельно. `Promise.race` полегшує реалізацію таких речей, як тайм-аути для обіцянок.
**[ повернутися до змісту](#table-of-contents)**
**[ повернутися до змісту](#зміст)**
### Async/Await ще чистіші за обіцянки
@ -2359,7 +2359,7 @@ try {
}
```
**[ повернутися до змісту](#table-of-contents)**
**[ повернутися до змісту](#зміст)**
## Обробка помилок
@ -2424,7 +2424,7 @@ function calculateTotal(items: Item[]): Failable<number, 'empty'> {
Для детального пояснення цієї ідеї зверніться до [оригінального посту](https://medium.com/@dhruvrajvanshi/making-exceptions-type-safe-in-typescript-c4d200ee78e9).
**[ повернутися до змісту](#table-of-contents)**
**[ повернутися до змісту](#зміст)**
### Не ігноруйте перехоплені помилки
@ -2460,7 +2460,7 @@ try {
}
```
**[ повернутися до змісту](#table-of-contents)**
**[ повернутися до змісту](#зміст)**
### Не ігноруйте відхилені обіцянки
@ -2501,7 +2501,7 @@ try {
}
```
**[ повернутися до змісту](#table-of-contents)**
**[ повернутися до змісту](#зміст)**
## Форматування
@ -2564,7 +2564,7 @@ type Container = { /* ... */ }
Перевагу слід віддавати використанню `camelCase` для змінних, функцій та членів класів.
Перевагу слід віддавати використанню капіталізованого `SNAKE_CASE` для констант.
**[ повернутися до змісту](#table-of-contents)**
**[ повернутися до змісту](#зміст)**
### Функції-викликачі та функції-виклики повинні бути близькими
@ -2653,7 +2653,7 @@ const review = new PerformanceReview(employee);
review.review();
```
**[ повернутися до змісту](#table-of-contents)**
**[ повернутися до змісту](#зміст)**
### Організуйте імпорти
@ -2702,7 +2702,7 @@ import { ApiCredentials, Adapters } from './common/api/authorization';
import { ConfigPlugin } from './plugins/config/configPlugin';
```
**[ повернутися до змісту](#table-of-contents)**
**[ повернутися до змісту](#зміст)**
### Використовуйте аліаси TypeScript
@ -2736,7 +2736,7 @@ import { UserService } from '@services/UserService';
...
```
**[ повернутися до змісту](#table-of-contents)**
**[ повернутися до змісту](#зміст)**
## Коментарі
@ -2763,7 +2763,7 @@ const isSubscriptionActive = subscription.endDate > Date.now;
if (isSubscriptionActive) { /* ... */ }
```
**[ повернутися до змісту](#table-of-contents)**
**[ повернутися до змісту](#зміст)**
### Не залишайте закоментований код у своїй кодовій базі
@ -2789,7 +2789,7 @@ type User = {
}
```
**[ повернутися до змісту](#table-of-contents)**
**[ повернутися до змісту](#зміст)**
### Не ведіть журнал у коментарях
@ -2817,7 +2817,7 @@ function combine(a: number, b: number): number {
}
```
**[ повернутися до змісту](#table-of-contents)**
**[ повернутися до змісту](#зміст)**
### Уникайте позиційних маркерів
@ -2879,7 +2879,7 @@ class Client {
};
```
**[ повернутися до змісту](#table-of-contents)**
**[ повернутися до змісту](#зміст)**
### Коментарі TODO
@ -2907,7 +2907,7 @@ function getActiveSubscriptions(): Promise<Subscription[]> {
}
```
**[ повернутися до змісту](#table-of-contents)**
**[ повернутися до змісту](#зміст)**
## Переклади
@ -2929,4 +2929,4 @@ function getActiveSubscriptions(): Promise<Subscription[]> {
Перевірте цю [дискусію](https://github.com/labs42io/clean-code-typescript/issues/15) для отримання додаткових деталей та прогресу.
Ви можете зробити неоціненний внесок у спільноту *Clean Code*, переклавши це вашою мовою.
**[ повернутися до змісту](#table-of-contents)**
**[ повернутися до змісту](#зміст)**