每个程序员都应学习的10条编码原则


面向对象的设计原则 是OOP编程的核心。仍然,我看到大多数Java程序员都在追求诸如Singleton模式,Decorator模式或Observer模式之类的设计模式,而对学习面向对象的分析和设计没有给予足够的重视。

必须学习诸如抽象,封装,多态和继承之类的面向对象编程的基础知识。但是,与此同时,了解面向对象的设计原则也同样重要。

它们将帮助您创建简洁的模块化设计,将来可以轻松进行测试,调试和维护。

我经常见过各种经验水平的Java程序员和开发人员,他们要么从未听说过这些OOP和SOLID设计原理,要么不知道特定设计原理可以提供什么好处以及如何在编码中应用这些设计原理。

为了发挥自己的作用,我已经写下了所有重要的面向对象的设计原则,并将它们放在此处以供快速参考。这些至少会让您对它们是什么以及它们提供的好处有所了解。

如果您不了解设计原理,则应该尝试做一个以上的示例,因为有时我们可以更好地连接到另一个模型或作者。 仍然,您必须遵循这些设计原则,并学习如何在代码中使用它。

您可以做的另一件事是加入全面的面向对象设计课程,例如Steve Smith在Pluralsight上编写的SOLID面向对象设计原理。它对我对这些原理的理解和应用极大地帮助了我。

顺便说一句,我在这里和那里分享了一些相关且有用的课程和书籍,包括免费和付费的,如果您购买一些不免费的东西,我会赚到一些钱。

它们也是我用来一般学习SOLID设计原理和编程的一些资源,有助于深入发现其中一些原理。

面向程序员的10种面向对象和SOLID设计原则 尽管学习任何设计原理或模式的最佳方法是一个真实的示例,并了解违反该设计原理的后果,但本文的主题是为Java程序员介绍面向对象的设计原理,但他们都不愿接触它。或处于学习阶段。

object-oriented-design-principles.png 我认为所有这些OOP和SOLID设计原则都需要一篇文章来清楚地解释它们,我将在这里尝试做到这一点,但是现在,让您准备好在设计原则之乡快速骑自行车吧:)

1.DRY(不要重复自己) 我们的第一个面向对象的设计原则是DRY,顾名思义,DRY (don’t repeat yourself)意味着不要编写重复的代码,而是使用Abstraction在一个地方抽象日常事物。

如果您有两个以上的代码块,请考虑使其成为一个单独的方法,或者如果您多次使用硬编码的值,请将它们设为public final常数。这种面向对象设计原则的好处在于维护。

重要的是不要滥用它,重复不是为了代码,而是为了功能。

这意味着,如果您使用标准代码来验证OrderId 和SSN,则并不意味着它们相同,否则将来它们将保持不变。

通过将标准代码用于两种不同的功能或事物,您可以将它们永久紧密地结合在一起,并且当OrderId更改其格式时,SSN验证代码将中断。

所以要当心这种耦合,不要将任何使用相似代码但无关的东西组合在一起。您可以在Udemy上的Java课程中进一步查看“软件体系结构和设计模式的基础知识”,以了解有关编写正确的代码和设计系统时应遵循的最佳实践的更多信息。

2.封装什么变化 在软件领域只有一件事是不变的,那就是“更改”,因此封装您期望或怀疑将来会更改的代码。

这种OOP设计原则的好处在于,它易于测试和维护正确的封装代码。

如果您使用Java进行编码,请遵循以下原则:默认情况下将变量和方法设为私有,并逐步增加访问权限。

Java中的几种设计模式都使用了封装。的工厂设计模式是封装的一个例子,它封装对象创建代码,并提供灵活性,以与现有的代码没有影响后面介绍的新产品。

顺便说一句,如果您有兴趣学习有关Java和面向对象编程中的设计模式的更多信息,那么您必须查看Pluralsight上的“设计模式库”课程。它是最好的设计模式集合之一,并提供有关如何在现实世界中使用它们的建议。

3.开放式封闭设计原则 根据该OOP设计原则,“类,方法或函数应为扩展而打开(扩展新功能),而为修改而闭合。”

