#c# #design-patterns #coding-style #clean-architecture #solid
#c# #дизайн-шаблоны #стиль кодирования #чистая архитектура #твердый
Вопрос:
Я интегрирую новый способ оплаты в наш сервисный проект. Я все закодировал. Теперь я хочу, чтобы это было удобно для Твердых принципов. Однако я застрял в том, как преодолеть случай. В нашем сервисе уже есть метод, который называется GetPaymentProfile и возвращает класс с именем PaymentProfile. После интеграции мне пришлось добавить новый PaymentProfile и метод, потому что у этого нового класса есть новое свойство.
Из-за этого я получил два класса и два метода. Каждый шаг кодируется дважды без необходимости. Я просто хочу, чтобы вы посоветовали, как я могу это преодолеть.
ранее существовавший метод класс:
public class PaymentProfile { public String Property1 = ""; public String Property2 = ""; public String Property3 = ""; public String Property4 = ""; } public PaymentProfile GetPaymentProfile(long aTicketType) {..}
класс и метод, полученные после интеграции
public class PayCorePaymentProfile { public String Property1 = ""; public String Property2 = ""; public String Property3 = ""; public String Property4 = ""; public String Property5 = ""; } public PayCorePaymentProfile GetPayCorePaymentProfile(long aTicketType) {..}
Что я думал
Создание базового класса, а затем привязка всех подклассов к этому базовому классу, но я думаю, что это не подходит для данного случая. Потому что я вернул бы этот базовый класс без нового свойства.
Если я помещу все в этот базовый класс, у старой модели будет новое свойство без необходимости.
*извините за грамматические правила и ошибки
Комментарии:
1. Вам также следует подумать о том, как это будет использоваться. Будет ли вызывающий абонент использовать все свойства и, следовательно, должен проверить, какие свойства доступны? Или это просто какой-то непрозрачный фрагмент данных, который используется только где-то еще в платежной системе?
2. Как это
PaymentProfile
потребляется? Вам нужно определиться с общим интерфейсом.
Ответ №1:
Вам нужно сделать PayCorePaymentProfile дочерним элементом PaymentProfile. В этом случае в методе GetPaymentProfile вы сможете вернуть PayCorePaymentProfile.
public class PaymentProfile { public string Property1 = ""; public string Property2 = ""; public string Property3 = ""; public string Property4 = ""; } public class PayCorePaymentProfile : PaymentProfile { public string Property5 = ""; } public PaymentProfile GetPaymentProfile(long aTicketType) { if (usePayCore) return new PayCorePaymentProfile(); // You can return a child of PaymentProfile else return new PaymentProfile(); // Or just return a PaymentProfile }
Я надеюсь, это поможет.
Комментарии:
1. Я действительно благодарю вас за ваши усилия, но если я сделаю это таким образом, я не смогу связаться с Property5, потому что в PaymentProfile нет
2.Вы можете проверить, какой фактический тип был возвращен из GetPaymentProfile, и при необходимости привести его.
var paymentProfile = GetPaymentProfile(someStuff);
if (paymentProfile is PayCorePaymentProfile payCorePaymentProfile)
Console.WriteLine($"GetPaymentProfile returned PayCorePaymentProfile, Property5 = {payCorePaymentProfile.Property5}");