什么是开闭原则(OCP)?
开闭原则 (OCP) 是面向对象编程中的一个基本原则,它指出应用程序实体(类、模块、方法等)应该对扩展开放但对修改关闭。换句话说,您应该能够在不更改现有代码的情况下向应用程序添加新功能。
为什么开闭原则很重要?
因为它有助于创建更灵活、可维护和可扩展的应用程序。通过遵循这一原则,您可以向程序添加新功能,而不必担心破坏现有功能。这意味着您可以轻松地扩展您的软件以满足新的需求,而无需重写或重构大部分代码。
如果将我们的微服务/组件模块视为一个类来看待,那么类应该对扩展开放,对修改关闭。这样做时,我们会阻止自己修改现有代码。因此,我们也停止在原本令人满意的应用程序中引发潜在的新BUG。
当然,该规则的一个例外是修复现有代码中的 BUG。所以,我们应该只在修复 BUG 时修改我们的类。
“对扩展开放”意味着在设计类的时候可以满足新需求时,能够添加新的功能。“Closed for modification” 意味着一旦你开发了一个类,你就永远不应该修改它,除非是为了纠正错误。
但实际开发中,这似乎是矛盾而执行是困难的,我个人认为设计和编码的方式应该是在对现有代码进行最少更改或不进行更改的情况下添加新功能。当需要扩展功能时——避免紧耦合,不要通过使用 if-else/switch-case 来追在新的功能逻辑,而且根据需要进行代码重构。
扩展类的方法有哪些?
扩展类的方式包括:
-
使用抽象(类继承,接口实现)
抽象是设计模式中常见的使用,并创建抽象类或接口来表示这些模式。通过使用抽象,您可以创建一组行为的类或接口,而无需指定如何实现该行为的细节。这降低了将新错误引入现有代码的风险,从而产生更健壮的程序。 -
封装
封装是隐藏代码内部细节并通过公共接口仅公开必要行为的过程。通过封装行为,您可以创建一组无需修改现有代码即可扩展的类或模块。 -
使用继承和组合
继承和组合是两种可用于基于现有类或模块创建新类或模块的技术。继承允许您创建一个继承现有类行为的新类,而组合允许您创建一个包含现有类实例的新类。 -
使用设计模式
设计模式是针对常见软件设计问题的可重用解决方案。有许多设计模式可以帮助您在程序设计中应用开闭原则,例如 Strategy 模式、Decorator 模式和 Factory 模式等等。
示例:违反 OCP 的代码
例如我们希望逗猫和狗叫。代码如下:
- 假设先养了猫,逗猫
// 小猫咪
public class Cat {
public void say {
System.out.println("喵喵喵...");
}
}
// 铲屎官
public class Master {
// 逗猫
public void playCat(Cat cat) {
cat.say();
}
}
- 假设又领养了只狗
public class Dog {
public void say {
System.out.println("嗷呜...");
}
}
// 铲屎官
public class Master {
// 逗猫
public void playCat(Cat cat) {
cat.say();
}
// 逗狗
public void playDog(Dog dog) {
dog.say();
}
}
从上面就可以看出,如果不断地领养其它小动物,就会导致 Master
这个类不断地被修改。
示例:遵循 OCP 的代码
现在我们通过开闭原则解决了上述设计中的缺陷。首先,我们将使设计具有可扩展性。
- 创建一个宠物的接口
Pet
public interface Pet {
void say();
}
// 让我们的宠物猫狗实现该接口
public class Cat implements Pet {
@Override
public void say {
System.out.println("喵喵喵...");
}
}
public class Dog implements Pet{
@Override
public void say {
System.out.println("嗷呜...");
}
}
- 更改铲屎官类
// 铲屎官
public class Master {
// 逗宠物
public void play(Pet pet) {
pet.say();
}
如上所写,如果当我们不断领养其它小动物,可以在不改变任何类的情况下实现 Pet
接口。这样,带来了一定程度的可扩展性。
开闭原则有什么好处?
以下是在您的代码中应用开放封闭原则的一些好处:
-
更容易扩展
不用说,开闭原则为您的代码提供了更好的可扩展性。当您以无需修改且允许扩展的方式编写代码时,您将获得更好的可扩展性。 -
更容易维护
该原则建议使用接口。代码中的接口提供了额外的抽象级别,从而实现了松散耦合。接口的实现是相互独立的,不需要共享任何代码。因此,您可以根据产品经理不断变化的需求轻松维护您的代码。 -
灵活性
当您在编写代码时遵循开放封闭原则时,您将有更好的灵活性来扩展它。此外,如果将来出现任何更改请求,您的代码将更灵活地扩展。
开闭原则的局限性是什么?
每当我们将任何更改作为扩展合并到代码中时,我们都需要在实现之前和之后进行单元测试来保障现用功能不出现异常情况。
结论
开闭原则是软件设计中的一个重要原则,可以帮助您创建更灵活、可维护和可扩展的软件。通过遵循这一原则,您可以向您的软件添加新功能而不用担心破坏现有功能,并且您可以轻松地扩展您的软件以满足新的需求。要在您的程序设计中应用 OCP,请使用抽象、封装、使用继承和组合以及使用设计模式。