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 ...
随机推荐
- MSSQL一个关于Count函数的小实例
--创建测试表 if object_id(N'T_Test',N'U') is null CREATE TABLE [dbo].[T_Test] ( , ) PRIMARY key NOT NULL, ...
- docker下MySQL的主从复制
MySql的主从复制 sudo docker pull MySQL:5.7 拉取MySQL的镜像文件(版本号为 5.7) sudo docker run -p 3339:3306 --name mas ...
- python 基础学习笔记(5)--文件操作
**python 的文件操作** - [ ] 使用python来读写文件是非常简单的操作,我们使用open()来打开一个文件,获取到文件的语柄,然后通过文件语柄就可以进行各种各样的操作了. - [ ] ...
- November 10th, Week 45th, Sunday, 2019
Perfection has no place in love. 爱从不完美. Perfection has no place in love, and we should always try to ...
- 淘宝爬取图片和url
刚开始爬取了 百度图片和搜狗图片 但是图片不是很多,随后继续爬取淘宝图片,但是淘宝反爬比较厉害 之前的方法不能用 记录可行的 淘宝爬取 利用selenium爬取 https://cloud.tence ...
- 集合系列 Set(六):HashSet
HashSet 是 Set 集合的哈希实现,其继承了 AbstractSet 抽象类,并实现了 Set 接口. public class HashSet<E> extends Abstra ...
- 四面快手、终拿Offer,想告诉你的一些事情
本篇面经来自于群里粉丝朋友的分享,希望对你有所帮助! 快手高开及以上职级面试 是没有笔试或者机试的,所以从第一轮开始就是直接面对面试官. 一轮 主要考察对Java基础的理解和深入程度. Spring ...
- FCC---Use the CSS Transform scale Property to Change the Size of an Element
To change the scale of an element, CSS has the transform property, along with its scale() function. ...
- SQL高效运行注意事项(四)
为了SQLSERVER能高效运行,SQLSERVER的磁盘子系统是一个重要的方面 Avg. Disk Sec/Read 这个计数器是指每秒从磁盘读取数据的平均值 下面的列表显示这个计数器值的范围,并指 ...
- mtu测试
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/jeromezmzx007/article ...