-Impl 后缀是 Java 中 Hook 方法的合法命名约定吗?

问题描述 投票:0回答: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”后缀在实践中是否用于钩子方法?或者这是一个令人困惑的命名实践?

java design-patterns naming-conventions template-method-pattern
1个回答
1
投票

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

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

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

对于模板方法来说,指定哪些操作是钩子(可以被覆盖)以及哪些是抽象操作(必须被覆盖)非常重要。

这导致我们...

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

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

© www.soinside.com 2019 - 2024. All rights reserved.