![](/img/trans.png)
[英]what is the inconveniences of using static property or method in OO approach?
[英]Static Method or OO Alternative?
可以說,有一個類似Person的類,該類已經與在Setting類中實現的一些默認設置相關聯。 這些設置可能是“默認標題”或“需要名字”之類的內容。 相應地,其他類(例如Address類)也可能具有一些默認設置。 Setting類將每個設置持久化到持久存儲中。
是否應該在每個類(如“ SetDefaults()”)中實現包含這些設置的靜態方法,以便外部方法可以在每種對象類型上調用SetDefaults()? 例如Person.SetDefaults()然后是Address.SetDefaults()?
還是有一些更好的面向對象的方法來做到這一點?
[更新:這不能在構造函數中,因為應該在特定的時間點而不是每次構造對象時從外部類調用SetDefaults()。
我想不出很多情況下默認值確實在發生……考慮到對象可能經歷的所有不同用例(尤其是反序列化之類的事情,即使不是這樣,最終也可能會設置默認值)意圖)。
IoC是一種選擇。 諸如StructureMap之類的IoC容器具有在初始化后設置屬性的能力,然后可以從調用代碼中對其進行抽象。
另一種選擇可能是某種模板實例(靜態),實例可以從中復制值。 但是我認為這在某些情況下是有風險的。 如果不同的線程(也許是Web服務器上的請求)需要不同的默認值,也會遇到問題。 [ThreadStatic]
不是一個好的選擇(盡管它是一個選擇)。
另一個選擇(提供最大的靈活性)將是提供一個用戶可設置的工廠,可能是通過委托或事件機制進行的,但是我很難弄清為什么您會想要這種情況。 這不是我經常見到的...
重新更新:如果僅由外部類使用; 是否可以使用類似擴展方法的東西(而不是Person
類必須對此有所了解):
public static class PersonExt {
public static void SetDefaults(this Person person) {
// your code
}
}
由於聽起來像原始的Person
類並不關心SetDefaults
,所以這與Person
的邏輯巧妙地分離了。
為什么在創建對象(在構造函數中)時不設置這些默認值。 默認值為-imho-,當沒有為該屬性指定特定值時應將其分配給該屬性,因此,我認為在創建對象時設置這些默認值是一個好主意(在構造函數中,或通過工廠)。
還是我想念什么?
我將它們放在構造函數中。
class Person
{
public Person()
{
this.Settings = MakeDefault();
}
public Person(Settings settings)
{
this.Settings = settings;
}
}
您可以創建一個設置類來封裝所有類(人,地址)的設置。
您可以為“人物”設置默認設置:
// Injected
Settings settings;
Setting personSetting = new ...;
...
settings.StoreSettingsFor(typeof(Person), personSettings);
如果需要,也可以使用單例來存儲此數據,尤其是在從某個位置的存儲中檢索值的情況下,因為這樣可以減少訪問存儲的次數。
(在這種情況下,存儲可以是數據文件,注冊表,數據庫。)
您還可以實現抽象工廠模式,並使用設置來配置工廠。 或者,您也可以使用IoC 將依賴項注入此工廠類中。
Preson的簡單工廠類如下所示:
public class PersonFactory
{
private readonly ISettings settings;
public PersonFactory(ISettings settings)
{
this.settings = settings;
}
public Person Create()
{
Person p = new Person();
// ... you code for populating person's attributes form settings.
return p;
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.