为你的项目引入特例!

举报
JavaEdge 发表于 2022/04/13 23:42:50 2022/04/13
【摘要】 动机一种常见的重复代码:一个数据结构的使用者都在检查某个特殊的值,并且当该特殊值出现时所做的处理也都相同。若发现项目中有多处以同样方式应对同一个特殊值,我就会想要把这个处理逻辑收拢到一处。 处理这种情况的一个好办法是使用“特例”(Special Case)模式:创建一个特例元素,用以表达对这种特例的共用行为的处理。这样我就能用一个函数调用取代大部分特例检查逻辑。特例有几种表现形式:若只需从...

动机

一种常见的重复代码:一个数据结构的使用者都在检查某个特殊的值,并且当该特殊值出现时所做的处理也都相同。若发现项目中有多处以同样方式应对同一个特殊值,我就会想要把这个处理逻辑收拢到一处。 处理这种情况的一个好办法是使用“特例”(Special Case)模式:创建一个特例元素,用以表达对这种特例的共用行为的处理。这样我就能用一个函数调用取代大部分特例检查逻辑。

特例有几种表现形式:

  • 若只需从该对象读取数据,可提供一个字面量对象(literal object),其中所有的值都是预先填充好的
  • 若除简单的数值外,还需更多行为,则要创建一个特殊对象,其中包含所有共用行为所对应的函数。特例对象可以由一个封装类来返回,也能通过变换插入一个数据结构。

一个通常需要特例处理的值就是null,这也是这个模式常被叫作“Null对象”(Null Object)模式的原因,我喜欢说:Null对象是特例的一种特例。

做法

从一个作为容器的数据结构(或者类)开始,其中包含一个属性,该属性就是我们要重构的目标。容器的客户端每次使用该属性,都需将其与某个特例值做比对。

希望把该特例值替换为代表这种特例情况的类或数据结构。给重构目标添加检查特例的属性,令其返回false。 创建一个特例对象,其中只有检查特例的属性,返回true。 对“与特例值做比对”的代码运用【提炼函数】,确保所有客户端都使用这个新函数,而不再直接做特例值的比对。

将新的特例对象引入代码中,可以从函数调用中返回,也能在变换函数中生成。 修改特例比对函数的主体,在其中直接使用检查特例的属性。 测试。使用函数组合成类(144)或函数组合成变换(149),把通用的特例处理逻辑都搬移到新建的特例对象中。特例类对于简单的请求通常会返回固定的值,因此可以将其实现为字面记录(literal record)。
对特例比对函数使用内联函数(115),将其内联到仍然需要的地方。

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

评论(0

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

全部回复

上滑加载中

设置昵称

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

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

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