2008-11-25 30 views
7

Можно создать дубликат:
How many parameters are too many?Сколько параметров функции слишком много?

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

EDIT: Для справки функция, которую я только что написал, взяла по 5 параметрам. Я использую определение нескольких, которое дал мне учитель AP Econ. Более 2; менее 7.

+0

Мальчик я надеюсь, что он сказал «меньше, чем 7» –

ответ

-1

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

+0

, что если для конструктора классов, который имеет 20 свойств? – Blankman

+0

Свойство не принимает параметры ... –

15

По Макконнеллам в полного кода, вы должны

Предельное количество параметров рутины, чтобы примерно семь

+0

Большой поклонник этой книги – Uri

+0

Семь кажется числом, которое не должно быть превышено ни в каком интерфейсе, параметрах или в меню. – Jonke

+0

Семь - это объем информации, который может храниться в краткосрочной памяти.По крайней мере, это то, что мне сказали, но я забыл детали. –

16

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

+0

Извините, ни одного раза не осталось. Но это все. –

+1

Так параметры функции, как порнография? –

+0

Хорошо, это интересная смена темы. Это дает совершенно другой смысл термина программного обеспечения ... –

1

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

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

+0

Я считаю, это А.К.А. шаблон Command. – moffdub

1

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

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

1

Слишком большой параметр - «Запах кода».

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

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

+1

Любая причина, по которой вы предпочитаете использовать класс для групповых переменных? Я думал, что структура будет более разумной здесь. – RWendi

+0

Не все языки делают различие между классами и структурами. –

4

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

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

0

Для меня 5.

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

0

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

0

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

7

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

0

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

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

Моя личная цель состоит в том, чтобы избежать использования более чем 4.

0

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

Реальный ответ приходит от спрашивать себя:

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

Роберт C. Мартин (Дядя Боб) рекомендует 3 как максимум в Clean Code: A Handbook of Agile Software Craftsmanship

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

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

0

И это зависит от языка программирования .. В 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); 
+0

Возможно, вы захотите заменить C# на любое -OO: p (и да, там должно быть что-то новое отсутствует: p) – user35978

Смежные вопросы