Виписання ваших іменників, дієслів, прикметників - чудовий підхід, але я вважаю за краще дизайн класу як запитання, які дані слід приховати ?
Уявіть, у вас був Query
об’єкт і Database
об’єкт:
Query
Об'єкт допоможе створити і зберегти запит - магазин, ключ тут, як функція може допомогти вам створити так само легко. Може бути , ви могли б залишитися: Query().select('Country').from_table('User').where('Country == "Brazil"')
. Не має значення саме синтаксис - це ваша робота! - ключ об’єкта допомагає вам щось приховати , в цьому випадку дані, необхідні для зберігання та виведення запиту. Сила об'єкта походить від синтаксису його використання (в цьому випадку деякі розумні ланцюжки) і не потрібно знати, що він зберігає, щоб змусити його працювати. Якщо зробити все правильно, Query
об’єкт може вивести запити для більш ніж однієї бази даних. Він внутрішньо зберігав би певний формат, але міг легко конвертувати в інші формати при виведенні (Postgres, MySQL, MongoDB).
Тепер давайте продумаємо Database
об’єкт. Що це приховує і зберігає? Ясно, що він не може зберігати повний вміст бази даних, тому що у нас є база даних! Тож який сенс? Мета - приховати, як працює база даних від людей, які використовують Database
об’єкт. Хороші класи спростять міркування під час маніпулювання внутрішнім станом. Для цього Database
об’єкта ви можете приховати, як працюють мережеві дзвінки, або пакетні запити чи оновлення, або забезпечити шар кешування.
Проблема в тому, що цей Database
об’єкт ВЕЛИЧЕЗНИЙ. Він представляє, як отримати доступ до бази даних, тому під обкладинками можна було робити все і все. Зрозуміло, що з мережею, кешуванням та пакетною розробкою досить важко розібратися залежно від вашої системи, тому їх приховання було б дуже корисним. Але, як зауважують багато людей, база даних шалено складна, і чим далі ви отримуєте необроблені дзвінки БД, тим складніше налаштовуватися на продуктивність і розуміти, як все працює.
Це фундаментальний компроміс ООП. Якщо вибрати правильну абстракцію, вона кодування спрощує (String, Array, Dictionary), якщо ви вибрали занадто велику абстракцію (База даних, EmailManager, NetworkingManager), вона може стати занадто складною, щоб зрозуміти, як вона працює, або що робити очікувати. Мета - приховати складність , але певна складність необхідна. Добре правило - почати уникати Manager
об'єктів, а натомість створювати схожі класи structs
- все, що вони роблять, - це зберігати дані, за допомогою деяких допоміжних методів створювати / маніпулювати даними, щоб полегшити ваше життя. Наприклад, у випадку EmailManager
запуску з функцією, яка називається, sendEmail
яка бере Email
об'єкт. Це проста відправна точка, і код дуже легко зрозуміти.
Що стосується вашого прикладу, подумайте, які дані повинні бути разом, щоб обчислити те, що ви шукаєте. Якщо ви хочете дізнатися, як далеко ходить тварина, наприклад, ви могли б провести AnimalStep
і AnimalTrip
(колекція AnimalSteps) занять. Тепер, коли кожна поїздка має всі дані про крок, то, мабуть, AnimalTrip.calculateDistance()
має сенс розібратися в цьому .