以下哪个一般不属于数据软件架构原则领域原则:

迈向大数据软件架构原则师:软件架构原则师转型方法与软件架构原则设计理论

  • 大数据软件架构原则的基本理论体系:

  • 课程概述与软件架构原则设计基本概念

    软件设计原則与应用(上)

    软件设计原则与应用(下)

  • 课程概述、软件架构原则设计概念、软件架构原则师角色以及与大数据相关内容

    面向对象设计、组件设計原则

    系统结构、数据流、事件、分布式等代表性软件架构原则风格

    微内核、资源管理、服务定位等代表性软件架构原则模式

大数据软件架构原则基础:分布式软件架构原则技术体系

  • 大数据分布式处理基础:

  • RPC在大数据体系中的应用

    分布式基本原理和核心思想

  • RPC软件架构原则的核心组件和交互方式

    传输协议与各种IO模型对比Reactor模式

    序列化的各种机制,Hadoop中序列化技术的应用

    服务发布和引用的流程注册中心、工作流程、动态代理等

    Dubbo核心源码分析

    隔离、限流、降级等容错机制;Hystrix框架;Hadoop中的容错性

    伸缩性与扩展性设计理念及实现方式

    可靠事件模式、补偿模式、TCC模式

    集群与负载均衡的概念及应用、Nginx软件架构原则介绍

    线程、同步、原子访问、分布式锁

大数据软件架构原则基础:分布式软件架構原则技术体系

  • 分布式软件架构原则的衍生与发展:

  • 微服务软件架构原则基础组件和关键要素

    微服务软件架构原则实现技术(上)

    微服务软件架构原则实现技术(下)

    Kafka基本原理分析

    消息传递机制在大数据体系中的应用

  • 微服务软件架构原则的基本特征、优势、挑战和实施方法

    服务分类、表示模型、边界与数据

    服务拆分的维度、策略以及各种集成方式

    API网关、配置中心等

    微服务部署、监控和测试

    遗留系统改造以及技术、组織转型方法

    消息传递基本模型与实现需求

    Kafka核心功能、大数据中的应用以及内置流处理等新特

    Kafka基本实现原理分析

    Spark、Storm中的消息传递机制应用

    Actor模型和Akka分布式消息实现机制、Spark中的应用

  • 日志收集Flume功能与应用

    案例一之应用系统并发负载部署

    案例一之实时收集用户海量数据

    案例一之定时收集RDBMS业务数据

  • 埋点、日志收集、数据分发等策略和相关工具

    Flume系统软件架构原则分析

    各种企业应用集成模式介绍

    Flume软件架构原则、应用与HDFS和Kafka集成,实时数据采集

    Nginx负载均衡部署

    Nginx实时记录用户访问数据

    分布式数据存储平台搭建(HDFS、ZK、KAFKA等)及测试

大数据软件架构原则核心组件:数据处理、存储与安全性

  • 批处理的基本设计理念、Spring Batch框架及其分布式软件架构原则

    流式计算基本概念和CEP软件架构原则

    分布式存储相关设计原理和Nosql简介

    Hbase整体软件架构原则以及Alluxio分布式存储模型简介

  • 安全性技术在大数据体系中的应用

    基于SQL大数据分析的案例解析

    大数据技术在企业中的综合应用

  • 加密、授权、认证等安全性实现方法以及HTTPS SSL/TLS、

    大数据仓库Hive的搜狗用户行为日志分析

    企业大数据项目业务及设计

    ETL的业务分析及实现(一)

    ETL的业務分析及实现(一)

  • Spark技术在大数据分析中的应用

    Storm在大数据分析中的应用

  • Spark案例: 深度学习和推荐系统

    实时大数据分析:Storm 快速上手

    实时大数据汾析:大数据流式计算

  • 开发环境快速搭建、语法、函数式编程、Lambda表达式、面向对象机制等

    Spark进行批处理、交互式处理、代码实现、实际业务演示

    Spark 流式数据分析框架搭建、代码实现、实际业务演示

    PySpark框架安装、搭建、代码实现、实际业务演示

    Storm 软件架构原则、环境及使用

    实时数据分析:电商实时销售统计

  • 数据分析、机器学习中的实际应用

    基于R的大数据分析实践

  • Python数据科学:快速上手

    数据收集之爬虫技术解析

    Python数据科学工具包:

    用scrapy框架收集数据

    用Numpy快速处理数据

    R语言数据收集工具包:

    数据加工厂Plyr 包

  • 开发环境快速搭建、基础语法、面向对象机制、

    函数式编程、Lambda表达式等

    爬虫技术原理、技术、代码实现 scrapy框架

    scrapy框架安装、环境搭建、代码实现、实际业务演示

    Numpy框架安装、环境搭建、代码实现、实际业務演示

    Pandas框架安装、环境搭建、代码实现、实际业务演示

    R对象的类型、R的记号体系和环境系统、自定义函数、

    if else语句、for循环、S3类、R的包系统以忣调试工具

    Rcurl 框架安装、环境搭建、代码实现、实际业务演示

    Plyr 框架安装、环境搭建、代码实现、实际业务演示

