2009-06-26 31 views
12

我知道這是一個主觀的問題,但我總是對編碼風格的最佳實踐感到好奇。 ReSharper的4.5是給我的關鍵字「基地」警告之前的實現類,即基礎的方法調用,儘管它可能對可讀性有好處,但它正在使用「基礎」錯誤練習嗎?

base.DoCommonBaseBehaviorThing(); 

雖然我很欣賞「少就是好」的心態,我也花了很多時間調試/維護高度鏈接的應用程序,並且覺得可能僅僅通過查看它就可以幫助知道成員調用是基礎對象。當然,改變ReSharper的規則很簡單,但是你們都會怎麼想?調用基礎成員時應該使用「基礎」嗎?

+12

你所有的基地都屬於我們 – JoelFan 2009-06-26 16:13:30

+0

恕我直言,這取決於未來的讀者(開發人員)認爲什麼是良好的可讀性。詢問他們,然後用「這取決於誰來維護代碼」來回答你自己的問題。 – LosManos 2015-03-19 11:44:39

回答

21

您應該使用base.MethodCall();的唯一時間是在子類中有相同名稱的重寫方法,但實際上您想調用父類中的方法。

對於所有其他情況,只需使用MethodCall();

關鍵詞像thisbase不使代碼更易讀,應當避免對所有情況除非他們是必要的 - 如我上面所描述的情況。

+4

+1。 multiupvote按鈕在哪裏? – 2009-06-26 16:00:50

+3

「不要讓代碼更具可讀性,應該避免」......至少主觀標籤已設置 – 2009-06-26 16:03:14

3

這確實是個人偏好的問題。如果你喜歡看「基地」。在您的成員開始時,您可以輕鬆關閉該規則(轉至選項>檢查嚴重性>代碼冗餘>冗餘'基礎限定符)。不要讓非行爲靜態代碼分析規則影響您的首選編碼風格。

編輯

有一點要考慮的是,在FxCop的靜態代碼分析和r#在那裏爲所有可能需要的規則。要真正堅持同時規則的所有是有點繁重。你應該定義你喜歡的編碼風格(如果你在一個團隊中工作,一起做),並堅持下去。修改您的規則以符合您的編碼標準,而不是相反。

4

我認爲一般只有在覆蓋以前的功能時才應該使用base

某些語言(C#沒有)也通過顯式調用函數的基類名稱來提供此功能,如下所示:Foo.common()(當然,在Bar的某處調用)。

這將允許您跳過鏈中的向上或從多個實現中選擇 - 在多重繼承的情況下。

無論如何,我覺得基地應該只在需要明確調用父母的功能時使用,因爲您已經或者已經重寫了此類中的功能。

6

需要考慮的另一個要點是,雖然您目前還沒有重寫該方法,但這並不意味着您將來不會再有這種方法,並且可以使用base預先調用所有的調用。如果不執行查找並替換所有呼叫,您將無法獲得新功能。

使用此命令調用呼叫時。除了減少/增加可讀性(忽略範圍中的兩個變量具有相同名稱的情況)基礎之外不會做任何其他事情。前綴將改變您在許多常見場景中編寫的代碼的功能。所以我永遠不會添加基地。除非它是必要的。

16

我不太確定使用這個是一個不好的做法或不是。 基地,但不是一個好的或不好的做法,而是一個語義問題。而這個是多態的,這意味着即使使用它的方法屬於一個基類,它也會使用overriden方法,基地不是。 基地將始終引用在調用它的方法的基類中定義的方法,因此它是不是多態。這是一個巨大的語義差異。 基地應該相應地使用。如果你想方法,使用基地。如果您希望呼叫保持多態,請不要使用基地

相關問題