获得适当级别的接口粒度

时间:2011-01-21 14:20:19

标签: java language-agnostic architecture interface api-design

我目前正在做一些API设计工作,涉及多个接口的规范作为抽象,稍后将由各种具体类实现。

碰巧,我正在使用Java,但我认为这个问题与支持类似界面概念的任何语言都有关。

我注意到:

之间通常有一个选项
  • 使用各种方法制作大型界面
  • 创建多个接口,每个接口包含所有方法的子集(单个具体类可能必须实现几个或所有这些接口)

每种方法的优点/缺点是什么?

7 个答案:

答案 0 :(得分:4)

分割界面的专家是,您可以将方法划分为有意义的一组责任。 con是你的界面现在分成一堆较小的,一个类可能正在实现。

我建议将接口拆分到有助于提高可读性的地方,而不是进一步。如果你有一个实现10个接口的类,那么这些接口需要组合成一个接口,或者类可能需要承担很多责任,而且它确实需要两个或更多个类。

答案 1 :(得分:4)

就反模式而言,我会说过多的界面可能导致所谓的溜溜球问题:

http://en.wikipedia.org/wiki/Yo-yo_problem

将所有内容放在一个界面中可能会创建上帝对象:

http://en.wikipedia.org/wiki/God_object

你应该找到你介于两者之间的地方:)

祝你好运!

答案 2 :(得分:4)

尚未提及的一个问题:将物品放入集合的接口应与将物品分开的接口分开;组合接口应该从两者继承。以这种方式隔离接口允许协方差和逆变。例如,ReadableBunch(Of ToyotaPrius)可以安全地传递给期望ReadableBunch(Of Car)的例程[因为给出ToyotaPrius实例的对象将在这样做中给出Car的实例],以及WritableQueue(Of Car) )可以安全地传递给期望WriteableQueue(Of HondaCivic)的例程[因为根据定义,可接受Car的对象将接受HondaCivic]。

我不知道这种类型的协方差和逆变是否意味着Java中的任何内容,但由于该问题被标记为与语言无关,因此任何编码支持协方差和逆变的平台的人都应该考虑该问题(例如.net)

答案 3 :(得分:2)

我不会提倡有太多方法的接口,因为我也不会为一个类。必须使用这样的接口或派生类的程序员很难理解它们之间的关系;此外,试图记住它们是什么以及何时使用就像玩杂耍太多的球一样。

对我来说,一般来说,一个模块中超过1000行是太多了;一种方法也超过100行;在类或接口中也有超过15种方法。当然可以有例外,但我尽量避免它们。

在考虑哪些方法进入它们之前,我会定义您拥有的接口。考虑系统中每个抽象实体的“原子行为”是什么,并使每个实体成为一个接口,如果需要,可以继承。然后决定方法 - 在那之后,每个接口可能不会有很多。

答案 4 :(得分:2)

  

制作多个接口,每个接口包含所有方法的子集

这种方法倾向于使用“prefer composition to inheritence”的设计原则更好地工作,因为单独的类可以各自实现一个(或几个)接口。

答案 5 :(得分:2)

我对你的问题没有一个好的答案。 API设计有点艺术性。如果您正在进行大型设计工作,我建议您自己获取NetBeans成名的Jaroslav Tulach的Practical API Design副本。

我认为他会建议使用太多方法,其中一些可能只是辅助方法。您应该公开使用API​​所需的最低要求。啰嗦越少越好。

答案 6 :(得分:2)

接口中的方法数量应仅由其已知(或预期)用法驱动。如果呼叫者通常使用接口的六个成员的三个不同(但重叠)的成员,那么就是六个成员!

许多方法通常表明内聚力差,良好的对象设计无论如何都应该对该数字设置自然限制。但是你不应该只是为了减少它所包含的方法数而拆分接口。