关闭。这个问题是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
)清楚地表明它包含的不仅仅是“步行”的逻辑。也许这个方法应该叫Exercise
或 GoToTheShops
- 或者你能想到的任何有创意的名字来描述你在做什么。无论方法是什么,它绝对是步行 + 一些其他前/后步行 Action 的超集。
我最近开发的一个类似示例有一个名为 Complete
的公共(public)方法。 ,以及一个名为 Save
的虚拟, 以便:
综上所述,抽象方法应该叫
Walk
,相反,您应该将您的公共(public)方法重命名为更准确地描述“做某事/步行/做某事”过程的内容。编辑:如果
Walk
类不会为 WalkInternal
添加任何重要的值(value)或逻辑。课然后我会质疑是否需要。如果它确实添加了逻辑,那么它应该被重命名以反射(reflect)它的新功能。
关于language-agnostic - 非虚拟和抽象方法的命名约定,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2597556/