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