我想知道接口(interface)隔离原则是否适用于我的代码库。
这是一些示例代码:
头等舱:
public class EntityGroup {
public List<Entity> tests;
//returns true if the EntityGroup is valid
public boolean validate() {
for (Entity test : tests) {
if (!test.validateFieldA() || !test.validateFieldB()) {
return false;
}
}
return true;
}
}
第二类:
public abstract class Entity {
protected String fieldA;
public abstract boolean validateFieldA();
public abstract boolean validateFieldB();
}
三等:
public class EntityChild extends Entity {
private String fieldB;
@Override
public boolean validateFieldA() {
if (fieldA.equals("valid")) {
return true;
} else {
return false;
}
}
@Override
public boolean validateFieldB() {
if (fieldB.equals("valid")) {
return true;
} else {
return false;
}
}
}
第四类:
public class EntityChild2 extends Entity {
@Override
public boolean validateFieldA() {
if (fieldA.equals("valid")) {
return true;
} else {
return false;
}
}
@Override
public boolean validateFieldB() {
return true;
}
}
这是我真实代码库中的一个大大简化的示例,但我认为它很好地说明了问题。我的 EntityChild2 类被迫实现它不需要或不想了解的方法。
我知道拥有一个包含 validateFieldB() 方法并且仅让 EntityChild 实现该接口(interface)的接口(interface)会更正确。
考虑到重构此解决方案需要花费大量精力,我很难证明在我的实际代码库中实现此解决方案所需的时间是合理的。
以这种方式保留代码会遇到哪些潜在问题?
重构代码以拥有独立的 validateFieldB() 接口(interface)会给我带来什么好处?
tldr:为什么接口(interface)隔离原则如此重要?
最佳答案
错误的抽象
您使用了接口(interface)隔离原则,但抽象错误。您不同的实体
类型仅在行为上有所不同。
由于共享行为,您在 EntityChild
和 EntityChild2
的 validateFieldA
方法中具有重复的代码。 validateFieldB
方法看起来与 validateFieldA
非常相似,只是用于检查相等性的字段是另一个。
您只需要一个实体
策略模式
与 Strategy-Pattern 你将不会有重复的代码:
class EqualValidationStategy() implements ValidationStategy<T> {
@Override
public boolean check(T a, T b) {
return a.equals(b)
}
}
class TrueValidationStategy() implements ValidationStategy<T> {
@Override
public boolean check(T a, T b) {
return true;
}
}
实体
public class Entity {
private String fieldA;
private String fieldB;
private ValidationStategy<String> validationForA;
private ValidationStategy<String> validationForB;
// all-args consturctor
@Override
public boolean validateFieldA() {
return validationForA.check(fieldA, "valid");
}
@Override
public boolean validateFieldB() {
return validationForB.check(fieldB, "valid");
}
}
// Validates fieldA and "ignores" fieldB
Entity example = new Entity(fieldA,
fieldB,
new EqualValidationStategy(),
new TrueValidationStategy());
关于java - 接口(interface)隔离原理应用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54337716/