面向对象的设计原则 是 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. nova安装与配置

    一.实验目的: 1.理解nova服务在OpenStack中的作用 2.掌握在控制节点上安装配置nova的方法和步骤 3.掌握在计算节点上安装与配置nova的方法和步骤 二.实验步骤: 1.在contr ...

  2. post请求四种传送正文的方式

    一.简介 HTTP协议规定post提交的数据必须放在消息主体(entity-body)中,但协议没有规定数据必须使用什么编码方式.HTTP协议是以ASCII码传输,建立再TCP/IP协议之上的应用层规 ...

  3. (day67)组件、组件化、组件传参、JS补充(命名转换、for in 、数据转换)、css取消选中和模拟小手

    目录 一.初识组件 (一)概念 (二)特点 二.组件的分类 (一)根组件 (二)局部组件 (三)全局组件 二.数据组件化 三.组件的传参 (一)父传子 (二)子传父 四.JS补充 (一)与html命名 ...

  4. RabbitMQ几个常用面试题

    以下观点,仅为个人理解的总结,如有错漏,欢迎指正! -------------------------------------------------------------------------- ...

  5. [译]Vulkan教程(31)加载模型

    [译]Vulkan教程(31)加载模型 Loading models 加载模型 Introduction 入门 Your program is now ready to render textured ...

  6. IDEA生成可执行的jar文件

    场景 用IDEA开发一个Java控制台程序,项目完成后,打包给客户使用. 做法 首先用IDEA打开要生成jar的项目,打开后选择File->Project Structure... 选择Arti ...

  7. Spring注解的使用和组件扫描

    非常重要] 组件扫描(Component-Scan) 通过配置组件扫描,可以使得spring自动扫描package,而不必在spring的配置文件中逐一声明各个<bean> 在配置组件扫描 ...

  8. cocos2d-x 新工程的把玩

    创建了cocos的工程以及初步了解了工程的结构之后,可以尝试自己改改代码了 游戏窗口的设置 首先是AppDelegate,找到AppDelegate.cpp中AppDelegate::applicat ...

  9. ES6新语法(一)

    1.常量         ES5没有定义声明常量的方式,ES6标准中引入了新的关键字const来定义常量.         常量必须给初始值: 常量不能在同一作用域内重新定义或赋值:  <scr ...

  10. golang-结构体与指针

    1.结构体 结构体是一系列具有指定数据类型的数据类型 ,就是一个结构体中存储多个不同类型的数据字段 ,用于创建传递复杂数据结构 结构体可以理解为面向对象的模板 ,但是go并非面向对象 ,结构体只是一种 ...