Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.53/15: Рейтинг темы: голосов - 15, средняя оценка - 4.53
2 / 2 / 4
Регистрация: 31.03.2015
Сообщений: 38

Насколько целесообразно разбивать программу на несколько функций?

24.04.2015, 21:40. Показов 3292. Ответов 26
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Такой вот вопрос. Допустим, программу можно разбить на отдельные функции. С одной стороны это удобно - в одном месте вызываем соответствующую функцию, которая, например, пишет данные в массив. В другом месте -ф-я считывания из массива в поток вывода с некой обработкой. Т.е. каждая функция будет представлять логическое звено всей программы. А с другой стороны - нагрузка на стек, если можно так выразиться. Не будет ли это вредно илинаоборот нужно именно так делать?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
24.04.2015, 21:40
Ответы с готовыми решениями:

Насколько целесообразно?
Здравствуйте! Опишу ситуацию. В школе и институте я весьма интересовался программированием, изучал паскаль и затем делфи, сутками сидел и...

Можно ли разбивать определение шаблона класса на несколько файлов?
Можно ли написать в хедере определение класса с прототипами методов, а реализацию методов в отдельном файле?

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

26
Модератор
Эксперт С++
 Аватар для zss
13769 / 10962 / 6491
Регистрация: 18.12.2011
Сообщений: 29,238
24.04.2015, 21:43
Нагрузка на стек несущественная (рекурсивные функции не рассматриваем).
Зато наглядность программы возрастает многократно.
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
24.04.2015, 21:45
Цитата Сообщение от leshafree Посмотреть сообщение
А с другой стороны - нагрузка на стек, если можно так выразиться.
inline функции спасут отца русской демократии. Их код фактически не вызывается, а подставляется в место вызова. Если, конечно, оптимизатору чего странного в голову не взбредет.
0
619 / 218 / 51
Регистрация: 22.11.2010
Сообщений: 1,781
Записей в блоге: 3
24.04.2015, 21:57
Чем весомей программный код и набор функций, тем целесообразней.
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
24.04.2015, 21:59
Программу лучше разбить на логически законченные блоки. Как известно, существует принцип: "разделяй и властвуй". Чем меньше блок, тем проще он поддается контролю. Пытаться решать задачи "оптимизации" до того, как возникла в них необходимость (а чтобы это понять нужно провести соответствующие тесты с замерами производительности) совершенно не стоит.
"Преждевременная оптимизация - корень всех зол" (с) Дональд Кнут.
Во многих случаях может оказаться, что установка оптимизации через ключи компилятора будет предпочтительнее, чем попытки ручной модификации кода.
0
Модератор
Эксперт по электронике
8978 / 6744 / 921
Регистрация: 14.02.2011
Сообщений: 23,854
24.04.2015, 22:02
Цитата Сообщение от leshafree Посмотреть сообщение
в одном месте вызываем соответствующую функцию, которая, например, пишет данные в массив.
завтра понадобится не писать в массив а передавать допустим по интернету, при разделении труда, переписываешь одну функцию
при "все в одном" придется потрудится
Цитата Сообщение от leshafree Посмотреть сообщение
А с другой стороны - нагрузка на стек, если можно так выразиться.
не всегда аргументы передаются через стек, да и адрес возврата не у всех процессоров в стеке лежит
0
13 / 13 / 12
Регистрация: 11.04.2015
Сообщений: 64
24.04.2015, 22:05
вместо функций можно макросы использовать.
0
Модератор
Эксперт по электронике
8978 / 6744 / 921
Регистрация: 14.02.2011
Сообщений: 23,854
24.04.2015, 22:09
Цитата Сообщение от f1ff Посмотреть сообщение
вместо функций можно макросы использовать.
специально для ухода от макросов придумали inline функции и const для переменных
а ты предлагаешь все обратно вернуть?
0
13 / 13 / 12
Регистрация: 11.04.2015
Сообщений: 64
24.04.2015, 22:14
Цитата Сообщение от ValeryS Посмотреть сообщение
а ты предлагаешь все обратно вернуть?
не предлагаю
0
2 / 2 / 4
Регистрация: 31.03.2015
Сообщений: 38
25.04.2015, 09:09  [ТС]
Ага, спасибо за ответы. Насколько я понял, применение функций улучшит читаемость и иодифицируемость кода. Но ведь за такое удобство приходится чем-то платить. И эта плата - набор операций по подготовке к вызову функции и возврата обратно? И в компьютере это не особо ощутимо. Верно?
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
25.04.2015, 09:17
Цитата Сообщение от leshafree Посмотреть сообщение
Ага, спасибо за ответы. Насколько я понял, применение функций улучшит читаемость и иодифицируемость кода. Но ведь за такое удобство приходится чем-то платить. И эта плата - набор операций по подготовке к вызову функции и возврата обратно?
Говорю же, объявляйте функцию как inline и этих затрат не будет. Правда, злоупотребление инлайнами ведет к раздуванию кода. И не особо то оправдано, если функция сложнее трех строчек. Грубо говоря, сама функция работает тысячу тактов процессора (цикл там какой-то крутится), ее вызов занимает десять тактов. Ну заинлайнили вы ее, сэкономили десять тактов из тысячи... Вы эту экономию вообще заметите?
0
2 / 2 / 4
Регистрация: 31.03.2015
Сообщений: 38
25.04.2015, 09:27  [ТС]
Ну заинлайнили вы ее, сэкономили десять тактов из тысячи... Вы эту экономию вообще заметите?
Думаю, что нет)
0
Модератор
Эксперт по электронике
8978 / 6744 / 921
Регистрация: 14.02.2011
Сообщений: 23,854
25.04.2015, 09:31
Цитата Сообщение от Renji Посмотреть сообщение
Говорю же, объявляйте функцию как inline и этих затрат не будет.
Не знаю как сейчас, а раньше inline это был не приказ, а пожелание компилятору
типа хочу функцию в которой 100500 циклов сделать inline, а компилятор думает" да пошел ты не выгодно это мне", и делает обыкновенную
есть еще одна область где без функций не обойтись, это рекурсия и inline здесь не поможет
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
25.04.2015, 10:16
Цитата Сообщение от ValeryS Посмотреть сообщение
Не знаю как сейчас, а раньше inline это был не приказ, а пожелание компилятору
Всё осталось по-прежнему. 7.1.2/2:
...The inline specifier indicates to the implementation that inline substitution of the function body at the point of call is to be preferred to the usual function call mechanism. An implementation is not required to perform this inline substitution at the point of call;...
Вроде как у студийного компилятора есть force_inline. Предполагаю, что в случае рекурсии оно просто не соберется.
1
Эксперт С++
1675 / 1047 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
25.04.2015, 10:42
Цитата Сообщение от Tulosba Посмотреть сообщение
Вроде как у студийного компилятора есть force_inline
Если inline - рекомендация, то __force_inline - настойчивая рекомендация. Всё отлично соберётся.
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
25.04.2015, 11:49
Цитата Сообщение от Nick Alte Посмотреть сообщение
Всё отлично соберётся.
Если верить документации, то должен получить хотя бы предупреждение:
If the compiler cannot inline a function declared __forceinline, it generates a level 1 warning (4714).
Однако, у меня что-то не получилось увидеть это предупреждение в VS2013.
Пример брал отсюда.
0
Эксперт С++
 Аватар для Mr.X
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
25.04.2015, 13:29
Автора можно поздравить, - он открыл для себя процедурное программирование, и даже подумывает, не применить ли его на практике!
А если серьезно, то специалисты советуют делать функции как можно меньше, и каждой функции поручать только одну операцию.
0
2 / 2 / 4
Регистрация: 31.03.2015
Сообщений: 38
26.04.2015, 16:14  [ТС]
И если только одну операцию выполнять, в чем же прелесть?
0
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,886
26.04.2015, 16:36
Надо выполнить одну операцию cout 1 млрд раз.
В функцию пришло нечто. cout<<нечто
едва ли не 3 строки кода.
без функции switch , case 1млрд раз. Да вообще никакой прелести нету. Порешай задачки, поймешь в чем прелесть.