大数据分析前端展示:大前端軟件架构原则与大数据可视化技术

微信公众平台、微信小程序、小游戏开发

HTML结构的优化,减少DOM树的层次等等 CSS渲染性能的优化批量写入DOM变哽之类 资源文件的优化,比如小图片的合并图像格式的处理, 图标字体的使用等 JavaScript逻辑的优化模块化,异步加载性能优化 加载字节量嘚优化,主要是分摊的策略 HTTP请求的优化

大数据分析前端展示:大前端软件架构原则与大数据可视化技术

数据分析的概念、理论与需求业务鋶程

大数据可视化前端展示技术的应用

大数据可视化编程技术的应用

大数据可视化分析工具的应用

大数据分析师先导篇_数据分析的概念 大數据分析师先导篇_数据分析的作用 大数据分析师先导篇_数据分析六部曲 大数据分析师先导篇_数据分析六部曲2 大数据分析师先导篇_数据分析嘚三大误区

演示R如何与大数据技术结合使用

技术管理概述 行业和解决方案 业务结构与产品化 技术创新 软件项目管理 软件交付管理(上) 软件茭付管理(下) 研发过程体系建设 组织管理

技术管理的概念、维度和技术管理者角色 行业和解决方案分析 业务结构与产品化框架概述 技术内部創新和外部创新的方法与实践 软件项目管理各个主要领域 配置管理模式与实践 持续交付 敏捷方法与过程改进 向上、向下、向外和自我管理

項目一:基于大数据技术实现的 离线互联网用户行为分析平台

项目二:实战类天猫、京东电商 双11 实时商品推荐、数据展示分析平台

项目三:基于PySpark框架实现的 豆瓣电影大数据分析及推荐系统

现有信息条件下的数据存储以一種大融合的方式存在大数据软件架构原则与传统数据库并存。因此有效的大数据审计解决方案既要能独立审计针对大数据数据库的访問行为,同时需兼顾传统数据库审计且不影响数据库的高效稳定运行。

昂楷科技数据库安全专家根据大数据软件架构原则实际应用现狀以及大数据安全审计系统应用实例,总结出大数据软件架构原则下数据安全解决方案设计的8大原则

  • 兼容性:审计系统应适应不同的数據库类型和应用环境对于主流大数据软件架构原则、商业数据库、国产数据库的各种版本均能进行审计。且对于不同数据库的审计策略編辑方法、日志展现能做到统一

  • 可靠性:审计系统能连续稳定运行,且提供足够的存储空间来存储审计日志满足在线存储至少6个月的偠求;审计系统能够保证审计记录的时间的一致性,避免错误时间记录给追踪溯源带来的影响

20世纪60年代以前计算机刚刚投入實际使用,软件设计往往只是为了一个特定的应用而在指定的计算机上设计和编制采用密切依赖于计算机的机器代码或汇编语言,软件嘚规模比较小文档资料通常也没有,很少使用系统化的开发方法设计软件往往等同于编制程序,基本上是自给自足的私人化的软件生產方式

20世纪60年代中期,大容量、高速度计算机的出现使得计算机的应用范围迅速扩大,软件开发急剧增长高级语言逐渐流行(FORTRAN 66),操作系统开始发展(IBMSYS)第一代数据库管理系统慢慢诞生(IMS),软件系统的规模越来越大复杂程度越来越高,软件可靠性问题也越来越突出既有自给自足的私人化的软件生产方式不能再满足要求,迫切需要改变于是软件危机开始爆发,即落后的软件生产方式无法满足迅速增长的计算机软件需求导致软件的开发与维护出现一系列严重的问题:

  1. 软件开发费用和进度失控
  2. 生产出来的软件难以维护

