Урок №28. Розробка ваших перших програм

  Юрій  | 

  Оновл. 20 Лип 2021  | 

 436

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

Багато в чому, програмування — це як архітектура. Що станеться, якщо ви спробуєте побудувати будинок без дотримання архітектурного плану? Будинок може ви і зможете побудувати, але який він буде: криві стіни, протікаючий дах і т.п. Аналогічно, якщо ви почнете програмувати що-небудь серйозне перед тим, як складете план, то дуже скоро побачите, що ваш код має дуже багато проблем, на вирішення яких ви витратите набагато більше часу, зусиль та нервів, ніж на початкове складання хорошого плану.

Крок №1: Визначте проблему

Перше, що вам потрібно зробити — це визначити проблему, яку вирішить ваша програма. В ідеалі, ви повинні сформулювати це одним або двома реченнями, наприклад:

   Я хочу написати програму-довідник для зручного зберігання і редагування всіх телефонних номерів та дзвінків.

   Я хочу написати програму для генерації випадкових чисел, за допомогою якої можна буде визначати переможців різних конкурсів.

   Я хочу написати програму, яка відслідковуватиме і аналізуватиме акції на фондовому ринку для генерації виграшних прогнозів.

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

Крок №2: Визначте інструментарій, цілі і план бекапу

Для досвідчених програмістів на цьому етапі буде ще чимало додаткових пунктів:

   Яка ваша цільова аудиторія і які в неї потреби?

   На якій архітектурі/ОС ваша програма працюватиме?

   Який інструментарій ви використовуватимете?

   Чи виконуватимете ви розробку програми самотужки чи в складі команди?

   Аналіз вимог.

   Визначення стратегій тестування/зворотного зв’язку/релізу.

   Створення плану бекапа у випадку форс-мажору.

Початківці, як правило, великою кількістю питань не задаються: “Пишу програму для власного використання, сам, на своїй операційній системі, за допомогою своєї IDE, користуватися цією програмою буду тільки я”. Все просто.

Якщо ж ви будете працювати над чимось серйознішим, то варто подумати над планом бекапу вашої програми/проекту. Це означає не просто скопіювати код в іншу папку на ноутбуці (хоча це вже краще, ніж нічого). Якщо ваша ОС “зламається”, то ви втратите всі дані. Хороша стратегія резервного копіювання включає в себе створення копії вашого коду поза вашою операційною системою, наприклад:

   Відправити самому собі E-mail з кодом (прикріпити як архів).

   Скопіювати в Dropbox чи в будь-який інший хмарний сервіс.

   Перенести на зовнішній пристрій (наприклад, на портативний жорсткий диск).

   Скопіювати на інший комп’ютер в локальній мережі.

   Скористатися системами контролю версій (наприклад, GitHub, GitLab чи Bitbucket).

Крок №3: Розбийте проблему на частини

У реальному житті нам часто доводиться виконувати дуже складні завдання. Зрозуміти, як їх вирішити, також буває дуже важко. У таких випадках можна використовувати метод поділу на частини (або метод “від великого до малого”). Тобто, замість того, щоб вирішувати одну велику складну задачу, ми розбиваємо її на кілька підзадач, кожну з яких простіше вирішити. Якщо ці підзадачі все ще надто складні, то і їх потрібно додатково розбити. І так до тих пір, поки ви не дійдете до точки, де кожне окремо взяте завдання можна легко виконати.

Розглянемо це на прикладі. Припустимо, що нам потрібно написати доповідь про картоплю. Наша ієрархія завдань в даний час виглядає наступним чином:

   Написати доповідь про картоплю

Це досить-таки велика задача, тому давайте розіб’ємо її на підзадачі:

   Написати доповідь про картоплю

   Пошук інформації про картоплю

   Створення плану

   Заповнення кожного пункту плану детальною інформацією

   Висновки

Це вже простіше, оскільки тепер ми маємо список підзадач, на яких можемо зосередитися в індивідуальному порядку. Проте, в даному випадку, “Пошук інформації про картоплю” звучить трохи розпливчасто, потрібно додатково розбити цей пункт:

   Написати доповідь про картоплю

   Пошук інформації про картоплю

   Сходити в бібліотеку за книжками про картоплю

   Пошукати інформацію в Інтернеті

   Зробити замітки на відповідні розділи з довідкового матеріалу

   Створення плану

   Інформація про вирощування

   Інформацію про обробку

   Інформація про добрива

   Заповнення кожного пункту плану детальною інформацією

   Висновки

Виконуючи кожен підпункт цього завдання, ми вирішимо одну велику задачу.

Є ще один спосіб створення ієрархії — метод “від малого до великого”. Розглянемо на прикладі.

Більшість з нас змушені ходити на роботу (або в школу/університет) в будні дні. Припустимо, що нам потрібно вирішити проблему “від ліжка до роботи”. Якби вас запитали, що ви робите перед тим, як дістатися на роботу, ви відповіли б приблизно наступне:

   Вибрати одяг

   Вдягнутися

   Поснідати

   Поїхати на роботу

   Почистити зуби

   Встати з ліжка

   Приготувати сніданок

   Прийняти душ

Використовуючи метод “від малого до великого”, ми можемо згрупувати завдання і створити ієрархію:

   Від ліжка до роботи

   Спальня

   Встати з ліжка

   Вибрати одяг

   Вдягнутися

   Ванна

   Прийняти душ

   Почистити зуби

   Сніданок

   Зробити сніданок

   Поснідати

   Транспорт

   Поїхати на роботу

Використання подібних ієрархій надзвичайно корисне в програмуванні для визначення структури всієї програми. Завдання верхнього рівня (наприклад: “Написати доповідь про картоплю” або “Від ліжку до роботи”) стає функцією main() (оскільки це основна проблема, яку потрібно вирішити). Підзадачі стають функціями в програмі.

