接口如何工作以及如何在实际编程中使用它们

时间:2009-12-31 04:43:13

标签: interface

我不久前开始编程。据说,如果将数据和算法结合在一起,那么你就得到了一个程序。这正是我现在所做的,但我听到了这些理论:

  • 为今天打造,为明天设计
  • 在编码之前,尽可能使每个模块都清晰
  • 只有极少数人才能理解您的代码
  • 准备可预测的更改

    总而言之,我没有遇到任何关于接口的理论。我想知道何时何地使用接口来满足良好的标准。

    也许你知道很多。然后给我一些提示!例子太棒了!

7 个答案:

答案 0 :(得分:3)

很抱歉,如果答案很一般,但问题一般如此。

答案 1 :(得分:3)

答案 2 :(得分:2)

当您将代码设计为高度可测试时,接口非常有用。如果你引用的是接口而不是具体的类,那么测试它们的次数要容易一百万次。

当您定义应该在应用程序或框架中标准化的行为时,接口也很有用。想想IDisposable和INamingContainer之类的东西在很多地方都有不同程度的用处。 IDispose.Dispose()用于释放非托管资源。 “如何”取决于实施者,但它存在的事实对外界来说意味着什么。

答案 3 :(得分:1)

在Java术语中,JDBC API是接口功能的一个很好的例子。数据库供应商提供他们自己的JDBC驱动程序(这只是JDBC API的具体实现),您可以编写统一的JDBC代码,而无需担心与数十个不同数据库的兼容性。

答案 4 :(得分:1)

当你学习驾驶时,你会担心汽车的接口(踏板,制动器,方向盘),而不是它的实现:磁盘制动器和鼓式制动器可以通过相同的接口(踏板)进入。你不关心他们的本性,他们是如何被驱使等等......除非你是一名机械师。当您开车时,您只需通过其通用界面访问它们。性能可能不同,但行为不是。

编程时有两个控制问题,一个是技术问题,另一个是面向业务

  1. 管理复杂性。复杂性来自实体数量和这些实体之间的相互作用数量。
  2. 并行化开发任务以实现在竞争对手面前的发布,可能还有更好的产品(尽管这些日子不需要)。
  3. 处理面向接口的编程是解决这两个问题的好方法。您能够隐藏在定义明确的通用界面漏斗后面的复杂性越多,您拥有的交互就越少(因为您现在看到大量实体作为单个,整体,复杂的实体不再由子部分组成),并且您可以更好地并行化开发任务,因为每个人都能解决他能胜任的问题,而不必弄乱他不熟悉的领域。

答案 5 :(得分:0)

如果您已阅读所有这些术语,但尚未发现它们的含义,那么您就不会阅读所有正确的书籍。

尝试:

  1. Robert C. Martin(unclebob)的Clean Code
  2. Michael Feather的“与遗产代码有效合作”。
  3. 我知道它帮助了我很多

    干杯

答案 6 :(得分:0)

我尝试用一​​个务实的例子来简化:


////////////////////
//VERY(!) simplified, real forums are more complex.
public interface ForumActions{

  /** @throws UserDisallowedException, email is not allowed to post. */
  Thread startThread(String email, String threadName, String description)
    throws UserDisallowedException;

  /** @throws UserDisallowedException, email is not allowed to comment. */
  void commentThread(String email, Thread thread, String comment) 
    throws UserDisallowedException;
}

///////////////////////////
//IMPLEMENTATION 1
public class StackOverflowForum implements ForumActions{

  /**
   * @param email Email of poster, which must have been registered before.
   *
   * @throws UserDisallowedException The mail address is not registered 
   */
  public Thread startThread(String email, String threadName, String description) 
     throws UserDisallowedException {

    if(isNotRegistered(email))
      throw new UserDisallowedException(...);
    ...
    return thread;

  }
}
...
}

///////////////////////////
//IMPLEMENTATION 2
public class JavaRanchForum implements ForumActions{

  /** 
   *  @param email Email of poster, which mustn't have exceeded a posting-limit per day.
   *               This way we protect against spammers.
   *
   *  @throws UserDisallowedException, the mail was identified as a spamming origin. 
   *        is mandatory for posting threads.
   */
  public Thread startThread(String email, String threadName, String description) 
     throws UserDisallowedException {

    if(isSpammer(email))
      throw new UserDisallowedException(...);
    ...
    return thread;

  }
}
...
}

正如您所看到的,界面本身就是一个契约,它是以下的组合:

  • '我怎么称呼它:例如它有什么名称,涉及的类型。语法。
  • '做什么':使用界面的效果是什么。这可以通过良好的命名和/或javadoc来记录。

以上类是接口的实现,必须遵循其合同。 因此,接口不应该过于严格“实施”必须如何实现合同(在我的情况下:为什么不允许用户发布/评论 - >垃圾邮件发送者与未注册)。

如上所述,非常简化的示例,到目前为止还没有完整的接口参考。

关于接口(和一般面向对象)的非常有趣和实用的例子,请看head first design patterns。这对初学者和专业人士都很好