3.13 以类取代类型码

【1】源代码

 1 #include <QString>
 2 #include <QDebug>
 3
 4 class Student
 5 {
 6 public:
 7    Student(int id, QString name, int status)
 8        : m_nID(id)
 9        , m_name(name)
10        , m_status(status)
11    {}
12
13    int getId()
14    {
15        return m_nID;
16    }
17    void setId(int id)
18    {
19         m_nID = id;
20    }
21
22    QString getName()
23    {
24        return m_name;
25    }
26    void setName(QString name)
27    {
28        m_name = name;
29    }
30
31    int getStatus()
32    {
33        return m_status;
34    }
35    void setStatus(int status)
36    {
37        m_status = status;
38    }
39
40    QString toString()
41    {
42         return QString("Student [id = %1, name = %2, status = %3]")
43                 .arg(QString::number(m_nID)).arg(m_name).arg(QString::number(m_status));
44     }
45
46 public:
47    static const int INVALID;
48    static const int VALID;
49
50 private:
51    int m_nID;
52    QString m_name;
53    int m_status;
54 };
55
56 const int Student::INVALID = 0;
57 const int Student::VALID = 1;
58
59 void main()
60 {
61     Student *pStudent = new Student(1, "张三", Student::VALID);
62     qDebug() << pStudent->toString();
63 }
64
65 // run out:
66 /*
67  * "Student [id = 1, name = 张三, status = 1]"
68  */

【2】以类取代类型码

 1 #include <QString>
 2 #include <QDebug>
 3
 4 class StatusCode
 5 {
 6 public:
 7     StatusCode(int nCode)
 8         : m_nCode(nCode)
 9     {}
10
11     int getCode()
12     {
13         return m_nCode;
14     }
15
16     void setCode(int code)
17     {
18         m_nCode = code;
19     }
20
21     QString toString()
22     {
23         return QString("StatusCode [code = %1]").arg(QString::number(m_nCode));
24     }
25
26 private:
27     int m_nCode;
28 };
29
30 class Student
31 {
32 public:
33    Student(int id, QString name, StatusCode status)
34        : m_nID(id)
35        , m_name(name)
36        , m_status(status)
37    {}
38
39    int getId()
40    {
41        return m_nID;
42    }
43    void setId(int id)
44    {
45         m_nID = id;
46    }
47
48    QString getName()
49    {
50        return m_name;
51    }
52    void setName(QString name)
53    {
54        m_name = name;
55    }
56
57    StatusCode getStatus()
58    {
59        return m_status;
60    }
61    void setStatus(StatusCode status)
62    {
63        m_status = status;
64    }
65
66    QString toString()
67    {
68         return QString("Student [id = %1, name = %2, status = %3]")
69                 .arg(QString::number(m_nID)).arg(m_name).arg(m_status.toString());
70     }
71
72 private:
73    int m_nID;
74    QString m_name;
75    StatusCode m_status;
76 };
77
78 void main()
79 {
80     Student *pStudent = new Student(1, "张三", StatusCode(1));
81     qDebug() << pStudent->toString();
82 }
83
84 // run out:
85 /*
86  * "Student [id = 1, name = 张三, status = StatusCode [code = 1]]"
87  */

【3】总结

类中有一个数值类型码,但它并不影响类的行为。以一个新的类替换该数值类型码。

在使用Replace Type Code with Class (以类取代类型码)之前,你应该先考虑类型码的其他替换方式。

只有当类型码是纯粹数据时(也就是类型码不会在switch语句中引起行为变化时),你才能以类来取代它。

更重要的是:任何switch语句都应该运用Replace Conditional with Polymorphism (以多态取代条件表达式)去掉。

为了进行那样的重构,你首先必须运用 Replace Type Code with Subclass (以子类取代类型码)或Replace Type Code with State/Strategy (以状态策略取代类型码),把类型码处理掉。

Good Good Study, Day Day Up.

顺序 选择 循环 总结

时间: 2024-10-28 15:13:08

3.13 以类取代类型码的相关文章

重构之2.Replace Type Code with Class(以类取代类型码)

