用类替换类型码

      在实际编程中,经常会遇到一些这样的问题:对于一类事物,经过会有一些不变的常量。例如:季节有春夏秋冬,方向有东西南北,状态有一二三四等等。通常的解决办法是使用类型码:也就是通常所说的类常量。

      对于这种解决方法,存在者许多问题。例如:类型不安全、错误的赋值等。可以使用【用类代替类型码】重构来解决这类问题。

      先简单介绍一下【用类代替类型码】重构:

  • 使用场合:类中有数字或其他类型的类型码,这些类型码不影响类的行为。
  • 解决方法:用类来替代这些类型码。
  • 动机:数值码、枚举都是C语言的普通特性。通过有意义的命名使得它们变得可读,但是问题在于编译器关注的是它们底层的数值。编译器的类型检查也是根据数值而不是有意义的名称。任何以类型码作为参数的方法期望接收数字,但是它们不能强制使用有意义的类型码。从而降低了可读性,同时也将会是错误的源泉(a source of bugs)。如果使用类来替代数值码,那么编译器就会进行类型检查。

      接下来就具体介绍一下【提取方法】重构的实施过程。

  1. 为类型码创建一个新类,并且这个类中持有一个与类型码匹配的字段。并为这个字段提供getter方法。同时还需要一组静态变量,这些变量包括了所有可能的新类的实例。提供一个静态方法,接收一个类型码的参数并返回一个合适的类实例。

  2. 使用新类来改变原有类的实现。

  3. 编译并测试。

  4. 为原类中每个使用类型码的方法创建一个使用新类型的方法,并用新方法代替原方法。

  5. 修改客户程序,使用新接口。

  6. 每次修改客户程序后都进行编译和测试。

  7. 删除使用类型码的旧方法,并且删除类型码。

  8. 编译并测试。

    现在给出一个简单的重构过程来加深理解。

        

   首先为类型码创建一个新类BloodGroup。

   

   然后用新类中的类型码替换Person类中的类型码。

   

   现在需要在运行时检查BloodGroup类型,为了能够从这个变化中真正的得到好处,需要让Person类的客户程序使用BloodGroup类型来代替原有的整数类型。为Person类添加使用BloodGroup类型的构造函数和getter/setter方法。

   

   如果没有客户程序使用BloodGroup中的getCode()和code()方法,可以将其设置为private。

   

   重构结束!

   最后总结一下【用类替换类型码】的优缺点:

   优点:更好的避免非法赋值和比较

   缺点:比使用不安全类型要求更多的代码

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值