Урок №14. Почему функции — полезны, и как их эффективно использовать?

  Юрий  | 

  |

  Обновл. 19 Сен 2020  | 

 109340

 ǀ   24 

Теперь, когда мы уже знаем, что такое функции и зачем они нужны, давайте более подробно рассмотрим, почему они так полезны.

Зачем использовать функции?

Начинающие программисты часто спрашивают: «А можно ли обходиться без функций и весь код помещать непосредственно в функцию main()?». Если вашего кода всего 10-20 строк, то можно. Если же серьезно, то функции предназначены для упрощения кода, а не для его усложнения. Они имеют ряд преимуществ, которые делают их чрезвычайно полезными в нетривиальных программах.

   Структура. Как только программы увеличиваются в размере/сложности, сохранять весь код внутри main() становится трудно. Функция — это как мини-программа, которую мы можем записать отдельно от головной программы, не заморачиваясь при этом об остальных частях кода. Это позволяет разбивать сложные задачи на более мелкие и простые, что кардинально снижает общую сложность программы.

   Повторное использование. После объявления функции, её можно вызывать много раз. Это позволяет избежать дублирования кода и сводит к минимуму вероятность возникновения ошибок при копировании/вставке кода. Функции также могут использоваться и в других программах, уменьшая объем кода, который нужно писать с нуля каждый раз.

   Тестирование. Поскольку функции убирают лишний код, то и тестировать его становится проще. А так как функция — это самостоятельная единица, то нам достаточно протестировать её один раз, чтобы убедиться в её работоспособности, а затем мы можем её повторно использовать много раз без необходимости проводить тестирование (до тех пор, пока не внесем изменения в эту функцию).

   Модернизация. Когда нужно внести изменения в программу или расширить её функционал, то функции являются отличным вариантом. С их помощью можно внести изменения в одном месте, чтобы они работали везде.

   Абстракция. Для того, чтобы использовать функцию, нам нужно знать её имя, данные ввода, данные вывода и где эта функция находится. Нам не нужно знать, как она работает. Это очень полезно для написания кода, понятного другим (например, Стандартная библиотека С++ и всё, что в ней находится, созданы по этому принципу).

Каждый раз, при вызове std::cin или std::cout для ввода или вывода данных, мы используем функцию из Стандартной библиотеки C++, которая соответствует всем вышеперечисленным концепциям.

Эффективное использование функций


Одной из наиболее распространенных проблем, с которой сталкиваются новички, является понимание того, где, когда и как эффективно использовать функции. Вот несколько основных рекомендаций при написании функций:

   Рекомендация №1: Код, который появляется более одного раза в программе, лучше переписать в виде функции. Например, если мы получаем данные от пользователя несколько раз одним и тем же способом, то это отличный вариант для написания отдельной функции.

   Рекомендация №2: Код, который используется для сортировки чего-либо, лучше записать в виде отдельной функции. Например, если у нас есть список вещей, которые нужно отсортировать — пишем функцию сортировки, куда передаем несортированный список и откуда получаем отсортированный.

   Рекомендация №3: Функция должна выполнять одно (и только одно) задание.

   Рекомендация №4: Когда функция становится слишком большой, сложной или непонятной — её следует разбить на несколько подфункций. Это называется рефакторингом кода.

При изучении языка C++ вам предстоит написать много программ, которые будут включать следующие три подзадания:

   Получение данных от пользователя.

   Обработка данных.

   Вывод результата.

Для простых программ (менее, чем 30 строк кода) частично или все эти три подзадания можно записать в функции main(). Для более сложных программ (или просто для практики) каждое из этих трех подзаданий является хорошим вариантом, чтобы написать отдельные функции.

Новички часто комбинируют обработку ввода и вывод результата в одной функции. Тем не менее, это нарушает правило «одного задания». Функция, которая обрабатывает значение, должна возвращать его в caller, а дальше уже пускай caller сам решает, что ему с ним делать.

Оценить статью:

Звёзд: 1Звёзд: 2Звёзд: 3Звёзд: 4Звёзд: 5 (1 146 оценок, среднее: 4,94 из 5)
Загрузка...

