开闭原则|设计原则(一)

简介: 由于在软件体系中,唯一不变的,就是软件一直在变。

前置知识

  • 有项目编写经历
  • 做过代码的功能拓展
  • 听说过设计模式

前言

本文带大家继续学习 开闭原则

由于在软件体系中,唯一不变的,就是软件一直在变。这就意味着我们的软件、系统,需要把可拓展性做好,才不会让后期的功能拓展变得困难。事实上,大多数的设计模式都是在提高代码的可拓展性。而 开闭原则 就是提高代码可拓展性的核心原则。

开闭原则 定义

面向对象编程领域中,开闭原则规定“软件中的对象(类,模块,函数等等)应该对于扩展是开放的,但是对于修改是封闭的”,这意味着一个实体是允许在不改变它的源代码的前提下变更它的行为。该特性在产品化的环境中是特别有价值的,在这种环境中,改变源代码需要代码审查单元测试以及诸如此类的用以确保产品使用质量的过程。遵循这种原则的代码在扩展时并不发生改变,因此无需上述的过程。

上述的定义来自 百度百科 。其精髓部分是,对拓展开发,对修改关闭。意思是说,我们不能去修改原有功能的代码,但是可以利用面向对象特性,在不修改原有代码的基础上进行功能的拓展。

什么样的代码不符合开闭原则

开闭原则的定义很清晰,但是想理解和应用起来却感觉很抽象。下面我们结合一段代码来看看,什么样的代码是不符合开闭原则的

public class Work{
    private A a;
    private B b;
    public Work(A a , B b){
        this.a = a;
        this.b = b;
    }
    public void process(String processA,String processB){
        ...
        actionA(a,processA);
        actionB(b,processB);
    }
}
复制代码

上述的代码中,在 process() 部分,实现了 actionAactionB 两个功能。

而当我们想要拓展一个功能 actionB 的时候,会做如下修改

public class Work{
    private A a;
    private B b;
    private C c;//修改
    public Work(A a , B b , C c){
        this.a = a;
        this.b = b;
        this.c = c;//修改
    }
    public void process(String processA,String processB,String processC){//修改
        ...
        a.actionA(processA);
        b.actionB(processB);
        c.actionC(processC);//修改
    }
}
复制代码

可见,上述对功能的拓展中,其修改了核心函数的参数,所以这类修改不符合开闭原则。

因为直接修改了核心代码,会导致原有对该函数的调用会出错,需要修改入参的值。少量代码需要修改还好说,但是当代码里逐渐变大,每次添加新功能,都会需要修改大量的代码。而且,原有的单例测试代码也将不能正确运行。

如何让代码符合开闭原则

需要将代码修改得符合开闭原则,就需要把开闭原则的对 修改关闭 落实。

如下方的代码,我们需要将代码中会变化的参数 提取出来成为一个单独的类 ,这样子便于后面对参数的添加和删除。

public class WorkBean{
    private A a;
    private B b;
    public void setA(A a){
        this.a = a;
    }
    public A getA(){
        return a;
    }
    ... ...
} 
public class Processbean{
    private String processA;
    private String processB;
    ...
}
复制代码



相关文章
|
设计模式 关系型数据库 数据安全/隐私保护
软件架构设计原则之单一职责原则
单一职责(Simple Responsibility Pinciple,SRP)是指不要存在多于一个导致类变更的原因。假设我们有一个类负责两个职责,一旦发生需求变更,修改其中一个职责的逻辑代码,有可能导致另一个职责的功能发生故障。这样一来,这个类就存在两个导致类变更的原因。如何解决这个问题呢?将两个职责用两个类来实现,进行解耦。后期需求变更维护互不影响。这样的设计,可以降低类的复杂度,提高类的可读性,提高系统的可维护性,降低变更引起的风险。总体来说,就是一个类、接口或方法只负责一项职责。
117 0
软件架构设计原则之单一职责原则
|
设计模式 人工智能 前端开发
七大设计原则之开闭原则应用
七大设计原则之开闭原则应用
85 0
|
7月前
|
设计模式 关系型数据库
【设计模式】软件设置原则-开闭原则
【1月更文挑战第12天】【设计模式】软件设置原则-开闭原则
|
7月前
|
设计模式 存储 NoSQL
【设计模式】软件设计原则-单一职责原则
【1月更文挑战第12天】【设计模式】软件设计原则-单一职责原则
浅谈设计原则
什么是单一职责原则,在我理解看来就是一个东西如果发生问题那么就有且仅有一个原因导致它发生问题。它的准确解释就是,就一个类而言,应该仅有一个引起它变化的原因。如果一个类承担的职责过多,就等于耦合度加大,当变化发生时,设计会受到破坏。最好的例子就是将界面和业务进行分离。做设计应该让类只有一个职责。
|
关系型数据库 测试技术 程序员
面向对象设计原则~~~开闭原则
面向对象设计原则~~~开闭原则
96 0
|
设计模式 人工智能 前端开发
软件架构设计原则之开闭原则
开闭原则(Open-Closed Principle,OCP)是指一个软件实体(如类、模块和函数)应该对扩展开放,对修改关闭。所谓的开闭,也正是对扩展和修改两个行为的一个原则。它强调的是用抽象构建框架,用实现扩展细节,可以提高软件系统的可复用性及可维护性。开闭原则是面向对象设计中最基础的设计原则,它指导我们如何建立稳定、灵活的系统。例如版本更新,我们尽可能不修改源代码,但是可以增加新功能。
136 0
|
设计模式 关系型数据库
软件架构设计原则之里氏替换原则
里氏替换原则(Liskov Substitution Principle,LSP)是指如果对每一个类型为T1的对象o1,都有类型为T2的对象O2,使得以T1定义的所有程序P在所有的对象O1都替换成O2时,程序P的行为没有发生变化,那么类型T2是类型T1的子类型。
79 0
|
设计模式 安全 Java
设计原则之接口隔离原则
设计原则之接口隔离原则
74 0
设计原则之接口隔离原则
|
设计模式 安全 Java
设计原则之依赖倒置原则
设计原则之依赖倒置原则
81 0
设计原则之依赖倒置原则