什么是微软的 Application Framework?

我是荔园微风,作为一名在IT界整整25年的老兵,今天来看一下什么是微软的 Application Framework?

到底什么是 Application Framework?

我当年学习这个的时候也困惑了好久,于是一直在搜索这个概念有没有好的解释,结果整个互联网都没有好的解释,我是很困惑这个事情的,为什么没有高手来写一段。今天我决定专门来写一写这个问题。对于很多初学者来说,在还没有真正掌握任何一套Application Framework的使用之前,就来研究这个真的不是很明智,尤其如果你对面向对象还没有深刻体会的话。但如果你已经看到这里那就看下去,希望对你有帮助。

一、知名杂志的说法

首先我们看看侯捷在《程序员》杂志上的无责任书评中是怎么说的:演化(evolution)永远在进行,但这个世界却不是每天都有革命性(revolution) 的事物发生。动不动宣称自己(或自己的产品)是划时代的革命性的,带来的影响就像时下满街跑的大师一样使我们渐渐无动于衷,因为大师不可能满街跑。 但是Application Framework 的的确确在我们软件界称得上具有革命精神。

什么是Application Framework?Framework这个字眼有组织、框架、体制的意思,Application Framework不仅是一般性的泛称,它其实还是面向对象领域中的一个专有名词。

基本上你可以说,Application Framework是一个完整的程序模型,具备标准应用软件所需的一切基本功能,像是文件存取、打印预览、数据交换......以及这些功能的使用接口(工具栏、状态栏、菜单、对话框)。如果更以术语来说,Application Framework 就是由一整组合作无间的对象架构起来的大模型。喔不不,当它还没有与你的程序产生作用的时候,它还只是有形无体,应该说是一组合作无间的类架构起来的大模型。

这带来什么好处呢?程序员只要带个购物袋到类超级市场采买,随你要买MDI或OLE或ODBC或Printing Preview,回家后就可以轻易拼凑出一个色香味俱全的大餐。

类超级市场就是C++ 类库,以产品而言,在Microsoft 是MFC,在Borland 是OWL,在IBM则是OpenClass。这个类库不只是类库而已,传统的函数库(C Runtime 或 Windows API)乃至于一般类库提供的是生鲜超市中的一条鱼一支葱一颗大白菜,彼此之间没有什么关联,负责当大厨的你必须自己选材自己调理。

能够称得上Application Framework 者,提供的是拼盘(就是那种带回家通通丢下锅就好的那种),依你要的是白菜火锅鱼头拼盘或是麻辣拼盘,菜色带调理包都给你配好。当然这样的拼盘是不能够就地吃的,你得给它加点能量。这能量就是所谓的application object(在 MFC 程序中就是派生自 CWinApp 的一个全局对象)。是这个对象引起了连锁反应(一连串的 'new'),使每一个形(类)有了真正的体(对象),把应用程序以及 Application Framework 整个带动起来。一切因缘全由是起。

 Application Framework 带来的是,程序模型已经存在,程序员只要依个人需求加料就好:在派生类中改写虚函数,或在派生类中加上新的成员函数。这很像你在拼盘中依个人口味加盐添醋。

由于程序代码的初期规模十分一致(什么样风格的程序应该使用什么类,是一成不变的),而修改程序以符合私人需要的基本动作也很一致(我是指像开辟一个空的骨干函数这种事情),你动不了 Application Framework 的大架构,也不需要动。这是福利不是约束。

应用程序代码骨干一致化的结果,使优越的软件开发工具如 CASE(Computer Aid Software Engineering)tool 容易开发出来。你的程序代码大架构掌握在 Application Framework 设计者手上,于是他们就有能力制作出整合开发环境( Integrated Development Environment,IDE)了。这也是为什么 Microsoft、Borland、Symantec、Watcom、IBM 等公司的集成开发环境进步得如此令人咋舌的原因了。

