Java程序员的10个面向对象设计原则

面向对象的设计原则是OOPS编程的核心,但是我看到大多数Java程序员都在追求诸如Singleton模式Decorator模式Observer模式之类的设计模式,但没有对面向对象的分析和设计给予足够的重视或遵循这些设计原则。 我经常见过各种经验水平的Java程序员和开发人员,他们要么没有听说过这些OOPSSOLID设计原理,要么根本不知道特定设计原理可以提供什么好处,或者如何在编码中使用这些设计原理。
最重要的是,始终努力实现具有高度凝聚力和松散耦合的解决方案,代码或设计,并且看起来来自Apache和Sun的开源代码是Java设计原理的很好示例,或者在Java编码中应如何使用设计原理。 Java开发工具包遵循几种设计原则,例如BorderFactory类中的Factory Pattern ,Runtime类中的Singleton模式,如果您对Java代码感兴趣,请阅读Joshua Bloch的Effective Java ,这是编写Java API的人的宝藏。 在面向对象设计模式上我另一个个人的最爱是Kathy Sierra等人的Head First Design PatternHead First Oriented Oriented Analysis and Design
尽管学习设计原理或模式的最佳方法是在现实世界中了解并理解违反该设计原理的后果,但本文的主题是为未接触Java或处于学习阶段的Java程序员介绍面向对象的设计原理 。 我个人认为这些设计原则中的每一个都需要一篇文章来清楚地解释它,我肯定会在这里尝试做,但是现在就让自己准备好在设计原则镇上快速骑自行车吧:)
面向对象的设计原则1 – DRY(请勿重复)
顾名思义, DRY(不要重复自己)意味着不要编写重复的代码,而应使用抽象将一个共同的地方抽象化。 如果您多次使用硬编码值,请考虑使其成为公共最终常量;如果您在两个以上的位置中包含代码块,请考虑使其成为单独的方法。 这种SOLID设计原则的好处在于维护。 需要注意的是不要滥用它,重复不是用于代码,而是用于功能,这意味着如果您使用通用代码来验证OrderID和SSN,这并不意味着它们相同或将来会保持不变。 通过将通用代码用于两种不同的功能或事物,您将它们永久地紧密结合在一起,并且当OrderID更改其格式时,SSN验证代码将中断。 因此,请注意这种耦合,不要将任何使用相似代码但不相关的东西组合在一起。
面向对象的设计原则2 –封装变化
在软件领域,只有一件事是不变的,那就是“更改”。因此,封装您期望或怀疑将来会更改的代码。 此OOPS设计原则的好处在于,它易于测试和维护正确的封装代码。 如果您使用Java进行编码,则遵循以下原则:默认情况下将变量和方法设置为私有,并逐步增加访问权限,例如,从私有到受保护而不是公共。 Java中的几种设计模式都使用封装, 工厂设计模式是封装的一个示例,它封装了对象创建代码,并提供了以后引入新产品的灵活性,而对现有代码没有影响。
面向对象的设计原则3 –开放封闭原则
类,方法或函数应为扩展打开(新功能),并为修改关闭。 这是另一种漂亮的面向对象的设计原则,可以防止有人更改已经尝试和测试过的代码。 理想情况下,如果仅添加新功能,则不应测试代码,这就是开放式封闭设计原则的目标。
面向对象的设计原则4 –单一职责原则(SRP)
类更改的原因不应多于一个,或者类应始终处理单个功能。 如果您在Java的一个类中放置了多个功能,则会在两个功能之间引入耦合 ,即使您更改了一个功能,也有可能破坏了耦合功能,这需要另一轮测试,以免对生产环境造成任何意外。
面向对象的设计原则5 –依赖注入或反转原则
不要要求依赖,它将由框架提供给您。 这已经在Spring框架中很好地实现了,此设计原理的优点在于,通过DI框架注入的任何类都易于使用模拟对象进行测试,并且易于维护,因为对象创建代码集中在框架中,并且不会乱扔客户端代码有多种方法可以实现依赖注入,例如使用像AspectJ这样的某些AOP(面向方面​​编程)框架的字节码检测工具,或像Spring一样使用代理来实现依赖注入
面向对象的设计原则6 –继承时优先考虑组成
如果可能的话,始终主张使用组合而不是继承 。 你们中的某些人可能会争论这一点,但是我发现Composition比Inheritance灵活得多。 组合允许通过在运行时设置属性并使用接口来构成一个类,从而在运行时更改类的行为,我们使用了多态性 ,该多态性可以随时替换以更好的实现。 即使是有效的Java建议也建议使用组合而不是继承。
面向对象的设计原则7 – Liskov替代原则(LSP)
根据Liskov替换原理,子类型必须可以替代父类型,即使用父类类型的方法或函数必须能够与子类的对象一起工作而没有任何问题。 LSP与单一职责原则接口隔离原则密切相关。 如果一个类具有比子类更多的功能,则可能不支持某些功能并且确实违反了LSP。 为了遵循LSP设计原则 ,派生类或子类必须增强功能而不减少它。
面向对象的设计原则8 –接口隔离原则(ISP)
接口隔离原则规定,如果客户端不使用接口,则不应实现该接口。 这种情况通常发生在一个接口包含多个功能而客户端只需要一个功能而不是其他功能的情况下。接口设计是一项棘手的工作,因为一旦释放接口,就无法在不破坏所有实现的情况下对其进行更改。 Java中这种设计原则的另一个好处是,接口在任何类都可以使用它之前就无法实现所有方法,因此具有单一功能意味着实现的方法更少。
面向对象的设计原则9 –不实现接口编程
总是为接口而不是为实现编程,这将导致可以与任何新的接口实现一起工作的灵活代码。 因此,在Java中对变量使用接口类型,方法的返回类型或方法的参数类型。 许多Java程序员都建议这样做,包括在Effective Java先行设计模式书中。
面向对象设计原则10 –委托原则
不要自己做所有事情,而是将其委托给各自的班级。 委托设计原理的经典示例是Java中的equals()和hashCode()方法 。 为了比较两个对象是否相等,我们要求类本身进行比较,而不是由Client类进行比较。 这种设计原则的好处是不会重复代码,并且很容易修改行为。
所有这些面向对象的设计原理都通过争取高内聚性和低耦合性来帮助您编写灵活,更好的代码。 理论是第一步,但是最重要的是发展能力,以发现何时以及应用这些设计原则,并确定我们是否违反任何设计原则并损害代码的灵活性。 但是,由于这个世界上没有什么是完美的,所以不要总是尝试用设计模式和设计原理来解决问题,它们主要用于维护周期较长的大型企业项目。

翻译自: https://www.javacodegeeks.com/2012/08/10-object-oriented-design-principles.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值