Ні , об'єкт не повинен представляти сутність.
Насправді я б заперечував, що коли ти перестаєш думати про об’єкти як про фізичні сутності, це коли ти нарешті отримуєш переваги, які обіцяє ООП.
Це не найкращий приклад, але дизайн кавоварки - це, мабуть, там, де для мене почало з’являтися світло.
Об’єкти - це повідомлення. Вони про відповідальність. Вони не про автомобілі, користувачів або замовлення.
Я знаю, що ми навчаємо ОО таким чином, але це стає очевидним після декількох спроб, як принципово засмучує з'ясувати, куди йдуть справи, коли ви намагаєтесь робити MVC, MVVM або MVWever. Або ваші моделі стають смішно роздуті, або це роблять ваші контролери. Щодо керованості, то чудово знати, що все, що стосується Транспортних засобів, є у файлі Vehicle.ext, але коли ваша заявка стосується Транспортних засобів, ви неминуче потрапляєте до 3000 рядків спагетті у цьому файлі.
Коли у вас є нове повідомлення для надсилання, у вас є принаймні один новий об’єкт і, можливо, пара з них. Отже, у вашому запитанні щодо набору методів я б заперечував, що ви потенційно говорите про пакет повідомлень. І кожен може бути власним об’єктом, з його власною роботою. І це нормально. Це стане очевидним, коли ви розділите речі, які речі дійсно повинні бути разом. І ви склали їх разом. Але ви не одразу опускаєте кожен метод у неясно підходящий ящик для зручності, якщо хочете насолодитися OO.
Поговоримо про сумки функцій
Об'єкт може бути просто набором методів і все ще бути ОО, але мої "правила" досить суворі.
Колекція повинна нести єдину відповідальність, і ця відповідальність не може бути такою загальною, як "Чи є це моторам". Я можу зробити таку річ, як фасад рівня службового рівня, але я гостро усвідомлюю, що я лінуюсь з причин навігації / виявлення, а не тому, що намагаюся написати код OO.
Усі методи повинні бути на послідовному шарі абстракції. Якщо один метод отримує об'єкти Motor, а інший повертає «Кінські сили», це, ймовірно, занадто далеко.
Об'єкт повинен працювати над тим самим "видом" даних. Цей об’єкт робить двигуни (старт / стоп), цей робить речі з довжиною кривошипа, цей обробляє послідовність запалювання, цей має форму html. Ці дані можуть бути полями на об'єкті, і це може здатися згуртованим.
Я, як правило, будую такі об'єкти, коли я роблю перетворення, композицію або просто не хочу перейматися питаннями змін.
Я вважаю, що зосередженість на об'єктних обов'язках призводить мене до згуртованості. Щоб бути об’єктом, має бути якась згуртованість, але для того, щоб бути об'єктом, не потрібно бути ані поля, ані дуже великої поведінки. Якби я будував систему, яка потребувала цих 5 рухових методів, я б почав з 5 різних об'єктів, які роблять ці речі. Як я виявив спільність, я б або почав об'єднувати речі разом, або використовувати спільні "помічники" об'єкти. Це перетворює мене на відкриті / закриті занепокоєння - як я можу отримати цей функціонал, щоб мені більше ніколи не доводилося змінювати цей конкретний файл, але все-таки використовувати його там, де потрібно?
Об’єкти - це повідомлення
Поля ледь не мають значення для об'єкта - отримання та встановлення регістрів не змінює світ поза програмою. Співпраця з іншими об'єктами виконує роботу. Однак сила ОО полягає в тому, що ми можемо створювати абстракції, тому нам не потрібно думати про всі окремі деталі одразу. Абстракції, які протікають або не мають сенсу, є проблематичними, тому ми глибоко (надто багато, можливо,) думаємо про створення об'єктів, які відповідають нашим ментальним моделям.
Ключове питання: Чому ці два об’єкти потребують розмови один з одним?
Розглядайте об’єкт як орган у людині - він має за замовчуванням мету і змінює поведінку лише тоді, коли отримує певне повідомлення, яке його хвилює.
Уявіть сценарій, коли ви перебуваєте на пішохідному переході, і машина їде швидко. Як об'єкт мозку я виявляю стрессор. Я кажу гіпоталамусу надсилати гормон, що вивільняє кортикотрофін. Гіпофіз отримує це повідомлення і вивільняє кортикотрофний гормон надниркових залоз. Наднирники отримують це повідомлення і створюють адреналін. Коли м'язовий об'єкт отримує повідомлення про адреналін, він стискається. Коли серце отримує те саме повідомлення, воно б’ється швидше. Існує цілий ланцюг гравців, які беруть участь у започаткуванні складної поведінки спринтерської дороги, і саме повідомлення мають значення. Об'єкт мозку знає, як змусити гіпоталамус надсилати сповіщення, але він не знає ланцюжок об'єктів, який врешті змусить поведінку відбутися. Так само серце не має уявлення, звідки береться адреналін,
Тож у цьому ( спрощеному ) прикладі об’єкту надниркової залози потрібно лише знати, як приймати АКТГ та робити адреналін. Для цього йому не потрібні поля, але це все ще здається мені об'єктом.
Тепер, якщо наша програма призначена лише для спринту через вулицю, мені може не знадобитися гіпофіз і наднирники. Або мені потрібен лише предмет гіпофіза, який лише незначну частину того, що ми можемо концептуально розглядати як "модель гіпофіза", мені потрібен. Всі ці концепції існують як концептуальні сутності, але це програмне забезпечення, і ми можемо зробити AdrenalineSender або MuscleContractor чи будь-що інше і не дуже хвилюватися з приводу "незавершеності" нашої моделі.