有人说工学院中唯一保有人文气息的只剩建筑系,我总觉得信息系也勉强可以算上。带艺术气息的软件创作行为(我一直是这么认为的)将在 Application Framework 出现后逐渐成为工匠技术,而我们都将只是软件 IC 装配厂里的男工女工。其实也没什么好顾影自怜,功成名就的冠冕从来也不曾落在程序员头上;我们可能像纽约街头的工作者,自认为艺术家,可别人怎么看呢?不得而知!话说回来,把开发软件这件事情从艺术降格到工技,对人类只有好处没有坏处。不是亨利福特,我们又如何能够享受大众化的汽车?或许以后会出现「纯手工精制」的软件,谁感兴趣不得而知,我自己嘛...唔...倒是从来不嫌机器馒头难吃。

如果要三言两语点出 Application Framework 的特质,我会这么说:我们挖出别人早写好的一整套模块(MFC 或 OWL 或 OpenClass)之中的一部分,给个引子(application object)使它们一一具象化动起来,并被允许修改其中某些零件使这程序更符合私人需求,如是而已。

看了以上他说的内容,是不是一下子就明白了,不得不佩服啊。

二、普通程序员的说法

侯捷的这一段话实在已经点出Application Framework的精神。凝聚性强、组织化强的类库就是 Application Framework。一组合作无间的对象,彼此间靠消息的流动而沟通,并且互相调用对方的函数以求完成任务,这就是 Application Framework。对象存在哪里?在MFC中?MFC的各个类只是对象属性(行为)的定义而已,我们不能够说 MFC 中有实际的对象存在。唯有当程序被application object(这是一个派生自 MFC CWinApp 的全局对象)引出,才将我们选用的类一一具象化起来,产生实体并开始动作。

这样子说吧,静态情况下MFC 是一组类库,但在程序运行时期它就生出了一群有活动力的对象组。最重要的一点是,这些对象之间的关系早已建立好,不必程序员操心。好比说当用户按下菜单的【File/Open】项,开文件对话框就会打开;用户选好文件名后,Application Framework 就开始对着你的数据类,唤起一个名为Serialize 的特殊函数。这整个机制都埋好了,你只要把心力放在那个叫作 Serialize 的函数上即可。

选用标准的类,做出来的产品当然就没有什么特色,因为别人的零件和你的相同,做起来的成品也就一样。我指的是用户接口(UI)对象。但你要知道,软件工业发展到现阶段,UI 已经渐渐走上标准化了。软件一决胜负的关键在数据的处理。事实上,在真正做事这一点上,整个application framework 是无能为力的,也就是说对于数据结构的安排,数据的处理,数据的显示,Application Framework 所能提供的,无一不是单单一个空壳而已——在 C++ 语言来讲就是个虚函数。软件开发人员必须想办法改造(override)这些虚函数,才能符合个人所需。基于 C++ 语言的特性,我们很容易继承既有之类并加上自己的特色,这就是面向对象程序设计的主要精神。也因此,C++ 语言中有关于「继承」性质的份量,在MFC程序设计里头占有很重的比例,在学习使用MFC的同时,你应该对C++的继承性质和虚函数有相当的认识。

MFC 是一个零组件超级市场,所贩卖的零组件功能以及零组件

彼此之间的关系都已定义好;我们选择自己喜欢的零件,做出一个应用程序

Application Framework 究竟能提供我们多么实用的类呢?或者我们这么问:哪些工作已经被处理掉了,哪些工作必须由程序员扛下来?比方说一个标准的 MFC 程序应该有一个可以读写文件数据的功能,然而应用程序本身有它独特的数据结构,从 MFC 得来的零件可能与我的个人需求搭配吗?

假设你买了一个整厂整线计划,包括仓贮、物料、MIS、生管,各个部门之间的搭配也都建立起来了,包含在整厂整线计划内。这个厂原先是为了生产葡萄酒,现在改变主意要生产白兰地,难道整个厂都不能用了吗?不!只要把进货原料改一改、发酵程序改一改、瓶装程序改一改、整个厂的其它设备以及设备与设备之间的联机配合都可以再利用。物料之后到生管,装瓶之后到仓贮,仓贮之后到出货,再加上 MIS监控全厂,这些程序都是不必改变的。

一个整厂整线计划,每一单元之间的联机沟通,合作关系,都已经建立起来,是一种构造好的运作模式。抽换某个单元的性质或部分性质,并不影响整体作业。整厂整线最重要最有价值的是各单元之间的流程与控制。

