什么是软件框架?

206

请问有人能解释一下什么是软件框架吗?我们为什么需要框架?框架如何使编程变得更容易?

12个回答

440

我回答晚了,但我想分享一个今天才想到的例子。如果我让你剪一张尺寸为5米乘5米的纸,你肯定可以做到。但是如果我让你剪1000张相同尺寸的纸,那么你不会测量1000次;显然,你会制作一个5米乘5米的框架,然后借助它,在更短的时间内完成剪切1000张纸的任务。因此,你所做的是创建一个可以执行特定类型任务的框架。而不是为相同类型的应用程序反复执行相同类型的任务,你可以创建一个框架,将所有这些功能一起打包,从而为你的应用程序提供抽象,并且更重要的是适用于很多应用程序。


29
我想知道为什么有人给我的回答投了反对票,这将有助于我改进它。 - Neha Choudhary
4
很酷,非常易懂...........非常感谢。 - Premkumar
27
不是我,而是他收到了-1的评分,因为你所说的是一个库,而不是一个框架,因为没有控制反转(IoC)。 - Pacerier
13
我读了你的帖子,但是你发表的内容听起来像图书馆可以做到的事情。那么能否解释一下框架和库之间的区别呢? - Aaron Liu
2
我不理解。从你解释的内容来看,那更像是一个库,对吗? - router
显示剩余17条评论

96

从技术层面上讲,你并不需要使用框架。如果你制作一个非常简单的网站(想想1992年的网络),你可以只使用硬编码HTML和一些CSS来完成。

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

你可以选择每次都自己编写所需的逻辑。 你可以编写自己的数据持久化/存储层,或者 - 如果你太忙了 - 为每个数据库访问编写自定义SQL。 您可以编写自己的身份验证和会话处理层。 还有自己的模板渲染逻辑。 还有自己的异常处理逻辑。 还有自己的安全功能。 还有自己的单元测试框架,以确保所有工作都正常运行。 以及你自己的... [长篇累牍]

然而,如果你使用框架,你将能够受益于许多其他开发人员的良好、通常经过同行评审和非常经过测试的工作,他们可能比你更优秀。你将能够快速构建想要的内容,无需花费时间构建或过多担心上述基础架构问题。

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

这需要的代价是什么?花一些时间学习框架。但是,几乎每个Web开发人员都会证明,从你选择的任何框架中学习所花费的时间绝对值得(真的非常值得)。


20
为什么不把那份精力投入到开源框架的贡献中,而是去搭建自己的东西呢?“一个人可以推动石头,但一起我们可以移动山脉”之类的。 - Steve Jalim
8
“那你将如何学习?如何成长为一名程序员?” 你可以自行选择学习方式,但如果你打算为真正的客户工作,就应该在最短的时间内提供最好的解决方案。而你的“可能存在错误”的代码是无法被接受的。 - Cmorales
6
如果你想要学习编程语言或者某个特定的领域问题,那么你肯定不会有任何“真正”的客户(而且你可能会有很多时间),这就是为什么我建议新手不要从框架开始学起。请注意,这句话的重点是建议新手不要从框架开始学起,同时强调了缺乏实际项目经验的新手在学习过程中需要专注于基础知识和语言本身。 - Shoe
3
@Jeffrey在评论中没有提到新手,而是一般性发言。我同意你应该先自己学习,但是你的评论没有明确说明这一点,在现实(工作)生活中你不能因为学习而使用有问题的代码。我知道一些人不使用框架,因为他们认为他们自己更懂……结果每个项目要花费两倍的时间。 - Cmorales
1
@Cmorales 我也认识一些使用框架的人,但每个项目所需的时间却是原来的两倍。编程速度并不总是与所使用的工具有关。 - Cypher
显示剩余3条评论

58

维基百科关于软件框架的概述(顺便说一下,这是谷歌的第一条搜索结果)解释得非常清楚:

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

软件框架具有以下与库或普通用户应用程序不同之处:

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

你可能“需要”它,因为它可以为您在开发应用程序时提供很大的捷径,因为它包含了大量已经编写和测试过的功能。这个原因与我们使用软件库的原因非常相似。


13
你的答案中白色部分比灰色部分更好,根据问题类型而言... - OlimilOops
1
我很确定提问的人已经找到了维基百科的条目... 他/她可能在寻找更全面的答案。 - four-eyes
面向对象编程 -- 我认为要真正理解这个概念,需要先了解类似于C++中的“模板”或类似的东西。如果没有这方面的知识,你就不会真正理解“选择性覆盖”或“专门化”等术语所暗示的含义。 - Elliptical view

