簡體   English   中英

有什么理由不使用`new object()。foo()`?

[英]Any reason not to use `new object().foo()`?

當使用極短壽命的對象時,我只需要調用一個方法,我傾向於將方法調用直接鏈接到new 一個非常常見的例子如下:

string noNewlines = new Regex("\\n+").Replace(" ", oldString);

這里的要點是,在我完成一次更換后,我不需要Regex對象,我希望能夠將其表達為單行。 這個成語有什么不明顯的問題嗎? 我的一些同事對此表示不滿,但沒有任何看起來像是一個很好的理由。

(我把它標記為C#和Java,因為上面的習語很常用,並且可以在兩種語言中使用。)

這個特殊模式很好 - 我偶爾會自己使用它。

但我不會像你的例子中那樣使用這種模式。 有兩種更好的替代方法。

更好的方法:使用靜態方法Regex.Replace(string,string,string) 當靜態方法可用於執行相同操作時,沒有理由使用new語法來模糊您的含義。

最佳方法:如果從同一方法使用相同的靜態(非動態生成)Regex,並且您經常調用此方法,則應將Regex對象存儲為包含該方法的類的私有靜態字段,因為這樣可以避免在每次調用方法時解析表達式。

我沒有看到任何錯誤; 我自己經常這樣做。

規則的唯一例外可能是出於調試目的,有時需要能夠在調試器中查看對象的狀態,這在單行中很難這樣。

如果你以后不需要這個對象,我沒有看到問題 - 我也不時自己做。 然而,它很難被發現,所以如果你的同事表達不適,你可能需要把它變成一個變量,所以團隊沒有任何難過的感覺。 真的沒有傷害你。

當你鏈接實現IDisposable的對象的方法時,你必須要小心。 做一個單行鏈並沒有真正留下調用Dispose或using {...}塊的空間。

例如:

DialogResult result = New SomeCfgDialog(some_data).ShowDialog();

沒有可以調用Dispose的實例變量。

然后有可能混淆意圖,傷害而不是提高可讀性,並且在調試時更難以檢查值。 但這些都是特定於對象和情況以及鏈接方法數量的問題。 我認為沒有一個理由可以避免它。 有時這樣做會使代碼更簡潔和可讀,有時可能會因為上面提到的某些原因而受到傷害。

只要您確定再次不再需要該對象(或者您沒有創建相同對象的多個實例),那么它就沒有問題。

但是,如果您的團隊其他成員對此不滿意,您可能需要重新考慮該決定。 團隊應該設定標准,你應該遵循它們。 始終如一。 如果您想更改標准,請進行討論。 如果他們不同意,那就排好了。

我認為沒關系,並歡迎相反的評論/理由。 當對象不是短暫的(或使用非托管資源 - 即COM)時,這種做法可能會讓你陷入困境。

問題是可讀性。

將“鏈式”方法放在一個單獨的行上似乎是我團隊的首選約定。

string noNewlines = new Regex("\\n+")
                             .Replace(" ", oldString);

避免這種風格的一個原因是你的同事可能想要在調試模式下檢查對象。 如果復合相似的實例化,可讀性會下降很多。 例如 :

String val = new Object1("Hello").doSomething(new Object2("interesting").withThis("input"));

一般來說,我更喜歡使用靜態方法來表示您提到的具體示例。

我能看到的唯一潛在問題是 - 如果由於某種原因,新的正則表達式為NULL,因為它沒有正確實例化,你會得到一個空指針異常。 但是,我非常懷疑,因為Regex總是被定義...

如果你不關心你調用方法的對象,那就表明該方法應該是靜態的。

在C#中,我可能會編寫一個擴展方法來包裝正則表達式,這樣我就可以編寫了

string noNewlines = oldString.RemoveNewlines();

擴展方法看起來像

using System.Text.RegularExpressions;

namespace Extensions
{
    static class SystemStringExtensions
    {
        public static string RemoveNewlines(this string inputString)
        {
            // replace newline characters with spaces
            return Regex.Replace(inputString, "\\n+", " ");
        }
    }
}

我發現這比原始示例更容易閱讀。 它也是可以重復使用的,因為剝離換行符是更常見的活動之一。

暫無
暫無

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

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