java - 接口(interface)隔离原理应用

标签 java oop design-patterns solid-principles

我想知道接口(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)隔离原则,但抽象错误。您不同的实体类型仅在行为上有所不同。

由于共享行为,您在 EntityChildEntityChild2validateFieldA 方法中具有重复的代码。 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/

相关文章:

c++ - 如何在虚方法上使用模板参数类?

.net - 使用 MVVM 处理 WPF 中的对话框

java - Eclipse - 提取具有相似变量名的常量时出现错误建议

java - (Java) vector 问题 - 检查怪物是否在 3 个 vector 内

java - 使用 Java 从格式化字符串中提取

java - REST API 调用是否应该在存储库层上使用 @Repository 进行?

java - 为什么我们要写Synchronized(ClassName.class)

java - Spring拒绝bean名称,未指定URL路径

c# - Asp.net - 向类添加函数

python - 测试 python 类对象实例