Добавлено через 14 минут
Mr.X, одна операция для функции не самое корректное утверждение.
Я, например, читал так, (не считал, а читал в литературе), что тело одной функции должно умещаться на экране монитора, если тело функции не умещается, то значит код написан плохо.
При этом одна функция должна решать ровно одну мини задачу. (мини задача - это мои собственные слова не из литературы. Не помню как там написано, но смысл тот же, что в словах "одну операцию")

Если inline функции, то должно умещаться в 3 строчки, но даже при этом компиляторы часто просто проигнорируют то, что функции объявлены как inline

От функций не убежишь, даже в ООП функции будут сплошь и рядом. Куда ни глянь, они заполонили мир.
0
Эксперт С++
 Аватар для Mr.X
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
26.04.2015, 17:05
Цитата Сообщение от daslex Посмотреть сообщение
Mr.X, одна операция для функции не самое корректное утверждение.
Цитата Сообщение от daslex Посмотреть сообщение
При этом одна функция должна решать ровно одну мини задачу. (мини задача - это мои собственные слова не из литературы. Не помню как там написано, но смысл тот же, что в словах "одну операцию")
Ну, слово "операция" не совсем русское и довольно многозначное, но оно используется в литературе.
В книге "Чистый код" это правило так и называется - "Правило одной операции".
В книге "Совершенный код" это называется функциональной связностью, когда функция выполняет одну и только одну операцию. Там рассматриваются еще несколько видов связности, которые могут реализовывать функции, но функциональная названа самой сильной и лучшей.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
26.04.2015, 17:05
Помогаю со студенческими работами здесь

Разбить программу на несколько функций
Как сделать эту программу в виде функций, сейчас она работает правильно. Программа ищет все локальные минимумы(элемент который меньше всех...

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

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

Написать программу, которая выводит на экран график одной или несколько функций
Написать программу, которая выводит на экран график одной или несколько функций. Программа должна выводить рисунок с использованием модуля...

SQL-запросы в большом проекте: есть ли смысл разбивать программу на отдельные классы
Добрый день! В данный момент занимаюсь приведением в порядок большого проекта на C#, который до меня писали несколько человек разного...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru