打开闭合和接口隔离

问题描述 投票:1回答:2

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

示例文件将是这样的。

name    age
abc     20
xyz     vf
aaa     22

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

{
    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;
        }
    }
}
java oop solid-principles
2个回答
1
投票

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

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

首先:在我的想法中,你的班级(DataValidation)与开放式原则没有冲突。

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

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

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

我认为你的类只是一个Checker类,没有任何状态(Attributes或Fields)。所以没有任何理由使用ISP。

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

为您的问题提供解决方案 你可以使用enum DataTypes {boolean, char, _etc_}作为原始数据类型,并且只使用DataType getDataType(String S)这样的方法来获得给定String的类型为enum。但你的方法(DataValidation class)也足够好。


0
投票

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.