当前位置: 首页 > 科技观察

面向对象程序设计的十大原则

时间:2023-03-19 20:50:46 科技观察

【.com速译】众所周知,面向对象设计原则(Object-OrientedDesignPrinciples)是面向对象程序设计(OOP)的核心。然而,如今许多Java程序员在追求Singleton、Decorator或Observer等设计模式时,却忽略了面向对象的分析和设计。除了学习抽象、封装、多态、继承等基础知识外,我们还需要了解面向对象的设计原则。由此,我们可以创建一个干净的模块化设计,以后可以轻松地对其进行测试、调试和维护。我想知道您是否听说过OOP的SOLID设计原则(参见--https://javarevisited.blogspot.com/2018/02/top-5-java-design-pattern-courses-for-developers.html)?作为一个面向对象的设计原则,它具体包括以下十个部分。1.DRY(Don'trepeatyourself)顾名思义,DRY就是不写重复的代码,应该尽量使用抽象类(Abstraction)来抽象目标事物。例如:如果你有两个以上的代码块,你应该考虑把它做成一个单一的方法。如果多次使用硬编码值,则应将它们设为公共最终常量(请参阅--http://javarevisited.blogspot.com/2011/12/final-variable-method-class-java.html)。显然,这样的面向对象的设计原则对于后期的维护是有好处的。但是,当你使用标准化代码来验证OrderId和SSN(译者注:美国社会安全号码)这两个不同的功能或事物时,你需要避免将它们联系得太紧密,否则当OrderId改变格式时,验证码为SSN将被阻止。这就是我们常说的耦合。请不要合并任何使用类似代码但实际上没有连接的东西。你可以在Udemy(译者注:一个开放的在线教育网站)上的“Java课程”中进一步学习《软件架构和设计模式的基础知识》,了解编写正确代码和设计系统时应遵循的最佳实践。2、封装变化(EncapsulateWhatChanges)资深码农常常仰天长叹:“在软件领域,唯一不变的就是变化!”可见,你应该尽量封装你期望的或者将来可能改变的代码。此举的好处还在于便于后期测试和维护。如果您使用Java编程,请将变量和方法默认设置为私有,并随着时间的推移逐渐增加访问权限。同时,在Java中,很多设计模式都使用了封装。工厂设计模式(Factorydesignpattern,见--http://javarevisited.blogspot.com/2011/12/factory-design-pattern-java-example.html)就是一个很好的例子。它通过封装对象的代码创建,提供了在不影响现有代码的情况下在稍后阶段引入新功能的灵活性。《设计模式库》Pluralsight课程(参见--https://pluralsight.pxf.io/c/1193463/424552/7490?u=https%3A%2F%2Fwww.pluralsight.com%2Fcourses%2Fpatterns-library),设计模式的最佳集合。它还提供了有关如何在真实环境中使用它的建议。3.开闭设计原则(OpenClosedDesignPrinciple)根据OOP的设计原则:“类、方法或函数对于新功能的扩展应该是开放的,而对于修改是关闭的(防止别人更改被测试的代码)”理想情况下,我们只需要测试带来新功能的代码,这就是开放封闭设计原则的目标,这里的Open-Closed是SOLID设计原则中字母“O”的缩写,我们来看一个Java例子违反了“开闭设计原则”:在某段代码中,GraphicEditor与Shape紧密结合,如果需要一个新的Shape,需要在drawShape(Shapes)方法里面,修改通过测试系统。显然,这是既容易出错又不可取的。大家可以在Udemy上学习《面向对象设计和架构的SOLID原则》的课程,加深对这个原理的理解。4.单一职责原则(SingleResponsibilityPrinciple,SRP)单一职责原则要求类变化的原因不应该超过一个,或者说在一个层次上始终只实现一个功能。好处是有效降低了软件各个组件与代码之间的耦合度。这里的SRP是SOLID设计原则中字母“S”的缩写。比如在Java中,如果你在一个类中设置了多个函数,那么就会造成两个函数之间的耦合。一旦更改单个功能,就可以打破耦合,触发新一轮测试以避免生产中出现任何异常。大家可以在Udemy上学习《从0到1:设计模式》的课程,加深对这个原理的理解。5.依赖注入或反转原则(DependencyInjectionorInversionPrinciple)这个原则要求:不要自己增加依赖,请交给框架。例如:作为编写实际应用程序最流行的Java框架之一,Spring框架提供了各种依赖。这种设计原则的好处是,DI框架注入的任何类都易于使用模拟对象进行测试,并且易于后期维护。由于对象创建代码集中在框架中,客户端代码不会散落在各处。依赖注入原理是SOLID中字母“D”的缩写。我们可以通过多种方式实现依赖注入,例如:使用类似于AspectJ的AspectOrientedProgramming(AOP)框架进行字节码检测;或者在Spring中使用各种代理。我们来看一个违反依赖注入原则的Java代码示例:EventLogWriter与AppManager存在紧耦合关系。如果需要使用其他方式(例如:推送短信或邮件通知)通知客户端,则需要更改AppManager类。对于这一点,我们可以利用依赖倒置原则来解决。也就是说,为了避免AppManager去请求EventLogWriter,我们可以使用框架注入或者提供的AppManager。大家可以在Udemy上学习《使用SOLID原则写更好的代码—速成班》的课程,加深对这个原理的理解。6.优先使用(对象)组合而不是(类)继承(FavorCompositionoverInheritance)继承和组合是可用于重用已编写代码的两种通用方法。两者各有利弊,但如果可能,您应该尝试使用组合而不是继承。毕竟,组合比继承灵活得多。这里的组合是指:通过设置属性改变运行时(run-time)类的行为,使用各种接口组合一个类。这就是我们常说的多态性(polymorphism)。可以随时灵活地替换成更好的实现。如果你有兴趣了解更多关于面向对象编程的概念和知识,如组合、继承、关联、聚合等,欢迎在Coursera上的《Java面向对象编程》课程中深入学习。7.里氏替换原则(LiskovSubstitutionPrinciple,LSP)根据里氏替换原则,子类型必须能够替换父类型。换句话说,那些使用超类型的方法或函数必须能够无障碍地与子类的对象协作。即:派生类或子类必须在父类的基础上增强功能,而不是降低功能。相反,如果一个类比它的子类有更多的特性,那么它不应该支持这些更多的特性,这就违反了LSP。事实上,LSP与单一职责原则和接口隔离原则(见下文)密切相关。另外,LSP是SOLID中字母“L”的缩写。我们来看一个违反里氏代换原则的Java代码示例:如果你设计一个area(Rectangler)方法来计算一个Rectangle的面积,那么当你传入Square时,由于Square不是一个真正的Rectangle,所以代码将产生一个中断。如果您对更多真实示例感兴趣,请深入学习Pluralsight上的《面向对象设计的SOLID原则》课程。8、接口隔离原则(InterfaceSegregationPrinciple,ISP)接口隔离原则规定,如果一个接口包含多个功能,而一个客户端只需要其中一个功能,那么我们不应该实现那些没有用到的功能。界面。毫无疑问,界面设计是一项棘手的工作。毕竟,一旦我们发布了一个接口,我们就不能在不破坏其现有实现的情况下更改它。ISP在Java中的另一个好处是,如果不同的类需要使用一个接口来实现各种方法,那么最好使用较少的方法来实现单个功能。如果你对接口编程感兴趣,请参考博文--《Java接口的实战用法》了解更多信息。9.Programmingfortheinterface,ratherthanprogrammingforimplementation(ProgrammingforInterfacenotimplementation)程序员应该永远为接口编程,而不是为实现编程。根据此原则创建的代码将能够灵活地用于接口的任何新实现。准确地说,我们应该在各种变量、方法返回类型和类Java参数类型上使用接口类型。例如:您可以使用SuperClasstype来存储对象而不是SubClass。另外,您可以使用Listnumbers=getNumbers();而不是ArrayListnumbers=getNumbers();。当然,像这样的东西:《Java高效编程(Effective Java)》(见——https://www.amazon.com/Effective-Java-3rd-Joshua-Bloch/dp/0134685997/?tag=javamysqlanta-20)和《入浅出的设计模式(Head First design pattern)》(见--http://www.amazon.com/dp/0596007124/?tag=javamysqlanta-20)和其他Java书籍也建议这样做。如果您有兴趣提高程序的代码质量,我建议您参加Udemy上的《设计模式重构》课程。本课程将教您如何在C#中使用重构技术以及设计模式来改进内部设计。10.委托原则(DelegationPrinciples)委托原则建议:请不要事事亲力亲为,学会将不同的实现委托给相应的类。这一原则的经典示例是Java中的equals()和hashCode()方法(参见--http://javarevisited.blogspot.com/2011/02/how-to-write-equals-method-in-java.html).事件委托是另一个示例,它将事件委托给处理程序进行处理。可以看出,这种设计原则的主要好处是无需重写代码就可以轻松修改程序的行为。总结和其他资源可以说,以上所有面向对象的设计原则,都会有利于程序代码的高内聚和低耦合,也会帮助你写出灵活简洁的代码。您将通过反复练习来实践这些理论原则,以解决应用程序开发和软件工程中的常见问题。同时,你可以从Apache和Google找到各种开源代码,学习Java和OOP的设计原理。此外,JavaDevelopmentKit(JDK)也包含了很多设计原则,例如:BorderFactory类中的工厂模式(见--http://javarevisited.blogspot.sg/2011/12/factory-design-pattern-java-example.html#axzz51cvxH5kW),java.lang.Runtime类中的单例模式(参见--https://javarevisited.blogspot.com/2014/05/double-checked-locking-on-singleton-in-java。html),以及各种java.io类中的装饰器模式(参见--http://www.java67.com/2013/07/decorator-design-pattern-in-java-real-life-example-tutorial.html).如果你对学习面向对象的原理和模式还有兴趣,我推荐你读一读《深入浅出学习面向对象的分析和设计(Head First Object-Oriented Analysis and Design)》这本书。当然,如果你想了解更多SOLID设计原则的具体内容,请参考以下有用的资源:《整洁的代码(Clean Code)》《面向对象设计的SOLID原则(SOLID Principles of Object-Oriented Design)》《面向对象设计和架构的SOLID原则(SOLID Principles of Object-Oriented Design and Architecture)》byRobertMartin《重构(Refactoring)》byMartinFowlerLearn,作者:JavinPaul