如何理解《干净代码》书中的“抽象级别错误的代码”?

问题描述 投票:0回答:2

我正在阅读干净的代码第 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 {}
}
oop refactoring code-cleanup
2个回答
1
投票

比如说你有一个基类

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
也没有意义)


0
投票

我试图用这个半代码来表达我的观点

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 {}
© www.soinside.com 2019 - 2024. All rights reserved.