@tukreb

Архитектурная проблема, как лучше управлять доступностью публичных методов для классов?

Добрый день.

Есть одна проблема, первый раз я столкнулся с ней здесь Как отключить наследование в Doctrine? которая плавно перетекла в эту Насколько вредно джойнить таблицы где отсутствует информация?
В итоге от наследования пришлось отказаться, но теперь вопрос как редактировать свойства "родительского класса", но при этом запретив напрямую обращаться к этим методам класса (то есть аналог protected).

Я пришёл к такому решению.

Создать в классах "детях" приватное свойство $accessibleToParent и расширить эти классы абстрактным классом с одним методом:
<?php
declare(strict_types=1);
namespace App\Model\;

abstract class AccessibleToParent
{
    abstract public function isAccessibleToParent(): bool;
}


Теперь, перед тем как вызвать родительские методы в них передаётся класс AccessibleToParent и внутри метода проверяется, выставлен ли флаг на переменную $accessibleToParent:
public function edit(AccessibleToParent $accessibleToParent, string $name, string $notes, int $blabla): void
    {
        if(!$accessibleToParent->isAccessibleToParent ()){
            throw new \DomainException('You can not do that.');
        }
        $this->name = $name;
        $this->notes = $notes;
        //code
    }


Выглядит это прямо так дурно пахнущем :).
Вообще какие есть в данной ситуации решения? Я с радостью вернулся бы к наследованиям, но доктрина в своём нынешнем виде не даёт такой возможности, либо я не нашёл решения, которые удовлетворило бы меня.
  • Вопрос задан
  • 74 просмотра
Решения вопроса 1
SilenceOfWinter
@SilenceOfWinter
та еще зажигалка...
Вариантов масса, самые простые:
1. детали реализации не ясны, но возможен класс реализующий шаблон Factory для создания моделей, в фабрику передается объект AccessibleToParent, который в свою очередь передается в модель при её создании
по поводу проблем с наследованием:
2. шаблон Decorator: под капотом объект Parent
3. шаблон Composite: под капотом несколько объектов, пользователь работает с ними как с едиными Composite объектом
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы