C++ 大规模程序设计 之 物理层次结构

在系统中物理组件间必然会存在着各种各样的联系(DependOn 关系)。良好的设计应该是接口短小,易于理解,易于使用和易于测试的。理清物理层次结构对于设计良好的系统是很有帮助的。


易测试性设计

质量设计的一个重要部分是易测试性设计,如果一个组件设计良好,那么用它构造测试用例也是比较容易的,同样它的易用性对于用户来说也是很好的,很多时候测试用例和用户使用的场景是一致的。这个和极限编程中测试驱动的想法是一致的。由使用倒逼设计。

规则 1:对整个系统的层次结构进行分布测试比只在上层测试要有效的多。

如果层次定义的清晰,那么测试起来会很方便,而且测试用例的构造也会非常的合理。如果发现分层次结构测试时构造测试用例很困难,或者很难划分清晰的层次,恐怕物理结构的设计已经出现了问题。

规则 2:隔离测试

也可以理解成一种独立的测试,针对每个模块的独立测试目的是为了降低集成测试时的风险。隔离测试可以确保单个组件的有效性。同时也是检查组件间依赖设计的好坏的一种方式。如果要单独执行某个组件还要依赖好多其他的组件,隔离起来有点困难,那么可能要重新考虑一下组件或子系统的设计了。

规则 3:非循环物理依赖

循环依赖,组件间的相互依赖。

非循环依赖的好处是可以更容易的进行测试。有循环依赖甚至很难确定测试的顺序。循环依赖更大问题是限制了组件的重用,增加理解和使用的成本。

要想解决循环依赖,可以考虑两个方面:一,重新打包,解开循环链。二,将循环依赖的两个或多个组件组成一个新的组件。


层次化和层次号

层次号是把组件划分层次的一种方式。用层次号的方法可以很简单的查找出系统中是否有

每一个有向非循环图都可以被赋予唯一的层次号,循环图则不能。可以被赋予唯一层次号的物理依赖图被称为可层次化的。

图中包含了没有循环依赖和有循环依赖的情况

在右边的图中有循环依赖,此时组件C的层次号是3还是4呢,无法确定了。

层次化清晰的组件关系可以为设计,测试,复用提供清晰的脉络,在迷宫一样的大型系统中有一份清晰的地图会是一件很美好的事。


累积组件依赖与组件设计质量

累积组件依赖(Cumulative Component Dependency)

它是一种数字表达方式,表示维护和测试一个子系统需要的开销。

定义:在一个子系统内所有组件Ci之上,对每个组件Ci增量式测试时所需要的组件数量进行求和。

计算CCD举例:

从图中可以看出,同样是3个组件,如果循环依赖时它的CCD=9,但是树状的话CCD=5,差别还是很明显的。

有了描述机制,就可以用它来量化的组件的物理设计了。有了量化就可以进行优化。

但就一个系统来说,它的可能有不同好多种优化方式,但什么是好的标准呢。

一个衡量方式:NCCD(标准累加组件依赖)

包含N个组件子系统的CCD值与相同系统树形大小的CCD的值做比较

以图中3中设计依赖为例,套用公式,

NCCD(垂直依赖) = 6/5 = 1.2

NCCD(循环依赖) = 9/5 = 1.4

NCCD(树形依赖) = 5/5 = 1



如果NCCD < 1 可以认为系统是比较水平化且松耦合的,便于复用。

如果NCCD > 1 则系统中存在着比较垂直的依赖,或紧耦合。

如果NCCD 远远大于 1,则系统中存在着明显的循环依赖。

NCCD为系统提供了一个量化指标,如果要实现一个好的系统,还需要不断的思考和设计。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-09 20:18:50

C++ 大规模程序设计 之 物理层次结构的相关文章

C++ 大规模程序设计 之 层次化

层次化的主要目的还是为了设计出高质量的系统 + 易于理解 + 易于维护 + 易于测试 + 易于重用 = 少加班 导致物理循环依赖的原因 产生物理循环依赖的原因是多种多样的,书中列举了3种,但总结一下可能2种更合适一些. 心理方面:在对原有系统开发新功能时,或修改问题时,信手拈来的习惯可能在不经意间造成循环依赖. 技术方面:设计系统逻辑关系时,逻辑上的耦合导致了物理上的循环依赖. 处理物理循环依赖的方式 升级 组件间支配: 如果组件y处于组件x的上层,并且y在物理上依赖于x,则称组件y支配组件x.

观点 | 为什么说云主机比物理机故障率更低?

