簡體   English   中英

靜態方法還是OO替代方法?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM