每个开发人员都应该了解的 10 条面向对象编程原则

每个开发人员都应该了解的 10 条面向对象编程原则

我经常遇到没有听说过 SOLID 原则的开发人员(我们 这里详细讨论了它们。。 - Transl.)或面向对象编程(OOP),或听说过,但在实践中没有使用它们。 本文介绍了 OOP 原则对开发人员日常工作有帮助的好处。 其中一些是众所周知的,另一些则不是那么出名,因此本文对于初学者和已经有经验的程序员都将很有用。

我们提醒: 对于“Habr”的所有读者 - 使用“Habr”促销代码注册任何 Skillbox 课程可享受 10 卢布的折扣。

技能箱推荐: 教育在线课程 《Java 开发人员》.

DRY(不要重复自己)

这是一个相当简单的原则,其本质从名称中就可以清楚地看出:“不要重复自己”。 对于程序员来说,这意味着需要避免重复代码,以及在工作中使用抽象的能力。

如果代码中有两个重复的部分,则应将它们合并为一个方法。 如果多次使用硬编码值,则值得将其转换为公共常量。

为了简化代码并使其更易于维护,这是 OOP 的主要任务。 您也不应该滥用联合,因为相同的代码不会同时通过 OrderId 和 SSN 的检查。

改变封装

大多数公司的软件产品都在不断发展。 这意味着代码需要更改,需要维护。 通过封装,您可以让您的生活变得更轻松。 这将使您能够更有效地测试和维护现有的代码库。 这是一个例子.

如果你用Java编写那么 默认情况下将私有分配给方法和变量.

开放/封闭原则

通过阅读以下语句可以轻松记住这一原则:“软件实体(类、模块、函数等)应该对扩展开放,但对修改关闭。” 实际上,这意味着他们可以允许在不更改源代码的情况下更改其行为。

当源代码的更改需要修订、单元测试和其他过程时,这一原则很重要。 遵循开闭原则的代码在扩展时不会改变,因此问题会少得多。

这是违反此原则的代码示例。

每个开发人员都应该了解的 10 条面向对象编程原则

如果您需要更改其中的某些内容,则将花费大量时间,因为您将必须更改与所需片段有连接的代码的所有部分。

顺便说一句,开放-封闭是 SOLID 的原则之一。

单一职责原则(SRP)

SOLID 集的另一个原则。 它说“只有一个原因导致阶级变化”。 班级只有一项任务。 它可能有多种方法,但每种方法仅用于解决一个常见问题。 所有方法和属性都应该只服务于此。

每个开发人员都应该了解的 10 条面向对象编程原则

这一原则的价值在于它放松了单个软件和代码之间的联系。 向一个类添加多个功能会引入两个功能之间的关系。 因此,如果您更改其中一个,则很有可能破坏与第一个相关的第二个。 这意味着增加测试周期,以便提前发现所有问题。

依赖倒置原则(DIP)

每个开发人员都应该了解的 10 条面向对象编程原则

上面是一个代码示例,其中AppManager依赖于EventLogWriter,而EventLogWriter又与AppManager密切相关。 如果您需要以不同的方式显示通知,无论是推送、短信还是电子邮件,您需要更改 AppManager 类。

可以用DIP来解决这个问题。 因此,我们请求一个 EventLogWriter,而不是 AppManager,它将使用框架注入。

DIP 使得可以通过更改依赖模块轻松地用其他模块替换单个模块。 这使得更改一个模块而不影响其他模块成为可能。

组合而不是继承

每个开发人员都应该了解的 10 条面向对象编程原则重用代码的两种主要方式是继承和组合,每种方式都有自己的优点和缺点。 通常首选第二种,因为它更灵活。

组合使您能够通过设置类的属性来在运行时更改类的行为。 在实现接口时,使用多态性,这提供了更灵活的实现。

甚至“Effective Java”Joshua Bloch 也建议优先使用组合而不是继承。

芭芭拉·利斯科夫替换原理 (LSP)

SOLID 工具包的另一个原则。 它规定子类型必须可以替换为超类型。 也就是说,适用于超类的方法和函数应该能够适用于其子类而不会出现问题。

LSP 与单一责任原则和责任分离原则相关。 如果一个类比子类提供更多的功能,那么后者将不支持某些功能,这违反了这一原则。

下面是一段与LSP相矛盾的代码。

每个开发人员都应该了解的 10 条面向对象编程原则

area(Rectangle r) 方法计算 Rectangle 的面积。 执行Square后程序会崩溃,因为这里的Square不是矩形。 根据 LSP 原则,使用基类引用的函数应该能够使用派生类的对象,而无需额外的指令。

这一原则是子类型的具体定义,由 Barbara Liskov 在 1987 年的一次名为“数据抽象和层次结构”的会议主题演讲中提出,因此得名。

接口分离原则(ISP)

另一个坚实的原则。 他认为,不使用的接口不应该被实现。 遵循这一原则有助于系统在更改工作逻辑时保持灵活性和可重构性。

最常见的情况是,当界面同时包含多种功能,而客户端只需要其中一种功能时,就会发生这种情况。

由于编写接口是一项复杂的任务,因此工作完成后,在不破坏任何内容的情况下对其进行更改将是一个问题。

Java中ISP原则的优点是所有方法都必须先实现,然后才能被类使用。 因此,该原理使得减少方法数量成为可能。

每个开发人员都应该了解的 10 条面向对象编程原则

为接口编程,而不是为实现编程

这里一切从名字就可以清楚地看出。 应用这一原则可以产生可以与任何新接口实现一起使用的灵活代码。

您应该对变量、返回类型或方法参数的类型使用接口类型。 一个例子是使用 SuperClass 而不是 SubClass。

是:

列表数字= getNumbers();

而不是:

ArrayList 数字 = getNumbers();

这是上面所说内容的实际实现。

每个开发人员都应该了解的 10 条面向对象编程原则

委托原则

一个常见的例子是 Java 中的 equals() 和 hashCode() 方法。 当需要比较两个对象时,此操作将委托给适当的类而不是客户端类。

该原理的优点是没有重复代码,并且改变行为相对容易。 它也适用于事件委托。

每个开发人员都应该了解的 10 条面向对象编程原则

所有这些原则可以让你编写出更加灵活、美观、可靠、高内聚、低耦合的代码。 当然,理论是好的,但是对于开发人员来说,要真正开始使用所获得的知识,需要实践。 掌握 OOP 原理后的下一步可以是研究解决常见软件开发问题的设计模式。

技能箱推荐:

来源: habr.com

添加评论