0

コードを最小化して、表示する必要があるものだけにします。

CustomerCourierおよびの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) ) {
}

これは、必要なコードとメソッドが少なく、見やすいソリューションですが、これを行うのは正しいですか? CustomerCourierクラスは について知らなくてもよいOrderですか? これは、その責任を持つべきではないクラスに責任を与えると見なされますか?

どんな助けでも大歓迎です。

4

1 に答える 1