Как лучше реализовать код?

Доброго времени суток. Я учусь грамотно использовать ООП для гибкости кода, возможности расширения в будущем. Подскажите пожалуйста:
Мой скрипт на основе шаблонов периодически создаёт задачи с помощью метода Tasks::createTask(). У каждой задачи задачи есть подзадачи. Они могут создаваться как сразу при создании основной задачи, так и постепенно добавляться через некоторое время. В каком месте кода их лучше создавать?

1 Вариант:
Создавать подзадачи в методе создания основных задач
class Subtasks
{
    public function createSubtasks()
    {
        // ...
    }
}

class Tasks
{
    public function createTask($params = array())
    {
        // Код создания основной задачи...
        $newTaskId = '...';
        
        
        // Создание подзадачи
        if ($params['create_subtasks'])
        {
            $Subtasks = new Subtasks;
            $Subtasks->createSubtasks($newTaskId);
        }
        
    }
}


2 Вариант
Создавать подзадачи в контроллере
Например так:
$Tasks = new Tasks;
$Subtasks = new Subtasks;
$Tasks->createTask();
$Subtasks->createSubtasks($Tasks->getNewTaskId());


Второй вариант с одной стороны мне кажется более гибким и меньше связывает Tasks и Subtasks, с другой стороны это не очень удобно и если что-то поменяется, то придётся везде переписывать вызов метода создания подзадач.
Как бы сделали вы? Спасибо
  • Вопрос задан
  • 2764 просмотра
Решения вопроса 2
DmitriyEntelis
@DmitriyEntelis
Думаю за деньги
Если уж ударяться в ООП - я бы сделал отдельный класс который делает эту хитрую логику с подзадачами и вызывал бы его из контроллера.
Ответ написан
Fesor
@Fesor
Full-stack developer (Symfony, Angular)
$taskManager = new TaskManager(); // вынести инстанцирование во вне а еще лучше использовать DI
// таск есть таск, имеет он при себе родителя или нет
// по сути у нас обычное дерево
$parentTask = new Task();
$subTask = new Task($parentTask);
$subSubTask = new Task($subTask);
// вся логика по сохранию тасков инкапсулируется в менеджер тасков
$taskManager->addTask($parentTask);
$taskManager->addTask($subTask);
$taskManager->addTask($subSubTask);


Если используете Doctrine в качестве ORM, то в менеджере вы должны делать только persist записи. flush в идеале должен быть только один (коммит транзакции), и желательно его делать в каком-нибудь так же даже не в контроллере, а сделать глобальный обработчик, мол если у нас не возникло ошибок во время обработки http запроса - делаем flush. Таким образом мы никогда не забудим закоммитить изменения в базу.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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