共通結合

 このサンプルコードでは、OrderProcessingクラスがOrderInvoiceShippingLabelの3つのクラスに依存しています。
これにより、これらのクラス間に共通の依存が存在し、共通結合が生じています。
この設計では、変更が発生した場合に影響が広がり、保守性が低下する可能性が高いです。

<?php

class Order
{
    private $orderNumber;
    private $totalAmount;

    public function __construct($orderNumber, $totalAmount)
    {
        $this->orderNumber = $orderNumber;
        $this->totalAmount = $totalAmount;
    }

    public function getOrderNumber()
    {
        return $this->orderNumber;
    }

    public function getTotalAmount()
    {
        return $this->totalAmount;
    }
}
                    
<?php

class Invoice
{
    private $order;

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

    public function generateInvoice()
    {
        // 請求書を生成
        $orderNumber = $this->order->getOrderNumber();
        $totalAmount = $this->order->getTotalAmount();

        echo "Invoice for Order #$orderNumber, Amount: $totalAmount";
    }
}
                    
<?php

class ShippingLabel
{
    private $order;

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

    public function generateShippingLabel()
    {
        // 配送ラベルを生成
        $orderNumber = $this->order->getOrderNumber();

        echo "Shipping Label for Order #$orderNumber";
    }
}
                    
<?php

class OrderProcessing
{
    private $order;
    private $invoice;
    private $shippingLabel;

    public function __construct(Order $order)
    {
        $this->order = $order;
        $this->invoice = new Invoice($order);
        $this->shippingLabel = new ShippingLabel($order);
    }

    public function processOrder()
    {
        $this->invoice->generateInvoice();
        $this->shippingLabel->generateShippingLabel();
    }
}
                    
<?php

// メインプログラム
$order = new Order("12345", 100.00);
$orderProcessing = new OrderProcessing($order);
$orderProcessing->processOrder();
                    

共通結合の改善例

 このコードでは、各機能を提供するクラスを導入し、それぞれが明確な責務を持つようにしました。
それにより、共通結合を解消し、各クラスの責務が明確になりました。また、依存関係が注入され、クラス間の結合度が低減しています。

<?php

class Order
{
    private $orderNumber;
    private $totalAmount;

    public function __construct($orderNumber, $totalAmount)
    {
        $this->orderNumber = $orderNumber;
        $this->totalAmount = $totalAmount;
    }

    public function getOrderNumber()
    {
        return $this->orderNumber;
    }

    public function getTotalAmount()
    {
        return $this->totalAmount;
    }
}
                        
<?php

class InvoiceGenerator
{
    public function generateInvoice(Order $order)
    {
        $orderNumber = $order->getOrderNumber();
        $totalAmount = $order->getTotalAmount();

        echo "Invoice for Order #$orderNumber, Amount: $totalAmount";
    }
}
                        
<?php

class ShippingLabelGenerator
{
    public function generateShippingLabel(Order $order)
    {
        $orderNumber = $order->getOrderNumber();

        echo "Shipping Label for Order #$orderNumber";
    }
}
                        
<?php

class OrderProcessing
{
    private $order;
    private $invoiceGenerator;
    private $shippingLabelGenerator;

    public function __construct(Order $order, InvoiceGenerator $invoiceGenerator, ShippingLabelGenerator $shippingLabelGenerator)
    {
        $this->order = $order;
        $this->invoiceGenerator = $invoiceGenerator;
        $this->shippingLabelGenerator = $shippingLabelGenerator;
    }

    public function processOrder()
    {
        $this->invoiceGenerator->generateInvoice($this->order);
        $this->shippingLabelGenerator->generateShippingLabel($this->order);
    }
}
                        
<?php

// メインプログラム
$order = new Order("12345", 100.00);
$invoiceGenerator = new InvoiceGenerator();
$shippingLabelGenerator = new ShippingLabelGenerator();
$orderProcessing = new OrderProcessing($order, $invoiceGenerator, $shippingLabelGenerator);
$orderProcessing->processOrder();