Яка межа обмеження кількості методів класу?


22

У різних книгах з дизайну, які я читаю, іноді великий акцент робиться на кількості методів, якими повинен володіти клас (враховуючи мову OO, наприклад, java або C #). Часто приклади, які повідомляються в цих книгах, дуже акуратні та прості, але рідко вони охоплюють "серйозний" чи складний випадок.
Однак, здається, діапазон знаходиться між 5 і 8.

У проекті я розробив клас "Примітка" з його attribuse як властивості: Title, Desctiption
, CreateDate і т.д.

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

Я знаю, що чим менше методів у класу, тим воно вразливіше. Це дійсно гарна перевага з точки зору модульності та повторного використання, а також легше редагувати.
До речі, якщо в нашому контексті немає необхідності (або навіть сенсу) створювати підкласи і всі необхідні функції пов'язані з цим класом, скільки методів ми можемо додатково приєднати?

Я погоджуюся, що, маючи більше 15 методів, можливо, може знадобитися трохи переробити дизайн.
Але навіть у тому випадку, якщо вилучення деяких методів чи спадкування не є варіантом, який би був правильний спосіб?


3
Люди, здається, мають вбудований діапазон забуття. Як тільки ти пройдеш через сім варіантів, перші кілька починають забуватися. Тому не давайте людям більше 7 варіантів на інтерфейс.
Мартін Йорк

+ 1 @ Martin- 7 + or- 2
Morgan Herlocker

Це обмеження стосується лише короткочасної пам'яті. Інакше, як ми могли згадати всі ті різні букви та слова? Якщо серйозно, якщо клас буде активно використовуватися, ви можете вважати це міні-мовою і мати стільки методів, скільки вам потрібно, щоб висловити все, що ви маєте з цим.
Артем


Відповіді:


30

Майте стільки методів, скільки вам потрібно. Я б спробував зменшити кількість публічних методів, щоб це правило було 5-8, якщо це можливо. Чесно кажучи, у більшості людей є протилежна проблема, коли у них є шалені супер-методи, які потрібно розбити більше, а не менше. Це насправді не має значення, скільки у вас є приватних помічників. Насправді, якщо ви залишилися нижче 8 методів у Java, ви можете досягти ліміту класом, у якому були лише конструктор, toString та getter / setter для 3 властивостей ... що не є абсолютно надійним класом. Суть полягає в тому, що не переживайте про те, скільки методів у вашому класі. Турбуйтеся про те, щоб ваш клас не брав на себе непов’язані проблеми, і що у вас є розумний публічний інтерфейс, який має легкі для розуміння методи.


Правильно, але якщо це корисний клас, до 10–15 - це добре.
Сід

1
@SidCool - я не кажу, що я не використовую їх ніколи, але корисні класи насправді не найкраща практика для початку. Вони, як правило, лише міні-клас богів, який поєднує купу непов'язаних проблем. Зважаючи на це, клас корисності насправді взагалі не повинен існувати, тим більше 15 методів.
Morgan Herlocker

1
Мій клас "Примітка" не є корисним класом. Він представляє бізнес-об’єкт (примітка, яка може додавати коментарі та опис до документа). Однак я погоджуюся з залізами про небезпеку "корисних" класів. Вони приходять на допомогу, коли ми поспішаємо з нашими термінами доставки, але я думаю, що для них часто є краще рішення / дизайн.
Франческо

13

Відповідь насправді проста: поставте все до класу, що належить до його обов'язків, але будьте обережні при розподілі обов'язків.

Іноді великий клас - це склад менших класів з різними обов'язками.

Взагалі, я намагаюся розділити обов'язки на менші класи, коли клас стає невибагливим у використанні чи обслуговуванні. У мене рідко є заняття, довші 500 рядків. У моїх найбільших класах приблизно 1,5 тисячі локусів.

Ви просто не можете вказати загальне правило, наприклад, "клас повинен мати між n та m методами".


8

Немає жодних підстав (в дизайні ОО), щоб існувати лише стільки методів. Також не вірно, що клас з меншими методами краще відокремлювати.

Подивіться, наприклад, клас java.lang.String. Багато методів, тому що існує так багато речей, які можна зробити за допомогою рядка. Тим не менш, не сильно з'єднані.

Цікаво, чому магічне число, як 15, може розділити хороший і поганий дизайн. Ні, це не так просто.


Я погоджуюсь, число 15 було лише наближенням, отриманим від читання книг, що проектують (як "Кодекс завершений" Стівена МакКоннелла, наприклад). Дійсно клас String має безліч методів, і всі вони передаються одній сутності.
Франческо

@Luca: Проблема деяких книг полягає в тому, що приклади часто надумані і тому менші, ніж у багатьох реальних прикладах.
FrustratedWithFormsDesigner

Точно ... напевно, щоб зробити концепцію більш зрозумілою для більшості та також розширити потенційну основу покупців ...
Франческо

Я хочу бачити будь-який тип DataGrid або навіть управління користувальницьким інтерфейсом лише з 15 методів. Якщо ви розділили ці класи на більш дрібні, інтерфейс став кошмаром.
Сокіл

6

У PMD поведінка за замовчуванням правила TooManyMethods полягає у визначенні та позначенні класів з 10 або більше методів як потенційних помилок. Це лише довільне число. Це легко змінюється в конфігурації. Незалежно від того, що це число, розробник - це лише прапор, щоб подивитися на клас і побачити, чи є проблема, а не те, що з цим є проблема.

Щось дещо конкретніше може бути правилом 7 плюс / мінус 2 . Це говорить про те, що людський розум може зберігати і осягати між 5 і 9 "предметами" в пам'яті. Читаючи певний клас, об'єктами, швидше за все, будуть методи та поля, що складають цей клас. Тим НЕ менше, класи часто мають більше 9 полів і методів, навіть якщо не брати до уваги аксессор, мутаторов і будь-які стандартні операції (наприклад, toString(), hashCode(), і equals()в Java).

Найбільш релевантними заходами були б приєднання та роздуття та обговорення зв'язку та згуртованості . Єдиний принцип відповідальності і поділ завдань слід застосовувати - клас повинен робити або представляти одне і тільки одне. Це набагато краще, ніж намагатися призначити числа максимальній / мінімальній кількості методів при оцінці дизайну чи реалізації.


+1 - правило 7 + -2 - це правило жити там, де йдеться про зручність використання.
Морган Херлокер
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.