コードを最小化して、表示する必要があるものだけにします。
Customer
、Courier
およびの3 つのクラスがありOrder
ます。
class Customer extends AbstractRegisteredUser implements CustomerInterface {
}
class Courier extends AbstractRegisteredUser implements CourierInterface {
}
class Order extends AbstractEntity implements OrderInterface {
private $customer;
private $courier;
public function isUserAssociated(RegisteredUserInterface $user) {
switch( $user->GetEntityType() ) {
case 'Customer':
return $this->isCustomerAssociated($user);
case 'Courier':
return $this->isCourierAssociated($user);
}
return false;
}
private function isCustomerAssociated(CustomerInterface $customer) {
return ( $this->customer->getId() === $customer->getId() );
}
private function isCourierAssociated(CourierInterface $courier) {
return ( $this->courier->getId() === $courier->getId() );
}
}
ご覧のとおり、そこにはswitchステートメントがありますが、これは望まないので、次のようにすることにしました。
class Customer extends AbstractRegisteredUser implements CustomerInterface {
public function isAssociatedWithOrder(OrderInterface $order) {
return ( $this->getId() === $order->getCustomerId() );
}
}
class Courier extends AbstractRegisteredUser implements CourierInterface {
public function isAssociatedWithOrder(OrderInterface $order) {
return ( $this->getId() === $order->getCourierId() );
}
}
isUserAssociated
クラスから,isCustomerAssociated
およびisCourierAssociated
メソッドOrder
と、そのい switch ステートメントを削除できるようになりました。
顧客が特定の注文に関連付けられているかどうかを確認したいときは、
// $user could be a customer or courier object.
if( !$user->isAssociatedWithOrder($order) ) {
}
それ以外の
if( !$order->isUserAssociated($customer) ) {
}
これは、必要なコードとメソッドが少なく、見やすいソリューションですが、これを行うのは正しいですか? Customer
とCourier
クラスは について知らなくてもよいOrder
ですか? これは、その責任を持つべきではないクラスに責任を与えると見なされますか?
どんな助けでも大歓迎です。