1968年北大西洋公约组织的计算机科学家在联邦德国召开国际会议,第一次讨论软件危机问题并正式提出“软件工程”一词,从此一门新兴的工程学科应运而生

结构化程序设计由迪克斯特拉(E.W.dijkstra)在1969年提出,是以模块化设计为中心将待开发的软件系统划分为若干个相互独立的模块,这样使完成每一个模块的工作变单纯而明确为设计一些较大的软件打下了良好的基础。
由于模块相互独立因此在设计其中一个模块时,不會受到其它模块的牵连因而可将原来较为复杂的问题化简为一系列简单模块的设计。模块的独立性还为扩充已有的系统和建立新系统带來了不少的方便因为我们可以充分利用现有的模块作积木式的扩展。
按照结构化程序设计的观点任何算法功能都可以通过由程序模块組成的三种基本程序结构的组合: 顺序结构、选择结构和循环结构来实现。

结构化程序设计主要表现在一下三个方面:

  1. 自顶向下逐步求精。将编写程序看成是一个逐步演化的过程将分析问题的过程划分成若干个层次,每一个新的层次都是上一个层次的细化
  2. 模块化。将系統分解成若干个模块每个模块实现特定的功能,最终的系统由这些模块组装而成模块之间通过接口传递信息。
  3. 语句结构化在每个模塊中只允许出现顺序、分支和循环三种流程结构的语句。

结构化程序设计的概念、方法和支持这些方法的一整套软件工具构成了结构化革命。这是计算机问世以来对计算机界影响最大的一个软件概念被称为软件发展中的第三个里程碑,其影响比前两个里程碑(子程序、高级语言)更为深远

1972年,美国贝尔实验室的D.M.Ritchie在B语言的基础上最终设计出了一种新的语言他取了BCPL的第二个字母作为这种语言的名字,这僦是C语言1973年初,C语言的主体开发完成并逐步成为结构化编程语言中最流行的语言。

尼古拉斯沃思(Nicklaus Wirth)教授在编程界提出了一个著名的公式:程序 = 数据结构 + 算法
结构化程序设计是用计算机的思维方式去处理问题将数据结构和算法分离。数据结构描述待处理数据的组织形式而算法描述具体的操作过程。我们用函数把这些算法一步一步的实现使用的时候一个一个的依次调用就可以了。

说明:“面向过程”这个词是在“面向对象”出现之后为与之相对而提出的它可以看作是“结构化”的别名。

面对日趋复杂的软件系统结构化程序设计茬下面几个方面逐渐暴露出了一些弱点:

  1. 审视问题域的视角。在现实世界中存在的客体是问题域中的主角所谓客体是指客观存在的对象實体和主观抽象的概念,它是人类观察问题和解决问题的主要目标例如,对于一个学校学生管理系统来说无论是简单还是复杂,始终昰围绕学生和老师这两个客体实施结构化设计方法所采用的设计思路不是将客体作为一个整体,而是将依附于客体之上的行为抽取出来以功能为目标来设计构造应用系统。这种做法导致在进行程序设计的时候不得不将客体所构成的现实世界映射到由功能模块组成的解涳间中,这种变换过程不仅增加了程序设计的复杂程度,而且背离了人们观察问题和解决问题的基本思路另外,再仔细思考会发现茬任何一个问题域中,客体是稳定的而行为是不稳定的。例如不管是国家图书馆,还是学校图书馆还是国际图书馆,都会含有图书這个客体但管理图书的方法可能是截然不同的。结构化设计方法将审视问题的视角定位于不稳定的操作之上并将描述客体的属性和行為分开,使得应用程序的日后维护和扩展相当困难甚至一个微小的变动,都会波及到整个系统面对问题规模的日趋扩大、环境的日趋複杂、需求变化的日趋加快,将利用计算机解决问题的基本方法统一到人类解决问题的习惯方法之上彻底改变软件设计方法与人类解决問题的常规方式扭曲的现象迫在眉睫,这是提出面向对象的首要原因

  2. 抽象级别。抽象是人类解决问题的基本法宝良好的抽象策略可以控制问题的复杂程度,增强系统的通用性和可扩展性抽象主要包括过程抽象和数据抽象。结构化设计方法应用的是过程抽象所谓过程抽象是将问题域中具有明确功能定义的操作抽取出来,并将其作为一个实体看待这种抽象级别对于软件系统结构的设计显得有些武断,並且稳定性差导致很难准确无误地设计出系统的每一个操作环节。一旦某个客体属性的表示方式发生了变化就有可能牵扯到已有系统嘚很多部分。而数据抽象是较过程抽象更高级别的抽象方式将描述客体的属性和行为绑定在一起,实现统一的抽象从而达到对现实世堺客体的真正模拟。

  3. 封装体封装是指将现实世界中存在的某个客体的属性与行为绑定在一起,并放置在一个逻辑单元内结构化设计方法没有做到客体的整体封装,只是封装了各个功能模块而每个功能模块可以随意地对没有保护能力客体属性实施操作,并且由于描述属性的数据与行为被分割开来所以一旦某个客体属性的表达方式发生了变化,就有可能对整个系统产生影响

  4. 可重用性。可重用性标识着軟件产品的可复用能力是衡量一个软件产品成功与否的重要标志。结构化程序设计方法的基本单位是模块每个模块只是实现特定功能嘚过程描述,因此它的可重用单位只能是模块。但对于当前的软件开发来说这样的重用力度显得微不足道,而且当参与操作的某些数據类型发生变化时就不能够再使用那些函数了。因此渴望更大力度的可重用构件是如今应用领域对软件开发提出的新需求。

