LINUX.ORG.RU

[C++] Очень много аргументов у функций

 


0

0

В наследство достался код, в котором необходимо разобраться. Помимо большого количества других косяков, очень напрягают функции с ~20 аргументами. Их много, и читать это всё через некоторое время становится просто невозможно. Как коллективный разум поступает в таких случаях? Переписывать всё с нуля лениво, хотелось бы как-нибудь причесать с минимальными трудозатратами.

★★★★

Покажи такую функцию, не стесняйся.

anonymous
()

А в чем именно «напряг»? Сложно запомнить суть и очередность параметров?
Ну, тут вариантов не так уж и много — в заголовочном файле рядом с описанием ф-ции напиши пространный комментарий, какой параметр за каким.

Кстати в Objective C (эдакий Си с классами) очень интересно подошли к этой проблеме. Вместо привычного foo(param1,param2,param3)
пишут:
foo:param1 description_of_2nd_param:param2 description_of_3rd_param:param3

Да, текста больше, но зато всегда легко вспомнить что да как.

Stahl ★★☆
()

Эм...

  • Написать обертки, в котрые передевать struct'ы или классы и которые будут вызывать неудобные функции с дофига аргументов, а потом пользоваться только этими обертками, постепенно заменяя в коде вызовы старых функций на новые обертки? (не так уж сложно сделать так, чтобы при прямом вызове функции в отладочной версии компилятор выдавал предупреждение о deprecated-style)
  • посмотреть, нафига функциям столько аргментов, декомпозировать их и пользоваться более простыми функциями с меньшим количеством аргументов?
  • ...
roof ★★
()
Ответ на: комментарий от Stahl

Кстати в Objective C (эдакий Си с классами) очень интересно подошли к этой проблеме.


ага, это было реализовано в Смолтоке, называется посылка сообщений )

Boy_from_Jungle ★★★★
()
Ответ на: комментарий от Stahl

Напрягает, в основном, не память, а глаза и чувство прекрасного. Если у тебя последовательно вызывается несколько таких функций, то читаемость кода быстро стремится к нулю. И вообще, я как-то стараюсь всегда писать по принципу «functions should be short and sweet, and do just one thing», а тут такой удар. Мало того, что у них аргументов много, так они и сами ещё по 3 экрана. Ладно, это всё брюзжание. Сначала попробую попробую покидать всё в структуры, если ничего хорошего не получится, буду переписывать. Всем спасибо.

Gvidon ★★★★
() автор топика
Ответ на: комментарий от Begemoth

>>Иногда переписать с нуля - это путь наименьших трудозатрат.

Плюсую. Можно разгребать чужой код много дольше, чем писать свой. Был у меня тоже как-то подобный проект - в итоге плюнул и за месяц переписал нужные куски.

MuZHiK-2 ★★★★
()
Ответ на: комментарий от roof

Написать обертки, в котрые передевать struct'ы или классы и которые будут вызывать неудобные функции с дофига аргументов, а потом пользоваться только этими обертками, постепенно заменяя в коде вызовы старых функций на новые обертки?

+1

Zodd ★★★★★
()
Ответ на: комментарий от Gvidon

>я как-то стараюсь всегда писать по принципу «functions should be short and sweet, and do just one thing»

надеюсь, они у тебя inline? Или любишь, чтобы проц 99% времени занимался сексом со стеком?

nu11 ★★★★★
()
Ответ на: комментарий от nu11

никакой умный компилятор не заменит ... опыт

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

Begemoth ★★★★★
()
Ответ на: комментарий от Gvidon

Просто смирись и потихоньку пили. Участь исходников у некоторых проектов - быть калеками на всю жизнь, ничего не поделаешь. 20 аргументов у функции, это не проблема. Проблема, это когда второй наследник класса Foo, хранящего третьего наследника твоего класса Bar, берёт и в одном из своих методов Spam внезапно вызывает memset(this, 0, sizeof(*this)), таким образом затирая все private поля твоего Bar, и ты об этом даже не догадываешься.

runtime ★★★★
()

В фортране 20 аргументов это обыденность, нередко встречаются функции с 50-100 аргументами.

Reset ★★★★★
()
Ответ на: комментарий от Reset

> В фортране 20 аргументов это обыденность, нередко встречаются функции с 50-100 аргументами.

Читать и понимать это говно за разумное время совершенно невозможно. Эти программы пишутся всякими математиками/физиками для машин, а не для людей. Вот пусть сами и саппортят. Любому рекомендовал бы соглашаться работать с такими сорцами за, минимум, вдвое большую оплату.

