代码重构:异曲同工的类(alternative classes with different interfaces)

举报
孙小北 发表于 2022/04/30 00:03:03 2022/04/30
【摘要】 什么是异曲同工的类(alternative classes with different interfaces)定义: 异曲同工的类——两个类功能一致,却有不同的定义(方法/接口)影响: 相关的业务逻辑可能会重复实现,或分布到不同类中,代码难维护改进目标: 统一接口、相同的功能只实现一份方法: 函数改名、搬移函数、添加参数、函数参数化、提炼超类、移除子类注:狭义的异曲同工:两个类功能完全相...

什么是异曲同工的类(alternative classes with different interfaces)

  • 定义: 异曲同工的类——两个类功能一致,却有不同的定义(方法/接口)
  • 影响: 相关的业务逻辑可能会重复实现,或分布到不同类中,代码难维护
  • 改进目标: 统一接口、相同的功能只实现一份
  • 方法: 函数改名、搬移函数、添加参数、函数参数化、提炼超类、移除子类

注:

  • 狭义的异曲同工:两个类功能完全相同;
  • 广义的异曲同工:两个类有很多相同的功能,从抽象角度看它们也有高一致性,却没有共同的基类/接口。

案例1

代码背景

  • 有个制造工厂(ManufactureService);
  • 它雇用了雇员(Employee)把原料(Material)加工成产品(Product);
  • 它也雇用了工人(Worker)把原料(Material)加工成产品(Product);
  • 其实,雇员(Employee)和工人(Worker)逻辑上等价

症状/问题

  • “异曲同工的类”让人困惑。从局部看,它们有着不同的函数接口;从整体看,它们像是同样的东西。分别看Employee和Worker的函数:
    •ID:identity vs id;
    •性别:booleanvs Sex枚举;
    •某方法:setValuesvs setProperties;
    •加工产品的方法:ManufactureService.createProductUsingEmployee() vs Worker.produce()

image-20220429215158258.png

案例1的改进目标

改进目标

  • 相同的类只留一个(本例中留Worker);

改进步骤

  • 统一Employee和Worker的函数签名(含:函数名、参数列表、返回值、异常申明),使两个类等价;
  • 查漏补缺类功能(如:Employee中不含加工产品的函数)
  • 把Employee全部用Worker替代
  • 删除Employee类

image-20220429215217783.png

案例2

代码背景

  • 有个销售管理系统,其中有:
  • 报价单Quotation,含:序列号、买家、创建时间、报价明细、报价有效期、并能转化为订单、重新报价……;
  • 销售订单SalesOrder,含:序列号、买家、创建时间、价格明细、收货地址、支付信息、并能创建出库单……;

症状/问题

  • Quotation和SalesOrder共享了一些功能,但没有共同的基类/接口:
  • 相同点:序列号、买家、创建时间、价格明细……
  • 差异点:
    •Quotation:报价有效期、转化为订单、重新报价……
    •SalesOrder:收货地址、支付信息、创建出库单……
  • 逻辑重复、代码重复

image-20220429215352734.png

案例2的改进目标

改进目标

  • 消除重复、消除混淆;

image-20220429215417975.png

重构对比(案例1)

image-20220429215437498.png

重构对比(案例2)

image-20220429215453717.png

总结

image-20220429215510252.png

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。