Java程序员应该了解的10个设计原则

面向对象设计原则是OOPS(Object-Oriented Programming System,面向对象的程序设计系统)编程的核心,但大多数Java程序员追逐像Singleton、Decorator、Observer这样的设计模式,而不重视面向对象的分析和设计。甚至还有经验丰富的Java程序员没有听说过OOPS和SOLID设计原则,他们根本不知道设计原则的好处,也不知道如何依照这些原则来进行编程。

  众所周知,Java编程最基本的原则就是要追求高内聚和低耦合的解决方案和代码模块设计。查看Apache和Sun的开放源代码能帮助你发现其他Java设计原则在这些代码中的实际运用。Java Development Kit则遵循以下模式:BorderFactory类中的工厂模式、Runtime类中的单件模式。你可以通过Joshua Bloch的《Effective Java》一书来了解更多信息。我个人偏向的另一种面向对象的设计模式是Kathy Sierra的Head First Design Pattern以及Head First Object Oriented Analysis and Design.

  虽然实际案例是学习设计原则或模式的最佳途径,但通过本文的介绍,没有接触过这些原则或还在学习阶段的Java程序员也能够了解这10个面向对象的设计原则。其实每条原则都需要大量的篇幅才能讲清楚,但我会尽力做到言简意赅。

  原则1:DRY(Don't repeat yourself)

  即不要写重复的代码,而是用“abstraction”类来抽象公有的东西。如果你需要多次用到一个硬编码值,那么可以设为公共常量;如果你要在两个以上的地方使用一个代码块,那么可以将它设为一个独立的方法。SOLID设计原则的优点是易于维护,但要注意,不要滥用,duplicate 不是针对代码,而是针对功能。这意味着,即使用公共代码来验证OrderID和SSN,二者也不会是相同的。使用公共代码来实现两个不同的功能,其实就是近似地把这两个功能永远捆绑到了一起,如果OrderID改变了其格式,SSN验证代码也会中断。因此要慎用这种组合,不要随意捆绑类似但不相关的功能。

  原则2:封装变化

  在软件领域中唯一不变的就是“Change”,因此封装你认为或猜测未来将发生变化的代码。OOPS设计模式的优点在于易于测试和维护封装的代码。如果你使用Java编码,可以默认私有化变量和方法,并逐步增加访问权限,比如从private到protected和not public.有几种Java设计模式也使用封装,比如Factory设计模式是封装“对象创建”,其灵活性使得之后引进新代码不会对现有的代码造成影响。

  原则3:开闭原则

  即对扩展开放,对修改关闭。这是另一种非常棒的设计原则,可以防止其他人更改已经测试好的代码。理论上,可以在不修改原有的模块的基础上,扩展功能。这也是开闭原则的宗旨。

  原则4:单一职责原则

  类被修改的几率很大,因此应该专注于单一的功能。如果你把多个功能放在同一个类中,功能之间就形成了关联,改变其中一个功能,有可能中止另一个功能,这时就需要新一轮的测试来避免可能出现的问题。

  原则5:依赖注入或倒置原则

  这个设计原则的亮点在于任何被DI框架注入的类很容易用mock对象进行测试和维护,因为对象创建代码集中在框架中,客户端代码也不混乱。有很多方式可以实现依赖倒置,比如像AspectJ等的AOP(Aspect Oriented programming)框架使用的字节码技术,或Spring框架使用的代理等。

  原则6:优先利用组合而非继承

  如果可能的话,优先利用组合而不是继承。一些人可能会质疑,但我发现,组合比继承灵活得多。组合允许在运行期间通过设置类的属性来改变类的行为,也可以通过使用接口来组合一个类,它提供了更高的灵活性,并可以随时实现。《Effective Java》也推荐此原则。

  原则7:里氏代换原则(LSP)

  根据该原则,子类必须能够替换掉它们的基类,也就是说使用基类的方法或函数能够顺利地引用子类对象。LSP原则与单一职责原则和接口分离原则密切相关,如果一个类比子类具备更多功能,很有可能某些功能会失效,这就违反了LSP原则。为了遵循该设计原则,派生类或子类必须增强功能。

  原则8:接口分离原则

  采用多个与特定客户类有关的接口比采用一个通用的涵盖多个业务方法的接口要好。设计接口很棘手,因为一旦释放接口,你就无法在不中断执行的情况下改变它。在Java中,该原则的另一个优势在于,在任何类使用接口之前,接口不利于实现所有的方法,所以单一的功能意味着更少的实现方法。

  原则9:针对接口编程,而不是针对实现编程

  该原则可以使代码更加灵活,以便可以在任何接口实现中使用。因此,在Java中最好使用变量接口类型、方法返回类型、方法参数类型等。《Effective Java》 和《head first design pattern》书中也有提到。

  原则10:委托原则

  该原则最典型的例子是Java中的equals() 和 hashCode() 方法。为了平等地比较两个对象,我们用类本身而不是客户端类来做比较。这个设计原则的好处是没有重复的代码,而且很容易对其进行修改。

  总之,希望这些面向对象的设计原则能帮助你写出更灵活更好的代码。理论是第一步,更重要的是需要开发者在实践中去运用和体会。

转载于:https://www.cnblogs.com/softwareofjava/p/7279320.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/467983.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

GPIO 使用 — Rockchip

昨天跟同事调试GPIO,用的就是Rockchip的板子,我们想把一个gpio口设置成阻塞状态,刚开始一直没有成功,然后我问了连总,连总是我原来的同事,是一个大牛,他跟我说,只要把gpio口设置成输…

倩女幽魂7月20日服务器维护,倩女幽魂手游7月20日更新什么?倩女幽魂手游7月20日更新一览...

倩女幽魂手游7月20日进行了版本大更新,那么倩女幽魂手游7月20日更新具体有哪些内容呢?接下来就由小编给大家带来倩女幽魂手游7月20日更新一览,希望对大家有所帮助。我们将于7月20日,进行较大规模的版本更新。届时将放出海量新内容…

python决策树id3算法_python实现决策树ID3算法

一、决策树概论决策树是根据训练数据集,按属性跟类型,构建一棵树形结构。可以按照这棵树的结构,对测试数据进行分类。同时决策树也可以用来处理预测问题(回归)。二、决策树ID3的原理有多种类型的决策树,本文介绍的是ID3算法。首先…

Android-你真的懂AIDL的oneway嘛?

AIDL是Android Interface definition language的缩写,它是一种android内部进程通信接口的描述语言,通过它我们可以定义进程间的通信接口。android提供了很多进程间通信的组件,像Activity、BroadcastReceiver和ContentProvider都可以实现进程间的通信。为什么还要用A…

Navicat Premium 实用快捷键

ctrlq 打开查询窗口ctrl/ 注释sql语句ctrlshift / 解除注释ctrlr 运行查询窗口的sql语句ctrlshiftr 只运行选中的sql语句F6 打开一个mysql命令行窗口ctrll 删除一行ctrln 打开一个新的查询窗口ctrlw …

妖怪手帐获取服务器信息失败,妖怪手账闪退怎么办 卡在加载页面解决办法

妖怪手账闪退怎么办?很多玩家下载了游戏之后发现一直卡在加载页面,完全进不去怎么办呢?有什么办法可以解决这种情况呢?接下来就跟随小编一起来看看吧!妖怪手账闪退怎么办 卡在加载页面解决办法很多玩家都发现自己下载游…

binder,hwbinder,vndbinder之间的关系

昨天发的那篇技术文之后,这篇文章我觉得可以给大家更加耳目一新,特别是因为其中的例子和白话文。昨天文章如下Android-你真的懂AIDL的oneway嘛?以下是正文1 前言先复制一段来自于android官方文档的文字https://source.android.google.cn/devi…

modbus协议手册_20种PLC元件编号和Modbus编号地址对应表

曾经做过单片机和以下20种PLC的Modbus RTU串口通信,现将这20种PLC输入、输出和寄存器元件与Modbus编号地址对应表分享出来。三菱FX3G-40MR/ES-A、西门子S7-200 CPU226 AC/DC/RLY、欧姆龙CP1H-X40DR-A、松下AFPX-C40R、台达DVP-12SA2、信捷XC5-48、永宏FBs-40MC、产电…

写代码获取全国疫情地图

今天在朋友圈看到一个同学写的python获取全国疫情地图,我觉得挺有意思的,这个分享给大家,如果喜欢python的,可以通过这个作为入门手段。1、安装python看这个链接来安装,非常的小白https://www.liaoxuefeng.com/wiki/10…

八大排序算法的python实现(三)冒泡排序

代码: #coding:utf-8 #author:徐卜灵 #交换排序.冒泡排序 L [1, 3, 2, 32, 5, 4] def Bubble_sort(L):for i in range(len(L)):for j in range(i1,len(L)):if L[i]>L[j]:# temp L[j]# L[j] L[i]# L[i] tempL[i], L[j] L[j], L[i]#交换顺序print L Bubble_so…

泛型类有什么作用_3 分钟带你彻底搞懂 Java 泛型背后的秘密

优质文章,及时送达作者 | 的一幕来源 | www.jianshu.com/p/dd34211f2565这一节主要讲的内容是java中泛型的应用,通过该篇让大家更好地理解泛型,以及面试中经常说的泛型类型擦除是什么概念,今天就带着这几个问题一起看下:举一个简单…

实现Linux系统的回收站

今天偶然看到一个有意思的shell脚本,用脚本实现Linux系统下的回收站,推荐给大家。今天我们利用简单的shell脚本实现Linux系统下的回收站机制。先提供脚本代码[rootqll251 ~]# vim /bin/delete1 #! /bin/bash2 [ ! -d /.recycle ] && mkdir -v /.…

RobotFramework自动化测试框架的基础关键字(五)

1.1.1 Run Keyword If判断的使用 Run Keyword If是一个常用的用来做逻辑判断的关键字,意思是如果满足了某一个判断条件,然后就会执行关键字,我们对list3中放入0,1,2三个元素,然后遍历list3,判断当取到元素为0时…

python按位翻转_Python成为专业人士笔记-位操作符

“专业人士笔记”系列目录:创帆云:Python成为专业人士笔记--强烈建议收藏!每日持续更新!​zhuanlan.zhihu.com按位操作符直接操作二进制的字符串,这些是最基本的操作,并直接由中央处理器所支持。在处理设备…

我看三国有感而发

三国到现在已经过去一千多年了,关羽先生应该还淹没在失去荆州的痛苦中,关羽先生出现的时候充满了一股傲气,这种站着向上仰望30度角的男人非常稀有,应该是几百年才出现一个,而且还要生于乱世,可惜啊可惜&…

pil库修改图片大小_Gvcode库:一个更简单的、华人开源的、自动生成验证码的python库...

1 说明:1.1 gvcode全称:graphic-verification-code。1.2 基本介绍,一秒搞懂。1.3 并对源码进行修改一个小bug,教您如何修改源码,解决bug。2 准备:2.1 官网:https://pypi.org/project/graphic-ve…

iOS获取某个日期后n个月的日期

一、给一个时间,给一个数,正数是以后n个月,负数是前n个月;1 -(NSDate *)getPriousorLaterDateFromDate:(NSDate *)date withMonth:(NSInteger)month2 3 {4 5 NSDateComponents *comps [[NSDateComponents alloc] init];6 …

Android-AB系统OTA升级介绍

什么是OTA升级?OTA是Over-the-Air的简称,OTA升级可以理解为用户正常使用过程中进行升级,OTA 升级旨在升级基础操作系统、系统分区上安装的只读应用和/或时区规则。什么是Android AB系统更新A/B 系统升级,也叫做无缝更新&#xff0…

python输出进度条 tqdm_python-tqdm进度条

Tqdm 进度条可视化模块2018-12-04 14:34:25 使用python Tqdm进度条库让你的python进度可视化 Tqdm在阿拉伯语表示进步,在西班牙语中表示我非常爱你.是一个快速,可扩展的Python进度条, ...Python字符进度条Python字符进度条 看看这个神奇的module from tqdm import trange from …

看完少年的你,想到少年的我

别人喜欢听故事,所以我就讲故事,我可以不是现在的我,但是我还是原来的我,我从一个很小的地方来,我小时候,家里赚钱很难,读书是一件很苦的事情,但是呢,读书又是一件非常光…