首页 > 解决方案 > 如何从清洁代码书中理解“抽象级别错误的代码”?

问题描述

我正在阅读干净的代码 第 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 {}
}

标签: ooprefactoringcode-cleanup

解决方案


例如,如果你有一个基类Person,和两个派生类BabyAdult它们都必须吃,并且它们都每天吃 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在那里也没有意义)


推荐阅读