代码重构~提取到类

简介:

提取到类(Extract Class) : 将多个类所公用的部分(包括方法,属性,事件等等)抽象出来,形成一个新的类型,这个类被称为它们的基类(base class)或者父类,而使用面向对象语言的特性,在基类中使用抽象对象或者虚对象,让子类可以直接使用基类的成员或者根据自己的逻辑去覆写基类的成员,提交到类经常被用到产品族的概念中,如一个数据操作基类,它的子类可能是user操作类,product操作类,order操作类等,具体看一下代码:

userRespository类型是用来对user表进行直接的单纯的数据操作的,它可以是这样的

而对于userRespository来说,它可能需要一个DB数据源对象(可能是linq to sql,ef的一种),还有一些标准的CURD操作的方法,而这些对于productRespository类型也是一样需要的,这时,我们就应该将userRepository和productRepository公用的部分提取出来,行成它们的基类,即RepositoryBase

在这个RepositoryBase基类中,还使用了接口,它实现了对所有数据基类(可能是linq to sql基类,ef基类,内存数据源基类,缓存数据源基类等)操作的统一性和一致性。

我们在进行“提取到类”时,需要注意的几个概念是:

抽象方法:abstract method,在基类去定义方法规范,由子类去实现它的逻辑

虚方法:virtual method,在基类去实现了这个方法,但子类可以根据自己的逻辑去override它

抽象类:一般基类都是不能被直接实例化的,所以一般是抽象类

如果上面的代码不容易理解,可以看一面简单的demo,一个boy类,它有一个属生name和一个方法display(),name表示为男孩的姓名,display输出男孩的姓名;而另外一个类girl,它也一样有name和display,这时,我们可以将boy和girl公有的属性和方法进行抽取,放在person类,而它应该有两个属性name和gander,代表人的姓名和性别,有一个方法是display(),用来输出人的姓名和性别,这个简单的例子很好的说明了提取到类的使用场合,它的代码如下:

 1 //男孩子
 2 class Boy
 3 {
 4   public string Name{get;set;}
 5 
 6   public void Display()
 7  {
 8   Console.Write("男孩姓名是{0}",Name);
 9   }
10 }
11 //女孩子
12 class Girl
13 {
14   public string Name{get;set;}
15 
16   public void Display()
17  {
18   Console.Write("女孩姓名是{0}",Name);
19   }
20 }
21 //而把方法修改后变为
22 
23 class Person
24 {
25   public string Name{get;set;}
26   public string Gander{get;set;}
27   public virtual void Display()
28   {
29      Console.Write("{0}姓名是{1}",Gander,Name);
30    }
31 }
32 
33 //男孩根据自己的需要,去override  Display()这个方法
34 class Boy
35 {
36   public string Name{get;set;}
37 
38   public void Display()
39  {
40   Console.Write("性别:{0},姓名:{1}",Gander,Name);
41   }
42 }

其实,代码重构它不仅是对代码本身的重构(代码执行性能),更重要的是对面向对象的重构(代码的逻辑表现)。

本文转自博客园张占岭(仓储大叔)的博客,原文链接:代码重构~提取到类,如需转载请自行联系原博主。

目录
相关文章
|
7月前
|
Python
飞机大战-代码提取面向对象(4)
用Python语言编写飞机大战,部分代码用面向对象方式编写。
35 0
|
10月前
《重构2》第十二章-继承
《重构2》第十二章-继承
92 0
|
JSON 前端开发 测试技术
手把手带你设计接口自动化测试用例(一):提取接口信息并分析
手把手带你设计接口自动化测试用例(一):提取接口信息并分析
370 0
手把手带你设计接口自动化测试用例(一):提取接口信息并分析
|
自然语言处理 算法
如何用3行代码简单实现文本情感分析
如何用3行代码简单实现文本情感分析
315 0
|
自然语言处理 安全 C#
2018-02-04 AppleScript类自然语言与非英语语法设计
对AppleScript语言中的类自然语言设计, 和日语, 法语的语法设计进行回顾和讨论. Review Applescript, which has a grammar close to natural language, and the support for Japanese and French grammars.
665 0
|
自然语言处理 算法 计算机视觉
pyhanlp 共性分析与短语提取内容详解
HanLP中的词语提取是基于互信息与信息熵。想要计算互信息与信息熵有限要做的是 文本分词进行共性分析。在作者的原文中,有几个问题,为了便于说明,这里首先给出短语提取的原理。在文末在给出pyhanlp的调用代码。
3609 0
|
Java C++
C++继承和组合——带你读懂接口和mixin,实现多功能自由组合
本文详细介绍了C++继承的三种方式和相关重要概念,整理了众多继承与组合中的注意问题。在C++继承存在不安全的默认实现,非虚函数的覆盖,多重继承的函数名冲突、菱形继承等众多问题下,如何实现多个功能的自由组合?阿里云高级开发工程师采用mixin,为大家提供了更好扩展性和更高代码复用度的解决方案
3484 0
重构——62提炼子类(Extract Subclass)
提炼子类(Extract Subclass):类中的某些特性只被某些实例用到;新建一个子类,将上面所说的那一部分特性移到子类中
1359 0