Чудовий вибір теми! Це саме той етап, де ми переходимо від "я написав код, і він працює" до "я створив надійну систему".
Оскільки ви не вказали конкретну мову програмування (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)? Не знанням синтаксису, а параноєю.
Типові помилки новачків:
- Оптимізм: "Я ж написав
Введіть число, ніхто не буде писати туди літери". (Спойлер: будуть). - Відсутність логів: Коли щось ламається, програма просто закривається, і ніхто не знає чому.
- Hardcoding: Писати
tax = 0.20прямо в формулі. А завтра податок зміниться на 22%, і доведеться шукати це число по всьому коду.
Як думає Senior:
- "Як я можу зламати цей код?"
- "Що буде, якщо інтернет зникне посеред операції?"
- "Що, якщо дані прийдуть у неправильному форматі?"
3 поради з практики:
- Fail Fast (Падай швидко): Перевіряйте помилки на самому початку функції. Якщо дані погані — відхиляйте їх одразу, не робіть зайвих обчислень.
- Читайте помилки: Текст помилки (Traceback) — це не лайка комп'ютера на вас, це поліцейський протокол. Там написано, де саме і що саме сталося. Читайте його!
- Використовуйте константи: Замість магічних чисел використовуйте змінні з зрозумілими назвами (
MAX_LOGIN_ATTEMPTS = 3).
6. 🧩 Підсумок
Отже, що ми сьогодні зрозуміли? Програмування — це не лише написання інструкцій, це передбачення майбутнього.
Сьогодні ви навчилися: * ✅ Бачити різницю між "Happy Path" та реальністю. * ✅ Передбачати крайові випадки (Edge Cases). * ✅ Валідувати дані, щоб захистити свою програму від краху. * ✅ Думати як інженер, який будує надійно, а не просто "щоб працювало".
Тизер: Тепер, коли ми вміємо писати код, який не ламається від кожного чиху, час дізнатися, як зробити його ефективним. Наступного разу ми поговоримо про Алгоритмічну складність (Big O) — або чому ваша програма працює швидко на 10 елементах, але зависає на мільйоні!
This was CS50 style lesson. Побачимось!