【问题标题】:How do you name your "reference" implementations of an interface?您如何命名接口的“参考”实现?
【发布时间】:2025-12-16 19:50:03
【问题描述】:

我的问题很简单,标题完美地说明了这一点:如何命名接口的“参考”或“基本”实现?我看到了一些命名约定:

  • FooBarImpl
  • DefaultFooBar
  • BasicFooBar

你用什么?优缺点都有什么?你把那些“参考”实现放在哪里?目前我创建了一个 .impl 包,实现的地方。可能包含多个类的更复杂的实现进入 .impl.complex 包,其中“complex”是描述实现的短名称。

谢谢你, 马拉克斯

【问题讨论】:

    标签: oop interface


    【解决方案1】:

    我想知道您的问题是否反映了特定语言的习俗。我用 C# 编写,我通常没有“默认”实现。我有一个接口,比如 IDistance,每个实现都有一个描述其实际目的/具体方式的名称,例如 EuclidianDistance、ManhattanDistance ......在我看来,“默认”不是实现本身的属性,而是其上下文:应用程序可以有一个名为“GetDefaultDistance”的服务/方法,它将被配置为返回距离实现之一。

    【讨论】:

      【解决方案2】:

      在 Java 中,(只要合适)我通常使用一个名为 RefImpl 的嵌套类。这样,对于给定的接口InterfaceXYZ,参考实现始终是InterfaceXYZ.RefImpl,无需费力地编造有效的冗余名称。

      public interface InterfaceXYZ {
      
         // interface methods ...
      
         public static class RefImpl implements InterfaceXYZ {
              // interface method impls.
         }
      }
      

      然后有一个统一的使用模式:

      // some where else
      public void foo () {
      
          InterfaceXYZ  anXYZ = new InterfaceXYZ.RefImpl();
      
          ...
      }
      

      【讨论】:

        【解决方案3】:

        asked a previous question 关于“空”实现,它被标识为空对象模式——一个没有任何意义的接口实现。像 Mathias 一样,我不太确定什么会被视为“默认”实现,它没有特定于其实现的某种名称。

        【讨论】:

          【解决方案4】:

          如果接口是 RazmaFrazzer,我会将实现称为 DefaultRazmaFrazzer。

          如果您已经有多个实现,并且您已将其中一个标记为“默认”,请查看所有实现并查看它们之间的差异并想出一个形容词来描述区别默认实现的特性,例如SimpleRazmaFrazzer,或者如果它是一个转换器,你可能有 PassThroughDefaultRazmaFrazzer - 所以你正在寻找使实现与众不同的东西。

          【讨论】:

            【解决方案5】:

            确切的约定不符合 - 无论是 IService + Service 还是 Service + ServiceImpl。关键是在整个项目中保持一致

            【讨论】: