oop - 如何从清洁代码书中理解“抽象级别错误的代码”?
问题描述
我正在阅读干净的代码 第 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 次,但是 aBaby
吃 40g 一顿饭(示例),而 aAdult
吃 150g 顿饭,因此你将有 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
在那里也没有意义)
推荐阅读
- python - plt.contourf() 的内存存储问题?
- c++ - C++ 线程错误:“static_assert 由于要求而失败”
- ruby - 如何以电报机器人中的链接形式返回用户用户名,以便我只需单击它并直接与他们聊天
- python - 如何在 Django 框架上加载我的媒体文件?
- c++ - 为什么关键字模板可以出现在由类头名称形成的限定ID中
- airflow - 手动触发 DAG 时如何修改具有默认值的 DAG 参数
- c# - 在ILogger中获取调用方法名
- apache-spark - Spark Word2Vec 中的分区数和迭代数如何工作?
- kubernetes - helm chart 从本地存储库部署映像
- typescript - 打字稿:如何使用同一界面中的地图从另一种类型派生