我有一個名爲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>
,目標將是專用字典。你會認爲這是一種代碼味道?
我可以用匿名方法包裝這個,但是當方法組轉換是可能的時候,我傾向於考慮那種糟糕的形式。
如果最終用戶知道此實現細節,會發生什麼危險或損害? – 2010-11-15 23:17:02
打破封裝不是不好的形式嗎?不道德的用戶可以手動添加屬性到他的字典中,但這是一件無聊的事情。 – 2010-11-15 23:54:38