什么是软件框架?[关闭]


193

有人可以解释一下什么是软件框架吗?我们为什么需要一个框架?框架做什么使编程更容易?

Answers:


422

我很迟才回答。但是,我想分享一个例子,我今天才想到。如果我告诉过您切一张5m x 5m的纸,那么您肯定会这样做。但是,假设我要您削减1000张相同尺寸的纸张。在这种情况下,您将无法进行1000次测量。显然,您将制作一个5m x 5m的框架,然后借助它,您可以在更少的时间内切割1000张纸。因此,您要做的是建立一个可以执行特定类型任务的框架。您无需创建对同一类型的应用程序一次又一次地执行相同类型的任务,而是创建一个框架,将所有这些功能组合在一个漂亮的数据包中,从而为您的应用程序(更重要的是为许多应用程序)提供抽象。


27
我想知道拒绝投票的原因。它会帮助我改善它。
Neha Choudhary 2014年

4
很酷,很容易理解...........谢谢你
Premkumar 2014年

25
@NehaChoudhary,不是我,但是他-1是因为您在说的是一个库,而不是一个框架,因为没有IoC。
Pacerier,2014年

11
我已经阅读了您的帖子,但是您发布的内容听起来像是图书馆可以做什么。如何解释框架和库之间的区别?
刘亚伦

2
我不明白 根据您的解释,这更像是图书馆吗?
路由器

92

从技术上讲,您不需要框架。如果您要制作一个真正非常简单的网站(可以回想起1992年的网络),则可以使用硬编码的HTML和一些CSS来完成所有工作。

而且,如果您要制作现代的Web应用程序,则实际上也不需要使用任何框架。

您可以选择每次都编写自己需要的所有逻辑。您可以编写自己的数据持久性/存储层,或者-如果您太忙-只需为每个数据库访问编写自定义SQL。您可以编写自己的身份验证和会话处理层。和您自己的模板发布逻辑。还有您自己的异常处理逻辑。和您自己的安全功能。还有您自己的单元测试框架,以确保一切正常。和你自己的... [持续了很长时间]

再说一次,如果您确实使用了框架,那么您将可以受益于数十名(如果不是数百名)其他开发人员的出色,通常经过同行评审和经过良好测试的工作,他们可能比您更好。您将可以快速构建自己想要的东西,而不必花费时间来构建或过多担心上面列出的基础架构项目。

您可以在更短的时间内完成更多工作,并且知道您正在使用或扩展的框架代码比您自己完成的工作更有可能完成。

以及这的成本?花一些时间学习框架。但是-几乎每个Web开发人员都会证明-绝对值得花时间学习使用所选的任何框架来获得巨大(确实是巨大的)收益。


17
为什么不把精力投入到开放源代码框架中,而不是抨击自己的东西呢?“我们可以独自搬石头。我们可以一起搬山”和所有这些
史蒂夫·贾利姆

7
@Jefffrey“那您将如何学习?您将如何成长为一名程序员?” 了解您想要的知识,但是如果您打算为真正的客户工作,则应在最短的时间内提供最佳的解决方案。您的“可能是错误的”代码是不可接受的。
Cmorales 2013年

6
@Cmorales,如果您想学习编程语言或任何特定领域的问题,那么您肯定不会有任何“真正的”客户(并且您可能会有很多时间在手),就是为什么我建议新手不是从框架开始。
Shoe

3
@Jefffrey您在评论中没有提到任何关于新手的信息,这很笼统。我同意您应该首先学习自己的知识,但是您的评论并未说明这一点,在现实(工作)生活中,您无法仅使用错误代码来学习。我认识一些不使用框架的人,因为他们认为他们更了解……并且每个项目花费两倍的时间。
Cmorales 2013年

1
@Cmorales我也认识一些使用框架的人,但每个项目花费的时间却是两倍。编程速度并不总是与所使用的工具有关。
Cypher

53

Wikipedia(软件框架)的摘要(第一个由Google推荐的btw)对其进行了很好的解释:

在计算机编程中,软件框架是一种抽象,其中提供通用功能的通用代码可以由提供特定功能的用户代码选择性地覆盖或专门化。框架是软件库的一种特殊情况,因为它们是包装在定义良好的应用程序编程接口(API)中的可重用代码抽象,但是它们包含一些与众不同的关键区别功能。

软件框架具有以下与众不同的功能,可将它们与库或普通用户应用程序分开:

  1. 控制反转 -在框架中,与库或普通用户应用程序不同,整个程序的控制流不是由调用者决定,而是由框架决定。[1]
  2. 默认行为 -框架具有默认行为。此默认行为实际上必须是一些有用的行为,而不是一系列的无操作。
  3. 可扩展性 -框架通常可以由用户通过选择性覆盖来扩展,也可以由提供特定功能的用户代码来专门化。
  4. 不可修改的框架代码 -通常不允许修改框架代码。用户可以扩展框架,但不能修改其代码。

您可能会“需要”它,因为它包含许多已经编写和测试的功能,因此在开发应用程序时可能为您提供一个捷径。原因与我们使用软件库的原因非常相似。


13
根据问题的类型,答案的白色部分比灰色部分要好得多
OlimilOops 2010年

我很确定提出这个问题的人也找到了Wikipedia条目...他/她可能正在寻找更全面的答案。
Stophface

31

已经有很多好的答案,但是让我看看是否可以给您另一个观点。

相当简化,您可以将框架视为除实际功能之外完整的应用程序。您插入了功能和PRESTO!您有一个应用程序。

