query = (new QueryBulder())
.select(...)
.with(...)
.from(...)
.all()
.build();
worker = (AbstractFooFactory factory, Params params) => factory.create(params);
worker(new FooMemoryFactory(), new Params())
UserProvider userProvider = new UserProviderAggregate(
new LoggerUserProviderDecorator(
new CacheUserProviderDecorator(
new UserProvider(...)
new Cache(),
),
new Logger(),
),
new DummyUserProvider()
)
public function loadUsers(): Collection<User> {
return new Collection<User>(...);
}
public function loadUsers(): Collection<User> {
if(cache.has('cache_users_key')) {
return cache.get('cache_users_key');
}
Collection<User> users = new Collection<User>(...)
cache.put('cache_users_key', users)
return users;
}
public function loadUsers(): Collection<User> {
if(...any condition) {
return dbUsers.loadUsers();
}
if(...any condition) {
return dummyUsers.loadUsers();
}
throw new Exception();
}
то как быть с ситуацией, когда в некоторых модулях должны производиться сложные выборки с фильтрами, агрегацией, затрагивающие сущности (entity) других модулей?
при анализе код увидел, что постоянно лазию в бд за одной записью (за одной и той же), чего, конечно же хотелось бы избежать. посоветуйте пожалуйста, как передавать данные между объектами?Есть такой подход как UnitOfWork, в котором складываются объекта из персистенс слоя (слоя хранения), соответственно когда идет повторное обращение — запрос в БД не идет...
использую АR.А вот тут проблема, тк AR модуль — кусок работы БД, а не отделенная от нее штука. То есть она (модель) ходит в хранилище, а не за ней куда-то и кто-то ходите... Ярчайший пример, когда нарушение SRP очень больно сказывается.
создавать отдельный метод getProductList, в котором будет инициализирован класс
class Order
{
private ProductStorageInterface $products;
public function __construct(ProductStorageInterface $products)
{
$this->products = $products;
}
public function refundProduct(Product $product): void
{
// логика возврата товара
// и соответственно изменение состава $this->products
}
}
getProductList()
, это ужасно! Называйте как есть: createProductList()
или loadProductList()
, ну в зависимости от логики.class Observer(ABC):
@abstractmethod
def update(self, subject: Subject) -> None:
"""
Получить обновление от субъекта.
"""
pass
Но что если мне необходимо вывести список всех работников,
class WorkerRepository(object):
def __init__(self, DBSession)
def get_dismissed_count(self, count)
def get_all(self)
Не складывается все пока в единую структуру
Во внешнем сервисе есть авторизация, добавление/изменение n-го количества сущностей (пользователь, заказ и т.д.). Основная задача паттерна, обойтись малой кровью при замене одного внешнего сервиса на другой, когда потребуется ее заменить. Или возможность переключаться между несколькими внешними системами.
// Принимает ваши учетные данные
DeliveryClientInterface::__construct(?string $account = null, ?string $password = null)
// Регистрируем покупателя в сервисе
DeliveryClientInterface::registerCustomer(DeliveryCustomer $customer): int
// Получаем заказы покупателя в сервисе
DeliveryClientInterface::getOrders(int $customerId): DeliveryOrder
// Добавляем заказ покупателю
DeliveryClientInterface::addOrder(int $customerId, DeliveryOrder $order): int
// Оповещение покупателя в сервисе о неком действии, связанной с ним в этом сервисе
DeliveryClientInterface::notifyCustomer(DeliveryEvent $event): bool
// что в конструктор сервиса запихнете, например PochtaClient или PickPointClient,
// с тем и будете работать
class DeliveryService
{
public function __construct(DeliveryClientInterface $deliveryClient, User $user)
}
$userOrders = $this->deliveryService->getOrders($user->getUuid());
Shop::getDeliveryVariants()
;Delivery::getDeliveryVariants()
interface EventInterface
{
public function begin();
}
class ConcreteEvent implements EventInterface
{
public function begin()
{
// ..
}
}
class OtherEvent implements EventInterface
{
public function begin()
{
// ..
}
}
Class MyClass
{
private $event;
public function __construct(SomeClass $obj, AnotherClass $obj2)
{
// инициализация с переданными параметрами
}
public function setEvent(EventInterface $event)
{
$this->event = $event;
}
private function doSomething()
{
// Работаем с нашим event
$someDoing = $this->event->begin();
}
}
$myObj = new MyClass(SomeClass $obj, AnotherClass $obj2);
// Set Event
$myObj->setEvent(new OtherEvent);
// Далее работаем с наши готовым объектом, у которого уже есть нужны Event