Ваша функция выполняет следующие задачи
- нагрузки
- создать экземпляр трансформатора
- трансформировать загруженные объекты
Загрузку действий можно удалить, введя ее в качестве аргумента.
public List<X> GetXObjects(List<Y> yObjects)
{
var transformer = new Transformer();
return transformer.Transform(yObjects);
}
Тогда создание трансформатора можно вынести и наружу
public List<X> GetXObjects(Trnasformer transformer, List<Y> yObjects)
{
return transformer.Transform(yObjects);
}
Итак, теперь где-то в коде вы называете это так
var yObjects= _crmWrapper.GetActivitiesByOpportunities();
var transformer = new Transformer();
var xObjects = GetXObjects(yObjects, transformer);
Но хиты означают, что везде, где вам нужно загрузить XObjects
, вам нужно знать, как загрузить YObjects
и как создать Transformer
Таким образом, мы можем инкапсулировать это знание/логику в одном классе.
public class XObjectsProvider
{
}
Этот класс должен загрузить YObjects
и преобразовать их в XObject. Фактическая реализация загрузки и создания экземпляра Transform не входит в обязанности этого класса, поэтому мы вводим их как зависимости.
public class XObjectsProvider
{
private Loader _loader;
private Transformer _transformer;
public XObjectsProvider(Loader loader, Transformer transformer)
{
_loader = loader;
_transformer = transformer;
}
public XObjects Get()
{
var yObjects = _loader.GetYObjects();
return transformer.Transform(yObjects);
}
}
Loader
и Transformer
могут быть представлены как абстракции, которые дают вам возможность изменять их без изменения кода XObjectProvider
- следуя "принципу открытия/закрытия". А у XObjectProvider
есть только одна причина для изменения - когда для получения XObjects нужно загрузить/предоставить что-то другое.
person
Fabio
schedule
17.07.2017