1. 依恋情节(Feature Envy)
Feature Envy 是指一个函数或方法过度依赖其他类的属性或方法,这表明它可能更适合在另一个类中实现。这种情况表明代码职责分配不合理,可能导致紧耦合的代码结构,使得系统的维护和扩展变得更加困难。
示例:
class Customer {
public:
double getDiscountRate() const { return discountRate; }
private:
double discountRate;
};
class Order {
public:
double calculateTotal() const {
return price * quantity * customer.getDiscountRate(); // 依恋情节
}
private:
double price;
int quantity;
Customer customer;
};
在这个例子中,Order 类的 calculateTotal 方法似乎过度依赖 Customer 类的折扣率信息,表明这段代码更适合在 Customer 类中实现。
2. 数据泥团(Data Clumps)
Data Clumps 指的是经常一起出现的一组数据,它们应该被封装成一个对象。这通常表明这些数据具有某种逻辑关联,应该被归类为一个类或结构体,以提高代码的可读性和可维护性。
示例:
class Order {
public:
void placeOrder(const std::string& customerName, const std::string& customerAddress, const std::string& customerPhone) {
// 数据泥土
}
};
在这个例子中,customerName、customerAddress 和 customerPhone 这三个字段常常一起出现,可能应该封装成一个 Customer 类。
3. 中间人(Middle Man)
Middle Man 是指一个类过度地将请求转发给其他类,自己并没有实际的功能。此时,Middle Man 类变得多余,建议移除它以简化代码结构。
示例:
class Employee {
public:
double getSalary() const { return salary; }
private:
double salary;
};
class Manager {
private:
Employee employee;
public:
double getEmployeeSalary() const { return employee.getSalary(); } // 中间人
};
在这个例子中,Manager 类只是简单地转发对 Employee 类的调用,这样的代码可以考虑去掉 Manager 类中的这个方法,直接访问 Employee 类。
4. 狎昵关系(Inappropriate Intimacy)
Inappropriate Intimacy 指两个类之间的耦合过于紧密,它们频繁地访问彼此的私有数据或内部实现。这种紧密的耦合关系可能会导致系统的灵活性和可维护性变差。
示例:
class Car {
public:
Engine& getEngine() { return engine; } // 狎昵关系
private:
Engine engine;
};
class Mechanic {
public:
void tuneEngine(Car& car) {
car.getEngine().setFuelInjection(1.2); // 直接操作 Engine
}
};
在这个例子中,Mechanic 类直接操作了 Car 类的内部 Engine 对象,这是一种狎昵关系,表明 Car 类和 Mechanic 类的耦合过于紧密。