博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Clean-Code: 面向过程 PK 面向对象
阅读量:5829 次
发布时间:2019-06-18

本文共 1030 字,大约阅读时间需要 3 分钟。

面向过程:

假设有两个类Square(正方形),Rectangle(长方形) 。代码如下:

 

 

如果有一个类Geometry需要计算图形的面积:

假设现在要添加一个Circle(圆形),并且同样需要计算Circle的面积。那么需要做哪些修改:

1:需要添加Circle类,代码如下:

2:因为需要计算Circle的面积,所以Geometry类需要修改

 

可以看到增加了sharp is Circle 的判断。

 

假设现在Geometry类不仅仅需要计算面积,还需要计算sharp的周长。

那么Geometry的代码大致如下:

可以发现,SquareRectangleCircle这三个类不需要做任何更改。

也就是说当需要添加函数的时候,数据结构不会受到影响。

 

 

 

面向对象:

如果使用面向对象的角度来思考这个问题,那么该怎么处理呢?

基本上有 if else,switch的地方就可以考虑使用策略模式。

 

首先可以创建抽象类Shape,或者是接口IShape

当然,在这里随便使用哪一个都可以,因为除了计算面积之外,目前不需要继承字段,属性,所以我选择了接口

 

Area的名字是面积,不过并没有体现出获取面积这个动作,所以我决定将Area重命名为GetArea或者是CalculateArea

代码如下:

 

 

 

接着创建实现类,Square,Rectangle

 

 

Geometry类的实现就比较简单了

同样,如果需要添加一个Circle,然后计算Circle的面积。那么该如何做呢?

 

很简单,添加一个Circle类就可以了,Geometry不需要任何变化。

也就是说添加数据结构的同时,方法不受影响。

 

如果现在要添加一个计算周长的方法呢?

首先IShape接口要增加GetPerimeter 方法。

如果现在编译的话,会得到下面的结果:

无法通过编译有2点好处:

  1. 修改了接口会导致无法通过编译,这是面向过程无法提供的,比如在面向对象的方案中
    Geometry
    中的
    GetPerimeter
    方法如果忘记了添加
    Circle
    的判断,那么编译一样可以通过。
  2. GetPerimeter
    方法由类自行管理,复杂度大大下降,代码结构更加清晰。

 

Square为例:代码如下:

如果这时候编译,可以发现,可以编译通过。

所以面向对象的特点是修改数据结构的同时,不影响方法,也就是说添加一个类,不会对原系统的方法有影响。

 

当然在这里Geometry 需要添加GetPerimeter方法:

转载地址:http://xuodx.baihongyu.com/

你可能感兴趣的文章
Win7硬盘安装方法
查看>>
第一次亲身感受良好的ASP.NET代码积累,强壮的软件产品是【马力强劲的印钞机】万能神速企业信单据数字化系统实施经验...
查看>>
Linux基础 文件的管理 正则表达式的应用的一些比较好的 练习
查看>>
JDK安装
查看>>
Linux运维之道之网络基础学习1.4
查看>>
shell的简单编写及执行
查看>>
nginx 二级域名之一
查看>>
一分钟教你知道乐观锁和悲观锁的区别
查看>>
基础语法的练习
查看>>
RabbitMQ 集群配置
查看>>
入门一班 20181023 w vmstat top sar nload
查看>>
linex常用命令
查看>>
MySQL之SELECT
查看>>
新一代大数据技术架构
查看>>
互联网企业不能轻视的一些网络安全问题
查看>>
176条DevOps人员常用的linux命令速查表
查看>>
idou老师教你学Istio 17 : 通过HTTPS进行双向TLS传输
查看>>
C++ TCP winsock 多线程编程的代码
查看>>
hash_map使用自定义类型做主键
查看>>
Linux中如何创建、管理及查询用户和组
查看>>