このサンプルコードでは、OrderProcessingクラスがOrder、Invoice、ShippingLabelの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();