考虑一个GUI框架。该框架包含制作应用程序所需的一切。确实,您经常可以用很少的源代码来完成一个最小的应用程序,而该源代码几乎什么也不做,但是它确实为您提供了窗口管理,子窗口管理,菜单,按钮栏等。这就是框架方面的内容。通过添加您的应用程序功能并将其“插入”到框架中的正确位置,您可以将此无用的应用程序(除了窗口管理等)变成一个真正的功能完善的应用程序。

对于Web应用程序,服务器端应用程序等,有类似类型的框架。在每种情况下,框架都(但愿)提供大量繁琐且重复的代码,同时提供实际的问题域功能。(这是理想的选择。实际上,实际上,框架的成功是高度可变的。)

我再次强调,这是框架的简化视图。尽管大多数框架都内置了此类可怕的概念,但我并未使用诸如“控制反转”之类的可怕术语。由于您是初学者,所以我想我会为您省去行话,并且要简单明了。


14

我不确定是否有“框架”的明确定义。有时,大量的库称为框架,但我认为该词的典型用法更接近于aioobe带来的定义。

这篇非常不错的文章总结了一组库和一个框架之间的区别:

框架可以定义为一组说“不要打电话给我们,我们会打电话给您”的库。

框架如何为您提供帮助?因为您基本上不需要扩展任何内容,而是基本上扩展了给定的,可运行的应用程序。这样,您将获得很大的生产力-有时所生成的应用程序比您在同一时间范围内自己完成的应用程序要复杂得多-但是您通常会以很大的灵活性进行交易。


8

一个简单的解释是:框架是一个支架,您可以围绕它构建应用程序。

框架通常提供一些基本功能,您可以使用这些功能并将其扩展以制作更复杂的应用程序,其中存在用于各种事物的框架。微软的MVC框架就是一个很好的例子。它提供了使用MVC模式启动地面建筑网站所需的一切,它可以处理Web请求,路线等。您要做的就是实现“控制器”并提供“视图”,这是MVC框架定义的两个构造。然后,MVC框架处理调用您的控制器并呈现您的视图。

也许不是最好的措辞,但我希望它能有所帮助


1
事实上,它更像是构建应用程序脚手架比围绕它。
约尔格W¯¯米塔格

4

在最低层次上,框架是一个环境,为您提供了一组可以使用的工具

该工具以库,配置文件等形式出现。

这个所谓的“环境”为您提供了基本设置(错误报告,日志文件,语言设置等)...可以对其进行修改,扩展和构建。

人们实际上不需要框架,这只是想节省时间,而其他人则只是个人喜好。

人们会证明使用框架是合理的,您不必从头开始编写代码。但是,这些只是人们将库与框架混淆了。

我在这里没有偏见,实际上我现在正在使用一个框架。


4

一般而言,框架是真实的或概念性的结构,旨在作为建筑物的支持或指南,以将结构扩展为有用的东西...


2

框架为特定问题区域提供功能/解决方案。
来自Wiki的定义:

在计算机编程中,软件框架是一种抽象,其中提供通用功能的通用代码可以由提供特定功能的用户代码选择性地覆盖或专用。框架是软件库的一种特殊情况,因为它们是包装在定义良好的应用程序编程接口(API)中的可重用代码抽象,但是它们包含一些与众不同的关键区别功能。


第一句中有一个词“抽象”。你是什​​么意思 ?我们在哪里使用抽象?
Kumaresan Perumal'5

2

框架可以帮助我们使用“已经创建的”,隐喻可以像:

认为地球材料是编程语言,

例如,“照相机”就是程序,您决定创建一个笔记本。您无需每次都重新创建摄像头,只需使用Earth框架(例如到技术商店)将摄像头集成到笔记本中即可。


2

框架具有您可能需要的一些功能。您可能需要某种具有内置排序机制的数组。或者也许您需要一个窗口,您想在其中放置一些控件,这些控件可以在框架中找到。这是一种围绕您自己的作品的框架。

编辑:好的,我要去挖掘你们想告诉我的内容;)在此之前,您可能还没有注意到“跨越一个框架的工作...”两行之间的信息。我希望对此有所发言,以使您满意:
我在这里http://ifacethoughts.net/2007/06/04/difference-between-很好地解释了“库与框架之间的差异”问题。
库和框架/


完全不理解不赞成票...我对此完全感到震惊。这个问题是初学者的基本问题,我的回答是根据这个相当好的……
OlimilOops 2010年

4
需要明确的是:我没有拒绝投票。但是,您所谈论的要比框架所关注的要低得多。例如,集合和排序算法比框架更多的是标准库。
bakkal 2010年

1
感谢您的回答,但...这不是我的问题的答案。根据OP的疑问,在“标准库”和“框架”之间进行区分是错误的地方。例如,在.net-framework中,您可以在框架的一部分中找到名称空间集合,我从未听说过有人说名称空间集合不是.netframework的一部分。所以您对我的问题的回答是错误的
OlimilOops 2010年

1
这是的定义。它错过了与库相反的框架的鲜明特征:控制反转
约尔格W¯¯米塔格

2

除了定义(有时只有在您已经理解的情况下才是可以理解的)之外,一个示例对我有所帮助。

我想在偏爱.Net中的列表排序时会有所了解。提供功能的框架示例,该功能由提供特定功能的用户代码量身定制。以List.Sort(IComparer)。排序算法(位于Sort方法中的.Net框架中)需要进行一系列比较。对象A在对象B之前还是之后?但是Sort本身不知道如何进行比较。只有被排序的类型知道这一点。您无法编写一种比较排序算法,该算法可以被许多用户重用,并且可以预期您将被要求进行排序的所有各种类型。您必须将这部分工作留给用户本身。因此,这里又称框架,即排序,它调用用户代码中的一个方法,该类型被排序以便可以进行比较。(或者可以使用委托;

我说对了吗?

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.