【问题标题】:How do interfaces work and How to use them in practical programming [closed]接口如何工作以及如何在实际编程中使用它们[关闭]
【发布时间】:2010-12-31 08:03:34
【问题描述】:

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

  • 为今天而构建,为明天而设计
  • 在编码之前,让每个模块尽可能清晰
  • 您的代码不应被少数人理解
  • 为可预测的变化做好准备

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

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

【问题讨论】:

标签: interface


【解决方案1】:

对不起,如果答案很笼统,但它和问题一样笼统。

【讨论】:

  • 无论如何,谢谢你的维基搜索
【解决方案2】:

在 Java 术语中,JDBC API 是接口强大功能的绝佳示例。 DB 供应商提供他们自己的 JDBC 驱动程序(它只是 JDBC API 的具体实现),您可以编写统一的 JDBC 代码,而不必担心与数十种不同数据库的兼容性。

【讨论】:

  • 这是一个很好的例子,我只是希望它们是你写的。是的,你明白这一点,或者熟悉细节......
【解决方案3】:

【讨论】:

  • 我非常感谢您的回答,但更好地理解接口需要更多工作接近的编程示例
  • kidsoul -- 您有更具体的问题需要我们回答吗?您提出的问题非常笼统;我不知道怎么可能回答。
【解决方案4】:

当您将代码设计为高度可测试时,接口很有用。如果您引用的是接口而不是具体的类,那么测试它们会容易上百万倍。

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

【讨论】:

    【解决方案5】:

    如果您已经阅读了所有这些行话,但还没有弄清楚它们的含义,那么您没有阅读所有正确的书籍。

    试试:

    1. Robert C. Martin(叔叔)的Clean Code
    2. Michael Feather 的“有效使用遗留代码”。

    我知道它帮助了我很多

    干杯

    【讨论】:

      【解决方案6】:

      当您学习驾驶时,您关心的是汽车的界面(踏板、制动器、方向盘),而不是其实现方式:盘式制动器和鼓式制动器是通过相同的界面(踏板)访问的。您不关心它们的性质,它们的驱动方式等……除非您是机械师。当您开车时,您只需通过它们的通用界面访问它们。性能可以不同,但​​行为不会。

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

      1. 管理复杂性。复杂性来自实体的数量和这些实体之间的交互次数。
      2. 并行开发任务以在您的竞争对手之前完成发布,可能使用更好的产品(尽管现在不需要这样做)。

      处理面向接口的编程是解决这两个问题的好方法。您越能将复杂性隐藏在定义明确的通用接口的漏斗后面,您的交互就越少(因为您现在将大量实体视为不再由子部分组成的单个、整体、复杂实体),并且您可以更好地并行开发任务,因为每个人都可以解决他擅长的问题,而不必搞乱他不擅长的领域。

      【讨论】:

        【解决方案7】:

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

        //////////////////// //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; } } ... }

        如你所见,接口本身就是一个合约,它是以下各项的组合:

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

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

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

        有关接口(和一般面向对象)的非常有趣和实用的示例,请查看head first design patterns。既适合新手也适合专业人士

        【讨论】:

          猜你喜欢
          • 2010-10-01
          • 2013-06-13
          • 2019-01-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-01-22
          • 2012-04-02
          相关资源
          最近更新 更多