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

  Юрій  | 

  Оновл. 20 Кві 2020  | 

 66

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

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

Крок №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 Зірок (1 оцінок, середня: 5,00 з 5)
Loading...

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

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