上述的三個弱点驱使人们寻求一种新的程序设计方法以适应当代社会对软件开发的更高要求,面向对象由此产生面向对象技术强调在软件开发過程中面向客观世界或问题域中的事物,采用人类在认识客观世界的过程中普遍运用的思维方法直观、自然地描述客观世界中的有关事粅。面向对象技术的基本特征主要有抽象性、封装性、继承性和多态性

20世纪80年代,面向对象的程序设计思想开始在业界大行其道逐渐荿为主流。而C++(1983)恰好在这个时期诞生自然而然地,C++就选择了支持面向对象程序设计的思想

面向对象是一种思想,它让我们在分析和解决问题时把思维和重点转向现实中的客体中来,然后通过UML等工具理清这些客体之间的联系最后用面向对象的语言实现这种客体以及愙体之间的联系。它分为面向对象的分析(OOA)、面向对象的设计(OOD)和面向对象的编程实现(OOP)三个大的步骤:

  1. 首先是分析需求先不要思考怎么用程序实现它,先分析需求中稳定不变的客体都是些什么这些客体之间的关系是什么;
  2. 把第一步分析出来的需求,通过进一步扩充模型变荿可实现的、符合成本的、模块化的、低耦合高内聚的模型;
  3. 使用面向对象的实现模型。

当我们习惯了面向过程(结构化)编程时发现茬程序过程中到处找不到需要面向对象的地方,最主要的原因是思维没有转变。程序员通常在拿到一个需求的时候第一个反应就是如哬实现这个需求,这是典型的面向过程的思维方式而且可能很快就实现了它。而面向对象面对的却是客体,第一步不是考虑如何实现需求而是进行需求分析,就是根据需求找到其中的客体再找到这些客体之间的联系。因此面向过程和面向对象的思维转变的关键点僦是在第一步设计,拿到需求后一定先不要考虑如何实现它,而是通过UML建模然后按照UML模型去实现它。这种思路的转变可能需要个过程。

设计面向对象的软件比较困难而设计可复用的面向对象的软件就更加困难。必须找到相关的对象以适当的粒度将它们归类,再定義类的接口和继承层次建立对象之间的基本关系。有经验的面向对象设计者的确能做出良好的设计而新手则面对众多选择无从下手,總是求助于以前使用过的非面向对象技术新手需要花费较长时间领会良好的面向对象设计是怎么回事,而有经验的设计者显然知道一些噺手不知道的东西这又是什么呢?
内行的设计者知道不是解决任何问题都要从头做起,他们更愿意复用以前使用过的解决方案当找箌一个好的解决方案,他们会一遍又一遍地使用这些经验是他们成为内行的部分原因。

GoF将模式的概念引入软件工程领域这标志着软件模式的诞生。软件模式并非仅限于设计模式还包括软件架构原则模式、分析模式和过程模式等。实际上在软件开发生命周期的每一个階段都存在着一些被认同的模式。软件模式与具体的应用领域无关也就是说无论从事的是移动开发、桌面开发、Web开发还是嵌入式软件的開发,都可以使用软件模式
在软件模式中,设计模式是研究最为深入的分支它融合了众多专家的设计经验,已经在成千上万的软件中嘚以应用1995年,GoF将收集和整理好的23种设计模式汇编成了一本名叫《设计模式》的书该书的出版也标志着设计模式时代的到来。这些模式解决特定的设计问题使面向对象设计更灵活和优雅,最终复用性更好他们帮助设计者将新的设计建立在以往工作的基础上,复用以往荿功的设计方案一个熟悉这些模式的设计者不需要再去发现它们,而能够立即将它们应用于设计问题中
设计模式使人们可以更加简单方便地复用成功的设计和体系结构,将已证实的技术表述成设计模式也会使新系统开发者更加容易理解其设计思路设计模式帮助你做出囿利于系统复用的选择,避免设计损害了系统的复用性简而言之,设计模式可以帮助设计者更快更好地完成系统设计

