通信的凝集

 このサンプルコードでは、OrderProcessingクラスが注文処理に関連するデータ、通知、バックアップの要素を含み、それらの要素が協力して動作します。
このような共有データや情報の受け渡しは通信的凝集の特徴です。
ただし、通信的凝集は保守性の低下などの問題を引き起こす可能性があるため、避けるべきです。

 一方、特定の状況で委譲(※1)が適切に設計されている場合、そのクラスやモジュールの責務が明確で、コードの保守性が高い場合には許容されることもあります。
重要なのは、凝集度を意識的に設計し、コードが読みやすく、保守性が高く、変更が容易であることです。通信的凝集を採用する場合でも、そのクラスやモジュールが特定のタスクに焦点を当て、他の部分との適切なコミュニケーションを持っていることが重要です。

※1: あるクラスやモジュールが別のクラスやモジュールに一部の責務や機能を委託する仕組み

<?php

class OrderProcessing
{
    private $orderData;
    private $notificationService;
    private $backupService;

    public function __construct($orderData, $notificationService, $backupService)
    {
        $this->orderData = $orderData;
        $this->notificationService = $notificationService;
        $this->backupService = $backupService;
    }

    public function processOrder()
    {
        // 注文処理のロジック

        // データベースへの保存
        $this->orderData->saveToDatabase();

        // 通知サービスを呼び出す
        $this->notificationService->sendOrderConfirmation();

        // バックアップを作成
        $this->backupService->createBackup();
    }
}
                    
<?php

class OrderData
{
    public function saveToDatabase()
    {
        // データベースに注文情報を保存
    }
}
                    
<?php

class NotificationService
{
    public function sendOrderConfirmation()
    {
        // 注文確認メールを送信
    }
}
                    
<?php

class BackupService
{
    public function createBackup()
    {
        // バックアップを作成
    }
}
                    
<?php

// 注文情報、通知サービス、バックアップサービスのインスタンスを作成
$orderData = new OrderData();
$notificationService = new NotificationService();
$backupService = new BackupService();

// 注文処理を実行
$orderProcessor = new OrderProcessing($orderData, $notificationService, $backupService);
$orderProcessor->processOrder();
                    

通信的凝集の改善例

 このサンプルコードでは、注文処理、通知、バックアップの各責務を持つクラスを作成し、通信的凝集を避けています。
各クラスは独自の責務を持ち、協力して動作します。このアプローチはコードの理解や保守性を向上させます。

<?php

class Order
{
    private $orderData;

    public function __construct($orderData)
    {
        $this->orderData = $orderData;
    }

    public function process()
    {
        // 注文処理のロジック
        $this->orderData->saveToDatabase();
    }
}
                        
<?php

class OrderData
{
    public function saveToDatabase()
    {
        // データベースに注文情報を保存
    }
}
                        
<?php

class OrderNotification
{
    private $notificationService;

    public function __construct($notificationService)
    {
        $this->notificationService = $notificationService;
    }

    public function sendConfirmation()
    {
        // 注文確認メールを送信
        $this->notificationService->sendOrderConfirmation();
    }
}
                        
<?php

class NotificationService
{
    public function sendOrderConfirmation()
    {
        // 注文確認メールを送信
    }
}
                        
<?php

class OrderBackup
{
    private $backupService;

    public function __construct($backupService)
    {
        $this->backupService = $backupService;
    }

    public function createBackup()
    {
        // バックアップを作成
        $this->backupService->createBackup();
    }
}
                        
<?php

class BackupService
{
    public function createBackup()
    {
        // バックアップを作成
    }
}
                        
<?php

// 別の場所で注文情報、通知サービス、バックアップサービスのインスタンスを作成
$orderData = new OrderData();
$notificationService = new NotificationService();
$backupService = new BackupService();

// 各処理のためのインスタンスを作成
$order = new Order($orderData);
$orderNotification = new OrderNotification($notificationService);
$orderBackup = new OrderBackup($backupService);

// 注文処理を実行
$order->process();

// 注文確認通知を送信
$orderNotification->sendConfirmation();

// バックアップを作成
$orderBackup->createBackup();