【问题标题】:Naming Convention for Class/Interface "Default" Implementation类/接口“默认”实现的命名约定
【发布时间】:2013-03-13 13:32:33
【问题描述】:

我在 StackOverflow 上看到了thecanonical 类/接口命名问题,并阅读了很多关于该主题的其他opinions,但我有一个相关的问题我不确定是否在任何一个中得到回答那些地方。我倾向于讨厌 IInterface 或 ClassImpl 命名约定,因为它们是不必要的(考虑到现代 IDE),使代码更难阅读,并且在许多情况下,需要使用其中一种命名模式似乎意味着不正确的设计。

但是,我经常遇到这样一种情况,即我有一个想要作为 API 的一部分公开的接口(通常在一个单独的包中),然后我创建了一个接口的抽象实现以包含一些常见的功能我希望大多数(但不是全部)具体实现都来自于。例如:

public interface Foo {
    public String getBar();
}

public abstract class BasicFoo implements Bar {
    private String bar;

    @Override
    public String getBar() {
        return bar;
    }
}

在实践中,我倾向于在实现名称前加上 Basic 前缀,但我所做的基本上正是某些人使用 Impl 后缀的目的:提供基本/默认实现。我可以尝试一个暗示它是由内存存储(例如 Bar)支持的 Foo 的名称,但它总是捕获 BasicFoo 中的所有功能。我也不认为我应该抛弃接口并直接公开实现,因为接口提供了额外的灵活性和解耦。

想更好的方法来处理这种情况,还是逻辑命名约定?

【问题讨论】:

    标签: api interface naming-conventions naming


    【解决方案1】:

    Java 世界中的一个常见模式是调用抽象的、不完整的实现AbstractSomething;例如AbstractListAbstractButton。接口和抽象类都暴露给客户端。这背后的想法是抽象类作为使用 API 的起点。这对于定义许多方法和复杂协定的接口尤其有用,例如 java.util.List。接口的大多数方法都是根据客户端必须提供的最小抽象方法集来实现的。

    例如,要实现基于AbstractList 的列表,您只需提供get(index)size() 方法的实现。所有其他操作 - 迭代器、indexOfsubListhashCode ... - 最后都委托给这两个。

    【讨论】:

    • 酷,这很有道理,正是我想要的。谢谢!
    猜你喜欢
    • 2011-02-18
    • 2013-12-01
    • 2014-10-01
    • 2012-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-11
    相关资源
    最近更新 更多