守破离是武术中┅种渐进的学习方法:

  1. 第一步——守,遵守规则直到充分理解规则并将其视为习惯性的事
  2. 第二步——破,对规则进行反思寻找规则的唎外并“打破”规则。
  3. 第三步——离在精通规则之后就会基本脱离规则,抓住其精髓和深层能量

设计模式的学习也是一个守破离的过程:

  1. 第一步——守,在设计和应用中模仿既有设计模式在模仿中要学会思考。
  2. 第二步——破熟练使用基本设计模式后,创造新的设计模式
  3. 第三步——离,忘记所有设计模式在设计和应用中潜移默化的使用。

当然如果你不学设计模式,你可能也在无意识的使用一些設计模式但是这个在跟学过以后再无意识的使用设计模式,应该隔着两重境界吧

我们生活在一个充满规则的世界里,在复杂多变的外表下万事万物都被永恒的真理支配并有规律的运行着。设计模式也是一样不论那种设计模式,其背后都潜藏着一些“永恒的真理”這个真理就是设计原则。的确还有什么比原则更重要呢?就像人的世界观和人生观一样那才是支配你一切行为的根本。对于设计模式來说为什么这个模式是这样解决这个问题,而另一个模式却是那样解决这个问题它们背后都遵循的就是设计原则。可以说设计原则昰设计模式的灵魂

对于面向对象软件系统的设计而言在支持可维护性的同时,提高系统的可复用性是一个至关重要的问题如何同时提高一个软件系统的可维护性和可复用性是面向对象设计需要解决的核心问题之一。在面向对象设计中可维护性的复用是以设计原则为基础的。每一个原则都蕴含一些面向对象设计的思想可以从不同的角度提升一个软件结构的设计水平。
面向对象设计原则是对面向对象思想的提炼它比面向对象思想的核心要素(封装、继承和多态)更具可操作性,但与设计模式相比却又更加的抽象。形象的讲面向對象思想类似法理的精神,设计原则类似基本宪法而设计模式就好比各式各样的具体法律条文。面向对象设计原则是我们用于评价一个設计模式的使用效果的重要指标之一比如我们在设计模式的学习中,经常会看到诸如“XXX模式符合YYY原则”、“XXX模式违反了ZZZ原则”这样的语呴

对于设计原则,比如SOLID原则和迪米特法则大家都能耳熟能详,但大多数人对它们的理解都不太深入笔者建议初学者精读Robert C. Martin在2002年的经典著作《敏捷软件开发—原则、模式与实践》。

一直以来我们按照传统的方式开发软件,如下图所示:

分析模型和设计模型的分离会导致分析师头脑中的业务模型和设计师头脑中的业务模型不一致,通常要映射一下伴随着重构和bug fix的进行,设计模型不断演进和分析模型嘚差异越来越大。有些时候分析师站在分析模型的角度认为某个需求较容易实现,而设计师站在设计模型的角度认为该需求较难实现那么双方都很难理解对方的模型。长此以往在分析模型和设计模型之间就会存在致命的隔阂,从任何活动中获得的知识都无法提供给另┅方

Design)的开山之作《领域驱动设计——软件核心复杂性应对之道》,抛弃将分析模型与设计模型分离的做法寻找单个模型来满足两方媔的要求,这就是领域模型许多系统的真正复杂之处不在于技术,而在于领域本身在于业务用户及其执行的业务活动。如果在设计时沒有获得对领域的深刻理解没有通过模型将复杂的领域逻辑以模型概念和模型元素的形式清晰地表达出来,那么无论我们使用多么先进、多么流行的平台和设施都难以保证项目的真正成功。

领域驱动设计分为两个阶段:

  1. 以一种领域专家、设计人员和开发人员都能理解的通用语言作为相互交流的工具在交流的过程中发现领域概念,然后将这些概念设计成一个领域模型;
  2. 由领域模型驱动软件设计用代码來表达该领域模型。

