разными валютами USD, EUR, RUB
Допустим нужно добавить новую валюту UAG - как организовать архитектуру таким образом чтобы не прищлось переписывать бизнесс логику?
Сейчас делаю вот так:
public function getWalletType(int $clientId, string $currency): Wallet
{
if ($currency === EURWallet::WALLET_CURRENCY) {
$wallet = new EURWallet($clientId, new \DateTimeImmutable());
} elseif ($currency === USDWallet::WALLET_CURRENCY) {
$wallet = new USDWallet($clientId, new \DateTimeImmutable());
} elseif ($currency === JPYWallet::WALLET_CURRENCY) {
$wallet = new JPYWallet($clientId, new \DateTimeImmutable());
}
if (!isset($wallet)) {
throw new NotCorrectCurrencyTypeException('Not correct currency type');
}
return $wallet;
}
Если добавится новая валюта придется тут еще один блок в IF городить
как лучше сделать? все новые валютные кошельки наследуются от общего родителя Wallet
вообщем нужно не нарушать принцип Open-Closed из Солида
паттер стратегия тебе поможет
пошел пытаться применять стратегию
так у меня уже стратегия по сути реализована в коде
м.б. весь код не видно же
попробую описать более подробно Вот метод который отдает нужный кошелек в зависимости от валюты public function getWalletType(int $clientId, string $currency): Wallet Внури тупо if ($currency === EURWallet::WALLET_CURRENCY) { $wallet = new EURWallet($clientId, new \DateTimeImmutable()); } elseif ... Получается уже стратегия, т.к дальше везде можно работать с кошельком, не важно какая валюта Но мне нужно именно здесь успростить или сделать согласно принципу открытости акртыост добавление новой валюты
Уберите код на пастбин или гист
https://pastebin.com/9t1nRKwF
Обсуждают сегодня