oop设计原则
面向对象的设计原则 OOP是OOP编程的核心,但是我看到大多数Java程序员都在追求诸如Singleton模式 , Decorator模式或Observer模式之类的设计模式,而对学习面向对象的分析和设计没有给予足够的重视。
重要的是要学习诸如抽象 , 封装 , 多态和继承之类的面向对象编程的基础知识。 但是,与此同时,了解面向对象的设计原则也同样重要。
它们将帮助您创建简洁的模块化设计,将来可以轻松进行测试,调试和维护。
我经常见过各种经验水平的Java程序员和开发人员,他们要么从未听说过这些OOP和SOLID设计原理 ,要么根本不知道特定设计原理可以提供什么好处以及如何将这些设计原理应用于编码中。
为了发挥自己的作用,我已写下所有重要的面向对象设计原则,并将其放在此处以供快速参考。 这些至少会让您对它们是什么以及它们提供的好处有所了解。
我没有放置示例,只是为了使文章简短,但是您可以在Internet上甚至在我的Java Blog上找到很多这些设计原理的示例,只需使用页面顶部的搜索栏即可。
如果您不能理解设计原理,则应该尝试做一个以上的示例,因为有时我们可以更好地联系到另一个示例或作者,但是您必须了解这些设计原理并学习如何在代码中使用它。
您可以做的另一件事是加入全面的面向对象设计课程,例如Steve Smith在Pluralsight上编写的SOLID面向对象设计原理。 它对我理解和应用这些原理有很大帮助。
顺便说一句,我在这里和那里分享了一些相关且有用的课程和书籍,包括免费和付费的,如果您购买一些不免费的东西,我会赚到一些钱。
它们也是我用来一般学习SOLID设计原理和编程的一些资源,并且对于深入学习其中的某些原理非常有用。
面向程序员的10个面向对象和SOLID设计原则
尽管学习任何设计原理或模式的最佳方法是一个真实的示例,并了解违反该设计原理的后果,但本文的主题是为Java程序员介绍面向对象的设计原理 ,他们可能不了解它或在学习阶段。
我个人认为,这些OOP和SOLID设计原则中的每一个都需要一篇文章来清楚地解释它们,我肯定会在这里尝试做到这一点,但是就目前而言,请准备好快速骑自行车进入设计原则之乡:)
1.干(不要重复自己)
我们的第一个面向对象的设计原则是DRY,顾名思义, DRY(不要重复自己)意味着不要编写重复的代码,而是使用Abstraction在一个地方抽象常见的东西。
如果您有两个以上的代码块,请考虑使其成为一种单独的方法,或者如果您多次使用硬编码的值,请将它们设为公共最终常量 。 这种面向对象设计原则的好处在于维护 。
重要的是不要滥用它,复制不是为了代码,而是为了功能。
这意味着,如果您使用通用代码来验证OrderId和SSN,则并不意味着它们是相同的,否则将来将保持不变。
通过将通用代码用于两种不同的功能或事物,您将它们永久地紧密结合在一起,并且当OrderId更改其格式时,SSN验证代码将中断。
因此要当心这种耦合,不要将任何使用相似代码但无关的东西组合在一起。 您可以在Udemy的Java课程中进一步查看“软件体系结构和设计模式的基础知识”,以了解有关编写良好代码和最佳实践的更多信息,以设计系统。
2.封装变化
在软件领域只有一件事是不变的,就是“更改”。因此,封装您期望或怀疑将来会更改的代码。
这种OOP设计原则的好处在于,它易于测试和维护正确的封装代码。
如果您使用Java进行编码,则遵循以下原则:默认情况下将变量和方法设为私有 ,并逐步将访问权限从私有变为受保护,而不是公开 。
Java中的几种设计模式都使用Encapsulation, Factory设计模式是Encapsulation的一个示例,它封装了对象创建代码,并提供了以后引入新产品而不影响现有代码的灵活性。
顺便说一句,如果您有兴趣学习有关Java和面向对象编程中的设计模式的更多信息,那么您必须查看本设计模式库课程Pluralsight。 它是最佳设计模式集和有关如何在现实世界中使用它们的建议之一。
3.开放式封闭设计原则
根据此OOP设计原则,“类,方法或功能应为扩展而打开(扩展新功能),而为修改而关闭”。
这是Bob叔叔在他的经典Clean Code书中提出的另一种美丽的SOLID设计原则,它可以防止他人更改已经尝试和测试过的代码。
此设计原则的主要好处是不会触碰已经尝试和测试过的代码,这意味着它们不会中断。
这是一个违反编程的开放式封闭设计原则的Java代码示例:
在此代码中,GraphicEditor与Shape紧密结合,如果需要新的Shape,则需要在thedrawShape(Shape s)方法内部修改已经尝试过并经过测试的代码,这既容易出错,也不可取。
理想情况下,如果仅添加新功能,则不应测试代码,这就是开放式封闭设计原则的目标。
顺便说一句,开闭原理是SOLID首字母缩略词“ O”。 如果您想了解更多有关此原理的知识,那么有关Udemy的SOLID面向对象设计和体系结构原理课程是最好的参考资源之一。
4.单一责任原则(SRP)
单一责任原则是另一种SOLID设计原则,在SOLID的首字母缩写上表示“ S”。 根据SRP,更改类不应有一个以上的原因,否则一个类应始终处理单个功能。
该原理的主要好处是,它减少了软件的各个组件与代码之间的耦合。
例如,如果您在Java的一个类中放置了多个功能,则会在两个功能之间引入耦合 ,即使您更改了一个功能,也有可能破坏了耦合功能,这需要进行另一轮测试才能避免生产上的意外环境。
您可以进一步看到从0到1:设计模式-24至关重要 关于Udemy的课程,以了解基于此原理的模式。
5.依赖注入或反转原理
不要要求依赖关系,它将由框架提供给您。 Spring框架 (用于编写具有实际价值的应用程序的最流行的Java框架之一)已经很好地实现了这一点。
该设计原理的优点在于,DI框架注入的任何类都易于使用模拟对象进行测试 ,并且易于维护,因为对象创建代码集中在框架中,而客户端代码则不会随处可见。
有多种方式可以实现依赖项注入,例如使用某些AOP(如AspectAs面向方面的编程)框架(如AspectJ)所做的字节码检测,或像在Spring中那样使用代理来实现。
您可以在Udemy上进一步查看SOLID面向对象设计和体系结构原理课程,以了解有关此有用原理的更多信息。 它也代表SOLID首字母缩略词“ D”。
这是违反Java中的Dependency Inversion Principle或DIP的代码示例:
您可以看到AppManager依赖于与EventManager紧密耦合的EventLogWriter。 如果您需要使用其他方式(例如通过发送推送通知,SMS或电子邮件)来通知客户端,则需要更改AppManager类。
此问题可以通过使用依赖关系反转原理来解决,在该依赖关系反转原理中,它将由框架注入或提供给AppManager而不是AppManager要求EventLogWriter。
您可以进一步查看使用SOLID原理编写更好的代码 -Udemy速成班,以了解有关依赖倒置原理以及如何解决此类问题的更多信息。
6.偏爱继承而不是继承
有两种通用的方法可以重用您已经编写的代码,即继承和组合,它们都有自己的优点和缺点,但是,通常,如果可能的话,您应该始终偏重于组合而不是继承。
你们中的某些人可能会争论这一点,但我发现Composition比Inheritance灵活得多。
组合允许通过在运行时设置属性并使用接口来构成一个类,从而在运行时更改类的行为,因此我们使用了多态性 ,该多态性可随时灵活地替换为更好的实现。
甚至约书亚·布洛赫(Joshua Bloch)的《 有效的Java》 ( Effective Java)都建议采用组合而非继承。 如果您仍然不相信,那么您也可以在这里阅读以更多地了解为什么您的Composition在重用代码和功能方面要比Inheritance好。
而且,如果您忘记了这条规则,可以在办公桌上放一个漂亮的卡通漫画:-)
如果您有兴趣了解有关诸如组合,继承,关联,聚合等面向对象的编程概念的更多信息,还可以在Coursera上的Java面向对象编程课程中查看。
它是免费的探索和学习,但如果您还想参加练习,作业,评估并需要获得认证才能显示在LinkedIn个人资料中,则需要付费。
7. Liskov替代原则(LSP)
根据Liskov替换原理,子类型必须可以替代父类型。我的意思是使用父类类型的方法或函数必须能够与子类的对象一起工作而没有任何问题。
LSP与单一职责原则和接口隔离原则密切相关。
如果一个类具有比子类更多的功能,则可能不支持某些功能并且确实违反了LSP。
为了遵循LSP SOLID设计原则 ,派生类或子类必须增强功能,但不能减少功能。 LSP在SOLID首字母缩写词上代表“ L”。
这是一个违反Java中的Liskov替换原理的代码示例:
如果您有一个方法area(Rectangle r)计算Rectangle的面积,则在通过Square时该代码将中断,因为Square不是真正的Rectangle。
如果您对一个更真实的示例感兴趣,那么Pluarlsight上的SOLID面向对象设计原理原理课程是一门很好的课程。
顺便说一句,您需要具有Pluralsight会员身份才能访问此课程,该课程每月费用约为$ 29或每年$ 299(折扣14%)。 即使您没有会员资格,您也可以免费使用该课程的10天免费试用版,而无需做出任何承诺,这是一种很好的方式,不仅可以免费访问此课程,而且可以查看加入Pluralsight之前的课程质量
8.接口隔离原理(ISP)
接口隔离原理规定,如果客户端不使用接口,则不应实现该接口 。
大多数情况是在一个接口包含多个功能且客户端仅需要一个功能而没有其他功能时发生的。
毫无疑问,接口设计是一项棘手的工作,因为一旦发布接口,就无法在不中断所有实现的情况下对其进行更改。 好吧,Java 8的默认或防御者方法功能确实提供了一种接口演化的方法,但是并非所有的编程语言都支持该功能。
此设计原则在Java中的另一个好处是,该接口的缺点是在任何类都可以使用它之前先实现所有方法,因此具有单一功能意味着实现的方法较少。
如果您没有从编码中获得接口的好处,那么我建议您阅读我的博客文章,即Java中接口的实际用法以了解更多信息。
9.接口编程未实现
程序员应该始终为接口编程,而不是为实现接口编程,这将导致产生可与接口的任何新实现一起使用的灵活代码。
具体来说,您应该在Java变量上使用接口类型,方法的返回类型或方法的参数类型,例如使用SuperClass类型存储对象而不是使用SubClass。
我的意思是
列表号= getNumbers();
代替
ArrayList数字= getNumbers();
许多Java书籍(包括Effective Java和Head First设计模式书籍)也建议这样做。
这是Java接口的编码示例:
如果您有兴趣提高程序的代码质量,我还建议您浏览Udemy上的“ 重构到设计模式”课程,该课程将帮助您使用C#中的重构技术和设计模式来改进内部设计。
10.授权原则
不要自己做所有事情,而是将其委托给相应的班级。 委托设计原理的经典示例是Java中的equals()和hashCode()方法 。
为了比较两个对象是否相等,我们要求类本身进行比较,而不是由Client类进行比较。
此设计原则的主要好处是无需重复代码,并且很容易修改行为。 事件委托是该原理的另一个示例,其中将事件委托给处理程序进行处理。
摘要
所有这些面向对象的设计原则都通过争取高内聚性和低耦合性来帮助您编写灵活,更好的代码。
该理论是第一步,但是最重要的是发展发现何时应用这些设计原理的能力 。
一旦掌握了这一点,下一步就是学习Java中的设计模式,该模式将使用这些设计模式来解决应用程序开发和软件工程中的常见问题。
如果您正在寻找一门不错的课程,建议您加入从0到1:设计模式-24的重要性-Java 当然在乌迪米。 它非常全面,您可以通过几次闪存销售以11美元的价格获得它。
无论如何,这是所有这些OOP设计原则的不错总结。
找出我们是否违反了任何设计原则并损害了代码的灵活性,但是由于这个世界上没有什么是完美的,因此不要总是尝试用设计模式和设计原理来解决问题,它们主要用于大型企业项目,维护周期更长。
最重要的是,专业程序员应始终努力争取高度凝聚力和松散耦合的解决方案,代码或设计。 从Apache和Google寻找开源代码是学习Java和OOP设计原理的一些好方法。
他们将向您展示如何在编码和Java程序中使用设计原理。 Java开发工具包遵循许多设计原则,例如BorderFactory类中的Factory Pattern ,java.lang.Runtime类中的Singleton模式 ,各种java.io类中的Decorator模式 。
如果您对学习面向对象的原理和模式感兴趣,那么可以看看我个人最喜欢的Head First面向对象的分析和设计 ,这本非常不错的书,而且可能是面向对象的分析和设计中最好的材料。
没有多少程序员知道这本书,因为它经常被Eric Freeman的更受欢迎的表兄弟Head First Design Pattern所遮盖 ,后者更多地是关于这些原理如何组合在一起以创建可直接用于解决已知问题的模式。
这些书充分利用了各种面向对象和SOLID设计原则,对编写更好的代码有很大帮助。 顺便说一句,如果您真的对Java编码实践感兴趣,那么请阅读Joshua Bloch撰写的Effective Java 3rd Edition ,这是编写Java Collection API的人的宝藏。
如果您想了解有关SOLID设计原理的更多信息,可以参考以下有用的资源:
而且,如果您喜欢这篇文章,那么您可能也喜欢这些Java和Programming文章 :
Java程序员应该在2019年学习的10件事
每个程序员必须阅读的10本书
提升编程技巧的10个技巧
每个软件开发人员都应该知道的10种工具
深入学习软件架构的5门课程
20个库和APIS Java程序员应该知道的
2019年要学习的十大编程语言
Java和Web开发人员应该学习的10个框架和库
感谢您阅读本文。 如果您发现这些面向对象的设计原则很有用,请与您的朋友和同事分享。 如果您有任何疑问或反馈,请留言。
顺便说一句,如果您购买了我推荐的书或课程中的任何一本书,我也会得到报酬。
如果您喜欢这篇文章,那么请考虑关注我( javinpaul )。 如果您希望收到每条新帖子的通知,并且不要忘记关注 在Twitter上再次访问java !
PS —如果您真的对编码充满热情,并且想提高编码技巧,那么没有比Robert Martin的 Clean Code和Martin P. Fowler的 Refactoring更好的书籍了。 只是去阅读。
翻译自: https://hackernoon.com/10-oop-design-principles-every-programmer-should-know-f187436caf65
oop设计原则