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是的,所有数据类型仅限于基本数据类型。