Сколько параметров функции слишком много?

Возможное дублирование:
Сколько параметров слишком много?

Я просто писал функцию, которая принимает несколько значений, и это заставило меня задуматься. Когда количество аргументов функции / метода слишком велико? Когда (если) это свидетельствует о дефектном дизайне? Вы проектируете / реорганизуете функцию, чтобы она принимала структуры, массивы, указатели и т. Д., Чтобы уменьшить количество аргументов? Вы проводите рефакторинг поступающих данных, чтобы уменьшить количество аргументов? Однако кажется, что это могло бы быть немного менее применимо в проектах ООП. Просто любопытно посмотреть, как другие видят проблему.

РЕДАКТИРОВАТЬ: Для справки, функция, которую я только что написал, имеет 5 параметров. Я использую определение нескольких, которое дал мне мой учитель AP Econ. Более 2-х; менее 7.


person Chris Kloberdanz    schedule 25.11.2008    source источник
comment
Мальчик, надеюсь, он сказал меньше семи   -  person Will Dean    schedule 26.11.2008


Ответы (15)


Я не знаю, но я знаю это, когда вижу.

person Community    schedule 25.11.2008
comment
К сожалению, голосов не осталось. Но на этом все. - person Toon Krijthe; 26.11.2008
comment
Значит, параметры функции похожи на порнографию? - person Paul Fisher; 26.11.2008
comment
Хорошо, это интересная смена темы. Это придает совершенно другое значение термину программное обеспечение ... - person Toon Krijthe; 26.11.2008

По словам Стива МакКоннелла в Code Complete, вам следует

Ограничьте количество параметров процедуры примерно семью

person Paul Reiners    schedule 25.11.2008
comment
Семь кажется числом, которое не должно быть превышено ни в каком интерфейсе, параметрах или пунктах меню. - person Jonke; 26.11.2008
comment
Семь - это количество информации, которое можно сохранить в краткосрочной памяти. По крайней мере, мне так сказали, но я забыл подробности. - person Toon Krijthe; 26.11.2008
comment
Вот почему телефонные номера начинались с семи цифр. - person LeopardSkinPillBoxHat; 26.11.2008
comment
можем ли мы получить справку по заявлению о 7-значном номере телефона? - person Tim; 26.11.2008
comment
Конечно, нельзя - это полная чушь. Телефонные номера начинаются с 1 или 2 цифр. - person Will Dean; 26.11.2008
comment
@ Тим: вы не получите этого, потому что это неправда. Первый номер телефона был Привет! Ты слышишь меня? - person MusiGenesis; 26.11.2008
comment
Первый номер телефона был одноэлементным :) - person Uri; 26.11.2008
comment
Хороший точный ответ, хотя я с дядей Бобом и считаю, что 0 - ваша цель, 1 - нормально, 2 - сносно, а за этим - безумие ;-) - person GhostCat; 15.04.2019

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

person Stephane Grenier    schedule 25.11.2008

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

Не то чтобы я сам всегда этому следил;)

person Uri    schedule 25.11.2008

Роберт С. Мартин (дядя Боб) рекомендует максимум 3 в Чистый код: руководство по созданию гибкого программного обеспечения

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

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

person Kenny    schedule 25.11.2008

Быстрый ответ: когда вам нужно остановиться и задать этот вопрос, у вас их слишком много.

Лично мне нравится, когда число меньше шести. Если требуется больше, решение зависит от проблемы. Один из подходов - использовать функции «установщика» для передачи значений объекту, который в конечном итоге выполнит желаемую функцию. Другой вариант - использовать структуру, как вы упомянули. В любом случае, вы не ошибетесь.

person Brian    schedule 25.11.2008
comment
Я считаю, что это также известный как шаблон Command. - person moffdub; 26.11.2008

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

Учитывая широкое распространение Intellisense (или эквивалента в других IDE) и всплывающих подсказок с комментариями из XML-документации в Visual Studio, я не думаю, что есть твердый ответ на этот вопрос.

person scwagner    schedule 25.11.2008

Слишком много параметра - это "Кодовый запах".

Вы можете разделить на несколько методов или использовать класс для перегруппировки переменных, которые имеют что-то общее.

Ставить число для «Слишком много» - это очень субъективно и зависит от вашей организации и языка, который вы используете. Практическое правило состоит в том, что если вы не можете прочитать подпись своего метода и иметь представление о том, что это такое делать, чем у вас может быть слишком много информации. Лично я стараюсь не превышать 5 параметров.

person Patrick Desjardins    schedule 25.11.2008
comment
Есть ли причина, по которой вы предпочитаете использовать класс для группировки переменных? Я думал, что здесь будет разумнее структура. - person RWendi; 26.11.2008
comment
Не во всех языках проводится различие между классами и структурами. - person Jeremy List; 23.04.2014

Для меня это 5.

За этим сложно управлять (запомнить имя, порядок и т. Д.). Плюс, если я зашел так далеко, у меня есть версии со значениями по умолчанию, которые называют это.

person OscarRyz    schedule 25.11.2008

Также зависит от функции, если ваша функция требует серьезного вмешательства пользователя или переменных, я бы не стал выходить за пределы диапазона 7-8. Что касается среднего количества параметров, то, на мой взгляд, наилучшим вариантом является 5-6. Если вы используете больше, чем это, вы можете рассматривать объекты класса как параметры или другие более мелкие функции.

person Ayo    schedule 25.11.2008

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

person moffdub    schedule 25.11.2008

Я тоже слышал эту цифру 7, но мне почему-то кажется, что это происходит из того времени, когда все можно было пройти там, где примитивные значения.

В настоящее время вы можете передать ссылку на объект, который инкапсулирует какое-то сложное состояние (и поведение). Использование 7 из них определенно было бы слишком много.

Моя личная цель - избегать использования более четырех.

person Joachim Sauer    schedule 25.11.2008

Это сильно зависит от типов аргументов. Если все они целые, то 2 может быть слишком много. (как мне запомнить, в каком порядке?) Если какой-либо аргумент принимает значение null, то число резко падает.

Настоящий ответ приходит, если спросить себя:

  • насколько легко понять вызовы, когда я читаю код?
  • насколько легко запомнить правильные аргументы и порядок аргументов при написании кода?
person Darron    schedule 25.11.2008

И это зависит от языка программирования .. В C действительно не редко можно встретить функции с 7 параметрами. Однако в C # я редко встречал больше 5 параметров, а лично я обычно использую меньше 3.

// In C 
 draw_dot(x, y, size, red, green, blue, alpha)

// In C# 
 Point point(x,y);
 Color color(red,green,blue,alpha);

 Tool.DrawDot(point, color);
person user35978    schedule 25.11.2008
comment
Возможно, вы захотите заменить C # на any-OO: p (и да, где-то не хватает нового: p) - person user35978; 26.11.2008

Я бы сказал максимум 4. Я думаю, что все, что указано выше, должно быть помещено в класс.

person Geo    schedule 25.11.2008
comment
что, если это конструктор классов с 20 свойствами? - person Blankman; 26.11.2008
comment
Свойство не принимает параметров ... - person Patrick Desjardins; 26.11.2008