Модуль 39

Реальні кейси та типові помилки

Чудовий вибір теми! Це саме той етап, де ми переходимо від "я написав код, і він працює" до "я створив надійну систему".

Оскільки ви не вказали конкретну мову програмування (Python, C, SQL тощо), я зроблю цей урок універсальним (на базі Python, як найбільш зрозумілого псевдокоду), фокусуючись на фундаментальних принципах Defensive Programming (Захисного програмування) та обробці крайових випадків (Edge Cases).

Ось ваш урок у стилі CS50.


🎓 Урок: Реальні кейси та типові помилки (або чому "на моєму комп'ютері працює" — це не аргумент)

1. 🔥 Вступ: проблема та мотивація

Уявіть, що ви збудували кавовий автомат. Ви протестували його: вкинули монету, натиснули кнопку, отримали каву. Все працює ідеально! Ви ставите його в центрі міста.

Але через годину він ламається. Чому? Бо хтось спробував вставити ґудзик замість монети. Хтось натиснув дві кнопки одночасно. А хтось взагалі почав трясти автомат, бо йому не дали решту.

Риторичне запитання: Ваш код готовий до того, що користувач введе -5 у поле для віку? Або завантажить картинку розміром в 1 гігабайт?

У підручниках ми часто пишемо код для "Happy Path" (щасливого шляху) — сценарію, де все йде за планом. Але в реальному житті (Real World Cases) "щасливий шлях" трапляється набагато рідше, ніж нам здається. Без розуміння типових помилок і реальних сценаріїв ваш застосунок — це картковий будинок, який впаде від першого ж легкого вітерця.

Сьогодні ми навчимося будувати не карткові будинки, а фортеці.


2. 🧠 Теоретична база (без сухої академічності)

Перш ніж пірнати в код, розберемо два ключові поняття.

1. Крайові випадки (Edge Cases)

Це ситуації, що трапляються на межі нормальної роботи програми. * Приклад: Ви пишете функцію, яка ділить 100 яблук на n людей. * Норма: 5 людей, 10 людей. * Край: 0 людей (ділення на нуль!), -5 людей (як це?), 0.5 людини.

Як це працює під капотом: Комп'ютер не має інтуїції. Якщо ви скажете йому поділити на 0, процесор викине апаратну помилку, і ваша програма "впаде" (crash). Ваше завдання — передбачити це до того, як процесор спробує виконати операцію.

2. Валідація даних (Input Validation)

Це принцип "Довіряй, але перевіряй". Ніколи не вірте даним, які приходять ззовні (від користувача, з файлу, з інтернету).

Що треба запам'ятати обов'язково:

Rule #1: Користувач завжди зробить щось непередбачуване. Не тому, що він злий, а тому, що він — людина.

Інтуїтивне розуміння: Уявіть фейс-контроль у клубі. Ви не пускаєте всередину п'яних або людей зі зброєю. Ваша програма має робити те саме з "поганими" даними на вході.


3. 🧪 Приклади (від простого до реального)

Давайте подивимось, як змінюється код від "студентського" до "професійного".

Приклад 1: Калькулятор знижки (Happy Path)

Студент пише код:

def calculate_discount(price, discount_percent):
    return price * (1 - discount_percent / 100)

Питання до вас: Що станеться, якщо я передам ціну 1000, а знижку 200? Результат: Функція поверне -1000. Магазин винен клієнту гроші? Це бізнес-катастрофа.

Приклад 2: Реальний кейс (Додаємо захист)

Досвідчений розробник знає: знижка не може бути більшою за 100% і не може бути меншою за 0.

def calculate_discount(price, discount_percent):
    # Перевірка на дурня (Sanity Check)
    if discount_percent < 0 or discount_percent > 100:
        print("Помилка: Некоректний відсоток знижки!")
        return None # Або повертаємо початкову ціну

    if price < 0:
        print("Помилка: Ціна не може бути від'ємною!")
        return None

    return price * (1 - discount_percent / 100)

Чому так краще: Ми явно обробили помилку. Програма не зробила нісенітниці, а повідомила про проблему.

