内容結合

 この例では、OrderProcessingクラスがInventoryMailerLogger クラスに依存しており、これらのクラスが詳細な実装に結びついています。
内容結合が発生しているため、依存しているクラスに影響を与える可能性があり、保守性が低下します。
適切な設計では、依存性の逆転(依存性注入など)を導入して内容結合を緩和することが推奨されます。

<?php

class Inventory
{
    public function decreaseStock($productId, $quantity)
    {
        // 在庫を減らす処理
    }
}
                    
<?php

class Mailer
{
    public function sendOrderConfirmation($order)
    {
        // メール送信処理
    }
}
                    
<?php

class Logger
{
    public function logOrderInfo($order)
    {
        // ログ記録処理
    }
}
                    
<?php
class OrderProcessing
{
    private $inventory; // 商品在庫情報
    private $mailer;    // メール送信クラス
    private $logger;    // ログ記録クラス

    public function __construct()
    {
        $this->inventory = new Inventory();
        $this->mailer = new Mailer();
        $this->logger = new Logger();
    }

    public function processOrder($order)
    {
        // 商品の在庫を減らす処理
        $this->inventory->decreaseStock($order->productId, $order->quantity);

        // メールで注文確認を送信
        $this->mailer->sendOrderConfirmation($order);

        // ログに注文情報を記録
        $this->logger->logOrderInfo($order);
    }
}
                    

内容結合の 改善例

このコードは依存性の注入(*1)を導入しており、内容結合を解消しています。
*1: 依存性の注入についての詳細は後述

<?php

class Inventory
{
    public function decreaseStock($productId, $quantity)
    {
        // 在庫を減らす処理
    }
}
                        
<?php

class Mailer
{
    public function sendOrderConfirmation($order)
    {
        // メール送信処理
    }
}
                        
<?php

class Logger
{
    public function logOrderInfo($order)
    {
        // ログ記録処理
    }
}
                        
<?php
class OrderProcessing
{
    private $inventory; // 商品在庫情報
    private $mailer;    // メール送信クラス
    private $logger;    // ログ記録クラス

    public function __construct($inventory, $mailer, logger)
    {
        $this->inventory = $inventory;
        $this->mailer = $mailer;
        $this->logger = $logger;
    }

    public function processOrder($order)
    {
        // 商品の在庫を減らす処理
        $this->inventory->decreaseStock($order->productId, $order->quantity);

        // メールで注文確認を送信
        $this->mailer->sendOrderConfirmation($order);

        // ログに注文情報を記録
        $this->logger->logOrderInfo($order);
    }
}