返回泄漏实现细节的委托

时间:2010-11-15 23:10:44

标签: c# design-patterns delegates

我有一个名为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()

这将构建一个封装Name,Id,Active的3个属性的映射。问题是Map委托现在可以将实现细节泄露给最终用户,因为他们可以将方法视为TryGetValue的{​​{1}}方法,目标将是私有字典。你会认为这是代码味道吗?

我可以用匿名方法包装它,但是当可能进行方法组转换时,我倾向于认为这种形式不好。

1 个答案:

答案 0 :(得分:4)

查看Map委托的目标和方法所涉及的工作量与反映MapBuilder类本身的字段大致相同;无论哪种方式,调用者都可以发现私有Dictionary实例。

MapBuilder课程的角度来看,我不担心。反映私人领域绝对是代码气味:但那不是你的责任,而是你班级用户的责任。