Я унаследовал следующий (ужасный) код, и мне интересно, как лучше его реорганизовать.
В кодовой базе есть большие предложения if / else, одно из которых похоже на приведенное ниже:
public class BaseResultItem
{
public int Property1 { get; set; }
}
public class ResultItem1 : BaseResultItem
{
public int Property2 { get; set; }
}
public class ResultItem2 : BaseResultItem
{
public int Property3 { get; set; }
}
public class BaseHistoryItem
{
public int Property1 { get; set; }
}
public class HistoryItem1 : BaseHistoryItem
{
public int Property2 { get; set; }
}
public class HistoryItem2 : BaseHistoryItem
{
public int Property3 { get; set; }
}
public class HistoryBuilder
{
public BaseHistoryItem BuildHistory(BaseResultItem result)
{
BaseHistoryItem history = new BaseHistoryItem
{
Property1 = result.Property1
};
if (result is ResultItem1)
{
((HistoryItem1)history).Property2 = ((ResultItem1)result).Property2;
}
else if (result is ResultItem2)
{
((HistoryItem2)history).Property3 = ((ResultItem2)result).Property3;
}
return history;
}
}
Обратите внимание, что это упрощенный пример, и в реальном коде задействовано гораздо больше классов. Схожие пункты if / else повсюду.
Я смотрел на абстрактный шаблон фабрики, но у меня возникли некоторые проблемы.
По сути, я предполагаю, что во избежание проблем с if / else мне нужно передать фактические типы dervied. Таким образом, BuildHistory не должен использовать базовые типы и, возможно, должно быть несколько методов, по одному на каждый производный тип?