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

标签 language-agnostic design-patterns oop naming-conventions

关闭。这个问题是opinion-based .它目前不接受答案。












想改进这个问题?更新问题,以便 editing this post 可以用事实和引用来回答它.

11 个月前关闭。




Improve this question




我经常发现自己在创建使用这种形式 (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 更不容易出错。

命名这些方法的标准约定是什么?
我喜欢命名公共(public)方法Walk从那以后我可以调用Dog.Walk()这看起来比 Dog.WalkExternal() 之类的更好.但是,我不喜欢为 protected 方法添加后缀“内部”的解决方案。我正在寻找一个更标准化的名称。

顺便说一句,这种设计模式有名字吗?

最佳答案

好问题。该模式是有效的,我经常使用它。我也同意 WalkInternal不是一个理想的名字。

在这个例子中,我相信你没有正确地构建问题。

与其重命名“内部”方法,不如查看您的“外部”公共(public)方法。它被称为 Walk ,但它有代码片段( //do something before walking//do something after walking )清楚地表明它包含的不仅仅是“步行”的逻辑。也许这个方法应该叫ExerciseGoToTheShops - 或者你能想到的任何有创意的名字来描述你在做什么。无论方法是什么,它绝对是步行 + 一些其他前/后步行 Action 的超集。

我最近开发的一个类似示例有一个名为 Complete 的公共(public)方法。 ,以及一个名为 Save 的虚拟, 以便:

  • 每个类(class)都需要“完成”
  • 不同的实现会有自己的“保存”方法
  • “完成”还会执行一些验证、通知等

  • 综上所述,抽象方法应该叫Walk ,相反,您应该将您的公共(public)方法重命名为更准确地描述“做某事/步行/做某事”过程的内容。

    编辑:如果 Walk类不会为 WalkInternal 添加任何重要的值(value)或逻辑。课然后我会质疑是否需要。如果它确实添加了逻辑,那么它应该被重命名以反射(reflect)它的新功能。

    关于language-agnostic - 非虚拟和抽象方法的命名约定,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2597556/

    相关文章:

    java - Spring 依赖注入(inject) - 使用实例化对象

    database - 键值存储和完整的 SQL 数据库之间有什么区别吗?

    c++ - 识别使用的设计模式名称

    algorithm - 非技术的Adaboost算法演练

    swift - 用户类设计

    java - 表示具有依赖关系的父子关系

    c# - 什么是标记接口(interface)?

    python - 在 python 中,使用点表示法访问类属性的正确命名法是什么?

    language-agnostic - 旅游承包

    language-agnostic - 提供接口(interface)的完整实现的类的命名,但设计为扩展/用作混合