Крок №4: Визначте послідовність подій

Тепер, коли ваша програма має структуру, прийшов час відповісти на питання: “А як же пов’язати всі ці пункти разом?”. Перший крок полягає у визначенні послідовності подій. Наприклад, коли ви прокидаєтеся вранці, в якій послідовності ви виконуєте вищенаведені справи? Швидше за все, в наступній:

   Встати з ліжка

   Вибрати одяг

   Прийняти душ

   Вдягнутися

   Приготувати сніданок

   Поснідати

   Почистити зуби

   Поїхати на роботу

Якби ми створювали калькулятор, послідовність подій виглядала б наступним чином:

   Отримати перше значення від користувача

   Отримати математичну операцію від користувача

   Отримати друге значення від користувача

   Обчислити результат

   Вивести результат на екран

Цей список визначає вміст функції main():

Або, у випадку з калькулятором:

Крок №5: Визначте дані вводу та дані виводу на кожному етапі

Після визначення ієрархії завдань і послідовності подій, нам потрібно визначити, якими будуть дані вводу та дані виводу на кожному етапі.

Наприклад, перша функція з вищенаведеного прикладу — getUserInput() — досить-таки проста. Ми збираємося отримати число від користувача і повернути його назад у викликаючу функцію. Таким чином, прототип функції виглядатиме наступним чином:

У випадку з калькулятором, для функції calculateResult() потрібно 3 даних вводу: 2 числа і 1 математичний оператор. При виклику calculateResult() у нас вже повинні бути 3 фрагмента даних, які ми використовуватимемо в якості параметрів функції. Функція calculateResult() обчислює значення результату, але не виводить його. Отже, нам потрібно повернути цей результат як значення, що повертається, щоб інші функції також мали можливість його використати.

Враховуючи все вищесказане, прототип функції стає наступним:

Крок №6: Подбайте про деталі

На цьому етапі нам потрібно реалізувати кожен підпункт з нашої ієрархії завдань. Якщо ви розбили завдання на досить дрібні частини, то виконати кожну з цих частин буде нескладно. Наприклад:

Крок №7: З’єднайте дані вводу з даними виводу в програмі

І, нарешті, останній крок — з’єднання даних вводу з даними виводу. Наприклад, ви можете відправити вихідні дані функції calculateResult() у вхідні дані функції printResult(), щоб друга функція могла вивести результат. Найчастіше в таких випадках використовуються проміжні змінні для тимчасового зберігання результату і його переміщення між функціями, наприклад:

Погодьтеся, що варіант, наведений вище, читабельніший без використання тимчасових змінних (див. нижче):

Розглянемо готову версію програми-калькулятора, її структуру і переміщення даних:

Тут є кілька концепцій, які ми ще не розглядали: умовне розгалуження з операторами if і використання оператора рівності == для порівняння двох елементів. Не турбуйтеся, якщо ви це не розумієте — ми все це детально розглянемо на наступних уроках.

Поради

Нехай ваші перші програми будуть простими. Дуже часто початківці ставлять занадто високі планки для своїх перших більш-менш серйозних програм. Наприклад, “Я хочу написати гру з графікою, звуком, монстрами, підземеллями і містом, в якому можна буде продавати знайдені речі”. Якщо ви спробуєте написати що-небудь подібне на початку вашого шляху в програмуванні, то дуже скоро у вас зникне будь-яке бажання програмувати. Замість цього, нехай ваші перші цілі/завдання/програми будуть простими. Наприклад, “Я хочу написати програму, яка показувала б 2D-поле на екрані”.

Додавайте новий функціонал поступово. Як тільки ви написали простеньку програму, яка працює (навіть без збоїв), то тільки тоді можна буде додавати новий функціонал. Наприклад, коли ви можете показувати 2D-поле на екрані, то тоді додайте персонажа, який зможе ходити по цьому полю. Після того, як ви вже зможете ходити, додайте стіни, які перешкоджатимуть вашому руху. Після того, як у вас будуть стіни, побудуйте з них місто. Після того, як у вас буде місто, додайте персонажів-продавців. При такому підході на вас не навалюється все відразу і ви знаєте з чого починати, що робити далі і в якій послідовності.

Фокусуйтеся тільки на одному завданні в певний проміжок часу. Не намагайтеся зробити все і відразу, не розпилюйтеся на кілька завдань одночасно. Зосередьтесь на чомусь одному. Краще мати одне виконане завдання і п’ять невиконаних, ніж шість частково виконаних завдань. Якщо ви розсіюєте свою увагу в декількох напрямках, то і помилок буде відповідно.

Тестуйте кожну нову частину коду. Початківці часто пишуть програми “за один підхід”. Потім, при компіляції проекту, отримують сотні помилок. Тому, при написанні певної частини коду, відразу компілюйте і тестуйте її. Якщо ваш код не працюватиме, то ви знатимете, де знаходиться проблема, і виправити її буде набагато легше. Як тільки ви переконалися, що ваш код робочий — переходьте до написання наступної частини, а потім repeat. Тестування може зайняти більше часу, але в кінцевому підсумку ваш код працюватиме так, як вам потрібно.

Більшість новачків пропустять деякі з цих кроків і порад, тому що це не настільки захоплююче, як, власне, сам процес програмування. Хороша новина полягає в тому, що як тільки ви освоїте всі ці концепції — вони стануть для вас звичними в процесі розробки ваших програмних продуктів.

Оцінити статтю:

1 Зірка2 Зірки3 Зірки4 Зірки5 Зірок (9 оцінок, середня: 5,00 з 5)
Loading...

Залишити відповідь

Ваш E-mail не буде опублікований. Обов'язкові поля відмічені *