Подтвердить что ты не робот

Сколько параметров в методе С# приемлемо?

Я новичок в С# и должен поддерживать приложение С#. Теперь я нашел метод, который имеет 32 параметра (не сгенерированный автоматически код).

Из C/С++ я помню эмпирическое правило "4 параметра". Это может быть старомодное правило, возвращающее старые компиляторы 0x86, где 4 параметра могут быть размещены в регистрах (быстро) или в стеке в противном случае.

Меня не интересует производительность, но у меня есть ощущение, что 32 параметра для каждой функции не просто поддерживать даже на С#.

Или я полностью не обновляюсь?

Что такое правило для С#?

Спасибо за любой намек!

4b9b3361

Ответ 1

Нет общего согласия, и это зависит от того, кого вы спросите.

В целом - момент читаемости страдает, их слишком много...

Боб Мартин говорит, что идеальное число параметров равно 0 и что 3 растягивает его.

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

От Очистить кодовый дескриптор недели № 10:

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

Ответ 2

Параметры Hmmm 32 слишком велики. Существует так много правил, как я думаю. Однако здравый смысл диктует, что более 6 становится громоздким.

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

Ответ 3

Я считаю, что общее чувство сообщества разработчиков составляет максимум 5 или 6 параметров. Время, когда я видел такие методы, как ваш, это кто-то, что делает что-то вроде "SaveCustomer" и передает каждое поле вместо передачи объекта клиента.

Ответ 4

С# не ограничивает максимальное количество параметров, AFAIK.
Но IL делает: 0x1FFFFFFF.

Конечно, этот пост не является руководством по написанию методов с огромным количеством параметров.

Ответ 5

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

Общее соглашение по этому вопросу

  • используйте меньше, чем pssible
  • используйте перегруженные функции, чтобы отрезать параметры между различными функциями

    func A(a,b)
    {
        A(a,b,c);
    }
    
  • может использовать ключевое слово params для передачи произвольной информации в массиве, например object[]

  • может использовать Key-value магазины, где вы можете хранить много информации и восстанавливать ее

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

Надеюсь, что это поможет.

Ответ 6

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

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

Ответ 7

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

Один из вариантов состоит в том, чтобы посмотреть строитель patter, который, по крайней мере, сделает задачу более читаемой.

Ответ 8

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

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

Ответ 9

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

Посмотрите на .NET Framework, вы увидите часто это:

  • Класс с методами, которые почти имеют меньшие или отсутствующие параметры, но использует несколько свойств для управления поведением класса (вместо 30 параметров).

  • Класс с огромным набором методов с меньшими или отсутствующими параметрами и почти без свойств. например BinaryReader.

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

Ответ 10

Валентин, у вас есть правильное чувство, 32 параметра означают только одно - что-то происходит совершенно неправильно. Из моего прошлого опыта в С++ я увидел только одного лидера "параметров":
Это Win32 APi CreateWindow с 11 параметрами.
Вы никогда не должны использовать такое огромное количество параметров.

С другой стороны, если вы интересуетесь вопросом с теоретической точки (возможно, ее можно задать на собеседовании) - Сколько параметров допустимо для метода?
Итак, здесь, как упоминалось выше, метод С# может иметь не более 0x1FFFFFFF-параметров (ограничение IL).
Вы можете использовать массив params [], чтобы настроить такое огромное количество.

И почему именно такой предел?
Потому что, если вы преобразуете это значение в байты и несколько по ссылочному размеру (4 байта), вы получите ровно 2 ГБ.
Ограничение по 2 ГБ для всех объектов в .NET и вам никогда не разрешено создавать один объект, который превышает 2 ГБ.

Ответ 11

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

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