这是Bob叔叔在他的经典Clean Codebook上提出的另一种美丽的SOLID设计原则,它可以防止他人更改已经尝试和测试过的代码。

此设计原则的主要好处是尚未尝试的经过测试的代码 这意味着它们不会破裂。

这是一个违反 编程的开放式设计原则的Java代码示例:

在此代码中,GraphicEditor与Shape紧密结合,如果需要新的Shape,则需要在drawShape(Shape s)方法内部修改已经尝试过并经过测试的系统,这既容易出错,也不可取。

理想情况下,如果仅添加新功能,则应该对代码进行测试,这就是开放式封闭设计原则的目标。

顺便说一句,开闭原理是SOLID首字母缩略词“ O”。如果您想了解更多有关此原理的知识,那么有关Udemy的SOLID面向对象设计和体系结构原理课程是最好的参考资源之一。

4.单一责任原则(SRP) 单一责任原则是另一种SOLID设计原则,在SOLID的首字母缩写中代表“ S”。根据SRP,更改类的原因不应多于一个,或者某个级别应始终处理单个功能。

该原则的主要好处是 它减少了软件的各个组件与代码之间的耦合。

例如,如果您在Java的一个类中放置了多个功能,则会在两个功能之间引入耦合,即使您更改了一个功能,也有可能破坏了耦合功能,这需要另一轮测试以避免任何意外。在生产环境上。

您可以进一步查看从0到1:设计模式— 24 关于Udemy的重要课程,以了解基于此原理的模式。

5.依赖注入或反转原理 不要要求依赖性;它将由框架提供给您。Spring框架是用于编写具有实际价值的应用程序的最流行的Java框架之一,在Spring框架中已很好地实现了这一点。

该设计原理的优点在于,DI框架注入的任何类都易于使用模拟对象进行测试,并且易于维护,因为对象创建代码集中在框架中,而客户端代码则不会随处可见。

有多种方法可以实现依赖项注入, 例如使用字节码检测,某些类似于AspectJ的AOP(面向方面​​编程)框架或通过使用Spring所使用的代理来实现。

您可以在Udemy上进一步查看SOLID面向对象设计和体系结构原理课程,以了解有关此有用原理的更多信息。它也代表SOLID首字母缩略词“ D”。

这是违反Java中的Dependency Inversion Principle或DIP的代码示例:

您会看到这AppManager 取决于EventLogWriter 与紧密相关的内容AppManager。如果您需要使用其他方式(例如通过发送推送通知,SMS或电子邮件)来通知客户端,则需要更改AppManager 类。

此问题可以通过使用依赖关系反转原理来解决,在该架构中,它不是注入AppManager 请求而是EventLogWriter由框架注入或提供给AppManager。

您可以进一步看到使用SOLID原理编写更好的代码— Udemy速成班,以了解有关依赖倒置原理以及如何解决此类问题的更多信息。

6.主张使用组合而不是继承 有两种通用的方法可以重用您已经编写的代码:继承和合成。两者都有自己的优点和缺点,但是,通常,如果可能的话,您应该始终主张使用组合而不是继承。

你们中的某些人可能会争论这一点,但我发现 Composition 比Inheritance灵活得多 。

组合允许通过在运行时设置属性来更改类在运行时的行为,并通过使用Interfaces来组成一个类,我们使用了polymorphism,它提供了随时替换为更好的实现的灵活性。

甚至约书亚·布洛赫(Joshua Bloch)的《有效的Java》(Effective Java)都建议在组合中优先考虑继承。如果您仍然不相信,那么您也可以在这里 阅读以更多地了解为什么您的Composition在重用代码和功能方面比在Inheritance方面更好。

而且,如果您忘记了这条规则,可以在办公桌上放一本出色的卡通漫画:-)

如果您有兴趣了解有关诸如组合,继承,关联,聚合等面向对象的编程概念的更多信息,还可以在Coursera上的Java面向对象编程课程中查看。

免费探索和学习,但如果您还想参加练习,作业,评估,并且需要认证才能显示在您的LinkedIn个人资料中,则会向您收费。

