java程序设计原则

  所有的设计模式都是对不同的可变性的封装,从而使系统在不同角度达到“开闭原则”的要求。
  

  在软件软件系统中,一个模块设计得好不好的最主要、最重要的标志,就是该模块在多大程度上将自己的内部数据和其他与实现有关的细节隐藏起来。一个设计得好的模块可以将它所有的实现细节隐藏起来,彻底地将提供给外界的API和自己的实现分隔开来。这样一来,模块与模块之间就可以仅仅通过彼此的API相互通信,而不理会模块内部的工作细节。

  
  
  OO设计根本的指导原则是提高可维护性和可复用性。这些原则主要有:
  1. 开闭原则

  一个软件实体应该对扩展开放,对修改关闭。

  在设计一个模块的时候,就当使这个模块可以在不被修改的前提下被扩展。换言之,就当可以在不必修改源代码的情况下改变这个模块的行为。
  

  如何做到既不修改,又可以扩展?

  解决问题的关键在于抽象化:在Java语言里,可以给出一个或多个抽象Java类或Java接口,规定出所有的具体类必须提供的方法特征作为系统设计的抽象层。这个抽象层预见了所有的可能扩展,因此,在任何扩展情况下都不会改变。这就使得系统的抽象层不需要修改,从而满足了—对修改关闭。

  同时,由于从抽象层导出一个或多个新的具体类可以改变系统的行为,因此系统的设计对扩展是开放的。
  

  开闭原则实际上是对“对可变性的封闭原则“:找到一个系统的可变因素,将之封装起来。这个原则意昧着两点:
  1)
一个可变性不应当散落在代码的很多角落里,而应当被封装到一个对象里面。同一种可变性的不同表象意昧着同一个继承等级结构中的具体子类。

  继承就当被看作是封装变化的方法,而不应当被认为是从一般的对象生成特殊对象的方法。
  2)
一种可变性不应当与另一种可变性混合在一起。(所有类图的继承结构一般不会超过两层,不然就意昧着将两种不同的可变性混合在了一起。)
  

  开闭原则是总的原则,其它几条是开闭原则的手段和工具。
  
  2. 依赖倒转原则

  依赖倒转原则讲的是:要依赖于抽象,不要信赖于实现。
  开闭原则是目标,而达到这一目标的手段是依赖倒转原则。

  抽象层次包含的是应用系统的商务逻辑和宏观的、对整个系统来说重要的战略性决定,是必然性的体现;而具体层次则含有一些次要的与实现有关的算法和逻辑,以及战术性的决定,带有相当大的偶然性选择。具体层次的代码是会经常有变动的,不能避免出现错误。

  抽象层次含有一个应用系统最重要的宏观商务逻辑,是做战略判断和决定的地方,那么抽象层次就应当是较为稳定的,应当是复用的重点;也应当是维护的重点。

  在很多情况下,一个Java程序需要引用一个对象。这个时候,如果这个对象有一个抽象类型的话,应当使用这个抽象类型作为变量的静态类型。这就是针对接口编程的含义。

  一般而言,在创建一个对象时,Java语言要求使用new关键词以及这个类本身。而一旦这个对象已经被创建出来,那么就可以灵活地使用这个对象的抽象类型来引用它。比如:List
employees = new
Vector();因此,Java语言中创建一个对象的过程是违背“开闭原则”以及依赖倒转原则的(因为先生成了具体的类型,再使用抽象的引用),虽然在这个类被创建出来以后,可以通过多态性使得客户端依赖于其抽象类型。正是由于这个问题,设计模式给出了多个创建模式,特别是几个工厂模式,用于解决对象创建过程中的依赖倒转问题。

  工厂模式将创建一个类的实例的过程封装起来,消费这个实例的客户端仅仅取得实例化的结果,以及这个实例的抽象类型。当然,任何方法都无法回避Java语言所要求的new关键字和直接调用具体类的构造子的做法(这违背了里氏代换原则)。简单工厂模式将这个违反“开闭原则”和依赖倒转原则的做法封装到了一个类里面,而工厂方法模式将这个违反原则的做法推迟到了具体工厂角色中。通过适当的封装,工厂模式可以净化大部分的结构,而将违反原则的做法孤立到易于控制的地方。

  

  联合使用Java接口和Java抽象类:声明类型的工作由Java接口承担,但是同时给出的还有一个Java抽象类,为这个接口给出一个缺省实现。如果一个具体类直接实现这个Java接口的话,它就必须自行实现所有的接口;相反,如果它继承自抽象类的话,它就可以省去一些不必要的方法,因为它可以从抽象类中自动得到这些方法的缺省实现。这其实就是缺省适配模式。

  
  依赖倒转的缺点:
  1)
