提取子类

概念:本文中的”提取子类”是指把基类中的一些不是所有子类都需要访问的方法调整到子类中。

正文:当你的基类中存在一些方法不是所有的子类都需要访问,你想将它们调整到子类中时,这个重构会变得很有用了。如下代码所示,我们需要一个 Registration类用来处理学生选课的信息。但是当Registration类开始工作后,我们意识到我们会在两种不同的上下文中使用Registration类,NonRegistrationAction和Notes只有在我们处理未注册情况下才用到。

所以我们将NonRegistration和Notes提到单独的NonRegistration类中。
using System;

namespace LosTechies.DaysOfRefactoring.SampleCode.ExtractSubclass.Before
{
    public class Registration
    {
        public NonRegistrationAction Action { get; set; }
        public decimal RegistrationTotal { get; set; }
        public string Notes { get; set; }
        public string Description { get; set; }
        public DateTime RegistrationDate { get; set; }
    }
}

重构后的代码如下所示,这样也满足面向对象五大原则之一的单一职责。同时也让类的结构变得更加清晰,增强了可维护性。

using System;

namespace LosTechies.DaysOfRefactoring.SampleCode.ExtractSubclass.After
{
    public class Registration
    {
        public decimal RegistrationTotal { get; set; }
        public string Description { get; set; }
        public DateTime RegistrationDate { get; set; }
    }

    public class NonRegistration : Registration
    {
        public NonRegistrationAction Action { get; set; }
        public string Notes { get; set; }
    }
}

总结:这个重构方法经常用来规范类的职责,和之前的一些重构方法也有些类似。

版权声明:本文为博主http://www.zuiniusn.com原创文章,未经博主允许不得转载。

时间: 2024-08-01 10:53:51

提取子类的相关文章

重构第20天 提取子类(Extact SubClass)

理解:提取子类就是把基类中,不是所有子类或者只有少数子类用到的方法,提取出来,调整到子类中去. 详解:下面的代码中我们用到一个单一的类Registration,来处理学生选课信息. 1 public class Registration 2 { 3 public NonRegistrationAction Action { get; set; } 4 public decimal RegistrationTotal { get; set; } 5 public string Notes { ge

小酌重构系列[11]——提取基类、提取子类、合并子类

概述 继承是面向对象中的一个概念,在小酌重构系列[7]--使用委派代替继承这篇文章中,我"父子关系"描述了继承,这是一种比较片面的说法.后来我又在UML类图的6大关系,描述了继承是一种"is a kind of"关系,它更偏向于概念层次,这种解释更契合继承的本质.本篇要讲的3个重构策略提取基类.提取子类.合并子类都是和继承相关的,如果大家对继承的理解已经足够深刻了,这3个策略用起来应该会得心应手. 提取基类 定义:如果有超过一个类有相似的功能,应该提取出一个基类,并

用原始方法解析复杂字符串,json一定要用JsonMapper么?

转自数据之巅原文用原始方法解析复杂字符串,json一定要用JsonMapper么? 阅读目录 1.不规则非json字符串 2.键值对字符串分割函数 3.复杂Json格式的字符串 4.标准的json格式 5.总结 经常采集数据,肯定会碰到解析字符串,包括整个页面的html,或者json以及一些不标准的json格式... 以前用json序列化,有时候需要实体类,有的时候没有,比较麻烦,听说可以用JsonMapper,解析为字典格式.不过没用过,习惯了用最原始的方法来解析字符串,所以这里分享几个解析的

C#重构经典全面汇总

C#重构经典全面汇总 1.  封装集合 概念:本文所讲的封装集合就是把集合进行封装,仅仅提供调用端须要的接口. 正文:在非常多时候,我们都不希望把一些不必要的操作暴露给调用端,仅仅须要给它所须要的操作或数据即可,那么做法就是封装.这个重构在微软的代码库也常常遇到. 比方最经典的属性对字段的封装就是一个非常好的样例,那么以下我们将看到对集合的封装.例如以下代码所看到的,调用端仅仅须要一个集合的信息,而我们则提供了一个IList的集合.大家都知道IList具有对集合的全部操作,所以这会带来非常多隐患

OO.A.D.P

OO/A/D/P 对象和类 三大特征 对象: 对象是面向对象语言的一个极为重要的特点,所有的面向对象语言都有对象的共性. 1. 职责(单一) 2. 属性(数据.可改变的) 3. 函数(行为.方法.业务算法) 总结:一个完整的对象是具有属性和行为以及它自身的职责. 一个完整的对象是具有属性和行为以及它自身的职责. 类: 任何对象都需要经过一个设计的阶段,通过设计,就可以很好的描述一个对象的内容,那么,设计的工作就是由类来完成. 因此,类专门设计和描述了同一类对象共有的特征 总结:通过类设计出来的对

《重构——改善既有代码的设计》读书笔记

重构--改善既有代码的设计 1 重构概述 1.1 重构的概念(What) Refactoring 名词:对软件内部结构的一种调整,目的是在不改变软件可观察行为的前提下,提高其可理解性,降低修改成本. 动词:使用一系列重构方法,在不改变软件可观察行为的前提下,调整其结构. 1.2 为什么要重构(Why) 改进软件设计 提高代码质量和可读性,使软件系统更易理解和维护 帮助尽早的发现缺陷 提高编程速度 1.3 何时重构(When) 何时重构: 1)随时随地进行. 2)三次法则:第一次做某件事只管去做:

重构第21天 合并继承 (Collapse Hierarchy)

理解:本文中的”合并继承”是指如果子类的属性和方法也适合于基类,那么就可以移除子类,从而减少依赖关系. 详解:上一篇我们讲到“提取子类”重构是指当基类中的一个责任不被所有的子类所需要时,将这些责任提取到合适的子类中.而我们今天所要讲的的“合并继承”重构一般用在当我们觉得不需要子类的时候. 1 public class Website 2 { 3 public string Title { get; set; } 4 public string Description { get; set; }

重读《重构》:第二篇

那些代码的坏味道: Duplicated code :最常见的复制黏贴综合征.人们会自然而然的会想到抽取方法. Long Method:这个也太常见.今天还在帮助一个小朋友重构她的python代码,一个函数写了100多行.她最痛苦的就是调试太痛苦了.其实最痛苦的还在后面.人们不愿意拆分功能,新写程序的人会觉得拆得特别散,然后n层调用关系,看起来很费劲,还不如堆在一坨.这是个非常错误的想法.拆分带来的好处是,解耦,重用,易于测试,易于理解(当然设计要合理),易于控制变更. 书中的一个原则是:每当但

数据模型设计

数据模型设计 1.整体框架约束下的迭代渐进 谈到关系数据模型设计,首先想到的可能会是"概念数据模型设计"及实体关系图(ER图),但我认为完整的数据库数据模型设计需要经过三个阶段:(1) 数据总体结构设计:(2) 概念数据模型设计:(3) 构建数据库模式. 2 数据总体结构设计 由于总体结构只是一个静态框架,因此总体结构设计只涉及静态对象建模,建模工具采用UML. 根据面向对象分析与设计方法,总体结构设计工作可按下列流程开展:(1) 剖析问题域(工作流与数据流分析):(2) 划分对象(面