如何理解《代码整洁之道》G6规则:错误抽象层级的代码?附Stack接口示例
什么是正确的抽象层级
简单来说,高层抽象(比如接口、基类)只应该定义所有下层实现都通用、和具体实现逻辑完全无关的特性/能力,不能把只有某一类实现才有的专属逻辑放到高层抽象里。
你贴的Stack接口问题出在哪
这个接口的问题核心就是把只有固定容量栈才需要的能力,强塞给了所有栈的通用抽象:
- 栈作为通用数据结构,核心能力只有
pop(出栈)、push(入栈)、peek(查栈顶)、判空这几个,和容量相关的逻辑不是所有栈都需要的:比如用链表实现的无界栈根本不存在“占满”的情况,永远不可能触发FullException,也没法计算percentFull(总容量无限的情况下占比没有意义)。 - 你把
percentFull方法和FullException放到通用的Stack接口里,等于强制所有实现栈的类都要支持“固定容量”这个特性,无界栈的实现要么被迫写没用的空实现,要么直接抛异常,完全违背了接口做通用抽象的初衷。
更通俗的例子对照
你可以把抽象层级的规则类比成动物分类的定义:
你定义「动物」这个基类的时候,只能放所有动物都有的能力,比如
进食()、移动()。要是你在「动物」基类里加了下蛋()方法,就完全错了——胎生动物(比如猫、狗)根本不会下蛋,你让这些子类怎么实现下蛋()?
这个错误和Stack接口里加percentFull是一模一样的逻辑:把只有部分子类才有的特性,放到了更高层的通用抽象里。
内容的提问来源于stack exchange,提问作者Jesus Mava
相关产品推荐
相关产品推荐

