Возвратите делегата, который пропускает детали реализации - PullRequest
1 голос
/ 16 ноября 2010

У меня есть класс с именем 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 Ответ

4 голосов
/ 16 ноября 2010

Уровень усилий, связанных с поиском цели и метода вашего делегата Map, примерно равен отражению над полями самого класса MapBuilder;в любом случае, вызывающая сторона может обнаружить частный экземпляр Dictionary.

Я бы не беспокоился об этом с точки зрения класса MapBuilder.Размышление над приватными полями определенно будет запахом кода, но тогда это не ваша ответственность, а ответственность пользователя вашего класса.

...