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」...