场景 在一个类中我们经常会下定义一些类型码,如: public static final int INVALID=0; public static final int VALID=1; 我们可以将这些数值转换为一个类 前提条件: 只有当类型码是纯粹数据时(类型码不会在Switch语句中引起行为的变化时),你才能以类来取代它 修改前代码: Student package com.demo.refactor.codetype.before; public class Student { privat

c#换ip代理源码

很多朋友都想如何提高自己的网站流量,可是都没有什么好的办法 经过很长时间的研究,在C#中实现了,当然了,这部分代码其中一部分是网上的,不是原创. using System; using System.Drawing; using System.Collections; using System.ComponentModel; using System.Windows.Forms; using System.Data; using System.Runtime.InteropServices; u

java动态代理源码解析

众所周知,java动态代理同反射原理一直是许多框架的底层实现,之前一直没有时间来分析动态代理的底层源码,现结合源码分析一下动态代理的底层实现 类和接口 java动态代理的主要类和接口有:java.lang.reflect.Proxy.java.lang.reflect.InvocationHandler 1 java.lang.reflect.Proxy:动态代理机制的主类,提供一组静态方法为一组接口动态的生成对象和代理类. 1.public static InvocationHandler g

java 1.8 动态代理源码分析

JDK8动态代理源码分析 动态代理的基本使用就不详细介绍了: 例子: class proxyed implements pro{ @Override public void text() { System.err.println("本方法"); } } interface pro { void text(); } public class JavaProxy implements InvocationHandler { private Object source; public Jav

编写高质量代码改善C#程序的157个建议——建议13: 为类型输出格式化字符串

建议13: 为类型输出格式化字符串 有两种方法可以为类型提供格式化的字符串输出.一种是意识到类型会产生格式化字符串输出,于是让类型继承接口IFormattable.这对类型来 说,是一种主动实现的方式,要求开发者可以预见类型在格式化方面的要求.更多的时候,类型的使用者需为类型自定义格式化器,这就是第二种方法,也是最灵活 多变的方法,可以根据需求的变化为类型提供多个格式化器.下面就来详细介绍这两种方法. 最简单的字符串输出是为类型重写ToString方法,如果没有为类型重写该方法,默认会调用Obj

重构之3.Replace Type Code with Subclasses(以子类取代类型码)

场景: 通常我们会在业务层判断类型码,执行不同的方法,可以使用子类来取代类型码 前提: 1.类型码不会被改变 2.类型码所属的类没有子类 修改前: Student: /** * @file Student.java * * * @author wumingkun * @version 1.0.0 * @Description */ package com.refractor.subcode.before; /** * @author wumingkun * */ public class Stu

重构之4.Replace Type Code with State/Strategy(以State/Strategy取代类型码)

场景: 你有一个类型码,它会影响类的行为,但你无法通过继承手法来消除它 ,可以使用状态对象取代类型码 类图: 修改前: Student /** * @file Student.java * * * @author wumingkun * @version 1.0.0 * @Description */ package com.demo.refactor.state.before; /** * @author wumingkun * */ public class Student { privat

13.C#分部类型和静态类(七章7.1-7.2)

再大的东西不去找,也就没了,再小的知识不去记,也就忘了.今天来写一写C#中的分部类型和静态工具类,这些两个概念可能在我们的日常使用过程中都使用过,可能大家对这些内容觉得这些不是应该有的东西嘛,那就来复习一下吧. 分部类型,个人理解是对同一事物在两个不同空间的描述,编译器将组织我们编写的在不同文件中代码,组合成一个完整的描述.我们不能在一个文件中编写成员的一半代码,而把另外一半代码放到另外一个文件中,每个独立的成员必须完整地位于所处的文件中.如有一个Map类,成员属性放在Map0.cs中,而成员方

13.函数的类型和基本使用

第一:函数类型: /* 函数类型: 类似于C语言的指向函数的指针 类似于OC语言的block 函数类型是由函数的参数类型和返回值类型组成的 */ // 这两个函数的类型是 (Int, Int) -> Int func sum(a: Int, b: Int) ->Int { return a + b; } func sub(a: Int, b: Int) ->Int { return a - b; } // 可以利用函数类型定义函数变量和常量 var funcP:(Int, Int) -&