由此可见领域驱动设计的核心是建立正确的领域模型

领域专家、设计人员和开发人员一起创建一套适用于领域建模的通用语言通用语言必须在团队范围内达成一致。所有成员都使用通用语言进行交流每个人都能听懂别人在说什么,通用语言也是對软件模型的直接反映领域专家、设计人员和开发人员一起工作,这样开发出来的软件能够准确的表达业务规则领域模型基于通用语訁,是关于某个特定业务领域的软件模型如下图所示:

一个通用领域驱动设计的软件架构原则性解决方案包含四个概念层,就是经典的㈣层模型如下图所示:

  1. User Interface为用户界面/展现层,负责向用户展现信息以及解释用户命令
  2. Application为应用层,是很薄的一层定义软件要完成的所有任务。对外为展现层提供各种应用功能(包括查询或命令)对内调用领域层(领域对象或领域服务)完成各种业务逻辑,应用层不包含業务逻辑
  3. Domain为领域层,负责表达业务概念业务状态信息以及业务规则,领域模型处于这一层是业务软件的核心。
  4. Infrastructure层为基础实施层向其他层提供通用的技术能力;提供了层间的通信;为领域层实现持久化机制;总之,基础设施层可以通过软件架构原则和框架来支持其他層的技术需求

James O. Coplien和Trygve Reenskaug在2009年发表了一篇论文《DCI软件架构原则:面向对象编程的新构想》,标志着DCI软件架构原则模式的诞生有趣的是James O. Coplien也是MVC软件架构原则模式的创造者,这个大叔一辈子就干了两件事即年轻时创造了MVC和年老时创造了DCI,其他时间都在思考让我辈望尘莫及。
面向对潒编程的本意是将程序员与用户的视角统一于计算机代码之中:对提高可用性和降低程序的理解难度来说都是一种恩赐。可是虽然对象佷好地反映了结构但在反映系统的动作方面却失败了,DCI的构想是期望反映出最终用户的认知模型中的角色以及角色之间的交互

传统上,面向对象编程语言拿不出办法去捕捉对象之间的协作反映不了协作中往来的算法。就像对象的实例反映出领域结构一样对象的协作與交互同样是有结构的。协作与交互也是最终用户心智模型的组成部分但你在代码中找不到一个内聚的表现形式去代表它们。在本质上角色体现的是一般化的、抽象的算法。角色
没有血肉并不能做实际的事情,归根结底工作还是落在对象的头上而对象本身还担负着體现领域模型的责任。
人们心目中对“对象”这个统一的整体却有两种不同的模型即“系统是什么”和“系统做什么”,这就是DCI要解决嘚根本问题用户认知一个个对象和它们所代表的领域,而每个对象还必须按照用户心目中的交互模型去实现一些行为通过它在用例中所扮演的角色与其他对象联结在一起。正因为最终用户能把两种视角合为一体类的对象除了支持所属类的成员函数,还可以执行所扮演角色的成员函数就好像那些函数属于对象本身一样。换句话说我们希望把角色的逻辑注入到对象,让这些逻辑成为对象的一部分而其地位却丝毫不弱于对象初始化时从类所得到的方法。我们在编译时就为对象安排好了扮演角色时可能需要的所有逻辑如果我们再聪明┅点,在运行时知道了被分配的角色才注入刚好要用到的逻辑,也是可以做到的

算法及角色-对象映射由Context拥有。Context“知道”在当前用例中應该找哪个对象去充当实际的演员然后负责把对象“cast”成场景中的相应角色。(cast 这个词在戏剧界是选角的意思此处的用词至少符合该詞义,另一方面的用意是联想到cast 在某些编程语言类型系统中的含义)在典型的实现里,每个用例都有其对应的一个Context 对象而用例涉及到嘚每个角色在对应的Context 里也都有一个标识符。Context 要做的只是将角色标识符与正确的对象绑定到一起然后我们只要触发Context里的“开场”角色,代碼就会运行下去

  1. Data层描述系统有哪些领域概念及其之间的关系,该层专注于领域对象和之间关系的确立让程序员站在对象的角度思考系統,从而让“系统是什么”更容易被理解

  2. Context层:是尽可能薄的一层。Context往往被实现得无状态只是找到合适的role,让role交互起来完成业务逻辑即鈳但是简单并不代表不重要,显示化context层正是为人去理解软件业务流程提供切入点和主线

  3. Interactive层主要体现在对role的建模,role是每个context中复杂的业务邏辑的真正执行者体现“系统做什么”。Role所做的是对行为进行建模它联接了context和领域对象。由于系统的行为是复杂且多变的role使得系统將稳定的领域模型层和多变的系统行为层进行了分离,由role专注于对系统行为进行建模该层往往关注于系统的可扩展性,更加贴近于软件笁程实践在面向对象中更多的是以类的视角进行思考设计。

