软件构建中的设计
设计中的挑战
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达人
ID:java_daren
以上都是本人对《代码大全》设计内容的归纳总结,你可以去看看里面对设计构造的详细描述