2012-06-04 15 views
0

拿這個類,例如:它是不好的做法,只能創建靜態方法,採取該類型的實例

public class Account 
{ 
    public string Code { get; set; } 
    public string Description { get; set; } 
    public DateTime CreatedOn { get; private set; } 

    public void Create() 
    { 
     // Invoke with new Account({...}).Create(); 
    } 

    //Or 

    public static void Create(Account account) 
    { 
     // Invoke with Account.Create(new Account({...})); 
    } 
} 

兩個Create()方法都將做同樣的事情,但你可以看到他們正在調用不同。是另一種更好的做法嗎?有沒有寫這樣的代碼的術語?

+2

它是如何一起工作更復雜的層次結構中的'無效'返回類型?效果如何? – leppie

+0

你的靜態函數只是一個用於調用非靜態函數的包裝? – brianestey

+0

就oops而言,這被稱爲函數重載。如果你想在對象創建上做一些事情,然後使用具有不同參數的構造函數。 –

回答

1

一般來說,我不知道這是好還是壞的做法。然而,我會傾向於在你給出的例子中的'壞習慣'(並且我不能想到將類型的實例傳遞給在該類型上聲明的靜態方法的任何有用的理由)。

當然在你的例子中,你是(IMO)創建一個不清晰的API。我不確定是否;

  • Account.Create是爲了發出一個帳戶數據存儲請求(功能,肯定是在你的對象模型的其他地方所屬)
  • 是某種「方便」的方法使用一些默認創建的帳戶的一個實例一組參數(這可以說是在賬戶的構造更好)
  • 是指作爲一個拷貝構造函數(在這種情況下,它應該是一個構造函數)
  • 是一種廉價實現的AccountFactory的(在這種情況下,你應該做一個工廠!)

另一個考慮因素是測試 - 當單元測試任何調用它們的東西時,靜態方法可能會帶來困難,因爲它們可能不容易模擬或存根。

除此之外,從技術上講,沒有什麼內在的「錯誤」。它以其他方式影響你的設計(例如:不能訪問實例成員,因爲它不是實例)。

所以,我認爲這種方法可能會導致一些混淆,但是,它也可能完全適合您的情況!

2

在這種情況下,我建議您不要使用靜態方法,因爲您應該創建大量帳戶,並且每個帳戶都有自己的不同屬性。但我認爲Create()方法沒有意義,因爲您可以直接使用構造函數來設置帳戶。因此,這裏是我會怎麼做:

螞蟻那麼我會創建另一個類來管理帳戶:

class AccountsManagement 
{ 
     public List<Account> Accounts 
     { 
      get; 
      set; 
     } 

     public AccountsManagement() 
     { 
      Accounts = new List<Account>(); 
     } 

     //... 

     public void Create() 
     { 
      Accounts.Add(new Account(); 
     } 

     public void Create(string Description) 
     { 
      Accounts.Add(new Account(Description); 
     } 

     //Or 

     public void AddAccount(Account account) 
     { 
      Accounts.Add(account); 
     } 

     //Find(), Delete()... 
} 

因此繼續講話是不壞習慣使用靜態方法,但它們只能在適當的時候使用。

1

如果方法的靜態和實例版本都會做同樣的事情,那麼我肯定會使用實例方法版本。原因如下:

  1. 代碼較少寫。你寧願不斷地寫Account.Create(accountObj);或只是accountObj.Create();
  2. 智能感知。當我有一個自定義對象並且我不記得所有的方法時,我經常會幫助我鍵入accountObj.並獲取下拉菜單以查看它使用的方法。如果使用靜態版本,該方法將不會顯示出來,並且可能需要幾秒鐘來記住如何使用/查找方法Account.Create()
  3. 這很有道理。如果您有一種方法可用於自定義對象的單個實例,則它是一種實例方法。

在我看來,在實例上使用靜態版本的唯一原因是您需要保持Create()方法訪問帳戶對象的私有成員。

0

我可以考慮使用靜態方法的唯一原因是您的創建,是你的默認構造函數是私人的,並希望通過ur helper方法來控制實例的創建。
這樣的設計實際上是使用微軟的表達式樹的框架,其中u創建通過日表達類的靜態方法的實例,但是他們也有抽象類的

之間
相關問題