Является ли запах кода возвращением делегата, который пропускает детали реализации?
У меня есть класс под названием MapBuilder<T>
который внутренне использует Dictionary<PropertyInfo,string>
Класс используется для быстрого построения сопоставления свойств, которые будут проксированы. Класс выглядит так:
public class MapBuilder<T>{
private Dictionary<PropertyInfo, string> m_Map = new Dictionary<PropertyInfo,string>();
public MapBuilder<T> Add<TProperty>(Expression<Func<T, TProperty>> property){
ArgumentValidator.AssertIsNotNull(()=>property);
var propertyInfo = Reflect.Property<T>.InfoOf(property);
m_Map.Add(propertyInfo, propertyInfo.Name);
return this;
}
public MapBuilder<T> Add<TProperty>(Expression<Func<T, TProperty>> property,string columnName){
ArgumentValidator.AssertIsNotNull(() => property);
ArgumentValidator.AssertIsNotNull(() => columnName);
var propertyInfo = Reflect.Property<T>.InfoOf(property);
m_Map.Add(propertyInfo, columnName);
return this;
}
public Map Compile(){
return m_Map.TryGetValue;
}
Таким образом, пользователь будет использовать это так:
var map= new MapBuilder<MyClass>()
.Add(x => x.Name)
.Add(x => x.Id)
.Add(x => x.Active)
.Compile()
Который будет строить карту, которая включает в себя 3 свойства Name,Id,Active. Проблема в том, что Map
Теперь делегат может передать детали реализации конечному пользователю, потому что он может наблюдать, как метод TryGetValue
метод Dictionary<PropertyInfo,string>
и целью будет частный словарь. Считаете ли вы это запахом кода?
Я могу обернуть это анонимным методом, но я склонен считать, что это плохая форма, когда возможно преобразование группы методов.
1 ответ
Уровень усилий, связанных с поиском цели и метода вашего Map
делегат примерно так же, как размышляя над полями MapBuilder
сам класс; в любом случае, вызывающий абонент может обнаружить Dictionary
пример.
Я не стал бы беспокоиться об этом с точки зрения MapBuilder
учебный класс. Размышление над закрытыми полями определенно будет пахнуть кодом: но тогда это не ваша ответственность, а ответственность пользователя вашего класса.