1

我正在查看一些旧代码,并在模板方法实现中找到了以下命名约定。

// TEMPLATE METHOD
// Check condition and fail fast if condition is met.
// Otherwise call the hook method (to be implemented by subclasses).
@Override
public boolean accept(String text) {
    if (condition) {
        return false;
    }

    // call to the hook method. Each subclass implements its own logic
    return acceptImpl(text);
}

// HOOK METHOD
protected abstract boolean acceptImpl(String text);

我希望钩子方法被命名为doAccept()acceptHook()而不是acceptImpl()

钩子方法在实践中是否使用了“-Impl”后缀?或者这是一个令人困惑的命名习惯?

4

1 回答 1

1

首先,请注意这里的示例不是GoF 定义的钩子方法。在第 327-328 页,GoF 模板方法模式定义了模板方法调用的操作类型,包括以下内容。

  • 原始操作(即抽象操作);
  • 钩子操作,它提供了子类可以在必要时扩展的默认行为。

显然这个例子展示了前者(抽象操作)而不是后者(默认操作)。紧随操作列表之后,GoF 强调了这两种类型之间的区别。

模板方法指定哪些操作是钩子(可能被覆盖)和哪些是抽象操作(必须被覆盖)是很重要的。

这导致我们...

命名约定。您可以通过在其名称中添加前缀来识别应覆盖的操作。例如...带有“Do-”的模板方法名称:“DoCreateDocument”、“DoRead”等。

不幸的是,GoF 似乎没有提供区分钩子和抽象操作的约定。关于“impl”后缀的问题显然是主观的;根据我的经验,“impl”通常与单实现反模式结合使用。

于 2016-10-31T23:52:42.807 回答