软件构建中的设计

设计中的挑战

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

软件构建中的设计

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