Важно помнить, что это руководящие принципы, а не правила.
Есть случаи, когда метод просто должен принять аргумент. Подумайте, например, о +
методе чисел. Или add
метод для коллекции.
На самом деле, можно даже утверждать, что то, что означает добавление двух чисел, зависит от контекста, например, в ℤ 3 + 3 == 6
, но в ℤ | 5 3 + 3 == 2
, поэтому действительно оператор сложения должен быть методом объекта контекста, который принимает два аргумента вместо метод чисел, который принимает один аргумент.
Аналогично, метод сравнения двух объектов должен быть либо методом одного объекта, принимающего другой в качестве аргумента, либо методом контекста, принимающим два объекта в качестве аргументов, поэтому просто не имеет смысла иметь метод сравнения с менее одного аргумента.
Тем не менее, есть несколько вещей, которые можно сделать, чтобы уменьшить количество аргументов для метода:
- Сделайте сам метод меньше : может быть, если метод нуждается в таком количестве аргументов, он делает слишком много?
- Отсутствующая абстракция : если аргументы тесно взаимосвязаны, возможно, они принадлежат друг другу, и есть абстракция, которую вы упускаете? (Пример канонического учебника: вместо двух координат передайте
Point
объект или вместо имени пользователя и электронной почты передайте IdCard
объект.)
- Состояние объекта : если аргумент нужен нескольким методам, возможно, он должен быть частью состояния объекта. Если это необходимо только некоторым методам, но не другим, возможно, объект делает слишком много и в действительности должен быть двумя объектами.
Одним из способов является извлечение аргументов в новый класс, но это, безусловно, приведет к взрыву классов?
Если в вашей доменной модели много разных видов вещей, то ваш код будет содержать множество разных видов объектов. В этом нет ничего плохого.
И эти классы, скорее всего, будут заканчиваться именами, которые нарушают некоторые правила именования (заканчивающиеся на «Данные» или «Информация» и т. Д.)?
Если вы не можете найти правильное имя, возможно, вы сгруппировали слишком много аргументов или слишком мало. Итак, у вас либо просто фрагмент класса, либо у вас более одного класса.
Другой метод - сделать переменные, используемые несколькими функциями, частной переменной-членом, чтобы избежать их передачи, но это расширяет область действия переменной, возможно, так, что она открыта для функций, которые на самом деле не нуждаются в ней.
Если у вас есть группа методов, все из которых работают с одинаковыми аргументами, и другая группа методов, которые этого не делают, возможно, они принадлежат к разным классам.
Обратите внимание, как часто я использовал слово «возможно»? Вот почему это руководящие принципы, а не правила. Может быть, ваш метод с 4 параметрами отлично подойдет!