32
很多好的答案已经存在,但是让我来分享另一个视角。
简化一下,你可以将框架视为一个完整的应用程序,除了实际功能之外。你插入功能,PRESTO!你就有了一个应用程序。
考虑一下GUI框架。框架包含使应用程序运行所需的所有内容。事实上,你通常可以使用非常少的源代码行轻松制作一个不执行任何操作的最小应用程序,但它确实提供了窗口管理、子窗口管理、菜单、按钮栏等。这就是框架的一面。通过将应用程序功能添加并“插入”到框架中的正确位置,您可以将此空应用程序转换为真正的、完整的应用程序。
类似的框架也适用于Web应用程序、服务器端应用程序等等。在每种情况下,框架提供大部分繁琐、重复的代码(希望如此),而您提供实际问题域功能。(这是理想情况。当然,实际上,框架的成功率高度不确定。)
我再次强调,这是框架的简化视图。我没有使用像“Inversion of Control”之类的可怕术语,尽管大多数框架都内置了这些可怕的概念。由于您是初学者,我认为我可以省略这些术语,而选择一个易懂的比喻。

15

“框架”没有一个清晰的定义。有时候,一大堆库被称为框架,但我认为这个词的典型用法更接近aioobe所提出的定义。

这篇非常好的文章总结了仅是一组库与框架之间的区别:

框架可以被定义为一组库,其说:“别打电话给我们,我们会给你打电话。”

一个框架如何帮助您?因为您基本上只需扩展给定的可工作应用程序,而无需从头编写。这样做可以获得很多生产力——有时候,结果的应用程序可能会比您在相同时间内单独完成的要复杂得多——但通常会牺牲许多灵活性。


8
一个简单的解释是:框架是一个脚手架,你可以在其基础上构建应用程序。
框架通常提供一些基本功能,你可以使用和扩展这些功能以制作更复杂的应用程序,有各种各样的框架。微软的MVC框架就是一个很好的例子。它提供了构建使用MVC模式的网站所需的一切,处理Web请求、路由等等。你只需要实现"MVC框架"定义的两个结构:"控制器"和"视图"。MVC框架然后处理调用你的控制器和呈现你的视图。
也许不是最好的措辞,但希望能帮助到您。

1
实际上,更像是将应用程序构建到脚手架中而不是围绕它构建。 - Jörg W Mittag

6
在最基本的层面上,一个框架是一个环境,在这个环境里,你会得到一组工具来进行工作。
这些工具以库、配置文件等形式呈现。
这个所谓的“环境”为你提供了基本设置(错误报告、日志文件、语言设置等),可以修改、扩展和构建。
实际上,人们并不需要框架,只是想节省时间,或出于个人偏好。
人们会认为使用框架可以避免从头开始编写代码,但这只是混淆了库和框架的人的观点。
我这里并没有偏见,实际上我正在使用一个框架。

4

通常,框架是一个实体或概念性结构,旨在作为支持或指南,用于建造一些将结构扩展为有用东西的物品...


2
一个框架有一些你可能需要的功能。你可能需要一些内置排序机制的数组,或者你需要一个窗口来放置一些控件,所有这些你都可以在一个框架中找到。它是一种将一个框架围绕你自己的工作的工作方式。
编辑: 好的,我马上就要挖掘你们试图告诉我的内容了 ;) 也许你们没有注意到“将一个框架围绕...”这些行之间的信息,在这之前已经越来越深了。我试着给它提供一个平台,希望你们能优雅地处理:
关于“库和框架之间的区别”的好解释我在这里找到了
http://ifacethoughts.net/2007/06/04/difference-between-a-library-and-a-framework/

完全不理解这些踩的意思...我对此感到非常震惊。问题是初学者基础问题,我的回答也相当不错... - OlimilOops
4
要明确一点:我没有给你的帖子点踩。不过,你所谈论的内容比一个框架关注的要低得多。例如,集合和排序算法更像是标准库,而不是框架。 - bakkal
1
感谢您的回答,但是...它并不是我问题的答案。根据OP的问题,区分“标准库”和“框架”在这里是错误的。例如,在.NET框架中,您可以在我从未听说过的框架部分中找到命名空间集合,因此您对我的问题的回答是错误的。 - OlimilOops
1
这是一个的定义。它缺少了框架与库的区别所在:控制反转 - Jörg W Mittag

2
一个框架提供了特定问题领域的功能和解决方案。
维基百科定义如下:

计算机编程中,软件框架是一个抽象层,其中通用功能的公共代码可以被用户代码选择性地覆盖或专业化。框架是软件库的一种特殊情况,它们是包装在定义良好的应用程序编程接口(API)中的可重用代码抽象,但它们包含一些关键的区别特征,使它们与普通库分开。


第一句话中有一个词“抽象”。你指的是什么?我们在哪里使用抽象? - Kumaresan Perumal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接