首页 > 解决方案 > 在我的情况下,我有哪些选项可以防止 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 告诉我,即使值不是唯一的,代码也是重复的。我不知道如何解决这个问题。我该如何解决这个问题,因为重复的代码不是最好的代码。提前致谢。

标签: javaduplicates

解决方案


您应该尝试在此处利用OOPS概念并在此处inheritance使用

您可以创建一个名为AttributeRule覆盖writeTemplate()方法的基类并将所有冗余代码放在那里,并让这个类由您的子类扩展,AttributeCompareRuleAttributeCompareRule

这是概念性想法和一些片段

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
}

推荐阅读