因为依赖倒转的缘故,对象的创建很可能要使用对象工厂,以避免对具体类的直接引用,此原则的使用还会导致大量的类。对不熟悉面向对象技术的工程师来说,维护这样的系统需要较好地面向对象的设计知识。

  2)
依赖倒转原则假定所有的具体类都是会变化的,这也不总是正确的。有一些具体类可能相当稳定、不会发生变化,消费这个具体类实例的客户端完全可以依赖这个具体类型,而不必为此发明一个抽象类型。

  
  3. 里氏代换原则
  任何基类可以出现的地方,子类一定可以出现。

  开闭原则的关键步骤是抽象化。而基类与子类的继承关系就是抽象化的具体体现,里氏代换原则是对实现抽象化的具体步骤的规范。
  
  4.
合成/聚合复用原则
  要尽量使用合成/聚合,而不是继承关系达到复用的目的。

  合成/聚合原则要求我们首先考虑合成/聚合关系,里氏代换原则要求在使用继承时,必须确定这个继承关系符合一定的条件(继承是用来封装变化的;任何基类可以出现的地方,子类一定可以出现。)

  
  合成/聚合原则就是在一个新的对象里面使用一些已有的对象,使之成为新对象的一部分;新的对象通过向这些对象的委派达到得复用已有功能的目的。

  
  5. 迪米特原则

  一个软件实体应当尽可能少的其他实体发生相互作用。模块之间的交互要少。这样做的结果是当系统的功能需要扩展时,会相对更容易地做到对修改的关闭。

  一个对象应当对其他对象有尽可能少的了解。
  
  迪米特原则的具体操作:
  1)
优先考虑将一个类设置成不变类。不变类易于设计、实现和使用。比如Java API中的String,BigInteger等类。

  一个对象与外界的通信大体上分成两种,一种是改变这个对象的状态,另一种是不改变这个对象的状态的。如果一个对象的内部状态根本就是不可能改变的,那么它与外界的通信当然就大大地减少。

  当涉及任何一个类的时候,都首先考虑这个类的状态是否需要改变。即便一个类必须是可变类,在给它的属性设置赋值方法的时候,也要保持吝啬的态度。除非真的需要,否则不要为一个属性设置赋值方法。

  
  2) 尽量降低一个类的访问权限。
  3)
谨慎使用Serializable,一旦将一个类设置成Serializable,就不能再在新版本中修改这个类的内部结构,包括private的方法和句段。

  4) 尽量降低成员的访问权限。
  
  6. 接口隔离原则

  应当为客户端提供尽可能小的单独接口,而不要提供大的总接口。也即是使用多个专门的接口比使用单一的总接口要好。

  接口隔离原则与迪米特都是对一个软件实体与其他的软件实体的通信限制。迪米特原则要求尽可能地限制通信的宽度和深度,接品隔离原则要求通信的宽度尽可能地窄。这样做的结果使一个软件系统在功能扩展过程当中,不会将修改的压力传递到其他对象。

  

  一个接口相当于剧本中的一种角色,而此角色在一个舞台上由哪一个演员来演则相当于接口的实现。因此,一个接口应当简单地代表一个角色,而不是多个角色。如果系统涉及到多个角色的话,那么每一个角色都应当由一个特定的接口代表。

  

  定制服务:如果客户端仅仅需要某一些方法的话,那么就应当向客户端提供这些需要的方法,而不要提供不需要的方法。(向客户端提供public接口是一种承诺,没有必要做出不必要的承诺,过多的承诺会给系统的维护造成不必要的负担。)

时间: 2024-12-28 01:11:51

java程序设计原则的相关文章

java程序设计原则知多少

程序设计七大原则 一.开闭原则 ? 针对我们设计的功能模块对扩展开放,对修改关闭:利用面向接口(抽象)编程(多态的特性),实现对功能需求扩展的同时,不允许更改原来的代码.提高对象的可复用性.可维护性.灵活性. ? 抽象的说,用抽象思维构建我们想要创建的实体对象,用具体实现去扩展实体对象的细节实现. ? 具体的说,业务需求的功能可以去扩展,但是已经实现的功能不应该去修改. 需求:以简单工厂模式和工厂方法模式理解开闭原则. 分析: 工厂模式是获取一个实例对象的建造者模式,我们不关心对象如何产生,只关

20145207《Java程序设计》第三周学习总结