本文根据高效运维系列微信群的嘉宾分享整理并发布.「高效运维」公众号作为本系列群的官方唯一公众号,原创并独家首发.OneAPM 授权转发. 编辑 徐凯强@和信-北京(内容收集.发布) 作者介绍 邱模炯 UCloud 平台开发中心总监,北京大学计算机系研究生毕业,擅长操作系统.虚拟化和数据中心自动化等云平台的基础技术. 引言 很多朋友对云平台可用性有所担心,认为用物理机更加放心.今天我想就这个话题抛出个人看法.希望对大家有参考意义.先抛出结论: 从业务程序的角度,云主机的可用性可以做到比物理机高,即

DBA词典:数据库设计常用词汇中英文对照表

1. Access method(访问方法):此步骤包括从文件中存储和检索记录. 2. Alias(别名):某属性的另一个名字.在SQL中,可以用别名替换表名. 3. Alternate keys(备用键,ER/关系模型):在实体/表中没有被选为主健的候选键. 4. Anomalies(异常)参见更新异常(update anomalies) 5. Application design(应用程序设计):数据库应用程序生命周期的一个阶段,包括设计用户界面以及使用和处理数据库的应用程序. 6. Att

前端模块化

前端模块化 前端模块化 在JavaScript发展初期就是为了实现简单的页面交互逻辑,寥寥数语即可:如今CPU.浏览器性能得到了极大的提升,很多页面逻辑迁移到了客 户端(表单验证等),随着web2.0时代的到来,Ajax技术得到广泛应用,jQuery等前端库层出不穷,前端代码日益膨胀 这时候JavaScript作为嵌入式的脚本语言的定位动摇了,JavaScript却没有为组织代码提供任何明显帮助,甚至没有类的概念,更不用说模块(module)了,JavaScript极其简单的代码组织规范不足以驾

有关云架构建设和选型的思考

最近在负责公司内部私有云的建设,一直在思考怎么搞云计算,怎么才能够把云架构设计得好一些.本文尽量全面的列出了云架构建设和选型的考量因素. 我们主要从五个层面逐步评估云架构的建设和选型,分别是: 行业生态 企业需求 云计算的能力 潜在的挑战 如何建设 一.行业生态 计算机云经过多年的发展,由一开始的概念,慢慢发展成熟并能够推向市场,提供多种多样的服务,市场空间非常之大. 在云的发展过程中,亚马逊经过多年的深耕积累,发展成为了云行业的标杆企业,甚至可以说是建立了云解决方案的标准.之后,Google.

十分钟看懂云计算概念

亚马逊AWS.微软Azure.阿里Aliyun组成的3A团队连续多季度保持高速增长.AWS通过光环新网实现商用,IBM Bluemix则由世纪互联提供运营,国际云服务商陆续来了.Openstack发布Newton版本,看上去就没有不能支持的东西,私有云的春天真的来了吗?Docker红得发紫,与之对应的DevOps和NoOps持续高温.但是对于不少企业尤其是传统企业,云仍在天边,对于云仍感觉云里雾里.上云还是不上云,上什么云,这是个问题.我们试着用最通俗的比喻,理清云服务中最基本的那些事儿. 什么

nodejs(一)

nodejs第一章节 使用node来实现第一个http服务器 var http = require('http'); http.createServer(function (request, response) { // 发送 HTTP 头部 // HTTP 状态值: 200 : OK // 内容类型: text/plain response.writeHead(200, {'Content-Type': 'text/plain'}); console.log("我是yyk"); //

在Windows下用Eclipse+CDT+MinGW搭建C++开发平台

本文提供了在Windows下用Eclipse+CDT+MinGW搭建C / C++开发平台的方法, 测试平台为Windows XP Sp2 CHS. 以下软件均为Windows平台下的版本. 1.安装JDK,目的是为了Eclipse的运行.目前版本是jdk-1_5_0_06-windows-i586-p.exe ,下载地址http://java.sun.com/javase/downloads/index.jsp.仅安装JDK即可.假设安装路径为D:\java\JDK.配置系统环境变量(右键点击

【C++探索之旅】开宗明义+第一部分第一课:什么是C++?

内容简介 1.课程大纲 2.第一部分第一课:什么是C++? 3.第一部分第二课预告:C++编程的必要软件 开宗明义 亲爱的读者,您是否对C++感兴趣,但是C++看起来很难,或者别人对你说C++挺难的,你不知道如何入门? 别担心,这个系列教程就是为C++初学者准备的. 不可否认,C++是一门非常著名的语言.几乎学计算机的同学都难免要碰一下C++,中国的大学课堂一般也是先学C语言入门,然后就是Java或者C++. C++ 这门语言的使用很广泛,特别是在游戏开发领域,C++的性能和无限可能性使得其几乎