架构设计思维篇之结构
结构是相关元素之间的组织和安排,它是一个很普遍的概念,我们无时无刻不在谈论着各种对象的结构,如:细胞结构、人体结构、目录结构、分子结构、组织架构、文章结构等等数不尽的结构。
那么,当人们用语言或图片向我们描述细胞结构、分子结构、软件架构时,这些符号想表达什么?
比如上面的两张图,植物细胞结构图能表达细胞的各个组成部分以及它们之间的关系;分子结构图能表达出它的组成成分原子以及原子在空间中的排列关系;
同样,软件架构图表达软件由那些组件组成以及它们之间的关系。
所以,我们可以看出当人们谈论对象的结构或软件工程师讨论软件架构时,他们想描述的是对象中主要的、重要的、高层次的要素以及这些要素之间的关系。
软件架构的定义众说纷纭,至今还未形成统一的定义,越是不确定,就越显得神秘,人们也就越趋之若鹜。
结构和架构有区别吗?如果没有区别为什么不用结构一词而用架构,如果有区别那区别是什么?
读者可以对比一下软件架构图和生物学、化学以及其它行业的对象的结构图,看看它们所描述的东西有什么区别,其实会发现它们所描述的都是对象由那些要素构成以及它们之间的关系,结构和架构在概念上没有本质的区别。
但我们还是可以发现一些细微的区别,我们可以对比一下细胞结构和软件架构,细胞的结构所指的东西具有固定性,只要我们了解过下次有人提及的时候我们能明确知道他要表达的东西;
而软件架构通常不具有固定性,其要素和关系都存在变化的可能,所以笔者认为架构作为名词的时候它和结构的含义是一样的,只不过架构是一种可能变化的结构。
当我们从宏观层面看时,组件是软件的最小构件,一个复杂的软件便是由相互关联的组件(模块、服务)构成的整体,那么软件架构设计所面临的一个问题便是:设计什么样的结构来组织各种组件,从而实现设计目标。
虽然软件的结构没有固定性,但是人们还是从长期的实践中,总结出了一些常见的、可复用的、稳定不变的结构即架构模式。
它们分别是分层模式、客户端-服务器模式、主从模式、管道-过滤器模式、代理模式、点对点模式、事件总线模式等。
软件除了具有宏观的结构即架构外,还有微观的结构即类与类之间的结构。
当我们从微观层面看时,在面向对象编程的程序中,类是软件的最小构件,一个复杂的软件便是由相互关联的类构成的集合,但这个集合中的类并不是孤立存在的,它们之间存在着6种基本关系:依赖,关联,聚合,组合,继承,实现。
类和类之间的关系会形成三种基本结构:一般具体结构、整体部分结构、组合结构。程序设计时,结构的好坏直接决定着程序的扩展性、灵活性、重用性以及复杂度。
所以,在长期的面向对象程序设计中,人们也总结出了一套可反复使用的设计结构,这便是GOF的23种设计模式如单例模式、工厂模式、代理模式等。
因此,我们可以看出结构之于软件的重要性就像建筑结构之于建筑物一样——如果一栋建筑物的结构无法承受正常的荷载作用那么它便有随时坍塌的风险,同样软件架构无法支撑业务发展,推到重构的现象在软件行业也是屡见不鲜的事了。
结构决定功能,这是一个重要的思想。当架构师针对某一重要问题提出解决方案后,他所思考的东西其实就是结构,他深知结构的重要性,他的职责是选择什么样的结构来组织解决问题的方案。其实,人人都是架构师,因为程序员也要思考如何组织类,只不过各自思考的元素的抽象程度以及重要程度有所区别而已,
架构师思考更抽象的、更重要的组件以及组件之间的关系,而程序员思考的是类以及类之间的关系。如果读者想成为架构师,那你首先想的不是需求如何实现,而是根据具体情况以及所要实现的设计目标确定好如何组织功能的结构,再去实现。
因为结构先行,可以让我们纵观全局,抓住主要的、重要的核心问题,不至于只见树木不见森林,深陷细节而无法自拔。所以,要善于利用结构,把它作为工具使用。
结构作为工具,它是一个能让事物变得井然有序的组织工具。有一种最常用的结构,它被广泛的用于人类生活的各个方面,这便是树形结构。
学生会使用它组织学科的知识点,软件工程师用它来组织代码,企业家使用它来组织员工生产。无论他们期望结构产生什么样的作用,但结构最基本的作用是让复杂的事物变得有序。
这正是所谓的无规矩,不成方圆,这里的结构便是规则或规定。如数据结构:数组、链表,语法结构:主谓宾、主系表,便是一种抽象结构,它们是一组规则或规定。
所以,我们可以看出架构既是结构也是规则、规范或规定,架构就是要让一切复杂的事物变得有序、简单、可理解。
总之,结构是对象中相关元素的组织方式,是人类的组织工具,也是规则。万物都有结构无论是空间结构、时间结构还是抽象结构,而且一个对象从不同的视角和关注点看会有呈现不同的结构。
软件结构具有层次性特征,层次越高,结构设计就越重要也越抽象,而且高层次的结构一旦确定就不易改变,如果要改变那么改变的成本就很高,所以显得结构设计的重要性。
扩展阅读
架构设计思维篇之结构
架构设计思维篇之概念
架构设计容错篇之重试
架构设计容错篇之熔断
架构设计容错篇之限流
架构设计事务篇之Mysql事务原理
架构设计事务篇之CAP定理
架构设计事务篇之分布式事务
架构设计消息篇之消息丢失
架构设计消息篇之保证消息顺序性
http://www.taodudu.cc/news/show-6776160.html
相关文章:
- 《结构化思维》思维导图读书笔记精选内容,理论和实际结合运用
- 读书记:《结构思考力》
- 思考的形状 《思维导图》读后感
- 红蓝按钮交替移动
- Unity NavMesh蓝色表面不出现
- 利用键盘控制小方块的移动
- Unity3d 控制物体transform移动的几种方法
- JS实现小球移动(点击移动,点击停止)
- 纯js操作div移动
- 猜测:秦始皇陵中有惊人的秘密
- 杀至明孝陵
- 兵马俑和秦始皇陵, 以及镇甲军钢
- 中国比较出名的几个皇帝陵墓----秦皇陵
- Java求极差
- 极差问题
- 什么是组织变革(组织变革的目的)
- 转:经验在组织管理中应扮演什么角色?
- 中国人民大学_《组织行为学》_13.领导风格:怎样获取团队认同?
- 使用组策略实现统一企业形象
- 图形学基础 | 如何计算切线空间的切线和副切线
- 空间曲线的切线和法平面与曲面的切平面和法线
- 【引用】空间曲线的切线、主法线、副法线
- OpenGL-空间曲线
- 你是否被这样pua过
- 你被PUA了吗?
- C/C++ 常用缩写词
- C++:try catch语句用法
- 被职场PUA了...
- 好家伙,渣男基因被发现了?还能让直男变弯?
- 造物致知,硬见致用 | 第四届硬见开发者论坛成功举行
架构设计思维篇之结构相关推荐
- TF之DD:利用Inception模型+GD算法生成带背景的大尺寸、高质量的Deep Dream图片——五个架构设计思维导图
TF之DD:利用Inception模型+GD算法生成带背景的大尺寸.高质量的Deep Dream图片--五个架构设计思维导图 目录 TF中的Deep Dream实践:利用Inception模型+GD算 ...
- CV之IE之Inception:基于TF框架利用Inception模型+GD算法的某层网络图像生成不同尺寸和质量的Deep Dream幻觉梦境图片(特征可视化实现图像可解释性)—五个架构设计思维导图
CV之IE之Inception:基于TF框架利用Inception模型+GD算法的某层网络图像生成不同尺寸和质量的Deep Dream幻觉梦境图片(特征可视化实现图像可解释性)-五个架构设计思维导图 ...
- 3D引擎架构设计高级篇
3D引擎架构设计最核心的技术包括:引擎框架设计,引擎内存管理,大场景加载以及卸载,引擎的渲染,模型骨骼插件:其他的模块还有粒子,AI,行为树,UI等等吧. 市场上对于引擎开发的需求也是比较大的,而且薪 ...
- Java企业级应用架构设计中的分布式结构
Java企业级应用架构设计中的分布式结构 2010-12-24 13:54:12| 分类:默认分类 | 标签:|字号大中小 订阅 Java企业级应用架构设计是每个Java开发者不必学的知识,本文将 ...
- 云时代架构阅读笔记十五——架构设计思维(一)
对于架构设计人们已经提出了许多方法,分类为:工件驱动的方法:用例驱动的法:模式驱动的方法:领域驱动的方法.一个经典的架构设计过程模型,沿用了RUP中迭代增量的思想,由分析.描述.选择.构造和组合5个阶 ...
- 张小龙、周鸿祎、傅盛都认同的架构设计思维
正文开始前,先花大量笔墨推荐几个我工作中常用的思考框架.实践框架,后续文章中会使用这几种思考框架作为工具来描述.拆解.分析问题.当然你也可以使用到其它工作内容中,掌握几种利器,比无头苍蝇样做事效率会高 ...
- 分布式锁选型背后的架构设计思维【附源码】
1. 分布式锁本质 提到分布式锁,有很多实现,比如Redis分布式锁.ZooKeeper分布式锁.etcd分布式锁等.但是选择哪个更适合你的项目?在<基于CAP模型设计企业级真正高可用的分布式锁 ...
- 《系统架构设计》-03-软件结构体系和架构风格
文章目录 1. 软件结构体系 1.1 抽象(Abstract) 1.1.1 抽象的应用 1.1.2 不同层次的抽象 1.2 组件(Component) 1.2.1 定义 1.2.2 切入点 1.3 组 ...
- Android中的MVVM架构设计-实用篇(五)实现RecyclerView列表展示
巨齿鲨.png 引言 上一篇中我们使用mvvm模式进行了listview的展示,当然我的方式只是众多方式中的比较简单的一种,大家如果有其他写法方式,希望不吝赐教,在下在此谢过. 今天给大家讲解一下Re ...
最新文章
- Linux内核网络栈1.2.13-有关tcp/ip协议的基础入门
- 在线转flv+flash在线录制视频
- 【转载】如何使用STM32的窗口看门狗
- Android 界面滑动实现---Scroller类 从源码和开发文档中学习(让你的布局动起来)...
- xml验证 java代码,使用Java代码进行XML验证
- Sql server 数据库备份、恢复等
- 收集的安装VS2005 sp1的注意事项
- windows7系统设置动态屏保的教程
- 越来越像QQ?微信支持批量删好友啦!安卓用户“不配”
- 搭建VMware6.5+Win2003 MSCS群集实验环境
- SOA进入成熟应用阶段仍需时日
- idea为java文件自动生成copyright
- 用计算机进行实时自动采集,动态数据采集
- c语言调用数学函数根号,不调用库函数求根号x的计算方法(二分/三分/牛顿迭代法)...
- java intern_Java intern() 方法
- 数据传输完整性_数据集成:什么是数据完整性?
- android中关闭软键盘
- 功能模块图、业务流程图、处理流程图、ER图,数据库表图(概念模型和物理模型)画法...
- 【游戏客户端】实现刮刮乐效果
- 孙溟㠭篆刻《无有中无尽藏》
热门文章
- 企业微信禁止分享转发
- 18. ubuntu的实践——who,ln,inxi,内核,编译
- 实习笔记 —— springMVC部分II
- python三剑客电子版_python编程操作office三剑客之word篇
- node 简繁体转换_编译了wasm版本的OpenCC,在浏览器上直接转换简繁体
- 【JavaScript UI库和框架】上海道宁与Webix为您提供用于跨平台Web应用程序开发的JS框架及UI小部件
- RockBrain USB Server- 云计算虚拟化集中管理、远程共享解决方案(涉及银企直联)
- android sdk mac版本查看,如何查看 mac androidsdk版本
- bootstrap添加移动端添加滑动手势功能
- Halcon之图像梯度、图像边缘、USM锐化