前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >软件构建中的设计

软件构建中的设计

作者头像
java达人
发布2018-01-31 19:16:15
5680
发布2018-01-31 19:16:15
举报
文章被收录于专栏:java达人java达人

设计中的挑战

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、合作设计(询问,讨论,论坛)

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

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2016-08-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 java达人 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档