fang
()

ты сам выбрал судьбу виндузятника-быдлокодера

Led ★★★☆☆
()
Ответ на: комментарий от nu11

Те, что меньше десятка строк, делаю подставляемыми, конечно. Кстати, есть какие-нибудь правила, когда функцию объявлять inline, а когда нет? Или это чисто на уровне интуиции.

Gvidon ★★★★
() автор топика
Ответ на: комментарий от Gvidon

>Кстати, есть какие-нибудь правила, когда функцию объявлять inline, а когда нет? Или это чисто на уровне интуиции.

школота всегда путает опыт и интуицию? Хотя первое зачастую предполагает и второе

Led ★★★☆☆
()
Ответ на: комментарий от nu11

>надеюсь, они у тебя inline? Или любишь, чтобы проц 99% времени занимался сексом со стеком?

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

legolegs ★★★★★
()
Ответ на: комментарий от legolegs

>Ой-вей, пока весь цивилизованные мир пишет на жабке и скриптах

что-то я эту цивилизацию у себя на десктопе практически не наблюдаю, разве что мелочевка да расширения. Есть одна поделка на пистоне, тормозит заметно.

nu11 ★★★★★
()
Ответ на: комментарий от anonymous

> Сгруппируй аргументы по структурам
ИМХО не вариант. Ну заменится вызов функции на заполнение структуры с последующим вызовом функции, легче от этого не станет.

FollowTheRabbit
()
Ответ на: комментарий от Begemoth

>Иногда переписать с нуля - это путь наименьших трудозатрат.

Когда используется 20 аргументов - это почти всегда единственный разумный выход :)

KRoN73 ★★★★★
()

>Как коллективный разум поступает в таких случаях?

Я обычно в этих случаях делал объект со значениями по умолчанию. И нужные аргументы расставлял сеттерами. Способ годится, в том числе и для переписывания (именно подобный случай и был как-то, хотя там аргументов «всего» с десяток было)

Типа, вместо

super_func(x1,x2,y1,y2,r1,r2,title,type,...)

юзать

obj = new super_object();
obj.set_point1(x1, y1, r1);
obj.set_point2(x2, y2, r2);
obj.set_title(title);
...
obj.super_func();

KRoN73 ★★★★★
()
Ответ на: комментарий от Reset

>В фортране 20 аргументов это обыденность

А ещё там 6 символов на имя той же функции, из которых три уходят на указание типа или библиотеки :)

KRoN73 ★★★★★
()
Ответ на: комментарий от Reset

>нередко встречаются функции с 50-100 аргументами.

Это я надеюсь такая словесная гипербола, с целью подчеркнуть тяжелое положение дел в фортране. Иначе работу на таком предприятии нужно считать вредной и выдавать молоко^Wвазелин.

pathfinder ★★★★
()

>Переписывать всё с нуля лениво, хотелось бы как-нибудь причесать с минимальными трудозатратами.

Отгороди свой код от чужого легким абстрактным слоем. Наверное лучше всего сделать это через классы-обертки в стиле того, что посоветовал KRoN73. Потом начинай по-тихоньку пилить чужой код, от которого ты спрятался за абстрактным слоем. Что надо переделаешь, что не надо... Эх.. Так сойдет.

Правда очень многое зависит от особенностей того наследства, что тебе досталось и от задач которые предстоит решать в будущем.

pathfinder ★★★★
()
Ответ на: комментарий от pathfinder

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

Если нужно активно ковыряться именно в потрохах этого кривого кода, то путь только один - переписывать все с нуля.

pathfinder ★★★★
()
Ответ на: комментарий от Gvidon

Мало того, что у них аргументов много, так они и сами ещё по 3 экрана.

переписать от нуля проще имхо...

erfea ★★★★★
()
Ответ на: комментарий от FollowTheRabbit

> ИМХО не вариант. Ну заменится вызов функции на заполнение структуры с последующим вызовом функции, легче от этого не станет.

Почему? Ну вот, например, в симуляторах физики для игр, так и сделано, что-бы не передавать 20 параметров в конструктор класса заведена специальная структура: класс btRigidBody, а структура btRigidBody::btRigidBodyConstructionInfo.

SSZB
()
Ответ на: комментарий от Stahl

>Кстати в Objective C

Это было в Smalltalk ещё до Objective C

