簡體   English   中英

我應該盡可能地讓我的方法保持靜態嗎?

[英]Should I always make my methods static where possible?

我經常思考這個問題......這可能是一個愚蠢的問題但是這里有。

說我有這個班:

public class SomeClass
{
    public int AProperty { get; set; }

    public void SomeMethod()
    {
        DoStuff(AProperty);
    }
}

這樣做有什么好處:

public class SomeClass
{
    public int AProperty { get; set; }

    public static void SomeMethod(int arg)
    {
        DoStuff(arg);
    }
}

唯一明顯的優點是我現在可以直接訪問SomeMethod

因此,如果一點點重構允許或浪費我的時間,將這些方法保持靜態是一種好習慣嗎?

編輯:我忘了提及(和ShellShock的評論提醒我),我問的原因是我使用ReSharper並且總是提出“方法X可以變為靜態”的建議等等......

Static不是邪惡的。 如果使用不正確, Static是邪惡的,就像編程工具包的許多部分一樣。

Static可能非常有利。 正如這里接受的答案所指出的那樣, static可以提高潛在的速度。

作為一般規則,如果該方法不使用該類的任何字段,那么它是評估其功能的好時機,但是最終可以在不實例化對象的情況下調用的實用方法通常是有用的。 例如, DirectoryInformationFileInformation類包含有用的靜態方法。

編輯

感覺有義務指出它確實讓嘲弄變得更加困難但它仍然是可以測試的。

它只是意味着你需要想象的更難哪里 static方法去,讓你隨時可以測試他們,而不需要依賴於一個模擬/存根。 (即:不要將它們放在需要與數據庫持久連接的DTO上)。

不, 靜電是邪惡的 它將調用者與使用的類緊密耦合, 使其難以測試

靜態方法是有意義的,如果你應該能夠在不創建類的對象之前調用它們。 例如,在Java中,Math-Class只包含靜態方法,因為僅僅為了對其他對象進行數學運算來實例化Math-Class沒有多大意義。

大多數情況下,最好避免使用靜態方法。 你應該熟悉面向對象的編程 - 有很多好的資源,解釋所有的概念,如靜態方法等。

我將嘗試回答您涉及您提供的代碼示例的特定問題。

如果SomeMethod只在聲明它的類中有用,我會避免靜態轉換並將其保留為實例方法。

如果SomeMethod在它所在的類之外是有用的,那么將它排除在類之外。 這可能是某個靜態實用程序類中的靜態方法。 要使其可測試,請確保將其所有依賴項作為參數傳遞給它。 如果它有很多依賴項,你可能想要查看設計並確切地弄清楚它應該做什么 - 它可能更好地作為你傳遞給它的一個類中的實例方法。

有人說靜電是邪惡的。 這通常是因為可變靜態提供的陷阱,其中變量從一個靜態構造函數被調用到應用程序域的拆除,在兩者之間發生變化。 依賴於該狀態的代碼可能會出現不可預測的行為,並且測試可能會變得非常可怕。 但是,靜態方法沒有引用可變靜態的問題。

對於(非常簡單)靜態是邪惡的例子,但可以轉換為非邪惡版本,想象一個計算某人年齡的函數:

static TimeSpan CalcAge(DateTime dob) { return DateTime.Now - dob; }

那可以測試嗎? 答案是不。 它依賴於大規模易變的靜態狀態,即DateTime.Now 每次都不能保證相同輸入的輸出相同。 為了使它更適合測試:

static TimeSpan CalcAge(DateTime dob, DateTime now) { return now - dob; }

現在函數所依賴的所有值都被傳入,並且它是完全可測試的。 相同的輸入將為您提供相同的輸出。

我認為這取決於你想要使用這些方法的方式。 如果將靜態方法用作類的幾個實例的常用方法,則可以使用靜態方法。

為了舉例,假設您有一個字符串類和兩個字符串A和B.要比較A和B,您可以使用A.CompareTo(B)方法或String.Compare(A,B)方法。

如果我錯了,請糾正我。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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