Иногда (редко) кажется, что создание функции, которая принимает приличное количество параметров, является наилучшим маршрутом.
Использование нескольких параметров часто является четким показателем того, что вы нарушаете SRP в этом методе. Метод, которому нужно много параметров, вряд ли будет делать только одно. Исключением может быть математическая функция или метод конфигурации, где действительно необходимо несколько параметров как таковых. Я бы избегал множества параметров, поскольку дьявол избегает святой воды. Чем больше параметров вы используете в методе, тем выше вероятность того, что метод (слишком) сложен; большая сложность означает: сложнее поддерживать, а это менее желательно.
Однако, когда я это делаю, я чувствую, что часто выбираю порядок параметров случайным образом. Я обычно выбираю «по важности», сначала выбираю самый важный параметр.
В принципе вы выбираете наугад . Конечно, вы можете подумать, что параметр A более важен, чем параметр B ; но это может быть не так для пользователей вашего API, которые считают, что B является наиболее важным параметром. Так что, даже если вы были внимательны при выборе заказа - для других это может показаться случайным .
Есть лучший способ сделать это? Существует ли «наилучшая практика» для упорядочения параметров, которая повышает ясность?
Есть несколько выходов:
а) Тривиальный случай: не используйте более одного параметра.
б) Поскольку вы не указали, какой язык вы выбрали, есть вероятность, что вы выбрали язык с именованными параметрами . Это хороший синтаксический сахар, который позволяет вам ослабить значение упорядочения параметров:fn(name:"John Doe", age:36)
Не каждый язык допускает такие тонкости. И что тогда?
c) Вы могли бы использовать Dictionary / Hashmap / Associative Array в качестве параметра: например, Javascript позволил бы следующее: fn({"name":"John Doe", age:36})
что не далеко от (b).
г) Конечно, если вы работаете со статически типизированным языком, таким как Java. вы можете использовать Hashmap , но вы потеряете информацию о типах (например, при работе с HashMap<String, Object>
), когда параметры имеют разные типы (и должны быть преобразованы).
Следующим логическим шагом будет передача Object
(если вы используете Java) с соответствующими свойствами или что-то более легкое, например, структура (если вы пишете, например, C # или C / C ++).
Практическое правило:
1) Лучший вариант - ваш метод вообще не нуждается в параметрах
2) Хороший случай - вашему методу нужен один параметр
3) Допустимый случай - вашему методу нужны два параметра
4) Все остальные случаи должны быть реорганизованы
MessageBox.Show
. Посмотрите на это также.