Тепер, коли ми вже знаємо, що таке функції і навіщо вони потрібні, давайте більш детально розглянемо те, чому вони так корисні.
Навіщо потрібно використовувати функції?
Початківці часто запитують: «А чи можна обходитися без функцій і весь код розміщувати безпосередньо в функції main()?”. Відповідь: “Якщо ваш код складає всього лише 10-20 рядків, то можна, якщо ж серйозно, то функції призначені для спрощення коду, а не для його ускладнення”. Вони мають ряд переваг, які роблять їх надзвичайно корисними в нетривіальних програмах.
Переваги функцій:
Структура. Як тільки програми збільшуються в розмірі/складності, зберігати весь код всередині main() стає важко. Функція — це як міні-програма, яку ми можемо записати окремо від головної програми, не заморочуючись при цьому на рахунок інших частин коду. Це дозволяє розбивати складні завдання на більш дрібні і прості, що кардинально знижує загальну складність програми.
Повторне використання. Після оголошення функції, її можна викликати багато разів. Це дозволяє уникнути дублювання коду і зводить до мінімуму ймовірність виникнення помилок при копіюванні/вставці коду. Функції також можуть використовуватися і в інших програмах, зменшуючи обсяг коду, який потрібно писати з нуля кожен раз.
Тестування. Оскільки функції прибирають зайвий код, то і тестувати його стає набагато простіше. А так як функція — це самостійна одиниця, то нам досить протестувати її один раз, щоб переконатися в її працездатності, а потім ми можемо її повторно використовувати багато разів без необхідності проводити тестування ще раз (до тих пір, поки не внесемо зміни в цю функцію).
Модернізація. Коли потрібно внести зміни в програму або розширити її функціонал, то функції є відмінним варіантом. З їх допомогою можна внести зміни в одному місці, щоб вони запрацювали всюди.
Абстракція. Для того, щоб використовувати функцію, нам потрібно знати її ім’я, вхідні дані, вихідні дані і де ця функція знаходиться. Нам не потрібно знати, як вона працює. Це дуже корисно для написання коду, зрозумілого іншим (наприклад, стандартна бібліотека С++ і все, що в ній знаходиться, — створена саме за цим принципом).
Кожен раз, при виклику std::cin або std::cout для введення або виведення даних, ми використовуємо функцію зі стандартної бібліотеки C++, яка відповідає всім зазначеним вище концепціям.
Ефективне використання функцій
Однією з найбільш поширених проблем, з якою стикаються початківці, є розуміння того, де, коли і як ефективно використовувати функції. Ось кілька основних рекомендацій при написанні функцій:
Рекомендація №1: Код, який з’являється більше одного разу в програмі, краще переписати у вигляді функції. Наприклад, якщо ми отримуємо дані від користувача кілька разів одним і тим же способом, то це чудова нагода для написання окремої функції.
Рекомендація №2: Код, який використовується для сортування будь-чого, краще записати у вигляді окремої функції. Наприклад, якщо у нас є список речей, які потрібно впорядкувати — пишемо функцію сортування, куди передаємо несортований список і звідки отримуємо уже відсортований.
Рекомендація №3: Функція повинна виконувати одне (і тільке одне) завдання.
Рекомендація №4: Коли функція стає дуже великою, складною чи незрозумілою — її варто розбити на декілька підфункцій. Це називається “рефакторингом коду“.
При вивченні C++ вам потрібно буде написати багато програм, які будуть включати наступні три підзавдання:
Отримання даних від користувача.
Опрацювання даних.
Вивід результату на екран.
Для простих програм (менше 30 рядків коду) частково або всі з цих трьох підзавдань можна записати у функції main(). Для більш складних програм (або просто для практики) кожне з цих трьох підзавдань є хорошим варіантом для написання окремої функції.
Початківці дуже часто комбінують в одній функції відразу і опрацювання даних від користувача, і виведення результату. Проте це порушує правило “одного завдання”. Функція, яка опрацьовує значення, повинна повертати його назад в викликаючу функцію, а далі вже нехай ця функція сама вирішує, що їй з цим значенням робити.