单一职责

代码优化第一步,单一职责原则 (Single Responsibility Principle)。对于一个java类,应该仅有一个引起它变化的原因,也就是说,一个类中,应该是一组相关性很高的函数、数据的封装。但是这个原则的界限划分的并不是那么清晰,很大程度上要依赖于开发者的个人经验来定。对于单一职责界限的划分最大的问题就是类的职责是什么,如何划分类的职责。
单一职责原则在我们实际工作中随处可见,例如在我们比较关心的框架MVC,MVP中,负责页面展示的Activity,Fragment,以及各种View,它们只负责UI的展示,具体的业务逻辑则交付给Controller或者Presenter.。再例如各种流行的图片加载框架,在其中都可以找到专门负责图片加载类,图片缓存的类。所以,单一职责原则是我们代码优化的第一步,也是最重要的一步。

开闭原则

开闭原则(Open Close Principle),是Java世界里最基础的设计原则,它指导我们如何建立一个稳定、灵活的系统。开闭原则定义:软件中的对象(类,模块、函数等)应该对于扩展是开放的,对于修改的封闭的。在软件的生命周期内,因为变化、升级、维护等原因需要对软件原有的代码进行修改时,可能会将错误引入原本已经测试过的旧代码,破坏原有系统,因此,当软件需要变化时,我们应该进肯能通过扩展的方式来实现变化,而不是通过修改已有的代码来实现。但这也不是绝对的,在实际开发过程中,只通过继承的方式来升级、维护原有系统是一个理想化的情况,因此,实际开发中,修改原有代码、扩展代码往往是同时存在的。而如何确保原有软件模块的正确性,以及尽量少地影响原有代码模块,答案就是尽量遵守开闭原则。

里氏替换原则

里氏替换原则(Liskov Substitution Principle),定义:如果对于每一个类型为ClassA的对象a,都有类型为ClassB的对象b,使得以ClassB定义的所有程序P在所有的对象b都替换成a时,程序P的行为没有发生变化,那么类型ClassA是类型ClassB的子类型。然而这段叙述并无卵用,更直接的定义是:所有引用基类的地方必须能透明的使用其子类的对象。

我们知道,面向对象的三大特点是:继承,封装,多态,里氏替换原则就是依赖于继承、多态这两大特性。里氏替换原则简单来说就是,所有引用基类的地方,必须能使用子类对象。也就是说只要父类能出现的地方,其子类就可以出现。而且替换为子类不会产生任何错误和差异。使用者可能根部就不需要知道是父类还是子类,但是反过来就行不了,有子类出现的地方父类未必就能适应。其实归根结底,里氏替换原则就是基于这两个字:抽象

例如在Android中,页面Window的展示依赖于View,而View定义了一个视图抽象,measure以及draw是其子类共享的方法,子类通过复写measure以及draw方法,可实现各式各样功能以及视图的view,任何继承自View的子类都可以传递给Window,由Window负责组织View,并将View显示到屏幕上,这就是所说的里氏替换原则。

里氏替换原则的核心原理是抽象,抽象又依赖于继承,在OOP当中,继承的优缺点都相当明显。优点是:

  • 代码重用,减少创建类的成本,每个子类都拥有父类的方法和属性
  • 子类和父类基本相似,但又与父类有所区别
  • 提高代码的可扩展性

继承的缺点:
- 继承是入侵性的,只要继承就必须拥有父类的所有属性和方法
- 可能造成子类代码冗余,灵活性降低,因为子类必须拥有父类的方法和属性

但事物总有两面性,符合权衡和利用都是需要根据具体情况来做出选择。在开发过程中运用抽象是走向代码优化的重要一步。

依赖倒置原则

依赖倒置原则(Dependence Inversion Principle),依赖倒置原则指定了一种特定的解耦形式,使得高层次的模块不依赖于低层次的模块的实现细节的目的,依赖模块被颠倒了。然而定义往往的不好理解的,依赖倒置原则有以下几个关键点:
- 高层模块不应该依赖低层模块,两者都应该依赖其抽象
- 抽象不应该依赖细节
- 细节应该依赖抽象
在Java 语言中,抽象就是指接口或抽象类,两者都是不能直接被实例化的。细节就是实现类,实现接口或继承抽象类而产生的类就是细节,其特点是,可以直接被实例化。高层模块就是调用端,低层模块就是具体实现类。依赖倒置原则在Java语言中的表现就是:模块间的依赖通过抽象发生,实现类之间不发生直接的依赖关系,其依赖关系是通过接口或实现类产生的。其实一句话就是:面向接口,或者面向抽象编程。
如果类于类直接依赖于细节,那么它们之间就有直接耦合,当具体实现需要变化时,意味着要同时修改依赖者的代码,这限制了系统的可扩展性。