反映到面向对象程序设计里头,Application Framework 就是整厂整线规划,Application Framework 提供的类就是上述工厂中一个一个的单元。最具价值的就是各类之间的交互运作模式。

虽然文件读写(此动作在MFC 称为Serialize)单元必须改写以符合个人所需,但是单元与单元之间的关系依然存在而且极富价值。当用户在程序中选按【File/Open】或【File/Save】,框架窗口自动通知Document 对象(内存数据),引发Serialization 动作;而你为了个人的需求,改写了这个 Serialize 虚函数。你对 MFC 的改写范围与程度,视你的程序有多么特异而定。

可是如果酿酒厂想改装为炼钢厂?那可就无能为力了。这种情况不会出现在软件开发上,因为软件的必备功能使它们具有相当的相似性,Windows 又强调界面一致性,不然会给用户的操作带来学习阻力。好比说程序想支持 MDI 接口,想支持 OLE,这基本上是超越程序之专业应用领域之外的一种大格局,一种大架构,最适合 Application Framework 发挥。

很明显,Application Framework是一组超级的类库。能够被称为 Framework 者必须其中的类性质紧密咬合,互相呼应。因此你也就可以想象,Framework 所提供的类是一伙的,不是单片包装的。你把这伙东西放入程序里,你也就得乖乖遵循一种特定的(Application Framework 所规定的)程序风格来进进程序设计工作。

三、各类学习资料上的说法

那其他资料上又是怎么描述Application Framework的?

1985 年,Apple公司的MacApp严格而系统化地定义出做为一个商业化 Application Framework 所需要的关键理念:

这里所指的 support 并不只是视觉性 UI 组件如menu、dialog、listbox...,还包括一个应用程序所需要的其它功能设备,像是 Document, View, Printing, Debugging。

另一个相关定义出现在 Ray Valdes 于1992年10月发表于Dr. Dobb's Journal 的 "Sizing up Application Frameworks and Class Libraries" 一文之中:

Donald G. Firesmith 在一篇名为 "Frameworks : The Golden path of the object Nirvana" 的文章中对 Application Framework 有如下定义:

* Nirvana 是涅盘、最高境界的意思。

Bjarne Stroustrup(C++ 原创者)在他的 The C++ Programming Language 一书中对于Application Framework 也有如下叙述:

Kaare Christian 在1994/02/08的PC Magazine 中有一篇"C++ Application Frameworks" 文章,其中有下列叙述(节录):

两年前我在纽约北边的乡村盖了一栋 post-and-beam 房子。在我到达之前我的木匠已经把每一根梁的外形设计好并制作好,把一根根的粗糙木材变成一块块锯得漂漂亮亮的零件,一切准备就线程只待安装。(注:所谓post-and-beam 应是指那种梁柱都已规格化,可以邮购回来自己动手盖的DIY房子)。

使用Application Framework建造一个Windows 应用程序也有类似的过程。你使用一组早已做好的零件,它使你行进快速。由于这些零件坚强耐用而且稳固,后面的工作就简单多了。但最重要的是,不论你使用规格化的梁柱框架来盖一栋房子,或是使用Application Framework 来建立一个 Windows 程序,工作类型已然改变,出现了一种完全崭新的做事方法。在我的 post-and-beam 房子中,工作类型的改变并不总是带来帮助;贸易商在预制梁柱的技巧上可能会遭遇适应上的困扰。同样的事情最初也发生在Windows 身上,因为你原已具备的某些以 C 语言写 Windows 程序的能力,现在在以C++ 和Application Framework 开发程序的过程中无用武之地。时间过去之后,Windows 程序设计的类型移转终于带来了伟大的利益与方便。Application Framework本身把message loops 和其它Windows的苦役都做掉了,它促进一个比较秩序井然的程序结构。

Application Framework——建立Windows应用软件所用的C++类库。Windows API 是程序性的,Application Framework 则让你写面向对象式的Windows程序。它们提供预先写好的机能(以 C++ 类型式呈现出来),可以加速应用软件的开发。