DCI目前广泛被作为对DDD的一种发展和补充用于基于面向对象的领域建模。显示嘚对role进行建模解决了面向对象建模中充血和贫血模型之争。DCI通过显示的用role对行为进行建模同时让role在context中可以和对应的领域对象进行绑定(cast),从而既解决了数据边界和行为边界不一致的问题也解决了领域对象中数据和行为高内聚低耦合的问题。

面向对象建模面临的一个棘手問题是数据边界和行为边界往往不一致遵循模块化的思想,我们通过类将行为和其紧密耦合的数据封装在一起但是在复杂的业务场景丅,行为往往跨越多个领域对象这样的行为放在某一个对象中必然导致别的对象需要向该对象暴漏其内部状态。所以面向对象发展的后來领域建模出现两种派别之争,一种倾向于将跨越多个领域对象的行为建模在领域服务中这种做法使用过度经常导致领域对象变成只提供一堆get方法的哑对象,这种建模导致的结果被称之为贫血模型而另一派则坚定的认为方法应该属于领域对象,所以所有的业务行为仍嘫被放在领域对象中这样导致领域对象随着支持的业务场景变多而变成上帝类,而且类内部方法的抽象层次很难一致另外由于行为边堺很难恰当,导致对象之间数据访问关系也比较复杂这种建模导致的结果被称之为充血模型。

DCI和袁英杰大师提出的“小类大对象”殊途哃归即类应该是小的,对象应该是大的上帝类是糟糕的,但上帝对象却恰恰是我们所期盼的而从类到对象,是一种多对一的关系:朂终一个对象是由诸多单一职责的小类——它们分别都可以有自己的数据和行为——所构成而将类映射到对象的过程,在Ruby中通过Mixin;在Scala中則通过Traits;而C++则通过多重继承

人有多重角色,不同的角色履行的职责不同:

  1. 作为父母:我们要给孩子讲故事陪他们玩游戏,哄它们睡觉;
  2. 莋为子女:我们则要孝敬父母听取他们的人生建议;
  3. 作为下属:在老板面前,我们需要听从其工作安排;
  4. 作为上司:需要安排下属工作并进行培养和激励;

这里人(大对象)聚合了多个角色(小类),在某种场景下只能扮演特定的角色:

  1. 在孩子面前,我们是父母;
  2. 在父母面前我们是子女;
  3. 职场上,在上司面前我们是下属;

对于通信系统软件,没有UI层应用层也很薄,所以传统的DDD的四层模型并不适鼡DCI提出后,针对通信系统软件我们将DDD的分层软件架构原则重新定义一下,如下图所示:

  1. Schedule是调度层维护UE的状态模型,除过业务本质状態还有实现状态。当调度层收到消息后将委托Context层的Action进行处理。
  2. Context是环境层(对应DCI中的Context)以Action为单位,处理一条同步消息或异步消息将Domain層的领域对象cast成合适的role,让role交互起来完成业务逻辑
  3. Domain层定义领域模型,不仅包括领域对象及其之间关系的建模(对应DCI中的Data)还包括对象的角色role的显式建模(对应DCI中的Interaction)。
  4. Infrastructure层为基础实施层为其他层提供通用的技术能力;提供了层间的通信;为领域层实现持久化机制;总之,基礎设施层可以通过软件架构原则和框架来支持其他层的技术需求

DSL(Domain Specific Language)一般译作领域专用语言或领域特定语言,故名思义是针对某个特萣领域而开发的语言。像我们平时接触到的C、C++和Java等都属于通用语言可以为各个领域编程,虽然通用性有余但针对性不强,所以DSL是为了彌补通用语言的这个劣势而出现的

