软件构建中的设计

设计中的挑战

1、设计是一个险恶的问题:只有通过解决或部分解决才能被明确的问题

(Tacoma Narrows大桥,空气动力学)

2、设计是一个了无章法的过程(不断修正错误,不知怎样算是足够好)

3、设计是一个确定取舍和调整顺序的过程

(性能、可维护性、开发时间)

4、设计受到诸多限制,设计是不确定的(设计计算机程序通常有数十种方法)

5、设计是一个启发式的过程(探索性,试试没准能行)

总结:设计是一个自然而然的过程(不断在讨论,写试验代码中修改完善的,不是突然跳出来的)

设计的首要技术使命-管理复杂度

软件设计中的问题

软件开发就是去挖掘错综复杂,相互连接的整套概念的所有细节,面对复杂无序的现实世界,精确完整地识别各种依赖关系和例外情况,设计出完全正确而非大致正确的解决方案。即使有一套能完整描述现实世界的语言,现实实体间的交互行为使之更为复杂。

没有谁的大脑能容得下一个现代计算机程序

失控的复杂度

把复杂的问题拆分成简单的部分,将整个系统拆分为多个子系统,子系统间相互依赖越少,越容易专注问题的部分。使任何人在同一时间处理的复杂度的量降到最小

设计的层次

启发式方法

1、找出现实世界中的对象

辨识对象属性,方法

对象间的交互

可见性

公共接口

2、形成一致的抽象(忽略无关的细节、复杂度)

基类,接口,包,子系统接口

3、封装实现细节(不让你看到那些复杂度)

4、当继承能简化设计时就继承(辅佐抽象的概念,多态,运行时确定对象,强大武器使用得当)

5、信息隐藏(强调隐藏复杂度,格外重要,在系统各个层次都可应用)

示例:id , g_maxId(分配id的最大值)

id=++g_maxId

问题一:1、留某些id作他用

2、非连续id提高安全性

3、重新使用已销毁对象的id

.......

一旦出现任何一种,需要修改所有这些语句。

解决:id=NewId()

问题二:id类型由整数改为字符串

对int id声明作几十,几百次改动

解决:隐藏id类型,创建IdType类型

采取信息隐藏的障碍

1、信息过度分散,如硬编码

2、循环依赖,无法单独测试

3、可以察觉的性能损耗(取舍):怕额外的层次影响性能,在编码层面上,为性能目标做的最好准备,是做出高度模块化的设计

我该隐藏些什么

信息隐藏的优势:

1、代码修改容易4倍

2、激发有效的设计方案。IdType

两种问题:1、能否把id看作对象

2、如何id应该被隐藏起来该怎样呢

6、找出容易变化的区域

找出容易变化的部分,将其分离出来,放在类的内部,且不会影响类的外部,任何使用这个类的其他类都不会察觉变化的存在。

如业务规则、硬件依赖,输入输出(如文件格式,输出页面字段数量,位置等)、困难的设计区域、非标准的语言特性、状态变量(枚举类取代布尔变量)、数据量

7、保持松散耦合,如商业合作者,火车厢

耦合度:模块间紧密程度

耦合标准:规模、可见性、灵活性

耦合类型:简单数据参数耦合,简单对象耦合,对象参数耦合

语义上的耦合最危险的(控制标志、全局数据、initialize,部分初始化,对象强转)

8、查询常用的设计模式

设计实践

1、迭代

2、分而治之

3、自上而下(分解,从一般性问题出发,分解成可控部分),受底层复杂度影响

4、自下而上(合成,从可控的部分出发,构造一个通用的方案),早期鉴别出复杂度,设计出更好的高层类

5 试验性原型

可以回答特定设计问题,量少且可以随时扔掉的代码

6、合作设计(询问,讨论,论坛)

以上都是本人对《代码大全》设计内容的归纳总结,你可以去看看里面对设计构造的详细描述

原文发布于微信公众号 - java达人(drjava)

原文发表时间:2016-08-02

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏web前端教室

偶遇--《坑新人--前端专用面试题》

在网上乱逛查资料,偶然看到下面这个js面试题, alert(a) a(); var a=3; function a(){ alert(10) } ...

22360
来自专栏Python小屋

Python+tkinter实现任意多层级关系的组合框

正好自己要用,就想了个简单思路实现了一下,假设现在需要一个组合框来显示多个层级关系的单位名称供用户选择,如果只有固定的两级关系当然可以使用两个组合框联动来实现,...

37050
来自专栏Java学习网

你的代码糟粕比精华要多得多

你的代码糟粕比精华要多得多 新的研究发现,一个程序的核心功能仅在于一小部分封装的代码。 如果你是一个软件开发人员,有人问你,你写的代码中有多少是真正在实现实际...

27350
来自专栏机器学习算法与Python学习

Python高居顶级编程语言交互排行榜第一,你要做些什么呢?

关键字全网搜索最新排名 【机器学习算法】:排名第一 【机器学习】:排名第二 【Python】:排名第三 【算法】:排名第四 IEEE Spectrum 发布了2...

32260
来自专栏编程

C语言发展历史,C语言特点,C语言利于弊,入门须知三招

C语言的发展历史: ? 20世纪70年代初,贝尔实验室的Dennis Richie 等人在B语言基础上开发出C语言,最初是作为UNIX的开发语言; 20世纪70...

33890
来自专栏技术沉淀

Pandas QQ聊天记录分析

19430
来自专栏云飞学编程

Python的面向过程、面向函数、面向对象的区别浅谈

有人之前私信问我,python编程有面向过程、面向函数、面向对象三种,那么他们区别在哪呢?这个问题,让我想起我在学习编程的时候,我的老师给我举的例子。分享给大家...

17120
来自专栏编程之旅

《代码整洁之道》读书小结

最近晚间的加班暂时暂停了,大概已经整整一个月每天焦头烂额的写着业务代码,被各种逻辑搞的整个人都不大好了,好在是写的差不多了。

32630
来自专栏加米谷大数据

Scala更适合用于大数据处理和机器学习

Scala是一门现代的多范式编程语言,设计初衷是要集成面向对象编程和函数式编程的各种特性。Scala允许用户使用命令和函数范式编写代码。Scala运行在Java...

12010
来自专栏程序员互动联盟

为什么这么多人学不会C语言?

很多人觉得用C语言作为入门语言觉得太难了,里面还有指针,回调,递归之类的操作太难了。为什么这么多人觉得C语言难?笔者根据从业十几年的经验尝试着分析一下。 ? 第...

42060

扫码关注云+社区

领取腾讯云代金券