anonymous
()
Ответ на: комментарий от Stahl

> Да, текста больше, но зато всегда легко вспомнить что да как

слава б-гу уже не 80-е и любая нормальная IDE автоматом показывает тултипом все комментарии по параметрам

ahonimous
()
Ответ на: комментарий от nu11

я как-то стараюсь всегда писать по принципу «functions should be short and sweet, and do just one thing»

надеюсь, они у тебя inline? Или любишь, чтобы проц 99% времени занимался сексом со стеком?

Не занимайся ерундой. Это собщение очень хорошо выдает твою некомпетентность.

Waterlaz ★★★★★
()
Ответ на: комментарий от Waterlaz

о да, сейчас мне любитель китайских порномультиков будет аргументировано рассказывать о компетентности, с примерами из практики современной школоты. Пошел за попкорном.

nu11 ★★★★★
()
Ответ на: комментарий от nu11

>о да, сейчас мне любитель китайских порномультиков будет аргументировано рассказывать о компетентности, с примерами из практики современной школоты. Пошел за попкорном.

гы... =)

Ты в своем коде наверняка создаешь столько оверхеда, что пару раз сунуть/высунуть из стека - сущая ерунда.

Ты же берешься «оптимизировать» с совсем левого конца при этом _охрененно_ в ущерб прозрачности и читаемости. Если ты не понимаешь, что это - сущая х**та и явно указывает на тебя, как на горе погромиста, то... можешь еще написать пару штампованых слов в духе «китайских порномультиков» и «школота». Неучем от этого ты быть не перестанешь.

Waterlaz ★★★★★
()
Ответ на: комментарий от Waterlaz

>Ты в своем коде наверняка создаешь столько оверхеда
в Киеве научились выращивать генно-модифицированную школоту, владеющую телепатией? Занятно

Ты же берешься «оптимизировать» с совсем левого конца

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

при этом _охрененно_ в ущерб прозрачности и читаемости.

можно наплодить мильон функций по 10 строк и это не будет читаться вообще никак.

Если ты не понимаешь, что это - сущая х**та

как я предполагал, аргументация вида «сейчас все пишут говнокод, ставящий раком многоядерные трехгигагерцовые числодробилки, так зачем напрягаться и делать что-то лучше»

Неучем от этого ты быть не перестанешь.

о, имею честь говорить с сертифицированным индусокодером? Выкладывай корочки, посмеемся.

nu11 ★★★★★
()
Ответ на: комментарий от nu11

>в Киеве научились выращивать генно-модифицированную школоту, владеющую телепатией? Занятно

детский сад...

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

мдам. Здравый смысл - это такой эвфемизм для «шаблонное мышление» между прочим. И инлайнить все подряд - типичный детский такой шаблон. Только вот тебе и невдамек, что беспорядочный inline может сделать программу медленнее. Внезапно, да?

как я предполагал, аргументация вида «сейчас все пишут говнокод, ставящий раком многоядерные трехгигагерцовые числодробилки, так зачем напрягаться и делать что-то лучше»

Неа. Аргументация вида: «усложнять код ради того, что-бы тот жрал на 0.01% меньше процессорного времени - идиотизм» несколько другого порядка, не?

Неучем от этого ты быть не перестанешь.

о, имею честь говорить с сертифицированным индусокодером? Выкладывай корочки, посмеемся.

Корочки? =) Если ты пишешь ерунду - ты неуч. Внезапно, да?

Waterlaz ★★★★★
()
Ответ на: комментарий от nu11

>Пошел за попкорном.

Нет. Это мы пошли за попкорном.

pathfinder ★★★★
()
Ответ на: комментарий от Waterlaz

>И инлайнить все подряд - типичный детский такой шаблон.
угу, это другая крайность. Вот только я не писал про все подряд. Ежели я как-то непонятно пишу или ты чего недопонял, так не стесняйся, спрашивай.

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

я ж говорю, телепат, не иначе :) Жаль, бракованный вышел

Аргументация вида: «усложнять код ради того, что-бы тот жрал на 0.01% меньше процессорного времени - идиотизм»

опять же, я даже не предлагал дописывать ни строчки кода. Внезапно, да?

Если ты пишешь ерунду - ты неуч. Внезапно, да?

ну а как назвать тебя, если ты написанное даже прочитать не можешь? ;)
Прежде чем доставать клинок и кидаться в бой, советую все же уточнять, против чего собрался воевать. А то выходят вот такие забавные конфузы

nu11 ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.