java - 在我的情况下,我有哪些选项可以防止 Java 中的重复代码
问题描述
我得到了大约 6 个类,它们在不同的值下“几乎”做同样的事情。我将在下面给出两个类和一个示例,然后描述我在做什么。
public class AttributeRangeRule implements Template {
@Override
public String writeTemplate(BusinessRule businessRule) throws Exception {
String link = TemplateReader.getInstance().getLinkToQuery(businessRule.getBusinessRuleTypeCode());
String template = TemplateReader.getInstance().readQuery(link);
ST templateFixer = new ST(template);
templateFixer.add("code", businessRule.getBusinessRuleTypeCode());
templateFixer.add("attribute_table", businessRule.getListOfTables().get(0).getName());
templateFixer.add("operator", businessRule.getOperator().getName());
templateFixer.add("range_min", businessRule.getListOfValues().get(0).getValue());
templateFixer.add("range_max", businessRule.getListOfValues().get(1).getValue());
templateFixer.add("attribute_column", businessRule.getListOfColumns().get(0).getName());
templateFixer.add("error", businessRule.getErrorMessage());
templateFixer.add("GreaterOrEqual", ">=");
templateFixer.add("LessOrEqual", "<=");
templateFixer.add("LessThen", "<");
templateFixer.add("GreaterThen", ">");
String templateDLL = templateFixer.render();
return templateDLL;
}
}
public class AttributeCompareRule implements Template {
@Override
public String writeTemplate(BusinessRule businessRule) throws Exception {
String link = TemplateReader.getInstance().getLinkToQuery(businessRule.getBusinessRuleTypeCode());
String template = TemplateReader.getInstance().readQuery(link);
ST templateFixer = new ST(template);
templateFixer.add("code", businessRule.getBusinessRuleTypeCode());
templateFixer.add("attribute_table", businessRule.getListOfTables().get(0).getName());
templateFixer.add("operand", businessRule.getOperator().getName());
templateFixer.add("compare_with", businessRule.getListOfValues().get(0).getValue());
templateFixer.add("error", businessRule.getErrorMessage());
String templateDLL = templateFixer.render();
return templateDLL;
}
}
templateFixer.add("code..") 例如是重复的。它们在两个类中的写法相同,但值不同。
我有不同的类,具有方法 writeTemplate() 的不同实现。如您所见,AttributeRangeRule 与 AttributeCompareRule 不同。这段代码正在为我编写查询。Intellij 告诉我,即使值不是唯一的,代码也是重复的。我不知道如何解决这个问题。我该如何解决这个问题,因为重复的代码不是最好的代码。提前致谢。
解决方案
您应该尝试在此处利用OOPS概念并在此处inheritance
使用
您可以创建一个名为AttributeRule
覆盖writeTemplate()
方法的基类并将所有冗余代码放在那里,并让这个类由您的子类扩展,AttributeCompareRule
即AttributeCompareRule
这是概念性想法和一些片段
public class AttributeRule implements Template {
@Override
public String writeTemplate(BusinessRule businessRule) throws Exception {
String link = TemplateReader.getInstance().getLinkToQuery(businessRule.getBusinessRuleTypeCode());
String template = TemplateReader.getInstance().readQuery(link);
ST templateFixer = new ST(template);
templateFixer.add("code", businessRule.getBusinessRuleTypeCode());
templateFixer.add("attribute_table", businessRule.getListOfTables().get(0).getName());
}
}
public class AttributeCompareRule extends AttributeRule {
@Override
public String writeTemplate(BusinessRule businessRule) throws Exception {
super.writeTemplate(rule);
// Custom class code here
templateFixer.add("operand", businessRule.getOperator().getName());
templateFixer.add("compare_with", businessRule.getListOfValues().get(0).getValue());
templateFixer.add("error", businessRule.getErrorMessage());
String templateDLL = templateFixer.render();
return templateDLL;
}
}
public class AttributeRangeRule extends AttributeRule {
super.writeTemplate(rule);
// Custom class code here
}
推荐阅读
- python - 如果匹配列表元素,则屏蔽子字符串,Python
- javascript - 空手道尝试在 iframe - iframe - 元素中使用一些元素并且看不到元素( UI )
- git - 带有 Laravel Sail 和版本控制的 Laravel 8 开发项目
- c++ - 如何在不反转字符串的情况下将堆栈值分配给 C++ 中的字符串?
- c++ - 可变参数模板运算符
- regex - 使用 Procmail/Formail/Regex 更正电子邮件标题中的错误
- javascript - Checkbox - ischecked jQuery 验证
- excel - VBA - 按数组自动过滤也没有返回大数字
- javascript - discord.js v12 命令参数
- java - 将 JDK 15 添加到 Netbeans 8.2 RC