【问题标题】:Designing a better API?设计更好的 API?
【发布时间】:2010-11-28 04:09:02
【问题描述】:
  1. 设计 API 时应遵循哪些最佳实践和模式?
  2. 如何实现实现隐藏的最佳方式(C++/Java)?
  3. 设计本质上是通用的 API?
  4. 是否有任何参考书/链接可以指导初学者使用简洁的示例?

【问题讨论】:

标签: java c++ design-patterns oop


【解决方案1】:

我不确定我对你的所有个人问题都有一个很好的答案,但我认为我对第一个问题确实有一个很好的答案。

在编写之前尝试使用它。我的意思是,为代码编写单元测试,就好像它确实存在一样。在编写 API 的一行之前,编写一些将使用 API 的代码。当您尝试使用它时,您会很快看到在您心目中的设计中哪些有效,哪些无效,并且您将很快更改它以匹配其实际用途,因为您还没有编写任何实际代码

如果您没有将任何内容提交给代码,那么更改某些内容永远不会有任何摩擦,但是当您这样做时,通常会有些不情愿。

【讨论】:

  • 我经常发现使用 API 编写“示例应用程序”比使用单元测试更好,这样您就可以了解如何在真实环境中使用 API。
【解决方案2】:
【解决方案3】:

第四季度:

在我看来,Josh Bloch 在编写好的 API 方面有最好的想法,他可以用非常容易理解的方式解释它们。上面的视频将为您介绍 Q1-3。

【讨论】:

    【解决方案4】:

    建议你查看How to Design a Good API & Why it Matters

    编写良好的 API 可能会很棒 资产到编写的组织 它和所有使用它的人。鉴于 良好的 API 设计的重要性, 令人惊讶的是,很少有人写 就此主题而言。在这次谈话中(记录 在 Javapolis),Java 库设计师 Joshua Bloch 教授如何设计 好的 API,有很多例子 好的和坏的 API 看起来像。

    http://www.infoq.com/presentations/effective-api-design

    您也可以阅读本书Practical API Design: Confessions of a Java™ Framework Architect。我没有读过它,所以我不确定它的内容是否对你有用。

    另一个要检查的资源:@​​987654324@

    【讨论】:

      【解决方案5】:

      我有一个关于第 3 点(通用 API 设计)的提示:

      开始将您的 API 建立在特定用例上;使您的设计具体化,而不是通用化 - 然后在以后通用化如果您发现 API 可以重复使用。

      在过去,我看到 API 被重构到如此通用的程度,以至于方法参数之一是“参数”对象,或者更糟的是,对应于任意 XML 片段的 DOM 树;例如

      void processData(Parameters reportParams);
      

      使用这种超级通用的方法:

      • Bug 在编译时或通过观察代码不太可能被发现,并且会在运行时出现,因此难以追踪。
      • 代码的可读性和自记录性会降低,因此难以使用或实施。
      • API 实现将变得丑陋,因为它需要在内部将此“参数”对象分解为特定用例并对其采取行动。

      【讨论】:

        【解决方案6】:

        Apress - 实用 API 设计 - Java 架构师的自白 - 2008 年

        务实 - 面向界面的设计 - 2006

        【讨论】:

          【解决方案7】:

          阅读 Josh Bloch 的 Effective Java。这本书非常适合任何 Java 程序员,但也解决了围绕创建有用 API 的许多问题。

          【讨论】:

            【解决方案8】:

            查看此podcast

            它谈到了一些关于 api 设计的非常好的概念。

            【讨论】:

              【解决方案9】:

              您可以实施以下准则:

              1) 使用已建立或已知的方法,示例:

              createPatientRecord();
              createPatientAppointment();
              createPatientCheckup();
              

              2) 返回值:

              • 如果有则抛出异常
              • 如果没有找到对象,返回null
              • 如果有多个对象,则返回不为空的空列表

              3) 一致的参数排序/序列

              recallPatientRecord(long patientId, long hospitalId);
              recallPatientRecord(long patientId);
              recallPatientRecord(long patientId, long hospitalId, int disciplineCode);
              

              【讨论】:

                【解决方案10】:

                这个问题几乎不可能回答。对于 Stack Overflow,它甚至可能不是一个合适的问题(A 人:我该如何解决具体问题?B 人:这是明确的答案)。

                1.设计 API 应遵循的最佳实践和模式是什么

                我们在谈论什么编程语言?我们在谈论什么领域的问题域?因为适用于一种编程语言/问题域的方法可能不适用于另一种编程语言/问题域。

                2.如何实现隐藏的最佳方式(C++/Java)

                这个问题有答案,写在这里太长了。事实上,它太长了,网站参考是不够的。有许多网站和书籍,当结合在一起时,将回答这个问题。哦,我只是在谈论 C++。对 Java 重复整个过程。对于 C#、Python 和 ....(等等)

                4. 任何可以为初学者提供简洁示例的参考书/链接

                选择一种编程语言。然后我可以提供参考书籍和链接。正如 Fred Brooks 所写,没有灵丹妙药。从编程语言到编程语言没有单一的思维方式。在一种编程语言中制作好的 API 将是另一种编程语言中的设计错误。相信我,通过尝试在这些语言中应用 C++、Delphi 和 Java 习语,我明白了这一点。它会导致错误的 API 和错误的代码。

                在设计 API 时也存在相互竞争的思想流派。而且,不幸的是,现实情况是没有人是 100% 正确的。事实上,当您了解多种思想流派并知道何时将特定思想流派应用于特定问题时,您就会成为一名出色的 API 设计师。

                【讨论】:

                  猜你喜欢
                  • 2013-02-18
                  • 1970-01-01
                  • 1970-01-01
                  • 2012-11-20
                  • 1970-01-01
                  • 2012-11-21
                  • 2011-09-24
                  • 2014-09-09
                  • 1970-01-01
                  相关资源
                  最近更新 更多