20145207<Java程序设计>第三周学习总结 教材学习内容总结 这部分可能要扒一些课本而上的东西了.在第三章中,知道了Java可区分为基本类型和类类型两大类型系统,其中类类型也称为参考类型.在这一周主要学习了类类型. 对象(Object):存在的具体实体,具有明确的状态和行为 类(Class):具有相同属性和行为的一组对象的集合,用于组合各个对象所共有操作和属性的一种机制. 简单来说,类是对象的设计图,对象是类的实例. 要深刻理解对象的含义,例如Clothes c1 = new Clot

20145225《Java程序设计》 2015—2016年学期课程总结

20145225<Java程序设计> 2015—2016年学期课程总结 读书笔记链接汇总 1.2016年2月25日 <Java程序设计>课程准备之问卷调查 摘要: 一.你对自己的未来有什么规划?做了哪些准备? 答:未来就是找个好工作,在保证自己与父母生活条件良好的基础上,进一步的提高精神上的需求...... 2.2016年3月6日 <Java程序设计>第1周学习总结——小试牛刀 摘要: 教材学习内容总结 1.java语言概述:一门高级编程语言. 2.java语言的三种技

20145331《Java程序设计》第5周学习总结

20145331<Java程序设计>第5周学习总结 教材学习内容总结 第八章 概述 Java异常机制主要依赖于try.catch.finally.throw.throws五个关键字. 语法格式如下: try { 被检代码; } catch(异常类 变量) { 处理异常的代码(处理方式): } 关键词try后的一对大括号将一块可能发生异常的代码包起来,称为监控区域.Java方法在运行过程中出现异常,则创建异常对象.将异常抛出监控区域之 外,由Java运行时系统试图寻找匹配的catch子句以捕获异

20145335郝昊《java程序设计》第4周学习总结

20145335郝昊 <Java程序设计>第4周学习总结 教材学习内容总结 第六章 何谓继承: 概念: 面向对象中,为避免多个类间重复定义共同行为.(简单说就是将相同的程序代码提升为父类.) 特点: 这里接触到了新的关键词,extends,在java语言中用estends来继承父类的行为. is-a原则,在java中子类只能继承一个父类.要开始理解多态,必须先知道操作的对象是“哪一种”. 多态,使用单一接口操作多种类型的对象. 在继承父类之后,定义与父类中相同的方法部署,但执行内容不同,称为重

Java程序设计 实验二 Java面向对象程序设计

北京电子科技学院(BESTI) 实     验    报     告 课程:Java程序设计 班级:1353  姓名:李海空  学号:20135329 成绩:             指导教师:娄嘉鹏      实验日期:2015.5.7 实验密级:         预习程度:         实验时间: 仪器组次:          必修/选修:            实验序号: 实验名称:       Java面向对象程序设计 实验目的与要求:实验内容 1. 初步掌握单元测试和TDD 2.

20145331 《Java程序设计》第2次实验报告

20145331 <Java程序设计>第2次实验报告 实验二 Java面向对象程序设计 一.实验内容 1.初步掌握单元测试和TDD 2.理解并掌握面向对象三要素:封装.继承.多态 3.初步掌握UML建模 4.熟悉S.O.L.I.D原则 5.了解设计模式 二.实验要求 1.没有Linux基础的同学建议先学习<Linux基础入门(新版)><Vim编辑器> 课程 2.完成实验.撰写实验报告,实验报告以博客方式发表在博客园,注意实验报告重点是运行结果,遇到的问题(工具查找,安装

20145326 《Java程序设计》第4周学习总结

20145326 <Java程序设计>第4周学习总结 教材学习内容总结 第六章 一.何谓继承 1.继承共同行为 面向对象中,子类继承父类,避免重复的行为定义.不过并非为了避免重复定义行为就使用继承,滥用继承而导致程序维护上的问题时有所闻.如何正确判断使用继承的时机,以及继承之后如何活用多态,才是学习继承的重点.以书上158页的例子来看,magician中粗体字部分与swordsman中相对应的程序代码重复了,重复在设计上就是不好的信号,如果我们想将name.level.blood改为其他名称,

20145320 《Java程序设计》第2周学习总结

20145320 <Java程序设计>第2周学习总结 教材学习内容总结 3.1 类型.变量与运算符 基本类型 整数(short.int.long) .字节(byte) .浮点数(float/double) .字符(char):汉字.英文字符都是双字节的 布尔(boolean):boolean类型中的true/false不能与其他类型进行运算 注释 三种注释 //:单行./** /:多行./** */:javadoc文档注释 常量 整数可以用二进制(0bdddd),八进制(0ddd).十进制(d