我目前正在做一些API设计工作,涉及多个接口的规范作为抽象,稍后将由各种具体类实现。
碰巧,我正在使用Java,但我认为这个问题与支持类似界面概念的任何语言都有关。
我注意到:
之间通常有一个选项每种方法的优点/缺点是什么?
答案 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)
接口中的方法数量应仅由其已知(或预期)用法驱动。如果呼叫者通常使用接口的六个成员的三个不同(但重叠)的成员,那么就是六个成员!
许多方法通常表明内聚力差,良好的对象设计无论如何都应该对该数字设置自然限制。但是你不应该只是为了减少它所包含的方法数而拆分接口。