プログラミングでの「依存関係」について
依存関係とは、一つのクラスまたはモジュールが他のクラスやモジュールの動作に依存している関係を指します。これをコードで表現する場合、以下のようになります。
class OrderController
{
protected $orderService;
public function __construct(OrderService $orderService)
{
$this->orderService = $orderService;
}
}
この例では、OrderController
がOrderService
に依存しています。
依存関係が逆転による不具合とは?
依存関係が逆転している場合、上位モジュールが下位モジュールに依存すると、一部のロジックの変更が全体への影響を及ぼす可能性があります。
// Product.php
class Product
{
public function applyDiscount($price)
{
// 既存の割引ロジック
}
}
// OrderController.php
class OrderController
{
public function placeOrder(Product $product)
{
$price = $product->applyDiscount($price);
// ...
}
}
この場合、割引ロジックが変更になった場合、それを呼び出す全ての場所で改修が必要になります。
依存関係を逆転方法:ユースケース層を追加
ユースケース層を追加することで、依存関係の逆転を防ぎ、改修の影響範囲を最小限にします。
// DiscountService.php
class DiscountService
{
public function applyDiscount($price)
{
// 新しい割引ロジック
}
}
// OrderUseCase.php
class OrderUseCase
{
protected $discountService;
public function __construct(DiscountService $discountService)
{
$this->discountService = $discountService;
}
public function placeOrder($product)
{
$price = $this->discountService->applyDiscount($product->price);
// ...
}
}
こうすることで、割引ロジックの変更が必要になった場合も、DiscountService
クラスのみの改修で済みます。
まとめ
依存関係の逆転は、システムの柔軟性と保守性を大幅に向上させる重要な設計原則です。特に、ユースケース層を導入することで、具体的なビジネスロジックの変更がその他のコンポーネントに影響を与えないようにすることが可能になります。
コメント