C#教您一步步摆脱面向过程:开闭原则

前面有几篇文章,已经教了一些方式或者方法,帮助您摆脱娘胎自带的面向过程编程,从而转为面向对象。

这是一篇文字较多的文章,您需要静心阅读,仔细理解,会让您比较好的掌握知识点。

文章的例子使用中文编码,是为了让您便于理解,实际开发中不宜使用中文。


开闭原则规定“软件中的对象(类,模块,函数等等)应该对于扩展是开放的,但是对于修改是封闭的”。

据说这是原话,我也不知道是不是。

一、理解开闭原则

开闭原则包含以下几层意思:

1.可以通过继承(抽象类)或者实现(接口)的方式,来实现“闭”。

2.可以通过修改业务源码的方式,来适应业务发展的需要,或者修复Bug,这是“闭”。

3.可以稳定的提供固定的接口给客户使用,并且根据业务扩展可以提供的更多,你的变化如果您不主动告诉客户的话,客户一般感应不到您的变化。这是“开”。

网络上普遍的讲解开闭原则的文章,大多是指第一种情况:就是通过继承的方法来进行扩展开放,然而这是不对的。这是对于开闭原则的理解不够深入的原因。

二、实现开闭原则的充要条件

会使用开闭原则,您必须会抽象,不论是将业务抽象为“抽象类”也好,或者抽象为“接口”也好,总之这是您掌握开闭原则的充要条件。

我曾经说过一句话,这句话,应该是我独家说的,全网应该没有,如果有实属巧合:

所有的类,不论你是具体类,还是抽象类,本质都是“具体实现”。只有顶级抽象“接口”,才是真正的抽象。

所以,您为了掌握开闭原则,您必须往抽象成“接口”的方向行走。

三、举例子说明“开闭”

 

如上图,有一个“家庭”类,有3个属性,分别是资产、是否有车、是否有房。

现在有一个客户端(类似于是我们的html前端),它需要显示所有家庭的资产大于1万的(所谓万元户),那么,作为后端程序员,他可能会这么写下面的代码:

 

 

这个是没有问题的,您看是吧?

四、业务变化一:100万富裕家庭

通过第3点的例子,我们看到,我们的用户端(就是前端html又或者是使用我们api的客户),这时候,随着经济发展,以及通胀等原因,万元户,已经不满足需要了,出于种种原因,不论是客户要求,还是我们自己的业务变化,需要变成100万元户了。

于是,后端程序员可以修改以下代码:

 

这样的话,就达到了跟进业务变化的目的。

请注意看,这是随着业务的变化,而修改的代码,又或者是因为这个方法有Bug,也可能要修改这个方法的代码。但不论怎么样,总之就是修改了。您还需要注意到,这个方法的名称,自始至终,都没有改变名字。正因为没有改变名字,所以我们使用这个api的客户也不需要去改他们的代码。

好的,如果不是客户要求我们改的,那么后端程序员修改的话,如果我们不告知客户,那么客户是不会立即感受到这种逻辑变化的。也就是说客户“毫无知觉”。这就是我们所说的开闭原则中的“闭”,对内修改关闭,让客户感受不到我们的修改。

五、业务变化二:我要找有房的

很好,我们通过找有房的家庭,可以实施一些市场策略。但是我们的api只有根据资产,而没有关于有房的api。于是我们的后端程序员修改成以下代码:

 

同样的道理,这是开闭原则中的“闭”和”开“。闭是指,这个api的新增,它不会影响客户现有的系统运行,所以,客户是无知觉的。开是指,该api的新增,拓展了原有的功能。

六、业务变化三:进军相亲市场

我们公司以前可能是做房地产,所以只要资产、房、车,就够了。

现在业务多元化,要进军相亲市场。需要增加一个关于“双亲家庭”、“单亲家庭”的业务逻辑。

那么怎么编写这个代码呢?

 

通过继承“家庭”类,新增一个家庭类型即可。这是开闭原则中的开和闭。开是指,通过继承扩展出了新的功能。闭是指,该业务是客户无感知的,除非我们告诉他有了新的业务api。

七、为什么要抽象?

您是否注意到,上面的例子,都是”具体实现“,我之前有说过,所有的类,不论你是抽象类,还是具体类,本质上都是”具体实现“。

那么本要点,讲为什么要抽象?这是很多人,特别是面向对象感受不深的人,难以理解的。

如果您有同事,跟您一起做开发,或者有别的部门程序员,要使用你的dll库。

如果你是具体实现类,就意味着,他们全部都可以看见你的方法体源码,但是对于他们来说,他们会关心你的方法体吗?会想要知道你是怎么实现这个方法的吗?

不,他们更需要的是,你告诉他们这个类,这个方法能实现什么功能,告诉我后,我能去调用就行了,至于你是怎么做到的,他们是不关心的。

所以,您需要抽象,抽象成顶级抽象,即接口。简单明了告诉他们,你具备什么功能,您请直接调用就好。

 

祝您用餐愉快。

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值