私は予約クラスを持つドメインモデルで作業しています:
class Reservation
{
public function changeStatus($status) { ... }
}
このchangeStatus()
メソッドは、すべての適切な通知 (電子メールなど) が送信されるコンテキストでのみ呼び出す必要があるため、このメソッドの呼び出しを次のように制限したいと思いますReservationService
。
class ReservationService
{
public function confirmReservation(Reservation $reservation)
{
$reservation->changeStatus(Reservation::STATUS_CONFIRMED);
// commit changes to the db, send notifications, etc.
}
}
私は PHP を使用しているため、パッケージの可視性やフレンド クラスなどの概念はありません。そのため、私のchangeStatus()
メソッドは単にパブリックであるため、アプリケーションのどこからでも呼び出すことができます。
この問題に対して私が見つけた唯一の解決策は、ある種の二重ディスパッチを使用することです:
class Reservation
{
public function changeStatus(ReservationService $service)
{
$status = $service->getReservationStatus($this);
$this->setStatus($status);
}
protected function setStatus($status) { ... }
}
潜在的な欠点は次のとおりです。
- それは設計を少し複雑にします
- それはエンティティにサービスを認識させますが、それが実際に欠点であるかどうかはわかりません
上記のソリューションについて何かコメントはありますか、またはこのchangeStatus()
メソッドへのアクセスを制限するために提案するより良い設計はありますか?