2009-09-05 76 views
4

当您创建界面时,您是否根据行为创建界面,并遵循可用的标准,例如,为对象创建接口还是为动作/行为创建接口?

interface Comparable 
interface Enumerable 
interface Listable 
interface Talkable 
interface Thinkable 

或基于对象,例如

interface Comparator 
interface Enumerator 
interface List 
interface Human 

为什么?

UPDATE

这个问题不是关于命名约定(-able后缀或前缀I-)。这是一个关于接口的设计意图,它的影响,在以下方面: -

  1. 灵活性
  2. 复杂性/简单
  3. 可维护性

例如,如果我需要为了实现不同的功能,通过可执行的方式,我可以宣布我的课程为

public class Man implements Talkable, Thinkable, Laughable 
public class Woman implements Talkable, Thinkable, Laughable 

另一方反之,如果我们创建一个基于对象的接口,我们可以把它作为

public class Man implements Human 
public class Woman implements Human 

而且我们还可以用它来多态性目的。

Human man = new Man(); 
+0

这方面的标准主要是针对特定语言的,有时对组织中的程序员和标准是主观的。 – 2009-09-05 02:44:16

回答

4

接口不是关于具体类是做什么的。他们更多的是关于客户需要什么,以及什么是替代客户需要的。例如,不是试图从Man类中提取接口,而是专注于使用Man类的其中一个类。它有什么作用?也许这是一个Conversation班,想让事情彼此交谈。如果你给了它两个Man类,它可以调用talk()。但是,如果你希望它更加灵活,你可以抽象出它所做的事情的概念 - 使事情变得简单,并且使用一个Talkable接口(例如)。当你看到这个ConversationTalkable界面,你不应该认为“这是一个真正的Man”,而是“我在哪里看到一个Talkable,我可以代替任何实现Talkable,无论是ManWomanParrotRobot等“

如果我不清楚,有关于这个问题的好资源。查看Robert Martin的Dependency Inversion Principle,Interface Segregation PrincipleLiskov Substitution Principle文章。

+0

感谢您的链接! – janetsmith 2011-12-01 09:59:50

1

接口作了定义对象的必要行为,你可以有一个类似的行为对多个对象..就像如果你想创建人类的行为,你可以有对象的男人和女人,谁共享相同的行为,但有一些独特的功能/属性。如果你不这样使用接口,在这种情况下,你将不得不为这两个人类性别创建2个接口。

所以,接口与对象的行为有关。

3

接口Comparable应该由其实例可以是COMPARED的类来实现;一个接口Comparator(用于任何级别的泛型编程的语言,可能是Comparator<T>!)应该由其实例可以比较其他类的类来实现。两种用法都具有出色的用例,基本上彼此不相交;你似乎错过了这个关键的语义区分。

+0

我正在使用的示例并未绑定到特定语言(Java)的任何实现。 Comparable/Comparator接口只是其中一个示例,可能用于C#,C++,Actionscript等。 – janetsmith 2009-09-05 14:27:18

+0

也不是我的答案Java-y,我只是建议''通用符号,因为它被广泛使用。我的观点是关于*英语*:Enumerable *可以被枚举,Enumerator *可以执行枚举;对于大多数及物动词等等。非常不同的语义。即使是不及物动词也是类似的(典型地用一些暗示的介词):一个可笑的物体就是一个可以嘲笑AT的物体(这就是这个词的意思!),一个Laugher是一个笑话的主体。它是主语对(语法)直接宾语。 – 2009-09-05 15:32:05