2009-09-29 79 views
0
interface IDependency 
{ 
    string Baz { get; set; } 
} 

class Foo 
{ 
    IDependency dependency; 

    public Foo(IDependency dependency) 
    { 
     this.dependency = dependency; 
    } 

    public void FubarBaz() 
    { 
     dependency.Baz = "fubar"; 
    } 
} 

我也可以實現這個爲:不可變對象優於靜態方法的優點是什麼?

class FooStatic 
{ 
    public static void FubarBaz(IDependency dependency) 
    { 
     dependency.Baz = "fubar"; 
    } 
} 

我什麼時候應該選擇在靜態方法不可變對象?有沒有什麼情況可能會出現相反的情況?

而且,在我看來是不可變對象不應該有空洞的方法。你怎麼看?

+2

你的例子有點icky-你有一個班級,只有在生活中的目的是改變一個不同班級的實例。 OOP的一個好處就是它的類可以限制狀態的範圍。 – RossFabricant 2009-09-29 23:55:44

回答

3

不可變對象肯定能有空隙的方法 - 還有其他各種各樣的副作用超出改變對象的狀態。考慮:

public void WriteTo(Stream stream) 

作爲一個例子。

至於你的「不可變對象VS靜態方法」的問題 - 如果你的方法確實需要的Foo狀態的幾個方面是什麼?僅僅因爲國家沒有改變並不意味着把這個國家封閉在一起是沒有意義的。假設它有5個依賴關係而不是1個 - 你是否想寫很多采用5個參數的靜態方法?當你獲得第六個依賴(或甚至只是另一個狀態)時,你真的不得不將第六個參數添加到所有方法中,或者只是添加到構造函數中?

+0

感謝您的回覆;聲明依賴關係對我來說似乎是合理的。在迴應你的第一段時,雖然,WriteTo不會修改流的狀態? – 2009-09-30 00:17:01

+0

@Sam:是的,它修改了流的狀態 - 但不是你調用它的對象的狀態。流是可變的,但對象可能是不可變的...所以它仍然是一個不可變對象的無效方法,而沒有任何意義。 – 2009-09-30 06:49:36

0

FubarBaz()變異的構件Foo.dependency因此Foo並不是一成不變的。不變性是一個設計約束,可以並且應該在C#中通過標記字段readonly來更好地表達。你的依賴關係的連接可以並且應該在構造函數中完成(如果你正在做IoC,大多數框架將需要這個)。一個不可變的設計最終可能是這樣的:

class Foo 
{ 
    private readonly IDependency dependency; 

    public Foo(IDependency dependency) 
    { 
     this.dependency = dependency; 
     dependency.Baz = "fubar"; 
    } 
} 

有一個時間和兩個可變和不可變類設計的地方。也許值經常變化,並且類不共享,那麼可變類就可以工作。不變性具有不變的優點。您可以傳遞對象的引用,並確保它指向的值始終不變。這是一個強大的概念,特別是在處理多線程應用程序時。

使用靜態類的決定應該基於你想如何調用一下,或者如果你確實需要使用靜態創建這樣的擴展方法時,就是這種情況。 IME在實現呼叫之前編寫呼叫是在接線實施之前決定設計的好方法。靜態方法與非靜態方法基本相同,只是靜態方法不能「新建」(由您構建)。靜力學不是不可改變的,特別是因爲你不構造它們。你只需要處理一個實例。

我認爲沒有理由,以避免在一個不變的一流的設計方法返回void類型。

相關問題