Application Framework 提供数种优点。或许最重要的,是它们在面向对象程序设计模式下对Windows 程序设计过程的影响。你可以使用 Framework 来减轻例行但繁复的琐事,目前的 Application Framework 可以在图形、对话框、打印、求助、OCX 控制组件、剪贴板、OLE 等各方面帮助我们,它也可以产生漂亮的UI接口如工具栏和状态栏。

借着Application Framework的帮助写出来的代码往往比较容易组织化,因为 Framework改变了Windows管理消息的方法。也许有一天Framework还可以帮你维护单一一套代码以应付不同的执行平台。使用Application Framework的主要缺点是,没有单一一套产品广被所有的C++编译器支持。所以当你选定一套 Framework,在某个范围来说,你也等于是选择了一个编译器。

作者简介:荔园微风,1981年生,高级工程师,浙大工学硕士,软件工程项目主管,做过程序员、软件设计师、系统架构师,早期的Windows程序员,Visual Studio忠实用户,C/C++使用者,是一位在计算机界学习、拼搏、奋斗了25年的老将,经历了UNIX时代、桌面WIN32时代、Web应用时代、云计算时代、手机安卓时代、大数据时代、ICT时代、AI深度学习时代、智能机器时代,我不知道未来还会有什么时代,只记得这一路走来,充满着艰辛与收获,愿同大家一起走下去,充满希望的走下去。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/29800.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ChatGPT时代:ChatGPT全能应用一本通

引言 随着人工智能技术的不断发展和进步,我们进入了ChatGPT时代。ChatGPT是基于GPT架构的大型语言模型,它具备强大的自然语言处理和生成能力,使得我们能够进行更加自由、流畅的对话。作为ChatGPT的全能应用,它可以被视为一本通&a…

【性能优化】性能优化

❤️ Author: 老九 ☕️ 个人博客:老九的CSDN博客 🙏 个人名言:不可控之事 乐观面对 😍 系列专栏: 文章目录 性能优化运行效率加载效率减少HTTP请求数量使用CDN缓存压缩文件、混淆样式表放在顶部、js代码放…

广告数仓:采集通道创建

系列文章目录 广告数仓:采集通道创建 文章目录 系列文章目录前言一、环境和模拟数据准备1.hadoop集群2.mysql安装3.生成曝光测试数据 二、广告管理平台数据采集1.安装DataX2.上传脚本生成器3.生成传输脚本4.编写全量传输脚本 三、曝光点击检测数据采集1.安装Zookee…

大数据周会-本周学习内容总结018

