我正在使用一个域模型,其中我有一个 Reservation 类:
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()
方法的访问吗?