接口隔离原则

接口隔离原则(Interface Segregation Principle),它的定义是:客户端不应该依赖它不需要的接口。另一种定义是:类间的依赖关系应该建立在最小的接口上。接口隔离原则将非常庞大,臃肿的接口拆分成更小的接口和更具体的接口,这样客户只需要知道他们感兴趣的方法。接口隔离原则的目的是系统解开耦合,从而容易重构、更改和重新部署。

定义总是不好理解的,我们通过一段代码来理解一下接口隔离原则的具体使用。比如我们常见的输出流OutputStream,使用之后需要将其关闭:

FileOutputStream fos = null;
try{fos = new FileOutputStream(URI);...
}catch(FileNotFoundException e){e.printStackTrace();
}finally{if(fos!=null) {try{fos.close();}catch(IOException e){e.printStackTrace();}}
}

我们看到,这段代码的可读性非常差,各种try catch嵌套的都是极其简单的代码,那么我们如何解决这个问题呢?在Java中有一个Closeable接口:

public interface Closeable extends AutoCloseable {/*** Closes this stream and releases any system resources associated* with it. If the stream is already closed then invoking this* method has no effect.** @throws IOException if an I/O error occurs*/public void close() throws IOException;
}

该接口标识了一个可关闭的对象,它只有一个close方法,而我们的FileOutputStream也实现了这个接口。这样我们就好办了,我们可以依赖Closeable 接口实现一个工具类:

public final class CloseUtils{private CloseUtils(){}public static void closeQuietly(Closeable closeable){if(null!=closeable){try{closeable.close();}catch(IOException e){e.printStackTrace();}}}
}

在实际的运用中,我们只需要这样:

...
finally{CloseUtils.closeQuietly(fos);
}

代码简洁了很多,而且这个工具类可以运用到各类可关闭的对象中,保证了代码的重用性。CloseUtils的closeQuietly方法的基本原理就是依赖于CLoseable抽象而不是具体实现,并且建立在最小化依赖原则的基础上,它只需要知道这个对象是可关闭的,其他的一概不关心,也就是我们所提出的接口隔离原则。

迪米特原则

迪米特原则(Law of Demeter),也成为最少知识原则:一个对象应该对其他对象有最少的了解。也就是说,一个类应该对自己需要耦合或者调用的类知道的最少,类的内部如何实现与调用者或者依赖者没关系,调用者和依赖者只需要知道它需要的方法即可,其他的一概不管。类与类的关系越密切,耦合度越大,当一个类发生改变时,对另一个类的影响也越大。

就比如说MVP框架中的Model层的实现,我们都知道Model抽象是给View提供具体的数据,而我们的View层并不需要知道数据是怎么得来的,就算我们后台接口如何改变,只要数据结构不变,那我们就不需要通知View层进行改变。

总结

在我们实际开发中,最难的不是完成应用的开发工作,而是后续的升级、维护过程中让系统兼容变化,这也意味着在满足需求而不破坏系统稳定性的前提下保持高可扩展性、高内聚、低耦合,在经历了各版本的变化之后依然保持清晰,灵活,稳定的系统架构。当然这是一个理想状态,但是我们必须朝这个方向努力,那么遵循我们上面提出的六大原则就是我们优化代码,走向灵活软件之路的第一步!

之后我会结合以上六大基本原则,讲解Android中的设计模式的运用,请持续关注。

欢迎一起交流学习。