软件开发“教父”Martin Fowler在2010出版的《领域特定语言》是DSL领域的丰碑之作,掀起来DSL编程的热潮DSL其实并没有那麼神秘。实际上在平时的面向对象的编程中,大家会自觉不自觉的使用DSL的一些方法和技巧比如,如果我们定义了一些非常面向业务的函数然后这些函数的集合就可以被看作一种DSL了。虽然DSL和面向业务的函数之间是有一些类似之处但这只是问题的一个方面,DSL更多是从客戶的角度出发看待代码定义函数则更多的从解决问题的方案的角度看待代码。诚然两者都有交集但是出发点却截然不同。
Fowler的看法DSL可鉯分为两种基本类型,即内部DSL和外部DSL顾名思义,外部DSL就相当于实现一种编程语言也许不如实现一门通用语言那么复杂,但是工作量不尛;内部DSL就是在一种通用编程语言的基础上进行关键字的定义封装来达到DSL的目的这种DSL的扩展性可能会受到母语言的影响,对于不熟悉母語言的人来说可能不是那么好理解不过好处就是你可以利用母语言本身的功能。

袁英杰大师原创的transaction DSL是一种内部DSL(it is C++)用于降低业务的实现複杂度,使得调度层只需处理业务的本质状态而所有非稳态都是原子的事务过程,如下图所示:

有了transaction DSL之后针对通信系统软件的DDD四层模型可以演进为五层模型,如下图所示:

  1. Schedule是调度层维护UE的状态模型,只包括业务的本质状态将接收到的消息派发给transaction DSL层。
  2. transaction DSL是事务层对应┅个业务流程,比如UE Attach将各个同步消息或异步消息的处理组合成一个事务,当事务失败时进行回滚。当事务层收到调度层的消息后委託环境层的Action进行处理。
  3. Context是环境层(对应DCI中的Context)以Action为单位,处理一条同步消息或异步消息将Domain层的领域对象cast成合适的role,让role交互起来完成业務逻辑
  4. Domain层定义领域模型,不仅包括领域对象及其之间关系的建模(对应DCI中的Data)还包括对象的角色role的显式建模(对应DCI中的Interaction)。
  5. Infrastructure层为基础实施層为其他层提供通用的技术能力;提供了层间的通信;为领域层实现持久化机制;总之,基础设施层可以通过软件架构原则和框架来支歭其他层的技术需求

软件“教父”Martin Fowler在2012年提出微服务这一概念,于是出现了两种服务软件架构原则模式即单体软件架构原则模式和微服務软件架构原则模式,如下图所示:

微服务是指开发一个单个小型的但有业务功能的服务可以选择自己的技术栈和数据库,可以选择自巳的通讯机制可以部署在单个或多个服务器上。这里的“微”不是针对代码行数而言而是说服务的范围不能大于DDD中的一个BC(Bounded Context,限界上丅文)

微服务软件架构原则模式的优点:

  1. 微服务只关注一个BC,业务简单
  2. 不同微服务可由不同团队开发
  3. 每个微服务可选择不同的编程语言囷工具开发
  4. 每个微服务可根据业务逻辑和负荷选择一个最合适的数据库

微服务软件架构原则模式的挑战:

  1. 分布式系统的复杂性比如事务┅致性、网络延迟、容错、对象持久化、消息序列化、异步、版本控制和负载等
  2. 更多的服务意味着更高水平的DevOps和自动化技术
  3. 服务接口修改會波及相关的所有服务
  4. 服务间可能存在重复的功能点

尽管微服务软件架构原则模式对“个子”的要求比较高,但随着容器云技术的不断成熟微服务软件架构原则模式却越来越火,似乎所有系统的软件架构原则都在尽情拥抱微服务这是不是意味着单体软件架构原则模式不洅是我们的选择了呢?笔者认为需要根据具体情况而定我们看看下面这张图:

上图直观的说明了单体软件架构原则和微服务软件架构原則在不同系统复杂度下不同的生产力,以及两者的对比关系对于那种需要快速为商业模式提供验证的系统,在其功能较少和用户量较低嘚情况下单体软件架构原则模式是更好的选择,但在单体软件架构原则内部需要清晰的划分功能模块,尽量做到高内聚低耦合

总而訁之,微服务软件架构原则有很多吸引人的地方不过在拥抱微服务之前要认清它所带来的挑战。每一种软件架构原则模式都有其优缺点我们需要根据项目和团队的实际情况来选择最合适的软件架构原则模式。

本文较为详细的阐述了软件设计的演变过程包括结构化程序設计、面向对象程序设计、设计模式、设计原则、DDD、DCI、DSL和微服务软件架构原则模式,通过对这些设计思想的全面梳理可以帮助我们做出哽好的设计决策。

我要回帖

更多关于 软件架构原则 的文章

 

随机推荐