Когда метод имеет слишком много параметров? [закрытый]

Когда отладка некоторого клиента веб-сервиса кодирует сегодня (в Java, с jax-ws) я натыкался на метод веб-сервиса с волнующей суммой 97 параметров!

Я должен был создать тестовый сценарий, который называет этот метод, и я заметил несколько вещей:

  • код помогает/колеблется, не масштабируется хорошо. Я использую Eclipse, и подсказка по методу так же широка как экран и охватывает несколько строк.
  • Я должен был скопировать значения параметров с предыдущего получения xml, и было практически невозможно помнить, "где я" - когда мне определили местоположение курсора после запятой и прежде, чем ввести некоторое значение, я часто понимал тип данных превратно - я ввел Целое число вместо Строки и наоборот.
  • Даже после того, как я записал все параметры, у меня все еще были некоторые ошибки, и подпись не соответствовала. К сожалению, Eclipse отмечает целую строку красного цвета как наличие ошибки, таким образом, нахождение, где ошибка была, заняло еще больше времени :(

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

39
задан 3 revs, 2 users 100% 18 April 2012 в 13:10
поделиться

9 ответов

Четкого ограничения нет, но мне неудобно иметь более 3-4 параметров. AFAIR дядя Боб Мартин в Clean Code рекомендует не более 3.

Существует несколько рефакторингов для уменьшения количества параметров метода (подробности см. в Эффективная работа с устаревшим кодом, автор Майкл Фезерс). Вот что приходит мне на ум:

  • инкапсулировать множество связанных параметров в один объект (например, вместо String surName, String firstName, String streetAddress, String phoneNumber передать объект Person, содержащий их в качестве полей)
  • передавать параметры в конструкторе или других вызовах метода до вызова этого метода
64
ответ дан 27 November 2019 в 02:06
поделиться

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

34
ответ дан 27 November 2019 в 02:06
поделиться

Великий Будда !! Девяносто семь????

Хорошая практика обычно говорит о макс. от шести до восьми. Конечно, ymmv, и время от времени может быть веская причина для девятого. Но 97 ?? !!

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

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

Если это просто данные, могут ли они быть сгруппированы в структуры и указатели на переданные структуры?

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

Да и «Опасно, Уилл Робинсон» - любой, кто открыто передает 97 параметров, может также передать любое число - не так очевидно - в качестве глобальных переменных.

Ps не знаю, как Eclipse работает на Java, но с C / C ++, если вы поместите параметры в отдельные строки

char DoEverything(
        int meaninglessParameterName1,
        char *meaninglessParameterName2,
        ....
        long double *meaninglessParameterName97)
        { return !NULL;}

Eclipse фактически идентифицирует строку с плохим параметром

8
ответ дан 27 November 2019 в 02:06
поделиться

Что ж, если вы сделаете его объектом JSON, вы можете заключить все 97 (или более) в этот объект и отправить только один объект.

5
ответ дан 27 November 2019 в 02:06
поделиться

Если его более 5-10 параметров, тогда создайте объект, который принимает параметры вместо этого, это может быть типизированный набор данных, структура или что-то еще.

Вместо:

Mywebservice.CreateUser(Firstname, LastName, Age,Sex, Haircolor,AmountOfFingers,AmountOfTeeht,Childrens,,,,,,,,,,,,,and so on)

Сделайте:

Dim MyUser as new UserObject
MyUser.Firstname="Stefan"
...and so on...
MyWebservice.CreateUser(UserObject)
3
ответ дан 27 November 2019 в 02:06
поделиться

Для этого вызовите метод Hibernate Session.createSQLQuery (). Сначала необходимо получить сеанс гибернации, а затем использовать этот сеанс для выполнения SQL. См. эту ссылку , чтобы узнать, как получить сеанс Hibernate из приложения Grails. Затем см. эту ссылку для получения сведений об использовании Hibernate для выполнения SQL.

-121--2943650-

Часть jquery

// initialize counter
var counter = 0;

// set the + functionality
$('#plus').click( function(){$('#display').html( ++counter )} );
// set the - functionality
$('#minus').click( function(){$('#display').html( (counter-1<0)?counter:--counter )} );
// initialize display
$('#display').html( counter );

и html

<span id="plus">+</span>
<span id="minus">-</span>
<div id="display"></div>
-121--4571440-

По моему собственному опыту, сигнатуры методов начинают путаться и их трудно запомнить с более чем 5 или 6 параметрами. И как только вы преодолеваете 10 параметров, это просто смешно.

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

1
ответ дан 27 November 2019 в 02:06
поделиться

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

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

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

0
ответ дан 27 November 2019 в 02:06
поделиться

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

Для всего остального я использую 3 параметра и иногда поднимаюсь до 5.

0
ответ дан 27 November 2019 в 02:06
поделиться

Как Стив МакКоннелл упоминает в Code Complete , золотое правило - 4 +/- 3 параметра. Обычному человеку сложно запомнить более 4 параметров, 5-7 следует использовать только в особых случаях, и никогда не следует использовать 8 или более.

12
ответ дан 27 November 2019 в 02:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: