【发布时间】:2011-02-27 04:38:42
【问题描述】:
谁能解释一下什么是软件框架?为什么我们需要一个框架?框架如何让编程更容易?
【问题讨论】:
标签: frameworks software-design
谁能解释一下什么是软件框架?为什么我们需要一个框架?框架如何让编程更容易?
【问题讨论】:
标签: frameworks software-design
我很晚才回答。但是,我想分享一个我今天才想到的例子。如果我告诉你剪一张尺寸为 5m x 5m 的纸,那么你肯定会那样做。但假设我让你剪 1000 张相同尺寸的纸。在这种情况下,您不会进行 1000 次测量;显然,你可以制作一个 5m x 5m 的框架,然后在它的帮助下,你可以在更短的时间内裁切 1000 张纸。因此,您所做的是创建一个可以执行特定类型任务的框架。您无需为相同类型的应用程序一次又一次地执行相同类型的任务,而是创建一个框架,将所有这些设施集中在一个漂亮的数据包中,从而为您的应用程序,更重要的是为许多应用程序提供抽象。
【讨论】:
从技术上讲,您不需要框架。如果您正在创建一个非常简单的网站(想想 1992 年的网络),您可以使用硬编码的 HTML 和一些 CSS 来完成所有工作。
如果你想制作一个现代的 web 应用程序,你实际上也需要为此使用框架。
您可以选择每次都自己编写所有需要的逻辑。 您可以编写自己的数据持久性/存储层,或者 - 如果您太忙 - 只需为每个数据库访问编写自定义 SQL。 您可以编写自己的身份验证和会话处理层。 以及您自己的模板渲染逻辑。 以及您自己的异常处理逻辑。 以及您自己的安全功能。 以及您自己的单元测试框架,以确保一切正常。 还有你自己的……[持续了很长时间]
再说一次,如果您确实使用框架,那么您将能够从数十个通常经过同行评审和经过良好测试的优秀作品中受益,如果不是数百名其他开发人员,他们很可能比你更好。您可以快速构建您想要的东西,而无需花费时间构建或过多担心上面列出的基础设施项目。
您可以在更短的时间内完成更多工作,并且知道您正在使用或扩展的框架代码很可能比您自己做的更好。
这要花多少钱?花一些时间学习框架。但是 - 几乎每个网络开发人员都会证明 - 花时间学习从使用您选择的任何框架中获得巨大(真正巨大)的好处是绝对值得的。
【讨论】:
一般来说,框架作品是真实的或概念性的结构,旨在作为建筑的支撑或指导,将结构扩展为有用的东西......
【讨论】:
除了定义,有时只有你已经理解才能理解,一个例子帮助了我。
我想在 .Net 中对列表进行排序时,我有了一丝理解;提供由提供特定功能的用户代码定制的功能的框架示例。取 List.Sort(IComparer)。排序算法,驻留在.Net框架中的Sort方法中,需要做一系列的比较;对象 A 在对象 B 之前还是之后?但是 Sort 本身不知道如何进行比较;只有被排序的类型知道这一点。您无法编写一个可供许多用户重复使用的比较排序算法,并且无法预测您将被要求进行排序的所有各种类型。您必须将这部分工作留给用户自己。所以在这里,排序,也就是框架,回调用户代码中的一个方法,类型被排序,所以它可以进行比较。 (或者可以使用委托;同样的观点。)
我做对了吗?
【讨论】:
已经有很多很好的答案了,但让我看看能不能给你另一个观点。
通过相当多的简化,您可以将框架视为除了实际功能之外的完整应用程序。您插入功能和 PRESTO!你有一个应用程序。
例如,考虑一个 GUI 框架。该框架包含制作应用程序所需的一切。实际上,您通常可以用很少的源代码行轻松地创建一个最小的应用程序,它完全什么都不做——但它确实为您提供了窗口管理、子窗口管理、菜单、按钮栏等。这就是框架方面的事情。通过添加您的应用程序功能并将其“插入”到框架中的正确位置,您可以将这个只做窗口管理等的空应用程序变成一个真正的、成熟的应用程序。
对于 Web 应用程序、服务器端应用程序等,存在类似类型的框架。在每种情况下,框架都提供了大量繁琐、重复的代码(希望如此),而您提供实际的问题域功能。 (这是理想状态。在现实中,当然,框架的成功是高度可变的。)
我再次强调,这是框架的简化视图。我没有使用“控制反转”之类的可怕术语,尽管大多数框架都内置了这些可怕的概念。既然你是初学者,我想我会省去你的行话,用一个简单的比喻。
【讨论】:
框架具有您可能需要的一些功能。您可能需要某种具有内置排序机制的数组。或者,也许您需要一个窗口来放置一些控件,所有这些都可以在框架中找到。这是一种跨越你自己工作的框架的工作。
编辑:
好的,我正要挖掘你们试图告诉我的内容;)您可能还没有注意到“跨越框架的工作......”这行之间的信息
在这变得越来越深之前。我试着给它一个发言权,希望你能优雅地:
很好地解释了我在这里找到的“库和框架之间的区别”问题
http://ifacethoughts.net/2007/06/04/difference-between-a-library-and-a-framework/
【讨论】:
我不确定“框架”是否有明确的定义。有时一大套库被称为框架,但我认为这个词的典型用法更接近aioobe带来的定义。
这个very nice article 总结了一组库和一个框架之间的区别:
一个框架可以定义为一组库,上面写着“不要打电话给我们,我们会打电话给你。”
框架对您有何帮助?因为您基本上只是扩展了一个给定的工作应用程序,而不是从头开始编写一些东西。通过这种方式,您可以提高工作效率 - 有时生成的应用程序可能比您在同一时间框架内自己完成的要复杂得多 - 但您通常会牺牲很多灵活性。
【讨论】:
一个框架可以帮助我们使用“已经创建”,一个比喻可以是,
认为地球材料是编程语言,
例如,“相机”是程序,您决定创建一个笔记本。您不需要每次都重新创建相机,您只需使用地球框架(例如到技术商店)将相机并将其集成到您的笔记本中。
【讨论】:
在最低级别,框架是一个环境,您可以在其中使用一组工具
这些工具以库、配置文件等形式出现。
这个所谓的“环境”为您提供基本设置(错误报告、日志文件、语言设置等)...可以修改、扩展和构建。
人们其实并不需要框架,只是想节省时间,其他的只是个人喜好问题。
人们会证明,有了框架,您就不必从头开始编写代码。但这些只是人们将库与框架混淆。
我在这里没有偏见,我现在实际上正在使用一个框架。
【讨论】:
一个简单的解释是:框架是一个脚手架,您可以围绕它构建应用程序。
框架通常提供一些基本功能,您可以使用和扩展这些功能以制作更复杂的应用程序,有各种框架可以满足各种需求。 Microsoft 的 MVC 框架就是一个很好的例子。它提供了使用 MVC 模式开始构建网站所需的一切,它处理 Web 请求、路由等。您所要做的就是实现“控制器”并提供“视图”,这是 MVC 框架定义的两个结构。然后 MVC 框架处理调用您的控制器并呈现您的视图。
也许不是最好的措辞,但我希望它有所帮助
【讨论】:
框架为特定问题领域提供功能/解决方案。
来自wiki的定义:
计算机中的软件框架 编程,是一种抽象 哪些通用代码提供通用 功能可以有选择地 被用户代码覆盖或专门化 提供特定的功能。 框架是一个特例 软件库,因为它们是 封装的代码的可重用抽象 在定义明确的应用程序中 编程接口 (API),但它们 包含一些关键区别 将它们与 普通图书馆。
【讨论】:
The summary at Wikipedia (Software Framework)(顺便说一句,谷歌第一次点击)解释得很好:
在计算机编程中,软件框架是一种抽象,其中提供通用功能的通用代码可以被提供特定功能的用户代码选择性地覆盖或专门化。框架是软件库的一种特殊情况,因为它们是封装在定义良好的应用程序编程接口 (API) 中的代码的可重用抽象,但它们包含一些将它们与普通库区分开来的关键区别特征。
软件框架具有将它们与库或普通用户应用程序区分开来的这些显着特征:
- 控制反转 - 在框架中,与库或普通用户应用程序不同,整个程序的控制流不是由调用者决定,而是由框架决定。[1]
- 默认行为 - 框架具有默认行为。此默认行为实际上必须是一些有用的行为,而不是一系列无操作。
- 可扩展性 - 用户通常可以通过选择性覆盖或由提供特定功能的用户代码专门化来扩展框架。
- 不可修改的框架代码 - 一般情况下,框架代码是不允许修改的。用户可以扩展框架,但不能修改其代码。
您可能“需要”它,因为它可以在开发应用程序时为您提供一个很好的捷径,因为它包含许多已经编写和测试过的功能。原因和我们使用软件库的原因很相似。
【讨论】:
Templates 的内容。否则,您将无法真正理解“选择性覆盖”或“专业化”等术语所暗示的含义。