Некоторые конкретные вопросы об объектно-ориентированном и MVC-дизайне - PullRequest
2 голосов
/ 29 марта 2010

У меня есть два объекта: Пользователи и Почта. Пользователи создают объекты Mail и отправляют их другим пользователям.

  1. Если бы я хотел получить всю почту для пользователя, я мог бы создать метод, подобный GetMail (), который бы возвращал массив объектов Mail, принадлежащих этому пользователю.
  2. Но если бы я хотел получить всю почту через систему, какой "тип" объекта был бы ответственен за это?
  3. Чтобы решить эту проблему, я обычно создаю Manager, который является объектом, отвечающим за работу с коллекцией объектов определенного типа. MailManager имеет дело с коллекциями объектов Mail. GetMailForUser () - это один метод, GetAllMail () - это другой метод. Объект User вызывает MailManager и выполняет GetMailForUser (me). Это глупо?
  4. Когда пользователь выполняет контроллер CreateMail, создается новый экземпляр объекта Mail. Объект Почта, видя, что он создает новую Почту типа «отправлено», решает продолжить и создать второй объект Почты для получателя, типа «получено». Создание одного объекта Mail инициирует создание второго объекта Mail. Это глупо? Должен ли контроллер создать оба объекта Mail или только первый «отправленный»?
  5. Когда два Пользователя являются друзьями, связь сохраняется в таблице Отношений. Я использую простой объект для отношений. У RelationshipManager есть метод GetFriendsForUser (). У объекта User есть метод GetFriends (), который вызывает RelationshipManager. Это глупо?

1 Ответ

1 голос
/ 06 апреля 2010
  1. ИМХО, согласно ООП, getAllMail - это сообщение, которое может быть целесообразно поместить в класс Mail как статический метод. В языках, где коллекции не являются гражданами первого класса, классы, как правило, используются как набор объектов с одинаковым поведением, состоянием или идентичностью. Поэтому, естественно, чтобы получить набор объектов некоторого класса, вы должны запросить этот набор для него.
  2. Определенно, это не глупо, это всегда зависит от контекста. Вы должны спросить себя, нужен ли вам отдельный одноэлементный класс для управления объектами. Будете ли вы использовать этот объект отдельно от класса Mail? Вы хотите наследовать от него или использовать какой-то другой механизм oo?
  3. Хм, это дизайн, который я не могу понять, не могли бы вы сказать, какие преимущества он вам дает? Я не знаю точно, каков ваш контекст, но я бы, вероятно, просто имел объекты Mail с двумя ассоциациями пользователей, один для отправителя, а другой для получателя. Это сэкономит половину объектов и облегчит навигацию по графу объектов от одного пользователя по почте другому пользователю.
  4. Опять же, зависит от вашего контекста и преимуществ, которые вы получаете от разделения.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...