夸夸其谈通用性 (Speculative Generality)
解释:
夸夸其谈通用性指的是为了未来可能的扩展或复用,过度设计和实现了许多当前并不需要的功能或抽象。这种做法会导致代码复杂度增加,难以维护和理解,而这些所谓的“通用性”在未来很可能并不会被用到。
解决方法:
- 简化代码:移除那些为了将来可能的需求而设计的过度抽象和通用性代码,只保留当前实际需要的功能。
- YAGNI原则:遵循YAGNI(You Aren’t Gonna Need It)原则,只实现当前确实需要的功能,而不是未来可能需要的功能。
例子:
夸夸其谈通用性的代码
重构前:
public abstract class Payment {
public abstract void processPayment(double amount);
}
public class CreditCardPayment extends Payment {
@Override
public void processPayment(double amount) {
// 处理信用卡支付
System.out.println("Processing credit card payment of " + amount);
}
}
public class PayPalPayment extends Payment {
@Override
public void processPayment(double amount) {
// 处理PayPal支付
System.out.println("Processing PayPal payment of " + amount);
}
}
public class PaymentProcessor {
private Payment payment;
public PaymentProcessor(Payment payment) {
this.payment = payment;
}
public void process(double amount) {
payment.processPayment(amount);
}
}
// 主程序
public class Main {
public static void main(String[] args) {
PaymentProcessor processor = new PaymentProcessor(new CreditCardPayment());
processor.process(100.0);
}
}
重构后的代码
重构后:
public class PaymentProcessor {
public void processCreditCardPayment(double amount) {
// 处理信用卡支付
System.out.println("Processing credit card payment of " + amount);
}
public void processPayPalPayment(double amount) {
// 处理PayPal支付
System.out.println("Processing PayPal payment of " + amount);
}
}
// 主程序
public class Main {
public static void main(String[] args) {
PaymentProcessor processor = new PaymentProcessor();
processor.processCreditCardPayment(100.0);
}
}
说明:
- 重构前:
Payment
类及其子类CreditCardPayment
和PayPalPayment
,以及PaymentProcessor
类,都是为了支持未来可能的多种支付方式而设计的。这种设计虽然具有一定的灵活性,但增加了代码的复杂性,而且在当前只需要处理信用卡支付和PayPal支付的情况下,这种设计显得过于复杂和冗余。 - 重构后:简化了设计,直接在
PaymentProcessor
类中实现了processCreditCardPayment
和processPayPalPayment
方法。这种方式更加直接和简单,去除了不必要的抽象和复杂性。
通过移除夸夸其谈通用性的设计,代码变得更简单,更容易理解和维护。遵循YAGNI原则,只实现当前确实需要的功能,可以避免过度设计带来的负担和问题。