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