逐次的凝集

 SequentialTaskHandlerクラス内にタスクが順次実行され、タスクの依存関係を明確に示しています。
順次的凝集を実行し、タスクが特定の順序で実行される必要がある場合に有用です。

<?php

class SequentialTaskHandler
{
    public function task1()
    {
        // タスク1の処理
    }

    public function task2()
    {
        // タスク2の処理
    }

    public function task3()
    {
        // タスク3の処理
    }
}

// 以下、タスクの順序で実行
$handler = new SequentialTaskHandler();
$handler->task1(); // タスク1を実行
$handler->task2(); // タスク2を実行
$handler->task3(); // タスク3を実行
                    

逐次的凝集の課題

 逐次的凝集は高い凝集度の一つであり、特定のタスクが順番に実行される場合に適しています。
しかし、改善の余地がないわけではありません。
改善のポイントは、処理の依存関係をより明確にすることです。

 逐次的凝集を改善するためには、以下のようなアプローチを考えることができます。

インターフェースの導入
 インターフェースを使用して、各タスクが特定のメソッドを実装することができるようにします。
これにより、タスクの依存関係が明確になり、実装の柔軟性が向上します。
イベント駆動の導入
 イベント駆動アーキテクチャを使用して、タスクの実行をより柔軟に制御できるようにします。
各タスクはイベントを発行し、他のタスクはそれに応答します。
タスクの分離
 タスクの分離: タスクを異なるクラスに分割し、それぞれのクラスが特定の責務を持つようにします。
これにより、処理の再利用性が向上し、タスク間の依存関係が減少します。

 逐次的凝集が高い凝集度を持つ一方で、改善の余地がある場合もあります。
コードの理解、保守性、柔軟性を向上させるために、上記のアプローチを検討することが大切です。

逐次的凝集の改善例

 この改善版では、各タスク(TaskA, TaskB, TaskC)がそれぞれ独立してクラスとして実装されています。
また、これらのタスクを実行するためのSequentialCoordinatorクラスが導入され、各タスクの依存関係を明確にし、柔軟性を向上させています。
タスクの実行はSequentialCoordinatorを介して行われます。

 このような設計を採用することで、凝集度が高く、各タスクが独立性を持ちつつ順次実行されるコードが実現されます。
これにより、コードの理解や保守性が向上し、柔軟性も増します。

<?php

class TaskA
{
    public function execute()
    {
        // タスクAの処理
    }
}
                            
<?php

class TaskB
{
    public function execute()
    {
        // タスクBの処理
    }
}
                            
<?php

class TaskC
{
    public function execute()
    {
        // タスクCの処理
    }
}
                            
<?php

class SequentialCoordinator
{
    private $tasks = [];

    public function addTask($task)
    {
        $this->tasks[] = $task;
    }

    public function executeTasks()
    {
        foreach ($this->tasks as $task) {
            $task->execute();
        }
    }
}
                            
<?php

$coordinator = new SequentialCoordinator();
$coordinator->addTask(new TaskA());
$coordinator->addTask(new TaskB());
$coordinator->addTask(new TaskC());

$coordinator->executeTasks();