7. Liskov替代原则(LSP) 根据Liskov替换原理,子类型必须可以替代父类型。我的意思是使用父类类型的方法或函数必须能够与子类的对象 一起工作而没有任何问题。

LSP与单一职责原则和接口隔离原则密切相关。

如果一个类具有比子类更多的功能,则可能不支持某些功能并且确实违反了LSP。

为了遵循LSP SOLID设计原则,派生类或子类必须增强功能,但不能减少功能。LSP在SOLID首字母缩写词上代表“ L”。

这是一个违反Java中的Liskov替换原理的代码示例:

Java中的Liskov替代原理

如果您有一种area(Rectangle r)计算Rectangle面积的方法,那么当您传递Square因为Square 不是真正的Rectangle时,该代码将中断。

如果您对一个更真实的示例感兴趣,那么Pluralsight上的SOLID面向对象设计原理原理课程是一门非常好的课程。

8.接口隔离原理(ISP) 接口隔离原则规定,如果客户端不使用接口,则不应实现该接口。

大多数情况是在一个接口包含多个功能且客户端仅需要一项功能而没有其他功能时发生的。

毫无疑问,接口设计是一项棘手的工作,因为一旦发布接口,就无法在不破坏所有实现的情况下对其进行更改。好的,Java 8的默认或防御方法功能确实提供了一种接口演化的方法,但是并非所有的编程语言都支持这些功能。

此设计原则在Java中的另一个好处是,该接口的缺点是在任何类都可以使用它之前先实现所有方法,因此具有单一功能意味着实现的方法较少。

如果您没有从编码中获得接口的好处,那么建议您阅读我的博客文章,即Java中接口的实际用法以了解更多信息。

9.接口编程未实现 程序员应该始终为接口编程,而不是为实现编程。这将产生灵活的代码,该代码可与该接口的任何新实现一起使用。

确切地说,您应该对变量使用接口类型,方法的返回类型。或参数类型(类似于Java中的技术),使用SuperClasstype来存储对象,而不是使用SubClass。

我是说

List numbers= getNumbers();

代替

ArrayList numbers = getNumbers();

许多Java书籍(包括Effective Java和Head First设计模式书籍)也建议这样做。

如果您对提高程序的代码质量感兴趣,我还建议您看一看Udemy上的“重构到设计模式”课程,该课程将帮助您使用C#中的重构技术和设计模式来改进内部设计。

10.委托原则 不要自己做所有事情,而是将其委派给相应的班级。委托设计原理的经典示例是Java中的equals()和hashCode()方法。

为了比较两个对象是否相等,我们要求类本身进行比较而不是 Client 类进行检查。

此设计原则的主要好处是无需重复代码,并且很容易修改行为。事件委托是该原理的另一个示例,其中将事件委托给处理程序进行处理。

概括 所有这些面向对象的设计原则都 通过争取高内聚性和低耦合性来帮助您编写灵活,更好的代码。

该理论是第一步,但是最重要的是发展发现何时应用这些设计原理的能力。

一旦掌握了这一点,下一步就是学习Java中的设计模式,该模式将使用这些设计模式来解决应用程序开发和软件工程中的常见问题。

如果您正在寻找一门不错的课程,建议您加入Udemy的Java 课程中的“从0到1:设计模式-24这么重要”。它非常全面,您可以通过几次闪存销售以11美元的价格买到它。

无论如何,这是所有这些OOP设计原则的不错总结。

找出我们是否违反了任何设计原则,并损害了代码的灵活性,但是由于这个世界上没有什么是完美的,所以不要总是尝试使用设计模式和设计原则来解决问题。它们主要用于维护周期较长的大型企业项目。

最重要的是,专业程序员应该始终努力实现具有高度凝聚力和松散耦合的解决方案,代码或设计。从Apache和Google寻找开源代码是学习Java和OOP设计原理的一些好方法。

他们将向您展示如何在编码和Java程序中使用设计原理。Java开发工具包中的许多设计原则,像工厂模式中BorderFactory 类,Singleton模式的java.lang.Runtime类,Decorator模式上的各种java.io类。


原文链接:http://codingdict.com