OO Design - отделение отдельных функций экземпляра от функций класса - PullRequest
1 голос
/ 17 февраля 2009

Учитывая класс, который семантически должен быть объектом определенного типа, но также имеет несколько операций для работы над объектами своего собственного типа, каков наилучший способ (шаблон?) Организации класс в этом типе сценария? Я считаю, что это обычное явление, когда разработчик создает объекты, но думает с процедурным мышлением.

Пример:

Class User {
  private m_userData;
  function User() {}
  function GetUserData() {}

  function KillAllUsers(){}
  function MaimAllUsers(){}
}

Ответы [ 4 ]

4 голосов
/ 17 февраля 2009

Я бы предпочел разделить эти две цели на класс User и UserManager. ИМО это обеспечивает более четкое разделение того, что должны делать классы.

Редактировать: Как правильно заметил Данк, реальное имя в вашем приложении должно быть не UserManager, а как-то более наглядно описывающее его реальную цель. Часто вы найдете шаблон проектирования для функциональности, которую вы собираетесь использовать, поэтому имя класса будет предоставлено этим шаблоном. Это может привести к таким именам, как UserRepository или UserFactory.

4 голосов
/ 17 февраля 2009

Это не очень понятно из вашего описания, но кажется, что методы "KillAllUsers" и "MainAllUsers" работают на множестве пользователей. Я бы порекомендовал создать пользовательскую коллекцию UserCollection, в которой эти методы используются как методы экземпляра, или создать их как статические и передать коллекцию пользователей. В современных терминах модели предметной области вы будете иметь дело с UserRepository.

1 голос
/ 17 февраля 2009

Создайте абстракцию операций, которые вы хотите выполнить над вашими объектами, например, создав интерфейс. Затем вы можете позаботиться о том, как обеспечить реализацию реальной логики.

Обычно при работе с коллекциями объектов, скажем, типа User, будет не сам пользователь, который его реализует, а другой объект, например, UserService. Если абсолютно необходимо, чтобы он был доступен на уровне класса, вы можете определить статический метод, который возвращает тип интерфейса и реализацию по умолчанию.

0 голосов
/ 29 мая 2012
Методы

, такие как killAllUsers () или MaimAllUsers (), только инкапсулируют предполагаемую операцию «что», ее неполную информацию в терминах взаимодействия, в частности, «кто». Вы можете .kill () или .maim () экземпляр пользователя, но должен быть кто-то (JackTheReaper), который намеревается сделать это с пользователем, поэтому kill () и maim () являются взаимодействиями между JackTheReaper и пользователем, Часть намерения, которое выражается «All» в killAllUsers (), является ответственностью класса JackTheReaper за то, как он управляет ссылкой всех пользователей. По сути, здесь трюк заключается в том, чтобы абстрагироваться от функций уровня типа как взаимодействие ч / б сущностей

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...