面向对象的设计原则 是 OOP 编程的核心,但是我看到大多数 Java 程序员都在追求诸如 Singleton 模式,Decorator 模式或 O​​bserver 模式之类的设计模式,而对学习面向对象的分析和设计没有给予足够的重视。了解诸如抽象,封装,多态和继承之类的面向对象程序设计的基础很重要。但是,与此同时,了解面向对象的设计原则也同样重要。它们将帮助您创建简洁的模块化设计,将来可以轻松进行测试,调试和维护。

我经常见过各种经验水平的 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)设计原则的更多相关文章

  1. Java 程序员在写 SQL 时常犯的 10 个错误

    Java程序员编程时需要混合面向对象思维和一般命令式编程的方法,能否完美的将两者结合起来完全得依靠编程人员的水准: 技能(任何人都能容易学会命令式编程) 模式(有些人用“模式-模式”,举个例子,模式可 ...

  2. Java程序员应更新的知识

    2013: 你应该更新的Java知识之常用程序库(一) 你应该更新的Java知识之常用程序库(二) 你应该更新的Java知识之Observer 你应该更新的Java知识之集合初始化 你应该更新的Jav ...

  3. java程序员应该掌握的技能

    这是看了一篇大神说的java程序员应该会些什么的文章,这里只是把应该掌握的技能部分列了出来. static.final.transient.volatile关键字,内部类,泛型等 static最需要记 ...

  4. Java程序员应该了解的10个面向对象设计原则

    面向对象设计原则: 是OOPS(Object-Oriented Programming System,面向对象的程序设计系统)编程的核心,但大多数Java程序员追逐像Singleton.Decorat ...

  5. Java程序员岗位

    Java程序员岗位面试题有哪些?   1.面向对象的特征有哪些方面(1)抽象:抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面.抽象并不打算了解全部问题,而只是选择 ...

  6. (转)Java程序员应该了解的10个面向对象设计原则

    面向对象设计原则是OOPS(Object-Oriented Programming System,面向对象的程序设计系统)编程的核心,但大多数Java程序员追逐像Singleton.Decorator ...

  7. 【分享】熟练的Java程序员应该掌握哪些技术?

    Java程序员应该掌握哪些能力才能算是脱离菜鸟达到熟练的程度? 1.语法:Java程序员必须比较熟悉语法,在写代码的时候IDE的编辑器对某一行报错应该能够根据报错信息 知道是什么样的语法错误并且知道任 ...

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

    引用: http://www.cnblogs.com/leehongee/archive/2012/03/18/2404760.html 面向对象设计原则是OOPS(Object-Oriented P ...

  9. [译]Java 程序员应该了解的 10 个面向对象设计原则

    面向对象设计原则是OOPS(Object-Oriented Programming System,面向对象的程序设计系统)编程的核心,但大多数Java程序员追逐像Singleton.Decorator ...

随机推荐

  1. Oracle ASM无法识别扩展分区的磁盘设备

    在linux 环境下,我们一般通过udev或者asmlib来绑定磁盘分区作为ASM的候选存储单元.在使用udev的情况下,一般只要我们可以看到被绑定的磁盘的设备,并且这些设备的属主和权限没有问题,AS ...

  2. Tornado—接口调用时方法执行顺序

    import tornado.web # web服务 import tornado.ioloop # I/O 时间循环 class MainHandler(tornado.web.RequestHan ...

  3. pytest系列(二):筛选用例新姿势,mark 一下,你就知道。

    pytest系列(一)中给大家介绍了pytest的特性,以及它的编写用例的简单至极. 那么在实际工作当中呢,我们要写的自动化用例会比较多,不会都放在一个py文件里. 如下图所示,我们编写的用例存放在不 ...

  4. 25.md5 collision(NUPT_CTF)

    抓住两点提示: 1.md5碰撞 2.please input a 利用0 == 字符串是成立的,从而可以绕过MD5检查. 所以找一个md5是0e开头的值,因为 php 在处理 == 的时候当碰到的字符 ...

  5. php获取本机ip

    最近在写个东西时,需要获取本机的IP,但是由于php本身不带这样的功能,在网上找了好久也没有一个好办法,突然想到一个好办法,如下代码 <?=gethostbyname($_ENV['COMPUT ...

  6. (转)Python- sklearn之最小二乘法

    最小二乘法:https://baike.baidu.com/item/%E6%9C%80%E5%B0%8F%E4%BA%8C%E4%B9%98%E6%B3%95/2522346?fr=aladdin ...

  7. 【Untiy】完美解决Untiy Package Manager无限加载的问题

    直接上干货 打开记事本,复制一下zhei个 @echo offset HTTP_PROXY=127.0.0.1set HTTPS_PROXY=127.0.0.1start "" & ...

  8. 【Unity】 关于Package Manager 无限加载的问题(Loading Packages),以及可能的解决办法(待补充。)

    ·版本:2019.1.8f 官方论坛对于此问题的讨论:地址>Package Manager 许多人都遇到了这个问题,但是无法定位问题出在哪里.官方技术人员提供了一个名为 Package Mana ...

  9. sshd 启动后 出现:Could not load host key: /etc/ssh/ssh_host_rsa_key

    今天在启动sshd时,出现了如下问题,导致客户端不能成功连接服务端,不能建立ssh连接: 有两个提示 Could not load host key: /etc/ssh/ssh_host_rsa_ke ...

  10. Linux:源代码安装及脚本安装的使用

    由于这两个安装方法比较少,就没有单独分开来写 源代码安装 源码安装的步骤 (1)对下载的码包进行解压 (2)进入解压目录执行 configure 命令做相关设置 (3)执行 make 进行编译 (4) ...