Общий красный флаг, указывающий на то, что язык ООП не используется должным образом, выглядит следующим образом:
if (typeof(x) == T1)
{
DoSomethingWithT1(x);
}
else if (typeof(x) == T2)
{
DoSomethingWithT2(x);
}
Стандартное "исправление" для таких проблем проектирования состоит в том, чтобы сделать T1
и T2
обеинтерфейс, либо через наследование базового типа, либо через реализацию общего интерфейса (на языках, которые его поддерживают);например, в C # решение может быть следующим:
public interface IT
{
void DoSomething();
}
Однако иногда вы хотите реализовать функциональность, которая отличается в зависимости от типа объекта, но эта функциональность не принадлежит этомутип объекта;таким образом, полиморфизм кажется неправильным путем.
Например, рассмотрим случай пользовательского интерфейса, который обеспечивает представление данного скопления данных.Предположим, что это представление способно отображать различные макеты и элементы управления в зависимости от типа представляемых данных. Как бы вы реализовали этот специфичный для типа рендеринг без набора операторов if
/ else
?
По причинамчто я надеюсь очевидны, в этом случае использование логики рендеринга в самом типе кажется мне очень плохим решением.С другой стороны, не связывая тип объекта данных с его визуальным представлением, мне трудно понять, как избежать сценария if
/ else
.
Вот конкретный пример: я работаю надторговое приложение, которое использует множество различных моделей ценообразования для различных рыночных продуктов.Эти разные модели представлены типами, унаследованными от общей базы PricingModel
;и каждый тип связан с совершенно другим набором параметров.Когда пользователь хочет просмотреть параметры для конкретной модели ценообразования (для конкретного продукта), в настоящее время они отображаются в форме, которая определяет тип модели и отображает соответствующий набор элементов управления.Мой вопрос заключается в том, как это может быть реализовано более элегантно, чем сейчас (с большим блоком if
/ else
).
Я понимаю, что это, вероятно, кажется очень простым вопросом;это лишь один из тех пробелов в моих знаниях (о твердых принципах ООП, шаблонах проектирования, здравом смысле?), которые я решил, что пора исправить.