Оскільки ваше запитання охоплює багато підстав, з великою кількістю припущень, я виокремлю тему вашого питання:
Чому нам потрібно стільки класів моделей дизайну
Ми не. Не існує загальноприйнятого правила, яке говорить про те, що в моделях дизайну повинно бути багато класів.
Існує два ключових посібника для вирішення питання, куди ввести код, і як розрізати завдання на різні одиниці коду:
- Згуртованість: будь-яка одиниця коду (будь то пакет, файл, клас чи метод) повинна належати разом . Тобто, будь-який конкретний метод повинен мати одне завдання, і це добре робити. Будь-який клас повинен відповідати за одну більшу тему (що б там не було). Ми хочемо високої згуртованості.
- З'єднання: будь-які дві одиниці коду повинні залежати якомога менше один від одного - особливо не повинно бути кругових залежностей. Ми хочемо низької муфти.
Чому ці два мають бути важливими?
- Згуртованість: метод, який робить багато речей (наприклад, старомодний скрипт CGI, який робить GUI, логіку, доступ до БД тощо) за один тривалий безлад коду) стає непростим. На момент написання запиту спокусливо просто поставити свій потяг думок у довгий метод. Це працює, це легко представити і таке, і ви можете зробити це з цим. Біда виникає пізніше: через кілька місяців ви можете забути, що робили. Рядок коду вгорі може бути в декількох екранах від рядка внизу; легко забути всі деталі. Будь-яка зміна в будь-якому місці методу може порушити будь-яку кількість поведінки складної речі. Буде досить непросто переробляти або повторно використовувати частини методу. І так далі.
- З'єднання: щоразу, коли ви змінюєте одиницю коду, ви потенційно можете порушити всі інші одиниці, які від цього залежать. У строгих мовах, таких як Java, ви можете отримувати підказки під час компіляції (тобто про параметри, оголошені винятки тощо). Але багато змін не викликають таких (тобто зміни поведінки), а інші, більш динамічні, мови не мають таких можливостей. Чим вище зв'язок, тим жорсткіше він може змінити що-небудь, і ви можете перемолоти до зупинки, де для досягнення певної мети необхідне повне переписування.
Ці два аспекти є базою "драйверів" для будь-якого вибору "куди що робити" в будь-якій мові програмування та будь-якої парадигми (не тільки OO). Далеко не всі їх чітко знають, і потрібен час, часто роки, щоб отримати справді вкорінене, автоматичне відчуття того, як вони впливають на програмне забезпечення.
Очевидно, що ці два поняття нічого не говорять про те, що насправді робити . Деякі люди помиляються на стороні занадто багато, інші на стороні занадто мало. Деякі мови (дивлячись на вас тут, Java), як правило, віддають перевагу багатьом класам через надзвичайно статичну та педантичну природу самої мови (це не є цінним твердженням, але воно є тим, що воно є). Це стає особливо помітним, коли ви порівнюєте його з динамічними та виразнішими мовами, наприклад, Ruby.
Інший аспект полягає в тому, що деякі люди підписуються на спритний підхід лише написання коду, який необхідний зараз , і на рефакторинг значно пізніше, коли це необхідно. У такому стилі розробки ви б не створювали те, interface
коли у вас є лише один клас реалізації. Ви б просто реалізували конкретний клас. Якщо пізніше вам потрібен другий клас, ви б рефактор.
Деякі люди просто так не працюють. Вони створюють інтерфейси (або, загалом, абстрактні базові класи) для всього, що коли-небудь могло б використовуватись більш загально; це швидко призводить до вибуху класу.
Знову ж таки, є аргументи «за» і «проти», і не має значення, якому я чи ви віддаєте перевагу. Ви в своєму житті як розробник програмного забезпечення зіткнетеся з усіма крайнощами - від довгих методів спагетті, через освічених, достатньо великих класів, до неймовірно підірваних схем класів, які значно переосмислені. По мірі того, як ви станете більш досвідченими, ви будете більше переростати в "архітектурні" ролі, і можете почати впливати на це в тому напрямку, в якому ви хочете. Ви дізнаєтесь золоту середину для себе, і все одно виявите, що багато людей не згодні з вами, що б ви не робили.
Отже, зберігання відкритості - це найважливіший біт, тут, і це була б моя основна порада, бачачи, що ви, здається, сильно боліте з цього питання, судячи з решти запитань ...