# Логування

> ***У програмуванні дві проблеми:***
>
> 1. *Невдале іменування змінних та функцій.*
> 2. *Обнулили те, що не треба (чи не те, що треба).*
> 3. *Помилка на одиницю.*

Логування — це вивід у лог певної інфи, яка допоможе побачити, де порився баг.

Логи виводяться на консоль. Тому, власне, функція і називається `console`**`.log`** :wink:

### Як та що логувати?

Уявімо, у вас такий код:

```javascript
let n = 10;
for(let i = 0; i >= 0; i++) {
    // тут типу якийсь код
}
```

Він вішає консоль, а ви не розумієте, чому. Припустімо, ви взагалі не розумієте, що відбувається. У таких випадках починайте з того, що просто логуйте всі сутності — змінні, масиви і т.д.

```javascript
let n = 10;
for(let i = 0; i >= 0; i++) {
    console.log("   До коду: i = " + i + ", n = " + n);
    // тут типу якийсь код
    console.log("Після коду: i = " + i + ", n = " + n);
    console.log("---");
}
```

Які висновки можна зробити з цих логів?

1. **`n`** незмінна. І в умові переривання циклу її теж нема. Проблема точно пов'язана з **`i`**. &#x20;
2. "До" та "після" не відрізняються, тобто в тілі циклу нічого корисного не відбувається.
3. Цикл — безкінечний. **Вочевидь, консоль вішається саме через це.**

Щоб переконатись, залогуємо ще умову переривання циклу. І ще викинемо з консолі те, що стало зайвим (тобто **`n`** (бо вона незмінна) і розділення на "до" та "після" (бо вони однакові)).

```javascript
let n = 10;
for(let i = 0; i >= 0; i++) {
    // тут типу якийсь код
    console.log("i = " + i + "\ti >= 0 == " + (i >= 0));
}
```

Знову переконуємось: **`i >= 0`** завжди **`true`**. Думаємо, як вилікувати бідну програму. Можливо, так?

```javascript
let n = 10;
for(let i = 0; i >= n; i++) {
    console.log("i = " + i + "\ti >= n == " + (i >= n));
    // тут типу якийсь код
}
```

Ура, консоль не вішається! Але й нічого не відбувається. Може це просто глюк Ш++ IDE? Знову ж, логуємо:

```javascript
let n = 10;
console.log("повідомлення до циклу");
for(let i = 0; i >= n; i++) {
    console.log("i = " + i + "\ti >= n == " + (i >= n));
    // тут типу якийсь код
}
console.log("повідомлення після циклу");
```

Ні, це не глюк, все працює. Крім цикла. Дивимось: цикл виконується, доки **`i >= n`**. Але ж від початку **`i = 0`,** тобт&#x43E;**`i < n`**  вже на першій ітерації. І ми просто не заходимо в тіло цикла. Що робити? Ну, наприклад, можна просто реверснути умову:

```javascript
let n = 10;
console.log("повідомлення до циклу");
for(let i = 0; i <= n; i++) {
    console.log("i = " + i);
    // тут типу якийсь код
}
console.log("повідомлення після циклу");
```

... або ще якось, залежно від умов задачі. У будь-якому разі, все запрацювало.

**Приблизно так і виглядає логування.** Виводимо на консоль інфу та шукаємо проблему. Звучить доволі просто :)

### **Висновок**

Логування — це круто і допомагає. Але **писати код навмання — максимально непродуктивно**.

Ніж розгрібати купу багів, варто від самого початку розуміти, що відбуватиметься на кожному кроці програми. Причому розуміти ще до того, як її запустимо. Треба будувати алгоритм на папері *(буквально: беремо аркуш зошита і там пишемо / малюємо)* та "запускати код в голові", передбачувати дії програми до появи багів, щоб їх і не виникало взагалі.

Спочатку це буде складно, але з кожною новою задачею дедалі простішатиме. Тому пишіть код руками не рідше, ніж читаєте теорію — і буде вам щастя :)


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://shpp.gitbook.io/zero/arrangements/logging.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
