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



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

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

Skillbox建议: Java开发人员在线教育课程。

干(不要重复自己)


一个相当简单的原则,其实质从标题中清晰可见:“请勿重复”。 对于程序员来说,这意味着需要避免重复的代码,以及在工作中使用抽象的能力。

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

为了简化代码并使支持更加容易,这是必需的,这是OOP的主要任务。 合并联合也不值得,因为相同的代码将无法同时通过OrderId和SSN进行验证。

封装变化


大多数公司的软件产品都在不断发展。 因此,您需要对代码进行更改,需要对其进行支持。 您可以使用封装简化生活。 这样可以更有效地测试和维护现有代码库。 这是一个例子

如果您使用Java编写,则默认情况下分配私有方法和变量

开放/封闭的原则


通过阅读以下语句,可以很容易地记住这一原则:“软件实体(类,模块,功能等)必须为扩展而打开,而为更改而关闭。” 实际上,这意味着它们可以允许您更改其行为而无需更改源代码。

当对源代码的更改需要修订,单元测试和其他过程时,该原理很重要。 遵循开放性/紧密性原则的代码在扩展过程中不会更改,因此问题少得多。

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



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

顺便说一下,开放性-封闭性是SOLID的原理之一。

单一责任原则(SRP)


SOLID套件的另一项原则。 他指出,“只有一个原因导致阶级的改变”。 一堂课只能解决一个问题。 它可能有几种方法,但是每种方法仅用于解决一个常见问题。 所有方法和属性都应仅用于此目的。



该原理的价值在于,它削弱了各个软件组件与代码之间的联系。 如果您在一个类中添加了多个功能,则这将在两个功能之间建立连接。 因此,如果您更改其中一个,则很有可能破坏第二个(与第一个关联)。 这就意味着增加测试周期以提前发现所有问题。

依赖倒置原则(DIP)




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

可以使用DIP解决该问题。 因此,我们请求一个EventLogWriter代替AppManager,它将使用该框架进行介绍。

DIP使您可以轻松地将单个模块替换为其他模块,从而更改依赖性模块。 这样就可以更改一个模块而不会影响其余模块。

组成而不是继承


重用代码有两种主要方法-这是继承和组合,每种方法都有其优点和缺点。 通常首选第二个,因为它更灵活。

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

甚至约书亚·布洛赫(Joshua Bloch)的“有效Java”也建议优先考虑组合而不是继承。

芭芭拉·里斯克(Barbara Lisk)替代原则


SOLID工具箱中的另一个原理。 它指出子类型对于超类型必须是可替换的。 也就是说,使用超类的方法和函数应该能够使用其子类而不会出现问题。

LSP与单一责任原则和责任分工原则联系在一起。 如果一个类比子类提供更多的功能,则后者将不支持某些功能,这违反了该原理。

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



area(Rectangle r)方法计算Rectangle的面积。 由于Square不是此处的Rectangle,因此在执行Square之后,程序将崩溃。 根据LSP原理,使用对基类的引用的函数应该能够使用派生类的对象,而无需其他指令。

这项原则是子类型的特定定义,由Barbara Liskov于1987年在主题为“数据抽象和层次结构”的主报告中的会议上提出,因此得名。

接口分离原理(ISP)


另一个SOLID原则。 据他介绍,不应使用未使用的接口。 遵循此原则有助于在更改工作逻辑时使系统保持灵活性并适合于重构。

当接口一次包含多个功能,而客户端仅需要其中一个功能时,通常会发生这种情况。

由于编写接口是一项艰巨的任务,因此在完成工作之后,不中断任何内容就对其进行更改将是一个问题。

Java的ISP原理的优点在于,必须首先实现所有方法,然后才能由类使用它们。 因此,该原理使得可以减少方法的数量。



为接口而不是实现编程


名称中的所有内容都很清楚。 应用该原理将导致创建可与任何新接口实现一起使用的灵活代码。

将接口类型用于变量,返回类型或方法参数的类型。 一个示例是使用SuperClass,而不是SubClass。

那就是:

列表号= getNumbers();

而不是:

ArrayList数字= getNumbers();

这是上述内容的实际实现。



委托原则


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

该原理的一个优点是没有代码重复,并且行为相对简单。 它也适用于事件委托。



所有这些原则都允许编写具有更高连接性和低齿轮的更灵活,美观和可靠的代码。 当然,理论是好的,但是对于开发人员来说,要真正开始使用所获得的知识,需要实践。 掌握了OOP原理之后的下一步可以是研究设计模式以解决软件开发中的常见问题。

Skillbox建议:

Source: https://habr.com/ru/post/zh-CN454314/


All Articles