`
马背{eric.liu}
  • 浏览: 27376 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

软件设计中的几点设计原则(上)

阅读更多
      最近又翻起阎宏博士的《Java与模式》这本书,此书语言浅显易懂,且内容充实,值得反复阅读思考,就像好的电影都会让你想有时间再翻出来再看看,此书也是一样。

      翻阅之中,觉得还是把内容摘抄下来,一是避免捧着这本大块头的痛苦,二是便于自己整理思路。

      以下内容大部分摘自此书的第二部分。

    什么情况下一个软件系统会变得“腐烂”:

         1.僵硬:增加新功能要影响很多地方。
         2.脆弱:一个地方的修改,会导致其他地方的发生变化或者故障。
         3.复用率低:代码、函数等难以被程序员复用在软件的其他地方.
                            导致程序员重复造轮子,甚至cp&paste来使用已有代码。
         4.粘度过高:当一个改动,可以按照原有设计框架进行,也可以另辟蹊径快速解决。
                             当第二种情况出现,则表示原系统设计粘度过高!


      设计的目标:

            1.Extensibility可扩展性:与“僵硬”相反,一个功能可以很容易的加入到系统中去,并尽量少的影响其他功能
                        
            2.Flexibility灵活性:与扩展性的增加功能相比来,当代码的修改,可以平稳发生,不会波及到其他模块,即与“脆弱”相反
            3.Pluggability可插入性:系统设计的接口和实现体,能够满足开发者很方便的替换来修改系统的功能。
                                            从而避免脱离原设计框架的改动方式,进而避免“粘度过高”现象的出现。
                                            即经常出现脱离系统设计框架的“开发捷径”。



        设计原则:

            1.开闭原则(Open for extension,close for modification)

                诚如标题解释的一样:对扩展开放,对修改封闭。在不被修改的情况下扩展,在不被修改的情况下行为产生变化。

                对可变性封装的原则:
                     A.一种可变性不应当散落在很多地方,应该被封装在一个对象里。
                     B.一种可变性不应该与另一种可变性混合在一起。从这一点上来说,类的继承结构不应该超过2层,不然就意味着2中不同的可变性混合在一起。
                       这里的2层,我(马背)自己的理解可以解释成具体类实现一个接口的2层,可以可以从继承的角度来看,即从接口-》抽象类-》具体实现类这样的2层“继承”。当然这里的抽象类可以是多级结构,但只是在封装了相同的行为,不影响总体上的2层结构
                       从2层的结构中我们也可以看出抽象类一定是用来继承的,而具体类则不是用来继承的,并且应该优先使用接口声明类型。

                继承应该被看做封装变化的方法,而不是从一般对象到特殊对象的方法。

            2.里氏替换原则(Liskov substitution principle)
               
                 任何基类被子类替换后,整个应用的功能没有变化(行为产生变化)。
                 但反过来的代换是不成立的。

                 由于Liskov替换原则主要讲基类与子类的关系,这里也说一下继承关系使用的条件

                      A.区分好子类是不是超类的一个“角色”,即只有"Is-A"的关系才符合。
                          "Has-A"则应用使用聚合关系描述。

                      B.子类不会出现成为其他类子类的可能行。

                      C.子类具体扩展超类的责任,但不是置换掉(Override)或者注销掉(Nullify)超类的责任

                      D.从分类学上有意义时候使用继承,不要从工具类继承。
             
                 当有继承关系的两个类A、B不符合Liskov原则时候,一般有2中方法来解决:

                        A.为2者抽象出一个超类,并使二者的共同行为移到新的超类中。

                        B.把B继承与A改为委派关系,即B拥有A的实例。

            未完待续。。。

                                                    马背{eric.liu}
                                                       2010.1.24
0
0
分享到:
评论

相关推荐

    软件工程知识点

    需求规格说明书是需求分析阶段需要交付的基本文档,将成为开发者进行软件设计和用户进行软件验证的基本依据,涉及引言、术语定义、用户需求、系统体系结构、系统需求等有关软件需求及其规格的诸多描述与定义。...

    数据库设计方案.docx

    每一个单元(象素)的位置由它的行列号定义,所表示的实体位置隐含在格行列位置中,数据组织中的每个数据表示地物或现象的非几问属性或指向其属性的针。一个优秀的压缩数据编码方是:在最大限度减少计算机运算时间的基点...

    软件设计规范

    软件设计必须有自说明特性。不能对文档产生依赖性。软件代码中合适的地方,需要对文档进行恰如其分说明。原则是,每段代码,每处需要理解的地方,如果和总体架构相关,就要有说明。 软件领域需要简化。需要还原软件...

    毕业设计基于JAVA的局域网飞鸽传书软件设计与实现(源代码+论文).zip

    【毕业设计】基于JAVA的局域网飞鸽传书软件设计与实现(源代码+论文) 根据对飞鸽传输系统的调研,我认为本设计需要满足以下几个系统设计目标: (1)实用性原则:真正为局域网的实际工作服务,按照需求的轻重缓急,合理...

    CorelDRAW软件服装设计毕业设计【2018年极具参考价值毕业设计首发】.doc

    利用该软件进行制作时,应当注意:单 件排料首先应当根据实现准备好的材料情况来安排面料幅宽,一般以面料一端作为起始 点,然后严格遵照先主片、后次片以及先大片、后小片的顺序规则,综合考虑碎料填空 、紧密排料...

    软件测试之“软件测试用例设计原则”

     不管是从个人角度还是从公司角度,根据我这几年的经验我觉得case的设计应该符合以下几点:  1、一个case一个功能点:每个case都要有个测点,找准一个测点则可,不能同时覆盖很多功能点,否则执行起来牵连太大;...

    软件测试应遵循的原则

    3.设计测试用例时,应该考虑到合法的输 软件测试应遵循的原则 软件测试 为了达到上述的原则,需要注意以下几点: 1.应当把“尽早和不断地测试”作为开发者的座右铭。 2.程序员应该避免检查自己的程序,测试工作...

    基于PLC的升降机控制系统设计毕业设计.doc

    目 录 第一部分 设计任务与调研 2 1.1PLC的简介 2 1.2可编程序控制器的设计任务 3 1.2.1设计目标 3 1.2.2设计任务的调研 4 1.2.3设计思路(方法) 5 第二部分 设计说明 7 2.1升降机控制设计步骤 7 2.2写入程序步骤 7...

    软件工程之专题七:软件工程专题

    软件设计 概要设计 模块分解,确定软件的结构,模块的功能和模块间的接口,以及全局数据结构的设计 系统分析员、高级程序员 设计说明书、数据说明书、模块开发卷宗 详细设计 设计每个模块的实现细节和局部数据结构...

    基于java实现局域网飞鸽传书软件设计与实现(源代码+论文)

    根据对飞鸽传输系统的调研,我认为本设计需要满足以下几个系统设计目标: (1)实用性原则:真正为局域网的实际工作服务,按照需求的轻重缓急,合理设计本系统。 (2)可靠性原则:必须为用户提供安全的服务,尤其是要...

    中型企业网络设计与仿真毕业设计.doc

    软件设计 就是在这些硬件的基础上实施各种高级的应用服务如DNS、DHCP、WEB、FTP和各种企业应 用软件和数据库系统。 第2章 需求分析 企业网(ENTERPRISE NETWORK)是非常典型的综合网络实例。在本设计方案中主要是对...

    界面设计方案.doc

    软件界面的设计,既要从外观上进行创意以到达 吸引眼球的目的,还要结合图形和版面设计的相关原理,从而使得软件设计变成了一门 独特的艺术。通常的讲,企业软件用户界面的设计应遵循以下几个基本原则: 1.用户导向...

    基于java实现局域网飞鸽传书软件设计与实现(源代码+论文)分享

    根据对飞鸽传输系统的调研,我认为本设计需要满足以下几个系统设计目标: (1)实用性原则:真正为局域网的实际工作服务,按照需求的轻重缓急,合理设计本系统。 (2)可靠性原则:必须为用户提供安全的服务,尤其是要...

    中型企业网络设计与仿真毕业设计(1).doc

    软件设计 就是在这些硬件的基础上实施各种高级的应用服务如DNS、DHCP、WEB、FTP和各种企业应 用软件和数据库系统。 第2章 需求分析 企业网(ENTERPRISE NETWORK)是非常典型的综合网络实例。在本设计方案中主要是对...

    酒店管理软件设计方案.doc

    3 二、设计目标 3 三、建设原则 4 系统结构与平台设计 5 一、硬件设备 5 二、软件平台 6 三、网络环境 6 四、扩展接口 7 客易隆酒店管理系统网络结构示意图 …………………………………………………..8 系统基本功能...

    界面设计方案(1).doc

    软件界面的设计,既要从外观上进行创意以到达 吸引眼球的目的,还要结合图形和版面设计的相关原理,从而使得软件设计变成了一门 独特的艺术。通常的讲,企业软件用户界面的设计应遵循以下几个基本原则: 1.用户导向...

    计算机网络课程设计之组建小型企业局域网.docx.docx

    计算机网络课程设计报告 题目: 组建小型企业局域网 学生姓名: 学 号: 班 级: 指导教师: 2012年 05 月20 日 摘 要 随着计算机及局域网络应用的不断深入,特别是各种计算机软件系统被相继应用在实际工作中,...

    百度VI手册.PDF_大厂VI品牌视觉标准设计规范_企业品牌手册.pdf

    在这篇文件中,我们可以总结出以下几点知识点: 一、什么是VI? VI是Visual Identity的缩写,也称为视觉 Identity,指的是企业品牌的视觉形象系统,包括Logo、色彩、字体、图片、图案等视觉元素。VI的目的是为了在...

    软件测试中需要构建测试数据,项目内包含构建测试数据的原则和一些方法包

    测试数据构建是软件开发过程中的一个关键环节,它涉及到创建用于测试软件系统的数据集合。这些数据需要能够覆盖各种可能的场景,以确保软件在不同条件下的稳定性和可靠性。一个良好的测试数据构建项目通常包含以下几...

    逆向工程四大软件简介

     Surfacer 是 Imageware 的主要产品,主要用来做逆向工程,它处理数据的流程遵循点――曲线――曲面原则,流程简单清晰,软件易于使用。其流程如下:    一、点过程  读入点阵数据。  Surfacer 可以接收几乎...

Global site tag (gtag.js) - Google Analytics