Комментариев: 24

  1. Lena:

    Большое спасибо за самые понятные уроки!

    1. Фото аватара Юрий:

      Пожалуйста 🙂

  2. Maks:

    Хочу поинтересоваться, если я досконально пройду это обучение, то я смогу себе считать полноценным джуниуром, если не полноценным, то приблизительно на сколько %?

    1. Фото аватара Юрий:

      Не совсем корректный вопрос, на который нет ответа.

      Всё зависит от вас, как от учащегося: как вы будете проходить материал, как будете выполнять практические задания, насколько будете вникать в материал, будете ли дополнительно искать информацию и т.д. Данные уроки дадут вам возможность стать джуном, но для этого придется "попотеть".

  3. Danil:

    Спасибо большое за отличный материал , он очень помогает в освоении языка, все сжато , понятно , я бы даже сказал расжевано. Представить себе не могу какой это труд все это собирать и показывать. Я бы сказал , что это "СЛИШКОМ КАЧЕСТВЕННО".)))))))))

    1. Фото аватара Юрий:

      Спасибо!) Очень приятно, что уроки вам пригодились 🙂

  4. prmx:

    Спасибо, этот материал мне очень помогает

  5. Андрей:

    Блин,это круто.
    Я сначала недооценил этот сайт,думал скучно и непонятно,а оказалось,что толстенные Страуструпы не нужны)
    Как новичок,я доволен,ибо получается,функции я освоил))
    Люблю тебя)
    как заработаю на с++ — тебе отправлю)
    И по твоему сайту людей учить буду))

    1. Фото аватара Юрий:

      Ну всё, жду твоего комментария на последнем уроке курса по С++!))

  6. Владимир:

    Юрий, Спасибо Вам за уроки!

  7. Дмитрий:

    Спасибо за такое обучения на C++ все понятно

    1. Фото аватара Юрий:

      Пожалуйста)

  8. Vortm4x:

    А существует ли в c++ log(x) с произвольным основанием (типо loq4(x) ) или нужно пользоваться свойствами логарифмов
    log4(x)=log(4)/log(x)?

    1. Denis:

      Учитывая тему, я бы посоветовал вам просто выделить такое действие в отдельную функцию=)

  9. Александр:

    Читаю уроки и душа радуется! Мне так давно хотелось освоить этот язык. Юра спасибо огромное и долгие лета!

    1. Фото аватара Юрий:

      Пожалуйста 🙂

  10. Михаил:

    Спасибо Вам большое за такой чудесный материал.Все просто четко и ясно изложено.Еще раз огромное Вам спасибо!!!

    1. Фото аватара Юрий:

      Спасибо и вам, что читаете 🙂

      1. Waldemar:

        Юрий, скажите, если я, например, в функции сделаю return 0, вместо return нужной константы, у меня он выведет в итоге 0?

  11. Алёна:

    Юра, СПАСИБО! Училась в 5 школах и 3 институтах, более структурированных и доходчивых лекций не видела. Без вот этой пафосной "научной лексики", даже словарь сделал для чайников! Ты делаешь очень ценное дело — даешь бесплатное образование, так еще и качество выдаешь на порядок лучше, чем многие преподаватели престижных ВУЗов и частных школ. Когда стану богатой, дам тебе много денег).

    1. Фото аватара Юрий:

      Спасибо за отзыв, реально приятно 🙂 Именно это и есть целью этих уроков — простота и качество в одном флаконе. Сам столкнулся с тем, что информации в книгах/учебниках/многих сайтах вроде бы много, но способ изложения хромает. А когда нашел качественный ресурс LearnCpp, то уже не удержался и решил переводить/поделиться уроками с Рунетом.

    2. 84.88.8G.80:

      Полностью согласен с Аленой.

  12. Семён:

    Спасибо ! Очень полезно и интересно , но и все уроки нужно подкреплять практикой и что бы хоть один раз получилось вызвать функцию , написать параметры и аргументы .

    1. Дима:

      В предыдущих уроках их предостаточно.
      Пример с ОК — круть

Добавить комментарий

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