类/接口“默认”实现的命名约定

时间:2013-03-23 20:17:57

标签: api interface naming-conventions naming

我在StackOverflow上看过the canonical类/接口命名问题,并在主题上阅读了很多其他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中的所有功能。我也不相信我应该抛弃接口并直接公开实现,因为接口提供了额外的灵活性和解耦。

关于更好地处理这种情况或逻辑命名约定的想法?

1 个答案:

答案 0 :(得分:2)

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

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