开会时间:2023.06.18 15:00 线下会议 01【调研-数据分析(质量、ETL、可视化)】 ETL,是英文Extract-Transform-Load的缩写,用来描述将数据从来源端经过抽取(extract)、转换(transform…

开源游戏区块链项目分享:Unity开发的独立区块链

Arouse Blockchain [Unity独立区块链] ❗️千万别被误导,上图内容虽然都在项目中可寻,但与目前区块链的业务代码关联不大,仅供宣传作用(总得放些图看着好看)。之所以有以上内容是项目有个目标功能是希望每个用户在区块链上都有一个独一无二的…

如何看待 Facebook 上线支付功能?

随着科技的不断进步,电子支付在我们的生活中变得越来越普遍。最近,Facebook宣布推出自己的支付功能,这引起了广泛的关注和讨论。作为世界上最大的社交媒体平台之一,Facebook进入支付领域的举措无疑具有重要意义。那么,…

13年测试老鸟,带你详探服务端的接口测试,测试内卷之路...

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 服务器的接口测试…

数据库第三章(SQL)

目录 1.SQL语言 索引 1.SQL语言 sql语言是个非过程性语言 sql的特点 1.综合统一,把增删查改都统一了起来 2.高度非过程化,不关心过程 3.面向集合的操作方式 sql基本语法 drop是删除表 delete是删除表的某个元组 安全方面:grant授权 revo…

EXCEL函数笔记1(数学函数、文本函数、日期函数)

数学函数 取整:INT(number) 取余:MOD(number,除数) 四舍五入:ROUND(number,保留几位小数) 取绝对值:ABS(number) 根号处理:SQRT(number) 0到1随机数:RAND(&am…

【机器学习】十大算法之一 “朴素贝叶斯”

作者主页:爱笑的男孩。的博客_CSDN博客-深度学习,活动,python领域博主爱笑的男孩。擅长深度学习,活动,python,等方面的知识,爱笑的男孩。关注算法,python,计算机视觉,图像处理,深度学习,pytorch,神经网络,opencv领域.https://blog.csdn.net/Code_and516?typeblog个…

【LeetCode】每日一题 -- 1171. 从链表中删去总和值为零的连续节点 -- Java Version

题目链接:https://leetcode.cn/problems/remove-zero-sum-consecutive-nodes-from-linked-list/ 1. 题解(1171. 从链表中删去总和值为零的连续节点) 2021年字节二面真题 1.1 暴力解法:穷举 时间复杂度 O(n2),空间复杂…

【论文】attention is all you need

重点在第三节 attention is all you need摘要1. 绪论2. 背景3. 模型架构3.1 编码器和解码器堆叠 3.2 注意力3.2.1 缩放点积注意力(Scaled Dot-Product Attention)3.2.2 多头注意力机制3.2.3 模型中注意力的应用 3.3 职位感知前馈网络(Positio…

前端中间件Midway的使用

一、 关于midway1. 解决什么痛点2. 期望达到什么效果 二、创建应用并使用1. 创建midway应用2. 认识Midway2.1 目录结构2.2 Controller2.3 路由2.4 获取请求参数2.5 Web中间件2.6 组件使用2.7 服务(service) 三、写到最后 一、 关于midway Midway 是阿里巴巴 - 淘宝前端架构团队…

基于深度学习的高精度安全背心检测识别系统(PyTorch+Pyside6+YOLOv5模型)

摘要:基于深度学习的高精度安全背心检测识别系统可用于日常生活中或野外来检测与定位安全背心目标,利用深度学习算法可实现图片、视频、摄像头等方式的安全背心目标检测识别,另外支持结果可视化与图片或视频检测结果的导出。本系统采用YOLOv5…

微服务: 01-rabbitmq的应用场景及安装(docker)

目录 1. rabbitmq前言简介: 1.1 RabbitMQ的几个重要作用: -> 1.1.1 解耦: -> 1.1.2 异步通信: -> 1.1.3 流量削峰: -> 1.1.4 消息传递的可靠性和持久性: 2. rabbitmq的安装(docker版) -> 2.1 …

SpringMVC 学习整理

文章目录 一、SpringMVC 简介1.1 什么是MVC1.2 什么是Spring MVC1.3 Spring MVC的特点 二、SpringMVC 快速入门三、RequestMapping注解说明四、SpringMVC获取请求参数4.1 通过ServletAPI获取请求参数4.2 通过控制器方法的形参获取请求参数4.3 通过RequestParam接收请求参数4.4 …

Rust语言从入门到入坑——(2)Rust在windows上搭建开发环境

文章目录 0 引入1、搭建 Visual Studio Code 开发环境1.1、安装 Rust 编译工具1.2 、VS Code安装 2、官网在线3、总结4、引用 0 引入 开始搭建一个适合在windows上运行的Rust环境。 Rust支持的程序语言很多:可详见官网介绍 1、搭建 Visual Studio Code 开发环境 …

[架构之路-211]- 需求- 软架构前的需求理解:ADMEMS标准化、有序化、结构化、层次化需求矩阵 =》需求框架

目录 前言: 一、什么是ADMES: 首先,需求是分层次的: 其次,需求是有结构的,有维度的 再次,不同层次需求、不同维度需求之间可以相互转化(难点、经验积累) 最终,标准…

【雕爷学编程】Arduino动手做(114)---US-015高分辨超声波模块

37款传感器与执行器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的&am…

Floyd 判圈算法(Floyd Cycle Detection Algorithm)

Floyd 判圈算法(Floyd Cycle Detection Algorithm) 前言 Floyd判圈算法属于对指针操作的算法,它一般需要且仅需要两个指针,通过设定不同的指针移动速度,来判定链表或有限状态机中是否存在环。人为规定移动较快的指针称为快速指针(fast poin…