Недостатки использования большого количества параметров - PullRequest
4 голосов
/ 31 января 2011

Я переписываю некоторый код для внесения функциональных изменений, и я застрял в ситуации, когда мне потребуется перегрузить функцию для размещения двух или трех типов параметров (но при этом выполнить почти идентичные операции над ними) ИЛИ использовать одинфункция с большим количеством параметров.Теперь я перехожу к последнему варианту, и я просто хотел узнать конкретные недостатки (если таковые имеются) использования функции с большим количеством параметров (и когда я говорю «много», я имею в виду 15).

Яищу общий ответ, ничего конкретного языка, поэтому я не говорю здесь о языке, но просто для информации, я использую C #.

Спасибо, Риши

Ответы [ 4 ]

6 голосов
/ 31 января 2011

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

// Uhh... what?
run(x, y, max_x, true, false, dx * 2, range_start, range_end, 0.01, true);

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

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

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

1 голос
/ 31 января 2011

Если вы пытаетесь написать свой код «функциональным способом», вы можете найти «Curry» полезным и создать значимые объекты-функторы, которые инициализируются всего парой параметров.Если функция принимает много параметров, их список может (или должен) обычно делиться на значимые куски, и каррирование должно образовывать цепочку функций со значимым намерением.

Таким образом, вместо (пример этого ответа):

run(x, y, max_x, true, false, dx * 2, range_start, range_end, 0.01, true);

вы можете использовать

// initialize functors
run_in_userbox = run(x, y, max_x);
run_with_bounds = run_in_userbox(true, false);
iterate_within_bounds = run_with_bounds(dx * 2, range_start, range_end, 0.01);

result = iterate(true); //computation only starts here

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

1 голос
/ 31 января 2011

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

, если не все аргументы используются не во всех случаях, вы можете:

  • использовать дополнительные параметры (например, c # 4 поддерживает)
  • используйте struct или class для хранения параметров и заполняйте только необходимые свойства
  • рефакторинг вашего кода.Я не знаю, что делает ваш код, но мне кажется, огромное количество параметров
0 голосов
/ 31 января 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...