框架的特点是什么?

What are the characteristics of a framework?

是否有设计和实现框架的参考? 框架的特点是什么?应该有什么特点?必须涵盖哪些必要条件? ORM 是否与框架关联?

谢谢

你的问题确实有点含糊,但从"coding philosophy"的角度来说还是挺有意思的。我并不是说我的回答是做这些事情的唯一方法,尤其是在没有任何关于你的问题的细节的情况下。这只是我个人使用的一套指南,希望它们对您有所帮助。

因此,首先,您必须真正了解您要解决的问题是什么。我不会在这里考虑 "I do it for educational purposes" 作为一个选项。试着问自己这样的问题:


你需要解决单一问题吗?

一个简单的例子:如果您的应用程序需要对数组进行排序,或者为了更接近您的领域,计算均值或偏差 - 所有这些都是单一问题。你真的不应该在你的应用程序中包含一整套所有已知的排序算法只是为了对数组进行排序,就像你真的不需要一个深度统计分析系统来计算平均值一样。我会 考虑开发针对您的问题的库

当前解决方案有什么问题?

当存在当前解决方案时,通常会产生诸如框架之类的通用概念,但是有一种方法可以更有效地与之交互。将糟糕的代码或设计隐藏在某种抽象的幕后是一个非常糟糕的主意。如果当前的解决方案运行良好但它的实现似乎有问题,我会从重构现有代码开始,而不是从头开始重写或隐藏它。

是否是反复出现的问题?

通用件最有价值的特性之一是可重用性。构建通用但有用的东西总是要困难得多。更难意味着昂贵,所以你必须证明在构建通用块上浪费时间是合理的。如果您不或不能在多个地方使用昂贵的块,您可能不需要它们,最好开发具体的解决方案。


我之所以划出这些问题是因为我经常看到代码的开发者称之为框架并投入了大量的时间和精力,但他最终做了一些不是框架的事情,最重要的是,首先不应该是一个。

所以,我们到了你问题的第一部分:

Is there a reference to design and implement a framework? What are the characteristics of a framework? And what features should be?

在这里为您提供框架专有的设计指南和功能列表是合适的,但我认为这不是一个好主意。原因如下:没有 ISO 或任何其他官方或广泛使用的软件框架开发标准。那是因为 框架没有解决特定问题,它提供了解决问题的方法 - 这是它最重要的功能。

关于框架的一个非常普遍的误解是它们必须绝对透明并且应该能够适应任何需要。框架开发人员和用户必须明白,框架在某些方面是硬连线的。那不是因为你不能这样做。你可以,这叫做元编程。原因是框架暗示了一种不变的内部行为,通常称为 "core of framework"。对于客户端来说,有一种方法可以扩展这种行为而不是修改它可能会很有用。

要点是,框架必须规定客户端如何与环境交互。更严格地说,当客户端在框架内运行时,控制流有点颠倒:框架评估客户端的代码并进行适当的调用,现在调用客户端的是框架,而不是相反,就像普通库一样.当然,可能会有一些例外,但我在这里说的是总体思路。

那你问:

What requisites must be covered?

正如您可能已经想到的那样,没有严格的要求。但是我想建议的东西很少:

  • 作为一个整体的框架应该完全代表一个特定的域(领域),但它不应该超出它。这意味着,如果你的框架做财务分析,它可能不应该做天气预报,也应该是一个闹钟
  • 框架应该有某种domain-specific language。以哪种形式并不重要。它可以只是客户端操作的特定于域的对象、命名约定和适当的间接级别(抽象),或者如果你愿意,你可以一路走下去,并在其中创建一种带有自己的解释器的编程语言。这只是客户端与更接近的东西交互的想法,例如,财务条款和操作,而不是一些抽象处理程序、指针和函数
  • 这应该是显而易见的,但不提它会很粗心:在处理一般问题时总是计划扩展和扩展。只要不与最初计划的行为相矛盾,实施和添加新东西应该不会太难(我不说容易),但要小心,不要太深入元编程

你问题的最后一部分是:

Are the ORM associated with the Framework?

好吧,是的,也不是。如果您的框架依赖于并非特定于每个实例的数据存储,那么您应该对此进行某种抽象。在这种情况下,ORM 可能是最好的方法,但我想指出以下几点:

  • 还有其他(可能不那么灵活)抽象数据存储的方法
  • ORM 意味着您正在操作对象(即 OO 语言),这并不总是正确的
  • ORM 技术本身的问题完全是另一个话题,但我相信这些 "hitches" 可能在某些方面与您的框架不兼容

好的,你的问题就这些了,但如果你决定开发一个合适的框架,我想添加一些提示:

  • 不要忘记你开发的是解决问题的方法,而不是解决方案本身
  • 不要尝试"solve it all",意思是不要忘记你正在解决什么问题。你无法解决所有问题,无论如何都不能在一个解决方案中解决
  • 不要专注于不必要的功能或被不必要的功能分散注意力,尤其是在早期
  • 找一个你打算编码的领域的专家,他可能会洞察什么是需要的,什么不是
  • 我发现采用 feature-driven development 流程来完成这种工作真的很方便,因为框架包含大量功能,如果您的方法不可靠,这些功能会使您分散精力,从而导致一定的失败.尤其是如果你打算独自完成,看到迭代的工作结果是一种激励