Java 程序员应在2019年学习的10条面向对象(OOP)设计原则
面向对象的设计原则 是 OOP 编程的核心,但是我看到大多数 Java 程序员都在追求诸如 Singleton 模式,Decorator 模式或 Observer 模式之类的设计模式,而对学习面向对象的分析和设计没有给予足够的重视。了解诸如抽象,封装,多态和继承之类的面向对象程序设计的基础很重要。但是,与此同时,了解面向对象的设计原则也同样重要。它们将帮助您创建简洁的模块化设计,将来可以轻松进行测试,调试和维护。
我经常见过各种经验水平的 Java 程序员和开发人员,他们要么从未听说过这些 OOP 和 SOLID 设计原理,要么根本不知道特定设计原理可以提供什么好处以及如何将这些设计原理应用于编码中。
为了发挥自己的作用,我已经写下了所有重要的面向对象设计原则,并将其放在此处以供快速参考。这些至少会让您对它们是什么以及它们提供的好处有所了解。
面向程序员的10个面向对象和SOLID设计原则
尽管学习任何设计原理或模式的最佳方法是一个真实的示例,并了解违反该设计原理的后果,但本文的主题是为 Java 程序员介绍面向对象的设计原理。

1.DRY (Don't repeat yourself)
我们的第一个面向对象的设计原则是 DRY,顾名思义,DRY(不要重复造轮子)意味着不要编写重复的代码,而是使用Abstraction 在一个地方抽象常见的东西。如果您有两个以上的重复代码块,请考虑使其成为一种单独的方法,或者如果您多次使用硬编码的值,请将它们设为public final常量。
这种面向对象设计原则的好处在于维护。重要的是不要滥用它,复制不是为了代码,而是为了功能。这意味着,如果您使用通用代码来验证 OrderID 和 SSN,并不意味着它们是相同的,否则将来将保持不变。

通过将通用代码用于两种不同的功能或事物,您将它们永久地紧密结合在一起,并且当 OrderId 更改其格式时,SSN 验证代码将中断。
因此请当心这种耦合,不要将任何使用相似代码但无关的东西组合在一起。
2.封装变化
在软件领域中只有一件事是不变的,即 “更改”。因此,封装您期望或怀疑将来会更改的代码。这种 OOP 设计原则的好处在于,它易于测试和维护正确的封装代码。
如果您使用 Java 进行编码,则遵循以下原则:默认情况下将变量和方法设为private,并逐步增加访问权限,例如,从private到protected而不是public。
Java 中的几种设计模式都使用 Encapsulation,Factory设计模式是 Encapsulation 的一个示例,它封装了对象创建代码,并提供了以后引入新产品而不影响现有代码的灵活性。
3.开放式封闭设计原则
类,方法或函数应对扩展开放(新功能),并为修改关闭。这是另一种美丽的 SOLID 设计原则,它可以防止他人更改已经尝试和测试过的代码。

理想情况下,如果仅添加新功能,则不应测试您的代码,这就是开放式封闭设计原则的目标。顺便说一下,该原则在 SOLID 首字母缩写词上代表 “O”。
4.单一责任原则(SRP)
单一责任原则是另一种 SOLID 设计原则,在 SOLID 首字母缩写词上代表 “S”。根据 SRP,更改类不应有一个以上的原因,否则一个类应始终处理单个功能。

如果您在 Java 的一个类中放置了多个功能,则它会引入两个功能之间的耦合,即使您更改了一个功能,也有可能破坏了耦合功能,这需要进行另一轮测试,以免对生产环境造成任何意外。
5.依赖注入或反转原理
尽量不要依赖,它将由框架提供给您。这已在Spring 框架中很好地实现,此设计原理的优点在于DI 框架注入的任何类都易于使用模拟对象进行测试,并且易于维护,因为创建对象代码放在框架比放在客户端代码中要好很多。

有多种方法可以实现依赖项注入,例如使用某些 AOP(面向方面的编程)框架(如 AspectJ)所做的字节码检测,或像 Spring 中那样使用代理来实现。
6.偏爱组合而不是继承
如果可能的话,我主张使用组合而不是继承。你们中的某些人可能会争论这一点,但我发现 Composition 比 Inheritance灵活得多。
组合允许通过在运行时设置属性并使用接口来构成一个类,从而在运行时更改类的行为,因此我们使用了多态性,该多态性可以随时随地替换更好的实现。

即使是《Effective Java》书籍也建议使用组合而不是继承。
7.Liskov替代原则(LSP)
根据 Liskov 替换原则,子类型必须可以替换为父类型,即使用父类类型的方法或函数必须能够与子类的对象一起工作而没有任何问题。”
LSP 与单职责原则和接口隔离原则密切相关。如果一个类具有比子类更多的功能,则可能不支持某些功能并且确实违反了 LSP。

为了遵循 LSP SOLID 设计原则,派生类或子类必须增强功能,但不能减少功能。LSP 在 SOLID 首字母缩写词上代表 “L”。
8.接口隔离原理(ISP)
隔离接口原理规定,如果客户端不使用接口,则不应实现该接口。大多数情况是在一个接口包含多个功能且客户端仅需要一个功能而没有其他功能时发生的。
关联设计是一项棘手的工作,因为一旦发布接口,您就必须在不破坏所有实现的情况下进行进行更改。

这种设计原则在Java中的另一个好处是,该接口的缺点是在任何类都可以使用它之前先实现所有方法,因此意味着尽可能实现具有单一功能的方法。
9.使用接口而不是实现
始终使用接口而不是使用实现编程,这将导致灵活的代码可以与任何新的接口实现一起使用。
因此,在Java中对变量,方法的返回类型或方法的参数类型使用接口类型。
在许多Java书籍中都建议这样做,包括在《Effective Java》和《Head First设计模式》书籍中。

10.授权原则
不要自己做所有事情,而是将其委托给相应的类。委托设计原理的经典示例是Java的中的equals()方法和hashCode()方法方法。为了比较两个对象是否相等,我们要求类本身进行比较,而不是由Client类进行比较。
此委托原则是该原理的另一个示例,其中将事件委托给处理程序进行处理。

总结
所有这些 面向对象的设计原则 都通过提高高内聚性和低交换性来帮助您编写灵活、更好的代码。这是理论的第一步,但是最重要的是 开发发现何时应用这些设计原理的能力。
一旦掌握了这一点,接下来就是学习Java中的设计模式,该模式将使用这些设计模式来解决应用程序开发和软件工程中的常见问题。
找出我们是否违反了任何设计原则并损害了代码的灵活性,但是由于这个世界上没有什么是完美的,所以不要总是尝试用设计模式和设计原理来解决问题,它们主要用于大型企业项目,因为更长的维护周期。
无论如何,这是所有这些OOP设计原则的不错的总结。
兴趣拓展
如果您真的对Java编码技巧与实践更感兴趣,请阅读Joshua Bloch撰写的《Effective Java 中文 第三版》 ,这是编写Java Collection API的人的宝藏。在公众号【Java知己】,后台回复:Effective Java,可以获得该书籍。
这本书充分利用了各种面向对象和SOLID设计原则,对编写更好的代码有很大帮助。
他们向我们展示了如何在编码和Java程序中使用设计原理。Java开发工具包遵循许多设计原则,例如BorderFactory类中的Factory Pattern,Runtime类中的 Singleton模式,各种java.io类上的Decorator模式。
归根结底,专业程序员应该始终努力实现高度凝聚力和松散耦合的解决方案,代码或设计。从Apache和Google寻找开源代码是学习Java和OOP设计原理的一些好方法。
“不积跬步,无以至千里”,希望未来的你能:有梦为马 随处可栖!加油,少年!
关注公众号:「Java 知己」,每天更新Java知识哦,期待你的到来!
- 发送「Group」,与 10 万程序员一起进步。
- 发送「面试」,领取BATJ面试资料、面试视频攻略。
- 发送「玩转算法」,领取《玩转算法》系列视频教程。
- 千万不要发送「1024」...

Java 程序员应在2019年学习的10条面向对象(OOP)设计原则的更多相关文章
- Java 程序员在写 SQL 时常犯的 10 个错误
Java程序员编程时需要混合面向对象思维和一般命令式编程的方法,能否完美的将两者结合起来完全得依靠编程人员的水准: 技能(任何人都能容易学会命令式编程) 模式(有些人用“模式-模式”,举个例子,模式可 ...
- Java程序员应更新的知识
2013: 你应该更新的Java知识之常用程序库(一) 你应该更新的Java知识之常用程序库(二) 你应该更新的Java知识之Observer 你应该更新的Java知识之集合初始化 你应该更新的Jav ...
- java程序员应该掌握的技能
这是看了一篇大神说的java程序员应该会些什么的文章,这里只是把应该掌握的技能部分列了出来. static.final.transient.volatile关键字,内部类,泛型等 static最需要记 ...
- Java程序员应该了解的10个面向对象设计原则
面向对象设计原则: 是OOPS(Object-Oriented Programming System,面向对象的程序设计系统)编程的核心,但大多数Java程序员追逐像Singleton.Decorat ...
- Java程序员岗位
Java程序员岗位面试题有哪些? 1.面向对象的特征有哪些方面(1)抽象:抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面.抽象并不打算了解全部问题,而只是选择 ...
- (转)Java程序员应该了解的10个面向对象设计原则
面向对象设计原则是OOPS(Object-Oriented Programming System,面向对象的程序设计系统)编程的核心,但大多数Java程序员追逐像Singleton.Decorator ...
- 【分享】熟练的Java程序员应该掌握哪些技术?
Java程序员应该掌握哪些能力才能算是脱离菜鸟达到熟练的程度? 1.语法:Java程序员必须比较熟悉语法,在写代码的时候IDE的编辑器对某一行报错应该能够根据报错信息 知道是什么样的语法错误并且知道任 ...
- Java程序员应该了解的10个设计原则
引用: http://www.cnblogs.com/leehongee/archive/2012/03/18/2404760.html 面向对象设计原则是OOPS(Object-Oriented P ...
- [译]Java 程序员应该了解的 10 个面向对象设计原则
面向对象设计原则是OOPS(Object-Oriented Programming System,面向对象的程序设计系统)编程的核心,但大多数Java程序员追逐像Singleton.Decorator ...
随机推荐
- django之跨站请求伪造csrf
目录 跨站请求伪造 csrf 钓鱼网站 模拟实现 针对form表单 ajax请求 csrf相关的两个装饰器 跨站请求伪造 csrf 钓鱼网站 就类似于你搭建了一个跟银行一模一样的web页面 , 用户在 ...
- C#的语法----程序结构(1)
接下来的内容是整个C#学习的脉络,它将各个知识点串联了起来,是整个C#的重点,所以篇幅较长. 首先,我们类比一下PLC和C#执行代码的方式,其实不难发现都是顺序扫描,以Main为程序入口,从上到下一行 ...
- Think in Java 笔记(chapter1-7)
Content Chapter 1:对象导论 Chapter 2:一切都是对象 Chapter 3:操作符 Chapter 4:控制执行流程 Chapter 5:初始化与清理 Chapter 6:访问 ...
- Ubuntu设置开机时启动的系统内核版本
1.查看系统当前安装的所有内核版本 有两种方法 第一种: 可以查看/lib/modules下的文件夹,一个文件夹对应一个内核版本,如下图: 第二种:使用下面的命令查看: dpkg --get-sele ...
- Linux中长时间运行程序的方法
一.场景: 如果临时有一个命令需要长时间运行,比如 python hello.py ,什么方法能最简便的保证它在后台稳定运行呢?解决方法: 当用户注销(logout)或者网络断开时,终端会收 ...
- 硬盘容量统计神器WinDirStat
最近遇到C盘快要爆满的问题,我的笔记本是128G SSD + 1t HDD,给C盘分配的空间是80G固态,由于平时疏远管理,造成了C盘臃肿,迁移一些软件,但还是没有太好的解决,这是上知乎发现有大神推荐 ...
- Python中Collections模块的Counter容器类使用教程
1.collections模块 collections模块自Python 2.4版本开始被引入,包含了dict.set.list.tuple以外的一些特殊的容器类型,分别是: OrderedDict类 ...
- JVM GC监控
一.jps常看java进程 Java版的ps命令,查看java进程及其相关的信息,如果你想找到一个java进程的pid,那可以用jps命令替代linux中的ps命令了,简单而方便. [root@tsp ...
- [browser window窗口大小 算是screen补充吧]主要因为移动IE游览器 写了个兼容
先上图吧 来上代码 console.log(window.outerWidth + '--' + window.outerHeight);//只读的整数,声明了整个窗口的XY //IE 不支持此属性, ...
- Vue.js2.0快速入门笔记
vue.js 解耦视图与数据,可复用的组件,前端路由,状态管理,虚拟DOM. MVVM模式:当View(视图层)变化时,会自动更新ViewModel(视图模型),View与ViewModel之间双向绑 ...