我正在阅读干净的代码第 17 章 - 气味和启发式部分G6:错误抽象级别的代码但我可以理解如何定义正确的抽象级别。
例如,仅与详细实现相关的常量、变量或实用函数不应出现在基类中。基类应该对它们一无所知。
有人可以用更清楚的例子向我解释吗?有一个例子,但我不明白为什么它是错误的。
public interface Stack {
Object pop() throws EmptyException;
void push(Object o) throws FullException;
double percentFull();
class EmptyException extends Exception {}
class FullException extends Exception {}
}
比如说你有一个基类
Person
,还有两个派生类Baby
和Adult
,他们两个都要吃饭,而且他们每天都吃3次,但是一个Baby
一次吃40g一顿饭(示例)和 Adult
每顿饭吃 150 克,
因此你将有 2 个这样的常量:
class Person{
int howMuchEats();
}
class Baby extends Person{
int BABY_AVG_MEAL = 40;
int howMuchEats(){ return 3 * BABY_AVG_MEAL; }
}
class Adult extends Person{
int ADULT_AVG_MEAL = 150;
int howMuchEats(){ return 3 * ADULT_AVG_MEAL; }
}
如果这些常量位于基类中,那么它将违反你的书的内容
这是针对常量的,但假设平均克数是根据成人的体重计算的,那么您将拥有一个仅存在于派生类中才有意义的辅助函数
您的代码中的问题是
percentFull
函数...并非所有堆栈都限制为最大元素数(如果没有这个,Stack.FullException
也没有意义)
我试图用这个半代码来表达我的观点
public interface Stack {
Object pop() throws Exception;
void push(Object o) throws Exception;
double percentFull();
class Exception {}
}
public class Exception {}
public class EmptyException extends Exception {}
public class FullException extends Exception {}