У меня есть User
объект. Я хотел бы иметь несколько «типов» этого объекта с разными менеджерами и репозиториями. Все User
лица всех типов будут делиться только UserInterface
. Теперь я ищу хороший способ организовать все. Первое, что пришло мне на ум, чтобы создать что-то вроде этого:PHP: шаблон проектирования для управления типами объектов
interface UserTypeManagerInterface
{
public function addUserType($name, RepositoryInterface $repository, ManagerInterface $manager);
public function hasType($name);
public function getRepository($type);
public function getManager($type);
}
Тогда в тех местах, где я хотел бы управлять несколькими типами User
сразу, я бы впрыснуть это, и в тех местах, где я хотел бы управлять определенным типом пользователя, я мог бы вводить только определенные объекты репозитория и менеджера для его типа.
Кажется, довольно чистый подход, но в то же самое время, когда я хотел бы создать тест для класса с помощью UserTypeManager
мне нужно издеваться UserTypeManager
, то этот макет нужно будет возвращать другие издевается (репозиторий и менеджер).
Это выполнимо, конечно, но это заставило меня подумать, можно ли этого избежать. Единственное, что я могу думать, что позволит избегать выше сложности во время тестирования, было бы что-то вроде этого:
interface UserTypeManagerInterface {
public function addUserType($name, RepositoryInterface $repository, ManagerInterface $manager);
}
/**
* My class managing multiple types of user.
*/
class ManageMultipleTypesOfUsers implements UserTypeManagerInterface {
// ...
}
Так что я бы просто добавить все хранилища и менеджеров всех классов, реализующих UserTypeManagerInterface
интерфейс. Таким образом, объекты будут использовать непосредственно то, что им было дано.
Таким образом, тестирование было бы намного чище, потому что мне нужно было высмеять только одного менеджера и один репозиторий для тестирования класса ManageMultipleTypesOfUsers
, но это очень похоже на чрезмерное проектирование. ;)
Возможно ли какое-либо среднее место здесь?
mo, Мне не нравится идея того, как пользовательский объект должен знать, как хранить себя или иметь менеджера или нет. Но им нужно знать, какой тип они есть. Таким образом, все, что получает экземпляр пользователя, может узнать, какие другие отношения он имеет, посмотрев в классе «тип пользователя»? Другой вариант: вы можете рассмотреть шаблон стратегии для «пользовательского объекта» и ввести объект «пользовательский тип» по мере необходимости (с помощью сеттера)? Это сделало бы тестирование/изменение того, что было очень легко из-за развязки? –