Ответы пользователя по тегу SOLID
  • Проектирование веб-программы, правильно ли я сделал?

    anton_slim
    @anton_slim
    web разработчик
    В абстрактном классе обязательно должен быть объявлен хотя бы один абстрактный метод и возможно какие то общие методы для всех потомков (любой области видимости public, protected, private). У интерфейса могут быть объявлены только публичные методы.
    Соответственно судя из вашей логики абстрактного класса, вам нужно все методы сделать
    abstract public function без тела и сам класс объявить как abstract class AbstractTasksManager

    Соответственно ваш код примет примерно такой вид:
    <?php
    
    interface TasksManagerInterface 
    {
    	public function find(TaskInterface $task);
    	public function create(TaskInterface $task);
    	public function update(TaskInterface $task);
    	public function delete(TaskInterface $task);
    }
    
    interface TaskInterface 
    {
        public function find(TaskInterface $task);
        public function create(TaskInterface $task);
        public function update(TaskInterface $task);
        public function delete(TaskInterface $task);
    }
    
    
    abstract class AbstractTask implements TaskInterface
    {
        protected function _commonTask() {
            // какой то общий метод для всех потомков AbstractTask
        }
    
        abstract public function find(TaskInterface $task);
    
        abstract public function create(TaskInterface $task);
    
        abstract public function update(TaskInterface $task);
    
        abstract public function delete(TaskInterface $task);
    }
    
    abstract class AbstractTasksManager implements TasksManagerInterface
    {
        protected function _commonTasksManager() {
            // какой то общий код для всех потомков AbstractTasksManager
        }
    
        abstract public function find(TaskInterface $task);
    
        abstract public function create(TaskInterface $task);
    
        abstract public function update(TaskInterface $task);
    
        abstract public function delete(TaskInterface $task);
    }
    
    
    
    class Task extends AbstractTask implements TaskInterface
    {
        public function find(TaskInterface $task)
        {
            /** Внедрить метод find в TasksManager правильно?
             * Или он должен быть в отдельном классе?
             * Метод find использует скоупы Yii2
             */
    
            // можно вызывать
            $this->_commonTask();
        }
    
        public function create(TaskInterface $task)
        {
            /** Содержимое метода */
        }
    
        public function update(TaskInterface $task)
        {
            /** Содержимое метода */
        }
    
        public function delete(TaskInterface $task)
        {
            /** Содержимое метода */
        }
    }
    
    class TasksManager extends AbstractTasksManager implements TasksManagerInterface
    {
        public function find(TaskInterface $task)
        {
            /** Внедрить метод find в TasksManager правильно?
             * Или он должен быть в отдельном классе?
             * Метод find использует скоупы Yii2
             */
    
            // можно вызывать
            $this->_commonTasksManager();
        }
    
        public function create(TaskInterface $task)
        {
            /** Содержимое метода */
        }
    
        public function update(TaskInterface $task)
        {
            /** Содержимое метода */
        }
    
        public function delete(TaskInterface $task)
        {
            /** Содержимое метода */
        }
    }
    $task = new Task();
    $taskManager = new TasksManager();
    Ответ написан
    3 комментария