软件复杂度与分而治之

http://www.cnblogs.com/feng9exe/p/5592577.html

什么是软件设计的复杂度

软件技术发展的使命之一就是控制复杂度(Complexity)。从高级语言的产生,到结构化编程,再到面向对象编程、组件化编程等等。关于复杂度的定义并不一致,想要详细了解的可以读读The Many Faces of Complexity in Software Design.

英文中Complex和Complicated有着微妙的不同。但总结起来,软件复杂度偏负面意义,包括两个要点: 
- 难以理解 (难以维护和扩展。) 
- 无法预测行为

复杂度是随着软件规模不断扩大而必然产生的。它本身又是一个相对的概念,同一个系统对于设计者、开发者,以及维护者而言,复杂度是不同的。不同时期,一个程序员所能掌握的复杂度也是不同的,这也是一个程序员不断提升的目标。

既然业界已经对抗复杂度几十年了,我们就来整理一下。

以分解降低复杂度

以分解的方式进行的设计,主要特点是: 
- 分离职责(Seperation of Concerns,参考单一职责原则) 
- 关注接口(定义交互)

这是最常使用的技术了。将一个大问题,不断的拆解为各个小问题进行分析研究,然后再组合到一起。在西方称为Divide and Conquer Principle (分而治之原则)。

在结构化编程的时代,提倡模块化(Modularization)。最早提出软件复杂度的工程师提出了基于组件的软件(Component Based Software)。不知道是不是从乐高积木上得到的启发,将系统中拆分为不同的组件,各自实现,然后再组装在一起。

在架构设计中,无论是C/S风格,分层,还是N-Tier,SOA,和前面组件式一样,都是在进行分解,它们都更加强调组合交互。设计上,分分职责,定义好接口,就可以各自开发了。然后将交互限定于接口层,就能够很好的控制整个系统的复杂度。

比如应用层使用一个语音库(Speech Library,一个以库的形式的模块化应用), 根本不用关心其内部实现,只要了解如何使用它的API就可以了。

时间: 2024-10-10 08:14:17

软件复杂度与分而治之的相关文章

软件设计的复杂度

http://blog.csdn.net/horkychen/article/details/45381743 什么是软件设计的复杂度 软件技术发展的使命之一就是控制复杂度(Complexity).从高级语言的产生,到结构化编程,再到面向对象编程.组件化编程等等.关于复杂度的定义并不一致,想要详细了解的可以读读The Many Faces of Complexity in Software Design. 英文中Complex和Complicated有着微妙的不同.但总结起来,软件复杂度偏负面意

软件体系结构原理、方法与实践总结

第1章:软件体系结构概论 什么是软件危机,软件危机的具体表现有哪些? 软件危机:落后的软件生产方式无法满足迅速增长的计算机软件需求,从而导致软件开发与维护过程中出现一系列严重问题的现象. 软件危机的表现: 软件成本日益增长,开发进度难以控制,软件质量差,软件维护困难 产生软件危机的原因,如何克服软件危机? 产生软件危机的原因有用户需求不明确,缺乏正确的理论指导,软件规模越来越大,软件复杂度越来越高. 人们面临的不光是技术问题,更重要的是管理问题.要提高软件开发效率,提高软件产品质量,必须采用工程

软件编码最重要的技能

参考 http://www.johndcook.com/blog/2015/06/18/most-important-skill-in-software/ When it comes to writing code, the number one most important skill is how to keep a tangle of features from collapsing under the weight of its own complexity. I’ve worked o

定论——软件开发的方法论探讨

http://www.jianshu.com/p/9593bd7b28d9 一.消除隐喻 1.隐喻 软件开发这件事情,出现得很晚.距今只有几十年的时间,关于它的定义,我们可以简单地说:"就是把软件做出来." 这基本上等于什么都没有说.而软件开发究竟是怎么回事,大家也没有搞明白,于是隐喻就派上用场了.当你要向一个完全没有概念的朋友,解释什么是软件开发的时候,你无法向解释建筑工程那样把他带到现场去看--案件开发的现场,你的朋友会以为软件开发就是一群人坐在电脑前面打键盘--你只能打比方:它就

zz从面向对象的设计模式看软件设计

原贴:https://coolshell.cn/articles/8961.html 前些天发了一篇<如此理解面向对象编程>的文章,然后引起了大家的热议.然后我在微博上说了一句--"那23个经典的设计模式和OO半毛钱关系没有,只不过人家用OO来实现罢了--OO的设计模式思想和Unix的设计思想基本没什么差别",结果引来了一点点争议.所以,我写下这篇文章把我的观点说明一下.我希望这样可以让大家更容易地理解什么是设计模式.我顺便帮OO和 Unix/Linux搞搞基. 什么是模式

编程思想进化史与软件复杂性

软件问题对象的问题: 1)业务逻辑的复杂型: 2)软件组件的规模: 软件复杂度的升级:一维线性(单纯计算):二维平面(带有业务逻辑的结构型计算):三维立体:描述复杂的现实世界: 针对软件开发任务的升级,编程思想也有一个相应的升级过程: 编程思想的进化: 1)面向计算:计算机出现的驱动力,具有唯一解: 2)面向过程.结构:具有有限解: 3)面向对象:具有无限解: 原文地址:https://www.cnblogs.com/feng9exe/p/8274875.html

多年收集的一些稀有软件2

QQ:365543212 Fuel Economy Calculator v1.1 B.001(汽车工程软件,用于预测车辆燃油消耗率,是目前此类软件中最为全面的,能接收从最新的发动机分析程序Engine Analyzer自动发送来的强大的游标和发动机规格) Psat v5.1 1CD ProScan.v5.1 1CD PowerFlow v3.3p3a for Linux 1CD(Exa公司的汽车外气流计算软件) Rotating Inertia Calculator v1.1 A.000(一款

架构设计之六个复杂度来源

之前在谈谈架构设计的目的 这篇文章中说过,架构设计的目的就是为了解决软件系统复杂度带来的问题. 但是究竟复杂度有哪些呢?所以今天借此说说软件复杂度的六个来源: 1.高性能; 2.高可用; 3.可扩展性; 4.低成本; 5.安全; 6.规模; 一.高性能 对性能孜孜不倦的追求是整个人类技术不断发展的根本驱动力.例如计算机,从电子管计算机到晶体管计算机再到集成电路计算机,运算性能从每秒几次提升到每秒几亿次.但伴随着性能越来越高,相应的方法和系统复杂度也是越来越高.现代的计算机CPU集成了几亿颗晶体管

九度拓客新零售系统APP源码定制开发

九度拓客系统开发找庄经理:18565189719微/电,九度拓客软件定制开发,九度拓客新零售系统定制开发,九度拓客系统开发方案,九度拓客新零售模式系统解析,九度拓客软件app开发案例,九度拓客现成系统开发,九度拓客系统源码开发? 在这么多年的网络营销推广市场中,传统网络营销推广公司的一贯做法早已将市场教育完全.经过多年市场对网络营销推广概念化的教育,服务业连锁品牌客户们多将网络营销推广定义为信息.其实这是对网络营销推广的一种错误认知.? 一.九度拓客系统升级制度介绍:? (1单=199元产品)?