Каковы мои варианты предотвращения дублирования кода в Java в моем случае - PullRequest
0 голосов
/ 28 декабря 2018

Я получил около 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 говорит мне, что код дублируется, даже если значения не являются уникальными.Я понятия не имею, как решить эту проблему.Как я могу решить эту проблему, так как дублирующий код не является лучшим в вашем коде.Заранее спасибо.

1 Ответ

0 голосов
/ 28 декабря 2018

Вы должны попытаться воспользоваться преимуществами 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
}
...