Answers:
特征嫉妒是一个术语,用于描述一种情况,在这种情况下,一个对象到达另一个对象的字段以执行某种计算或做出决定,而不是要求对象自己进行计算。
作为一个简单的例子,考虑一个代表矩形的类。矩形的用户可能需要知道其面积。程序员可以公开width
和height
字段,然后在Rectangle
类之外进行计算。或者,Rectangle
可以将width
和height
字段设为私有并提供一种getArea
方法。可以说这是一种更好的方法。
第一种情况的问题以及将其视为代码异味的原因是因为它破坏了封装。
根据经验,每当您发现自己广泛使用另一个类的字段来执行任何类型的逻辑或计算时,请考虑将该逻辑移至类本身的方法上。
可以广泛使用其他类/结构方法的情况是可能的-当您的类/结构是数据的容器时。通常,您可以在没有外部上下文的情况下使用此数据。
这样的类仍然可以保留一些内部逻辑,但是更多时候将它们用作容器:
class YourUid {
public:
YourUid(int id_in_workplace_, int id_in_living_place_, DB* FBI_database, int id_in_FBI_database);
bool IsInvalidWorker() const { return id_in_workplace == consts::invalid_id_in_workplace; }
bool CanMessWith() const { return !FBI_database_.is_cool(id_in_FBI_database_); }
int id_in_workplace;
int id_in_living_place;
private:
int id_in_FBI_database_;
const DB* FBI_database_;
};
@jhewlett在他的回答中引用了本文,以证明您不应该广泛使用其他类成员,但是其中的另一种代码气味情况与倡导者我的示例相同:
长参数列表。限制给定方法中需要的参数数量,或使用对象组合参数。