软件架构及几种典型框架

2023-11-08

    什么是软件架构?什么是软件框架?很多时候,我们常常会混用架构和框架这两个词。实际上,广义上的架构和框架在概念上有很大的不同,架构给人的感觉,包容上更大,所以实际上架构是包含了框架的概念的。广义的架构应为一个系统的架构,不仅仅涉及软件中的技巧,更有系统的观念与视角在其中;不仅要考虑代码的因素,更要布局非代码的因素;不仅仅有技术的内容,更有管理的内容在其中。而为了便于讨论,这里的架构很多时候是指狭义上的纯技术上的架构,我们根据表达需要,将其与框架混用。

   就单纯的框架而言,其核心是抽象。抽象就是统一建模的过程。语言的最高境界应该就是高度的抽象。就比如,单说树木我们认为是一种抽象,而具体言及柏树、杨树、松树、银杏等,则是一种具体化。这种抽象会剥离出这类事物共性的东西。比如对树木而言,有树根、树干、树枝、树叶这些特征。对一个从来没有接受过训练的小孩子,画一个具有上述特征的树,他也能告诉你,这是一棵树。这就是抽象的威力。对语言、对程序设计,也需要这种对现实的、非现实的事物进行抽象,找到共同点,构建出统一完成体。这里,我们提到了非现实事物,举个例子,Android应用程序组件就是对APP的一种抽象,并统一抽象为Activity来与用户交互;而对Apple的IOS而言,则有另一种抽象。二者都是对非现实事物的抽象描述,虽有不同,但都是探索与人类交互的APP的共同特征。抽象带来的最大好处就是对变化的应对能力,达到以不变应万变的效果。

   一,框架本身很复杂,但是却是用来将复杂的东西简单化

   软件设计,到了变大,变复杂的时候,框架或者架构,就是重要的一块了。一个小测试程序,谈不上郑重其事的架构。但是,一旦成为一个大系统,那么架构或者框架就是重中之重了。这时架构设计上的差异,可能会导致截然不同的结果。好的架构,系统稳定灵活,可扩展性强,开发、运行效率高,生命周期长。相反,不好的架构,可能系统还没有设计出来,就因为中途暴露的各种坑而提前夭折。即便磕磕绊绊走到交付,也可能因为难以维护而使得生命周期大打折扣。

   理解大型软件的设计思想:

   软件的设计为软件的核心。写一个小程序跟设计一个大型系统区别在于何处?我们可以通过类比来说明。比如构建房屋,最简单的搭建一个犬舍,只需要几块木板加图钉(例子来源于代码大全)就可以完成。如果搭建的不好看,完全可以拆了重来,如果选的位置不好,也可以拆了重来。建一座房子,就有一点不同了,需要提前想一想该怎么弄。搭建犬舍时不需要图纸,只需要埋头干就行了。而建房子就不能这样,不但要仔细想一想,而且想好了可能还需要简单设计一下,画个图,实地丈量丈量,等等如此一番。完了还需要准备材料,石头沙子,水泥,砖块,钢筋等等,准备好材料后,就可以施工了。需要打个地基,一米深就够了吧,需要一些测量水平和垂直的工具。盖房屋已经不允许拆了重来了。再进一步,我们来看看设计高楼大厦。这就不是一个人可以完成的了,需要多人协作,进行精心完整的设计,并输出规范的图纸作为大家形成共识的基础。地基也不是简单的弄一下就行,要几米,怎么布局,都需要严格的计算和测量。各种施工工具需要具备,才能开始建造。软件设计也是类似,如果只是写一个测试小程序,完全不必要讲究命名,书写,功能有就可以了,当然可以写的好看点,有一个好看的犬舍还是给人不一样的感觉。再往后,大点的设计一个模块,或者一个具有一定功能的程序,有完整的操作界面,那么就需要简单的设计一下了。另外可能还需要一些脚本等其他语言协助。也许一个人也是可以完全完成的。再大点,一个大型的软件或者系统,情况就大不一样了。跟建设高楼大厦类似,需要进行详细的设计。接口要求,代码风格等等,都需要要求。每一个连接结构都必须是一致的,大家都可以拿来使用。一个功能模块,一个组件做什么用,需要具有什么样的要求,特点,接口等,都必须进行严格的设计,就像大楼的钢筋要用什么型号,做成什么形状等等,都需要按设计来。所有这些整合到一起,才能形成一个功能强大而又稳定的系统。此时的系统,也许就无法靠一个人来完成了。

   不过这个类比,或者说隐喻,还是有点问题的。因为软件设计跟建筑大厦还是有些不一样。盖楼,是一个实物,实实在在能够看到,很多东西做成什么样,通过图纸就能完全确定。软件设计则不太一样,是一个抽象的东西,纯粹存在于我们大脑的一个系统。而且软件设计面临的不仅是系统本身的问题,还有解决问题领域的限制,很多东西无法跟建筑施工那样复用。不过这里重点是要突出一个强大的软件系统需要精心的设计,在这一点上,将二者进行隐喻是恰当的。

   作为设计者而言,定然要有深厚功力。俗话说,也许每一个人都可以做一个好的欣赏家,评判家,但是,并非每一个人都能做一个好的创造者。也就是说,好东西容易看出来,但是不容易做出来。就像大楼,我可以住,可以看,可以评判,但是,要设计,就是另外一回事了。

   作为一个软件开发者,一个有一定经验的软件开发者,笔者常常在想,那些好用的、庞大的系统的设计者,是如何认识系统架构的?是如何想出来设计方案的?像操作系统,Office办公软件,集成开发环境Eclipse,Android手机等等,哪一个不是投入了大量的人力物力开发出来的?哪一个不是人类智慧的结晶,像艺术品一样的存在?也许世上诸多人,这辈子都注定只是望码兴叹的命。在本章最后,附有笔者对架构认识有感而发的思考过程记录。

   在《程序员的自我修养》这本书里,作者在序言部分提到了这么一段话:CPU体系结构、汇编、C语言(C++)和操作系统,永远都是编程大师们的护身法宝,就如同少林寺的《易筋经》

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