java代码优化六大原则相关推荐

  1. Java 设计模式六大原则

    Java 设计模式六大原则 单一职责原则 定义:不要存在多于一个导致类变更的原因.通俗的说,即一个类只负责一项职责. 问题由来:类T负责两个不同的职责:职责P1,职责P2.当由于职责P1需求发生改变而 ...

  2. java设计模式六大原则之场景应用分析

    面对项目中如此众多的设计模式,我们有时候无法 下手.在强大的设计框架也终脱离不了23种设计模式,6大原则.我们只要把内功修炼好,掌握其精髓也离我们不远了... 目录: 设计模式六大原则(1):单一职责 ...

  3. java 设计原则_【无尽的编程之路】(java)-设计模式六大原则

    本文主内容主要是列出各项原则的定义与本人对六大原则的感悟.写出来的目是想与大家分享与讨论.正如有句话叫做一千个读者眼中有一千个哈姆雷特,如果大家对这六项原则的理解跟我有所不同,欢迎留言,大家共同探讨. ...

  4. Java基础学习总结(84)——Java面向对象六大原则和设计模式

    面向对象六大原则 在此之前,有一点需要大家知道,熟悉这些原则并不是说你写出的程序就一定灵活.清晰,只是为你优秀的代码之路铺上了一层栅栏,在这些原则的指导下,你才能避免陷入一些常见的代码泥沼,从而让你写 ...

  5. Java设计六大原则

    1.遵循单一职责原则 一个类只专注于做一件事: 高内聚,低耦合: 2.开放-封闭原则 对拓展开放,对修改关闭(尽可能不动原有代码进行拓展): 高内聚,低耦合: 为达到目的,需对系统进行抽象化设计(关键 ...

  6. JAVA设计模式六大原则:(5)迪米特法则

    1 定义 迪米特法则定义:一个对象应该对其他对象保持最少的了解. 2 描述 问题由来:类与类之间的关系越密切,耦合度越大,当一个类发生改变时,对另一个类的影响也越大. 解决方案:尽量降低类与类之间的耦 ...

  7. java六大原则_六大Java功能

    java六大原则 我花了无数小时来对不同的应用程序进行故障排除. 通过经验,我可以得出关于大多数开发人员应该远离的几个Java SE功能/ API的结论. 当我提到大多数开发人员时,我会想到常规的Ja ...

  8. java开闭原则实现代码_向对象的六大原则

    前言 我们都知道面向对象有六大原则,23种设计模式.它们可以指导我们如何写出更加优秀的代码.六大原则是基础,我们面向对象编程应该尽量遵从这六大原则,才能写出优秀的代码. 23种设计模式是前人为我们总结 ...

  9. java中高级面试_中高级面试常问:Java面向对象设计的六大原则

    这篇文章主要讲的是面向对象设计中,我们应该遵循的六大原则.只有掌握了这些原则,我们才能更好的理解设计模式.我们接下来要介绍以下6个内容.单一职责原则--SRP 开闭原则--OCP 里式替换原则--LS ...

最新文章

  1. Java中一个令人惊讶的bug
  2. 手把手教你写一个生成对抗网络
  3. http协言和web本质
  4. Nginx四层负载均衡模块添加
  5. 你应该如何选择笔记软件?
  6. python3爬取带密码的网站_Python3 爬取网站收藏数超过70的 情侣网名
  7. 哲学家都在干些什么_哲学家们都干了些什么——哲学是什么
  8. 005-OpenStack-网络服务
  9. springcloud断路器修改熔断时间_SpringCloud(四)Hystrix服务降级,服务熔断
  10. Caused by: java.lang.ClassNotFoundException: backtype.storm.topology.IRichSpout
  11. 【openjudge 计算概论(A)】[函数递归练习(3)]
  12. 订阅发布延时_Redis实时队列和延时队列的php实现
  13. 基于台达PLC的步进电机控制<续一>
  14. 100层楼和两个玻璃球的问题
  15. Linux下打开chm文件
  16. mysql zimbra_Zimbra重新设置LDAP和MySQL密码
  17. typora常用格式设置
  18. 关于数据结构(c语言)中结构体声明的typedef struct LNode, *LinkList的思考
  19. 光学瞄准镜是怎么调节校准的,你学会了吗?
  20. 复制移动文件时对于目标文件系统过大的问题解决

热门文章

  1. 如何使用域名访问到特定IP地址的服务器
  2. Kafka的基础概念
  3. Tomcat下work目录的作用
  4. 云路php解密源代码_解密后乱码如何处理
  5. FPGA开发之SD卡初始化
  6. 安全测试须知的TOP20漏洞编码安全规范
  7. 浅谈红外线与红外气体分析技术
  8. 中兴U830移动定制手机获取root权限详细操作
  9. 未来计算机的重要性论文1000字,未来的作文1000字5篇
  10. 整理:RelativeLayout的相关属性