2010-04-08 44 views
26

我經常發現自己創建它使用這種形式(A)類:命名約定非虛擬和抽象方法

abstract class Animal { 
    public void Walk() { 
    // TODO: do something before walking 

    // custom logic implemented by each subclass 
    WalkInternal(); 

    // TODO: do something after walking 
    } 
    protected abstract void WalkInternal(); 
} 

class Dog : Animal { 
    protected override void WalkInternal() { 
    // TODO: walk with 4 legs 
    } 
} 

class Bird : Animal { 
    protected override void WalkInternal() { 
    // TODO: walk with 2 legs 
    } 
} 

而不是這樣的形式(B):

abstract class Animal { 
    public abstract void Walk(); 
} 

class Dog : Animal { 
    public override void Walk() { 
    // TODO: do something before walking 

    // custom logic implemented by each subclass 
    // TODO: walk with 4 legs 

    // TODO: do something after walking 
    } 
} 

class Bird : Animal { 
    public override void Walk() { 
    // TODO: do something before walking 

    // custom logic implemented by each subclass 
    // TODO: walk with 2 legs 

    // TODO: do something after walking 
    } 
} 

正如你可以看到,形式A的好處在於,每次實現子類時,都不需要記住包含初始化和終結邏輯。這比形式B更不容易出錯。

什麼是命名這些方法的標準慣例?
我喜歡命名公共方法Walk,因爲我可以打電話Dog.Walk(),這比Dog.WalkExternal()好看。但是,我不喜歡我爲受保護的方法添加後綴「Internal」的解決方案。我在尋找更加標準化的名字。

順便說一句,有這個設計模式的名稱?

+0

好問題;我也一直這樣做。 – 2010-04-08 04:56:29

+0

@羅伯特:你在調用什麼內部方法? – Senseful 2010-04-08 05:06:04

+0

Impl在WalkImpl ....沒有比內部更好。 – 2010-04-08 05:54:00

回答

11

我不是確定是否有一個標準的命名約定。除了WalkInternal,其他替代品可能是DoWalkWalkImpl

+0

另外我看到的是* MakeWalk * – Leyu 2013-05-09 07:51:52

-2

方法是採取行動的手段,並遵循該規則方法名稱應該是動詞或動詞短語。它適用於方法,而不管它們在何處聲明。對我來說Dog.Walk看起來比Dog.WalkInternal更自然。方法的命名比設計模式更具指導性:)如果你是一個.Net人,那麼我會推薦Brad Adam和Krzystof Cwalina的「Framework Design GuideLines」一書,它清楚地解決了這些問題。

+1

這是如何解決具體問題的。如果「WalkInternal」不好,那麼*好*是什麼? – 2010-04-08 04:57:25

+0

問題不是Dog.Walk()vs Dog.WalkInternal()。我想將暴露的方法稱爲「漫步」,因爲像你說的那樣,它看起來更自然。問題在於每次調用Walk()方法時,調用這個內部方法來處理每個子類的主定製邏輯。但感謝您的答案。 – Senseful 2010-04-08 05:03:27

+0

由於內部方法對外部世界不可見,因此可以根據您的偏好命名它。在某些地方我注意到的是,在方法名稱後面加上「Helper」字樣的方法。在這種情況下,您的「WalkInternal 「將成爲」WalkHelper「。 – 2010-04-08 05:26:35

10

順便說一句,有沒有這個設計模式的名稱?

你的第一個例子使用了模板方法模式的方面是類似於香草薩特所說的「非虛擬接口成語」:

+0

這與我所指的設計模式完全相同。對於其他感興趣的人,Herb Sutter使用前綴「Do」作爲內部方法(例如DoWalk()而不是WalkInternal())。而且,他推薦這種形式的另一個原因是將接口和實現的關注分開。 – Senseful 2010-04-08 17:53:16

3

好問題。該模式是有效的,我使用它很多。我也同意WalkInternal不是一個理想的名字。

在這個例子中,我相信你沒有正確地解決問題。

而不是重命名'內部'方法,看看你'外部'的公共方法。它被稱爲Walk,但它有代碼片段(//do something before walking//do something after walking),清楚地表明它包含的不僅僅是「走路」的邏輯。也許這種方法應該被稱爲ExerciseGoToTheShops - 或者你可以想到的任何創意名稱都描述了你正在做的事情。無論採取什麼方法,它絕對是散步+其他一些前/後步行動作的超集。

一個類似的例子,我最近開發了一個公共方法叫Complete和虛擬叫Save,使:

  • 需要「完成」每類
  • 不同的實現將有自己的自己的「保存」方法
  • 「完成」也將進行一些驗證,通知等

綜上所述,抽象的我的ThOD應該叫Walk,而是你應該重命名的公共方法的東西,更準確地描述了「做一些事情/行走/做些什麼」的過程。


編輯:如果Walk類沒有任何顯著值或邏輯添加到WalkInternal類,然後我會質疑它是否是必需的。如果它添加了邏輯,那麼它應該重新命名以反映它的新功能。

8

我寧願名加上Core我的虛擬或抽象方法,以表明,該方法應該包含核心邏輯,做一些事情。

所有參數的檢查和提高可能發生的事件我做的方法,調用核心的方法。

abstract class Animal { 
    public void Walk() { 
     // TODO: do something before walking 
     // possible Argument checks and event raising 

     // custom logic implemented by each subclass 
     WalkCore(); 

     // TODO: do something after walking 
    } 

    protected abstract void WalkCore(); 
    } 

    class Dog : Animal { 
    protected override void WalkCore() { 
     // TODO: walk with 4 legs 
    } 
    } 

    class Bird : Animal { 
    protected override void WalkCore() { 
     // TODO: walk with 2 legs 
    } 
    } 

我認爲這沒有官方的命名準則,這取決於你。但是它應該對您定義的所有類和虛擬/抽象方法保持一致。

如果您遵循模板方法並希望提供可擴展性點,則"Framework Design Guidelines"建議使用核心後綴。

+0

+1爲「框架設計指南」的參考。 – 2012-02-15 16:21:30

2

我用抽象的覆蓋下劃線資本案件的慣例,那麼Dog._Walk,雖然我比偶爾不知道是否有更好的方法沒有。

我喜歡DoWalk比WalkInternal更好 - 它是短&傳達的想法,它的覆蓋迅速和前期。 「做什麼」儘管有點像我的「物體」那樣,但我仍然錯誤地使用了它。我仍然喜歡我的下劃線,然後是大寫字母慣例。

好現實生活中的問題,雖然

乾杯,
Berryl

0

對於提供了一個模板方法的主要行爲的方法,我用的名字,如WalkOverride。基類將其作爲protected abstract方法(派生類爲需要來提供實現)或protected virtual空/非空(其派生類可能可選地提供/覆蓋實現)來實現它。實例可以在微軟的XAML各種與框架的方法,如MeasureOverrideArrangeOverride被發現。 (@Jehof提到的WalkCore模式在那裏用於命名模板方法本身。)

對「事件」給其派生類可以有選擇地響應達到自己的目的(而不是定義模板方法的行爲),我使用像OnWalkingOnWalked名。這些方法中的每一個通常都在基類中作爲具有空方法體的protected virtual方法實現。