2010-11-15 55 views
1

我有一個名爲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個屬性,活動。問題是Map委託現在可以將實現細節泄漏給最終用戶,因爲他們可以觀察到該方法是TryGetValue方法Dictionary<PropertyInfo,string>,目標將是專用字典。你會認爲這是一種代碼味道?

我可以用匿名方法包裝這個,但是當方法組轉換是可能的時候,我傾向於考慮那種糟糕的形式。

+0

如果最終用戶知道此實現細節,會發生什麼危險或損害? – 2010-11-15 23:17:02

+0

打破封裝不是不好的形式嗎?不道德的用戶可以手動添加屬性到他的字典中,但這是一件無聊的事情。 – 2010-11-15 23:54:38

回答

4

查看Map代表目標和方法的工作量與MapBuilder類本身的反映大致相同;無論哪種方式,調用者都可以發現私人的Dictionary實例。我不擔心MapBuilder這個類。反映私人領域肯定會是一種代碼味道:但這不是你的責任,而是你班級用戶的責任。

+0

不幸的是,因爲它繼承自'Delegate',所以Map暴露了'Method'和'Target'。我認爲'Target'被暴露是不好的,因爲它是一個私人領域。 – 2010-11-16 00:08:21

+0

我的觀點是'MapBuilder'由於它繼承自Object,暴露了'GetType',它具有一個'GetFields'方法,用戶可以使用它來檢查字典。您的擔心可能適用於您編寫的每個.NET類。 – 2010-11-16 13:56:27