软件架构及几种典型框架 的相关文章

  • Unix/Linux编程:文件树遍历-----nftw()

    nftw 函数是对执行类似功能的老函数 ftw 的加强 由于提供了更多功能 对符号链接的处理也更易于把握 GNU C 语言函数库也提供了派生自 BSD 分支的 fts API fts open fts read fts children f

随机推荐

  • telnet配置及用法

    内容转载 http jingyan baidu com article ae97a646b22fb6bbfd461d19 html 搭建或配置网络环境时 经常会使用ping命令检查网络是否可达 有些时候Ping命令也不好使 比如因防火墙禁止
  • 中国半导体硅片行业未来发展趋势与销售规模预测报告2022版

    中国半导体硅片行业未来发展趋势与销售规模预测报告2022版 HS HS HS HS HS HS HS HS HS HS HS HS 修订日期 2021年11月 搜索鸿晟信合研究院查看官网更多内容 第一章 半导体硅片相关概述 1 1 半导体硅
  • C语言向上取整数简单写法

    C语言整数除法向上取整 define GET M N M 1 N 1 实例 一共100字节的数据 一次发送11字节 需要发送多少次 GET 100 16 7 次
  • 记录一道leetcode算法题的坑

    题目链接 这个题并不难 只是想让自己牢记一句老话 题目里面的每个条件都有用 int twoSum int nums int numsSize int target int returnSize int a 2 0 注意 注意 注意 retu
  • Mathematica 随机打乱列表顺序/列表随机重排列

    更新 找到相关函数了 没仔细看说明以为RandomSample只能随机取样来着 汗 RandomSample list 原内容 没必要看了 没有找到直接的相关函数 想到的方法是随机交换列表元素 例如以下程序为1 10的数字乱序 Permut
  • IP数据包长度问题总结

    首先要看TCP IP协议 涉及到四层 链路层 网络层 传输层 应用层 其中以太网 Ethernet 的数据帧在链路层 IP包在网络层 TCP或UDP包在传输层 TCP或UDP中的数据 Data 在应用层 它们的关系是 数据帧 IP包 TCP
  • TypeError: write() argument must be str, not bytes报错原因及Python3写入二进制文件方法

    Python2随机写入二进制文件 with open python2 random bin w as f f write os urandom 10 但使用Python3会报错 TypeError must be str not bytes
  • Java设计模式:深入解析与应用示例

    文章目录 引言 一 单例模式 二 工厂模式 三 抽象工厂模式 四 建造者模式 五 原型模式 六 适配器模式 七 装饰器模式 八 观察者模式 九 策略模式 十 命令模式 结语 引言 设计模式是一种在特定上下文中反复出现的可重用解决方案 用于处
  • Linux / ldd 命令的介绍与使用

    0 介绍 ldd 用来打印或者查看程序运行所需的共享库 访问共享对象依赖关系 常用来解决程序因缺少某个库文件而不能运行的一些问题 1 首先 ldd 不是一个可执行程序 而只是一个 shell 脚本 2 ldd 能够显示可执行模块的 depe
  • 学习笔记Flink(八)—— 基于Flink 在线交易反欺诈检测

    一 背景介绍 信用卡欺诈 信用卡欺诈是指故意使用伪造 作废的信用卡 冒用他人的信用卡骗取财物 或用本人信用卡进行恶意透支的行为 在当今数字时代 信用卡欺诈行为越来越被重视 罪犯可以通过诈骗或者入侵安全级别较低系统来盗窃信用卡卡号 用盗得的信
  • mipi和isp处理_ISP-摄像头的最强大脑- 图像质量及色彩科技知识分享平台 图像质量与色彩管理 - Powered by HDWiki!...

    做为拍照手机的核心模块之一 camera sensor效果的调整 涉及到众多的参数 如果对基本的光学原理及sensor软 硬件对图像处理的原理能有深入的理解和把握的话 对我们的工作将会起 到事半功倍的效果 否则 缺乏了理论的指导 只能是凭感
  • 【系统篇 / 文件】01. 文件服务安装与配置 ❀ Windows Server 2008 R2

    简介 文件服务提供帮助管理存储 启用文件复制 管理共享文件夹 确保快速搜索文件 以及启用对UNXI客户端计算机访问的技术 使用文件服务 组织可以将文件存储到中心位置 然后通过公司网络与用户共享 可以为这些共享文件创建索引 以帮助用户快速查找
  • K8S deployment可视化故障排查指南

    这是一个示意图 可帮助您调试Kubernetes中的deployemnt 当您希望在Kubernetes中部署应用程序时 通常定义三个组件 一个deployment 这是创建名为Pods的应用程序副本的秘诀 一个service 内部负载平衡
  • cocos creator 中读取Excel表格中的数据

    一 使用相应工具将Excel文件转化成JSON文件导入到cocos creator资源文件 二 在VS中对Excel文本中的数据进行转换 Excel文本中各项数据的名称对应代码中的data export default class Task
  • Apache-tomcat-8.5.82下载安装以及环境变量配置

    一 下载apache tomcat 8 5 82 1 进入apache官网 Apache Tomcat Welcome 选择Download gt Tomcat8 进入Apache Tomcat Apache Tomcat 8 Softwa
  • 分布式计算,泛在计算,BOINC

    BOINC平台简介 知乎 Download BOINC client software 开源源代码 https github com BOINC boinc 介绍 https www equn com wiki BOINC 使用指南 htt
  • 【Antdv】a-date-picker showTime带时间默认00:00:00

    show time 默认当前系统时间 设置默认 00 00 00
  • 预编码

    原则上说MIMO技术并不一定需要预编码 使用预编码的前提是发射端可以及时获取信道信息 也就是CSIT 在通常情况下 只有接收端可以知道信道信息CSIR 在这个情况下 接收端通过复杂的信号处理算法 如MMSE SIC 可以解调出多路的MIMO
  • Zookeeper 通知更新可靠吗? 解读源码找答案!

    欢迎大家前往腾讯云 社区 获取更多腾讯海量技术实践干货哦 本文由特鲁门发表于云 社区专栏 导读 遇到Keepper通知更新无法收到的问题 思考节点变更通知的可靠性 通过阅读源码解析了解到zk Watch的注册以及触发的机制 本地调试运行模拟
  • 软件架构及几种典型框架

    什么是软件架构 什么是软件框架 很多时候 我们常常会混用架构和框架这两个词 实际上 广义上的架构和框架在概念上有很大的不同 架构给人的感觉 包容上更大 所以实际上架构是包含了框架的概念的 广义的架构应为一个系统的架构 不仅仅涉及软件中的技巧