nit*_*.kk 2 oop interface design-principles dependency-inversion
" 代码到接口 "被认为是良好的做法.这样的代码易于单元测试并且可以实现松耦合.用户只知道接口和布线具体对象的责任在最顶层(这可以在一些初始化代码中或在框架的帮助下完成).
我的问题是关于遵循接口的代码实践:它是否暗示具体类永远不能声明其接口中不存在的任何公共方法?
否则,它将迫使用户依赖具体实现.这将使这种方法难以进行单元测试; 如果测试失败,确定它是否由于调用者代码中的问题或由于具体方法而失败将需要额外的努力.这也将打破依赖倒置原则.它会引起类型检查和向下转换,这被认为是不好的做法.
这是完全可以接受的,只要新方法对类的操作不是至关重要的,特别是当有人认为它是超类或接口时它的工作方式.
ArrayList提供了很好的例子.它有一些方法可以让你管理它的内部存储器,比如ensureCapacity(int)或trimToSize().如果您知道您正在使用ArrayList并且需要更精确地了解内存分配,那么这些有时会很有用,但是对于ArrayList的基本操作它们并不是必需的,特别是它们不需要它们.作为一般清单运作.
实际上,接口本身可以通过这种方式添加新方法.考虑NavigableSet,它扩展了Set.它添加了一大堆依赖于set元素排序的方法(给我第一个,最后一个,从这里开始的子树等).这些方法都没有在Set上定义,甚至元素都是有序的这一事实也没有由Set契约定义; 但是Set方法在没有附加方法和排序的情况下工作得很好.
"编写接口"的建议是一个良好的开端,但它有点过于笼统.对该建议的改进将是"代码到您需要的最通用接口".如果您不需要ArrayLists的方法(或其合同,例如其随机访问性能),则代码为List; 但如果你确实需要它们,那么一定要使用它们.