【问题标题】:Create interface for object or for action / behavior?为对象或动作/行为创建接口?
【发布时间】:2010-11-25 19:41:47
【问题描述】:

来创建接口时,你是根据行为来创建的吗,遵循-able标准,例如

interface Comparable
interface Enumerable
interface Listable
interface Talkable
interface Thinkable

或基于对象,例如

interface Comparator
interface Enumerator
interface List
interface Human

为什么?

更新

这个问题与命名约定无关(-able 后缀或 I- 前缀)。这是关于界面的设计意图及其影响,在以下方面:-

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

例如,如果我需要实现不同的功能,通过 do -able 方式,我可以将我的类声明为

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();

【问题讨论】:

  • 这方面的标准主要是特定于语言的,有时还取决于程序员和组织中的标准。

标签: oop architecture interface naming


【解决方案1】:

接口被用来定义对象的必要行为,你可以对多个对象有类似的行为。就像如果你想创造人类的行为,你可以让对象男性和女性共享相同行为,但有一些不同的功能/属性。如果您不以这种方式使用接口,则在这种情况下,您必须为两种人类性别创建 2 个接口。

因此,接口与对象的行为有关。

【讨论】:

    【解决方案2】:

    接口与具体类的作用无关。它们更多地是关于客户的需求,以及什么可以替代客户的需求。例如,与其尝试从Man 类中提取接口,不如关注使用Man 类的类之一。它有什么作用?也许这是一个Conversation 类,它想让事物相互交流。如果你给它两个Man 类,它可以在它们上调用talk()。但是如果你想让它更灵活,你可以抽象出它的概念——让事情说话,并让它使用Talkable接口(例如)。当你在这个Conversation 类上看到Talkable 接口时,你不应该认为“这真的是一个Man”,而是“我看到Talkable 的地方,我可以替换任何实现Talkable ,无论是ManWomanParrotRobot等。”

    如果我不清楚,关于这个主题有很好的资源可用。查看 Robert Martin 的 Dependency Inversion PrincipleInterface Segregation PrincipleLiskov Substitution Principle 文章以供初学者参考。

    【讨论】:

      【解决方案3】:

      接口Comparable 应该由其实例可以比较的类实现;接口Comparator(在进行任何级别的通用编程的语言中,可能是Comparator<T>!-)应该由其实例可以比较其他的类实现。两种用法都有很好的用例,基本上彼此脱节;你似乎错过了这个关键的语义区别。

      【讨论】:

      • 我使用的示例与特定语言 (Java) 的任何实现无关。 Comparable/Comparator 接口只是示例之一,可能用于 C#、C++、Actionscript 等。
      • 我的答案也不是 Java-y,我只是建议 <T> 表示通用性,因为它被广泛使用。我的观点是关于English:一个Enumerable可以枚举,一个Enumerator执行枚举;等等,对于大多数及物动词。非常不同的语义。即使是不及物动词也有类似的作用(通常隐含一些介词):Laughable 对象是一个可以笑的对象(这就是这个词的意思!),a Laugher 是一个笑的主语。这是主语与(语法)直接宾语。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-04-29
      • 1970-01-01
      • 1970-01-01
      • 2011-03-11
      • 2018-11-05
      • 1970-01-01
      • 2015-12-24
      相关资源
      最近更新 更多