Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 开闭界面分离_Java_Oop_Solid Principles - Fatal编程技术网

Java 开闭界面分离

Java 开闭界面分离,java,oop,solid-principles,Java,Oop,Solid Principles,我正在编写一个代码,基本上读取一个文本文件(表格格式),并检查该文件是否包含预期的数据类型。为此,我在下面的课上写了一篇文章 示例文件应该是这样的 name age abc 20 xyz vf aaa 22 我有一个JSON文件,上面写着,哪个conlumn应该包含什么 { filename:"test.txt", cols:{ name:string, age: int } } JSON

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

示例文件应该是这样的

name    age
abc     20
xyz     vf
aaa     22
我有一个JSON文件,上面写着,哪个conlumn应该包含什么

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

}
JSON文件包含每行的数据类型,因此我知道会发生什么

下面的代码工作没有任何问题。但是,该代码似乎违反了开放-关闭和接口隔离原则

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;
        }
    }

}
因此,我想引用下面提到的代码。然而,我想知道我会得到什么好处,有没有更好的方法

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;
        }
    }
}

开闭原则(OCP)的基本定义(Meyer 1988)
打开/关闭原则规定“软件实体(类、模块、函数等)应为扩展而打开,但为修改而关闭”;也就是说,这样的实体可以允许在不修改其源代码的情况下扩展其行为

但是:另一方面,中的Bob叔叔对OCP的含义进行了一些澄清。(我在下面使用了它们)


首先:在我看来,您的类(
DataValidation
没有冲突 开闭原则

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;
        }
    }

}
您的类只需检查基本数据类型即可。(正如你在评论中回答我的问题)。Java中只有8种基本数据类型这个数字在将来不会改变。因此,如果将所有8个方法放在一个类中,将来就不会对数据类型进行任何扩展或修改
另一方面,OCP是在不改变旧代码的情况下添加新的源代码。因此,如果Java添加了新的数据类型,您可以轻松地添加该方法,而无需修改代码的其他部分

因此,我认为你们班不够大,不能违反开合原则

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;
        }
    }

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

我认为您的类只是一个Checker类,没有任何状态(属性或字段)。因此,没有任何理由使用ISP

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

为您的问题提供解决方案

对于基本数据类型,您可以使用
enum数据类型{boolean,char,_等}
,并且只使用一种方法,如
DataType getDataType(String S)
获取给定
String
的类型作为
enum
但是您的方法(
数据验证类
)也足够好

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

首先,几乎所有的最佳实践、范例等都试图提高可维护性、可测试性和可扩展性的程度。你真的需要它们吗?添加一些自定义和复杂类型的可能性有多大?如果它非常低,那么您的第一个变体可能就足以完成您的任务(不是一般的验证任务,只是针对您的验证任务)


其次,很大程度上取决于你如何使用它。您没有展示如何准确地使用所有这些方法/类/接口。“仆人”代码可能非常好,它可以是世界上最干净的代码,但谁在乎它是否使用不当或使用起来非常困难呢?

Em。。。。你想摆脱JSON字段的声明类型还是什么?请举例说明。我不确定我是否理解你的最后一个问题。您能再解释一下吗?您的数据类型是否仅限于原始数据类型或更多?@Green\u Wizard我正在尝试了解是否有更好的方法来重新记录代码。我有另一个解决方案,但是,我仍然需要编写一个逻辑来匹配每个单元格调用哪个函数。@Gholamali Irani是的,所有数据类型仅限于基本数据类型。