Вы хотите использовать рефакторинг, который заменяет условный, используя полиморфный класс. Для пример .
Или вот еще один пример
По сути, идеал очень прост: вы создаете иерархию объектов и перемещаете различные варианты поведения в переопределенный метод. Вам все еще понадобится метод для создания правильного класса, но это можно сделать с помощью фабричного шаблона.
Редактировать
Позвольте мне добавить, что это не идеальное решение в каждом случае. Как (я забыл ваше имя, извините) указал в моих комментариях, иногда это может быть болезненно, особенно если вам нужно создать объектную модель просто для этого. Этот рефакторинг превосходит, если у вас есть это:
function doWork(object x)
{
if (x is a type of Apple)
{
x.Eat();
} else if (x is a type of Orange)
{
x.Peel();
x.Eat();
}
}
Здесь вы можете изменить рефакторинг на новый метод, который будет обрабатывать каждый фрукт.
Редактировать
Как кто-то указал, как создать правильный тип для перехода в doWork, есть больше способов решить эту проблему, чем я мог бы перечислить несколько основных. Первое и самое прямое (и да идет против сути этого вопроса) это переключатель:
class FruitFactory
{
Fruit GetMeMoreFruit(typeOfFruit)
{
switch (typeOfFruit)
...
...
}
}
Хорошая особенность этого подхода в том, что его легко написать, и обычно это первый метод, который я использую. Хотя у вас все еще есть оператор switch, он изолирован для одной области кода и является очень простым, но все, что он возвращает, - это n-объект. Если у вас есть только несколько объектов, и они не меняются, это работает очень хорошо.
Другие более сложные шаблоны, которые вы можете посмотреть, - это Abstract Factory . Вы также можете динамически создавать Fruit, если ваша платформа поддерживает его. Вы также можете использовать что-то вроде Provider Pattern . По сути, для меня это означает, что вы конфигурируете свой объект, и тогда у вас есть фабрика, которая на основе конфигурации и ключа, который вы даете фабрике, динамически создает правильный класс.