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

Здравствуйте. Учусь писать гибкие программы в соответствии с MVC, SOLID и т.д.
Мне нужен модуль управления задачами. Скажите пожалуйста, правильно ли я составил классы?
Я сделал унаследование от абстрактных классов и следование интерфейсам, что бы в будущем, если появятся новые вида класса Task или TasksManager, то я мог просто создать очередного наследника например AbstractTasksManager и модифицировать или дополнить функционал скрипта не меняя содержимого других классов.

<?php

class Task extends AbstractTask implements TaskInterface
{
}

class TasksManager extends AbstractTasksManager implements TasksManagerInterface
{

}

class AbstractTasksManager implements asksManagerInterface
{
    public function find(TaskInterface $task)
    {
        /** Внедрить метод find в TasksManager правильно?
         * Или он должен быть в отдельном классе?
         * Метод find использует скоупы Yii2
         */
    }

    public function create(TaskInterface $task)
    {
        /** Содержимое метода */
    }

    public function update(TaskInterface $task)
    {
        /** Содержимое метода */
    }

    public function delete(TaskInterface $task)
    {
        /** Содержимое метода */
    }
}
  • Вопрос задан
  • 2424 просмотра
Решения вопроса 1
Fesor
@Fesor
Full-stack developer (Symfony, Angular)
AbstractTask нужен только для DRY. В вашем случае он пока лишний, чуть что добавите позже. Даже больше, можно пока даже интерфейс отдельно не делать. Если в будущем нам понадобится добавить еще одну реализацию скажем... Task-а или TaskManager-а, выделение инетфейса класса вам сделает любая нормальная IDE. Назовете этот интерфейс TaskManager и будет у вас реализация оного ScheduledTaskManager и DBTaskManager... для примера. А клиентский код такие штуки не затронет вовсе.

Советую вооружиться PhpSpec и таким образом проверять насколько удобно вы спроектировали API ваших сервисов.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
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();
Ответ написан
@PiloTeZ Автор вопроса
...
Или унаследоваться от абстрактного класса лишнее, пока нет потребности в создание других менеджеров и иных методов класса Task?
Нужно ли делать для всех классов интерфейсы, если в будущем есть вероятность его расширения?
Ответ написан
Ваш ответ на вопрос

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

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