《软件设计重构》读书笔记(2)-抽象型设计缺陷

抽象原则倡导通过精简和概括来简化实体。精简指去掉不必要的部分,概括指抽出并定义通用的重要特性。可以通过一些重要的实现手法在软件设计中应用抽象原则,如果违反了这些原则,就有可能产生抽象型设计缺陷。具体对应关系请见下面的逻辑结构图。


下面我们详细介绍每一种抽象型设计缺陷即重构方法。

缺失抽象 缺陷

【概念定义】 设计时没有创建概念便捷清晰,身份唯一的实体,而是通过基本数据类型或编码字符串来表达抽象。

【违反原则】由于数据和行为分离,分散在代码的各个地方,违反了抽象原则,封装原则和模块化原则。

【缺陷实例】在人员管理系统中,用字符串存放15位或18位的身份证号,并在系统中通过传递这些字符串来进行相应的处理。

【重构建议】重构“缺失抽象缺陷“的方法是以类取代类型码。对于上述实例,可以创建身份证接口,接口内定义操作身份证的各种方法;并定义15位身份证和18位身份证子类,在子类中实现接口中的方法。

【设计考虑】如果实体只包含数据,不包含关联的行为,就不需要抽象成类,以避免过度设计。

命令式抽象 缺陷

【概念定义】以面向过程思维进行面向对象设计而导致将操作转化为类时,发生命令式抽象缺陷。表现为类中只定义了一个方法,大都数情况下类名和方法名相同。

【违反原则】抽象原则

【重构建议】找到或重构一个抽象,将方法移到这个抽象中。

【设计考虑】具体化是指将不是对象的抽象提升为对象。状态模式,命令模式和策略模式都使用了具体化。使用具体化可以改善系统的灵活性,提升系统质量,但增加了系统的复杂度。

不完整的抽象 缺陷

【概念定义】抽象未支持所有互补或相关的方法

【违反原则】抽象原则

【缺陷实例】抽象中,不成对的set/get方法,不成对的add/remove方法等;工厂模式中,只有对象的创建方法,没有对象的删除方法

【重构建议】补足缺失的方法

多方面的抽象 缺陷

【概念定义】当抽象被赋予不只一种职责时会导致多方面抽象缺陷。通常情况下,存在多方面缺陷的抽象大多庞大而复杂。

【违反原则】单一职责原则

【缺陷实例】java.util.Calendar类里面,不仅包含了有关日期的操作,还包含和时间有关的操作

【重构建议】将和时间有关的数据和操作提取出来,形成一个新类。

不必要的抽象 缺陷

【概念定义】由于过度设计或使用了不合适的语言功能,会导致不必要的抽象缺陷。

【违反原则】抽象原则

【缺陷实例】1)在java设计中使用接口来存储常量。比如javax.swing.WindowConstants接口;2)在设计中使用了不必要的委托类。

【重构建议】1)在java中使用枚举代替常量接口;2)删除不必要的委托类。

【设计考虑】调停者模式,适配器模式,代理模式和门面模式都使用了委托类,但这些委托类都承担了明确而具体的职责。

未使用的抽象 缺陷

【概念定义】由于设计人员的过度设计(为满足未来可能用得到的需求)而导致为使用的抽象缺陷。未使用的缺陷包括两种:未被使用的具体类和没有被派生的接口/抽象类。

【违反原则】YAGNI原则(不需要就不做原则)

【缺陷实例】为想像中的功能而预留的抽象接口

【重构建议】删除不必要的抽象接口

重复的抽象 缺陷

【概念定义】两个抽象的名称或实现相同是将导致重复的抽象缺陷

【违反原则】DRY原则

【缺陷实例】java.util.Date类和java.sql.Date类之间存在着重复的抽象,而且两者还是继承关系

【重构建议】根据JDK的说明,可以在java.sql.Date类中包含一个java.util.Date的实例。


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值