非虚拟和抽象方法的命名约定

Sen*_*ful 27 language-agnostic oop design-patterns naming-conventions

我经常发现自己创建使用这种形式的类(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
  }
}
Run Code Online (Sandbox Code Playgroud)

而不是这种形式(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
  }
}
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,关于表单A的好处是,每次实现子类时,您都不需要记住包含初始化和终结逻辑.这比形式B更不容易出错.

命名这些方法的标准惯例是什么?
我喜欢命名公共方法,Walk从那以后我可以调用Dog.Walk()哪个看起来比类似的更好Dog.WalkExternal().但是,我不喜欢我为受保护方法添加后缀"Internal"的解决方案.我正在寻找一个更标准化的名字.

顺便问一下,这个设计模式有名字吗?

Ran*_*ica 11

我不确定是否有一个标准的命名约定.此外WalkInternal,其他替代品可能是DoWalkWalkImpl.


Mic*_*urr 10

顺便问一下,这个设计模式有名字吗?

您的第一个示例使用模板方法模式的各个方面,类似于Herb Sutter所称的"非虚拟接口惯用法":


Jeh*_*hof 8

我更喜欢用后缀来命名我的虚拟或抽象方法Core,以表明该方法应该包含执行某些操作的核心逻辑.

所有参数检查并引发我在方法中执行的可能事件,这些事件调用Core-Methods.

  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
    }
  }
Run Code Online (Sandbox Code Playgroud)

我认为没有正式的命名准则,这取决于你.但它应该与您定义的所有类和虚拟/抽象方法保持一致.

如果您遵循模板方法并希望提供可扩展性点,则"框架设计指南"建议使用Core后缀.