Приклад 3: "Тиха" помилка типів

Уявіть форму реєстрації, де користувач вводить вік. Він ввів: "двадцять".

# Типова помилка новачка
age = input("Введіть ваш вік: ") # Отримуємо стрічку "20"
days_alive = age * 365 

Що ви очікуєте? Число 7300? Реальність: У Python множення стрічки на число дублює її. Ви отримаєте стрічку "20202020..." (365 разів). Ваша база даних лусне.

Виправлення: Завжди перетворюйте типи та перехоплюйте помилки.

try:
    age = int(input("Введіть ваш вік: "))
    print(f"Ви живете приблизно {age * 365} днів.")
except ValueError:
    print("Будь ласка, введіть число, а не текст!")

4. 🛠 Практична частина

Час закачати рукави. Ось кілька ситуацій. Спробуйте знайти рішення.

Завдання 1: Банкомат Користувач хоче зняти гроші. balance = 1000 request = 5000 Напишіть умову if, яка не дозволить йому піти в мінус.

Завдання 2: Ділення на нуль Є список чисел: [10, 5, 0, 2]. Напишіть цикл, який ділить 100 на кожне з цих чисел. Задача: Зробіть так, щоб програма не "впала" на нулі, а просто написала "Пропускаємо нуль" і пішла далі.

Завдання 3: Міні-кейс "Список гостей" Ви пишете програму для вечірки. Користувач вводить ім'я. * Що, якщо користувач просто натисне Enter (порожній рядок)? * Що, якщо введе " Alex " (з пробілами)? * Напишіть код, який очищає ім'я від зайвих пробілів і перевіряє, чи воно не порожнє.

Завдання 4: А що, якщо... (Подумайте) Ви розробляєте гру. Гравець має здоров'я health = 10. Монстр б'є його на 15 урону. health стає -5. На екрані відображається смужка життя. Чи вміє ваша функція малювання смужки малювати від'ємну довжину? Як це виправити одним рядком коду? (Підказка: функція max()).


5. 💡 Мислення як у розробника

Чим відрізняється новачок (Junior) від профі (Senior)? Не знанням синтаксису, а параноєю.

Типові помилки новачків:

  1. Оптимізм: "Я ж написав Введіть число, ніхто не буде писати туди літери". (Спойлер: будуть).
  2. Відсутність логів: Коли щось ламається, програма просто закривається, і ніхто не знає чому.
  3. Hardcoding: Писати tax = 0.20 прямо в формулі. А завтра податок зміниться на 22%, і доведеться шукати це число по всьому коду.

Як думає Senior:

  • "Як я можу зламати цей код?"
  • "Що буде, якщо інтернет зникне посеред операції?"
  • "Що, якщо дані прийдуть у неправильному форматі?"

3 поради з практики:

  1. Fail Fast (Падай швидко): Перевіряйте помилки на самому початку функції. Якщо дані погані — відхиляйте їх одразу, не робіть зайвих обчислень.
  2. Читайте помилки: Текст помилки (Traceback) — це не лайка комп'ютера на вас, це поліцейський протокол. Там написано, де саме і що саме сталося. Читайте його!
  3. Використовуйте константи: Замість магічних чисел використовуйте змінні з зрозумілими назвами (MAX_LOGIN_ATTEMPTS = 3).

6. 🧩 Підсумок

Отже, що ми сьогодні зрозуміли? Програмування — це не лише написання інструкцій, це передбачення майбутнього.

Сьогодні ви навчилися: * ✅ Бачити різницю між "Happy Path" та реальністю. * ✅ Передбачати крайові випадки (Edge Cases). * ✅ Валідувати дані, щоб захистити свою програму від краху. * ✅ Думати як інженер, який будує надійно, а не просто "щоб працювало".

Тизер: Тепер, коли ми вміємо писати код, який не ламається від кожного чиху, час дізнатися, як зробити його ефективним. Наступного разу ми поговоримо про Алгоритмічну складність (Big O) — або чому ваша програма працює швидко на 10 елементах, але зависає на мільйоні!

This was CS50 style lesson. Побачимось!