打开封闭和界面隔离

时间:2017-12-18 03:23:06

标签: java oop solid-principles

我正在编写一个基本上读取文本文件(表格格式)的代码,并检查文件是否包含预期的数据类型。为此,我写了下课。

示例文件将是这样的。

name    age
abc     20
xyz     vf
aaa     22

我有JSON文件说,哪个conlumn应包含什么?

{
    filename:"test.txt",
    cols:{
            name:string,
            age: int
    }

}

JSON 文件包含每行的DataType,所以我知道会发生什么?

以下代码工作没有任何问题。但是,似乎这段代码违反了开放的封闭和接口隔离原则。

public class DataValidation {

    public boolean isInt(String value) {
        try {
            Integer.parseInt(value);
            return true;
        } catch (NumberFormatException ne) {
            return false;
        }
    }


    public boolean isFloat(String value) {
        try {
            Float.parseFloat(value);
            return true;
        } catch (NumberFormatException ne) {
            return false;
        }
    }

}

所以我想Refector下面提到的代码。但是,想知道我会得到什么好处,有没有更好的方法?

public interface DataValidation {

    boolean validate(String value);
}

public class IntValidator implements DataValidation {
    public boolean validate(String value) {
        try{
            Integer.parseInt(value);
            return true;
        }catch (NumberFormatException ne){
            return false;
        }
    }
}

2 个答案:

答案 0 :(得分:1)

开放式原则(OCP)的基本定义 :( Meyer 1988)
开放/封闭原则规定"软件实体(类,模块,功能等)应该是可以扩展的,但是关闭以进行修改&#34 ;;也就是说,这样的实体可以允许在不修改源代码的情况下扩展其行为see Reference

但是:另一方面,this reference中的鲍勃叔叔提供了有关OCP含义的一些说明。 (我在下面使用它们)


首先:在我的想法中,您的班级(DataValidation没有发生冲突 开放原则。

你的班级 JUST 检查原始数据类型。 (正如你在评论中回答我的问题)。 Java中有只有8种原始数据类型此数字将来不会更改。因此,如果您将所有8种方法都放在一个类中,那么将来您不会对数据类型进行任何扩展或修改。
另一方面,OCP是关于添加新的源代码而不改变旧代码。因此,如果Java添加新数据类型,您可以轻松添加方法而无需修改代码的其他部分。

因此,我认为你的班级不足以违反开放式原则。

其次:使用接口隔离原则(ISP)
要使用ISP,我们需要一些先决条件。我们应该在系统(或类)的一部分之间存在一些依赖关系。我们应该需要依赖管理来管理系统的某些部分,我们有意识地决定系统的每个部分可以依赖什么。 please read this reference in-depth

我认为您的班级只是一个Checker类,并且没有任何状态(属性或字段)。所以没有任何理由使用ISP。

总结:使用所有面向对象的原则和启发式(如SOLID),应该帮助我们降低复杂度。在您的项目中,不需要使用它们。

为您的问题提供解决方案
您可以使用enum DataTypes {boolean, char, _etc_}作为原始数据类型,并仅使用DataType getDataType(String S)之类的方法将给定String的类型设为enum您的方法(DataValidation class)也足够好了。

答案 1 :(得分:0)

Gholamali-Irani提供了很好的答案,但我想添加一些我自己对你主题的看法:

首先,几乎所有最佳实践,范例等都试图提高可维护性,可测试性和可扩展性。你真的需要它们吗?添加一些自定义和复杂类型的概率有多大?如果它非常低,可能你的第一个版本对你的任务来说已经足够好了(不是针对你的一般验证任务)。

其次,很大程度上取决于你如何使用它。您没有显示您是如何使用所有这些方法/类/接口的。 “Servant”代码可能非常好,它可以是世界上最干净的代码,但谁会关心它是否使用不正确或者很难使用?