Найголовніше, що потрібно пам’ятати, це те, що це настанови, а не правила.
Бувають випадки, коли метод просто повинен взяти аргумент. Подумайте, наприклад, про +
метод числення. Або add
метод для колекції.
Насправді, можна навіть стверджувати, що те, що означає додати два числа, залежить від контексту, наприклад, у ℤ 3 + 3 == 6
, але в ℤ | 5 3 + 3 == 2
, тому дійсно оператор додавання повинен бути методом на контекстному об'єкті, який бере два аргументи замість метод на числах, який бере один аргумент.
Аналогічно, метод порівняння двох об'єктів повинен бути або методом одного об'єкта, що бере інший як аргумент, або методом контексту, який бере два об'єкти як аргументи, тому просто не має сенсу використовувати метод порівняння з менше одного аргументу.
Однак, є кілька речей, які можна зробити, щоб зменшити кількість аргументів для методу:
- Зробіть сам метод меншим : можливо, якщо методу потрібно стільки аргументів, він робить занадто багато?
- Відсутня абстракція : Якщо аргументи тісно співвіднесені, можливо, вони належать разом, і є абстракція, яку ви пропускаєте? (Приклад канонічної книги з текстами: замість двох координат передайте
Point
об’єкт або замість того, щоб ввести ім'я користувача та електронну пошту, передайте IdCard
об’єкт.)
- Стан об'єкта : Якщо аргумент потрібен декількома методами, можливо, він повинен бути частиною стану об'єкта. Якщо для цього потрібні лише деякі з методів, але не інші, можливо, об'єкт робить занадто багато і справді повинні бути два об'єкти.
Один із способів - витягнути аргументи в новий клас, але це, безумовно, призведе до вибуху класів?
Якщо у вашій моделі домену є багато різних речей, то ваш код матиме багато різних об'єктів. У цьому немає нічого поганого.
І ці класи, ймовірно, виявляться іменами, які порушують деякі правила іменування (закінчуючись на "Дані" або "Інформація" тощо)?
Якщо ви не можете знайти власне ім’я, можливо, ви згрупували занадто багато аргументів разом або занадто мало. Отже, у вас є лише фрагмент класу, або ви маєте більше одного класу.
Інша методика полягає в тому, щоб зробити змінні, які використовуються декількома функціями, змінною приватного члена, щоб уникнути їх передачі, але це розширює область змінної, можливо, такою, що вона відкрита для функцій, які насправді її не потребують.
Якщо у вас є група методів, всі з яких працюють на одних і тих же аргументах, і інша група методів, яких немає, можливо, вони належать до різних класів.
Зауважте, як часто я вживав слово "можливо"? Ось чому це правила, а не правила. Можливо, ваш метод з 4 параметрами ідеально чудовий!