重构当前方法的最佳方法

时间:2015-04-22 12:00:48

标签: refactoring

我很难重构这段代码,但没有成功。请告诉我如何去做。我在那里待了几个小时试图寻找解决方案。我已经阅读了一些关于清洁代码的摘录,但作为初学者我真的觉得很难重构。对不起,这是我第一次诚实的尝试,但我无法弄清楚如何制作大小~4或小的功能。

public boolean[] validateTrueFalse(String[] checkBoxValues) {

    boolean[] answer = new boolean[checkBoxValues.length];

    for (int i = 0; i < checkBoxValues.length; i++) {

        // values are like 1_true
        String[] values = checkBoxValues[i].split("_"); // split each value
                                                        // from my array
        int configId = Integer.parseInt(values[0]);
        boolean isAns = Boolean.parseBoolean(values[1]);

        for (TrueFalseConfigurationModel tm : dt.getTfModelList()) {
            if (tm.getConfiguration_id() == configId) {
                if (tm.isAnswer() == isAns) { // are values from both true
                    answer[i] = true;
                } else {
                    answer[i] = false;
                }
            }
        }

    }

    return answer;

}

2 个答案:

答案 0 :(得分:1)

请记住,短片并不一定意味着更好。很多时候,更长的方法可以更具可读性,并且将来更容易理解和维护。你有时需要在你第一次写代码后的一年或两年内查看你的代码,如果在你做得太短以至于你无法理解它之后你就​​无法理解它。了解你在那种方法中的意图。当然,另一个极端也是要避免的,而且太长的方法不是模块化的,如果你只想改变它的一个特定部分,就很难理解。

在我看来,你写的方法长度很长,不需要缩短。

但只是回答你的问题,你总是可以通过将方法划分为更多方法来缩短方法。例如在你的情况下:

public boolean[] validateTrueFalse(String[] checkBoxValues) {

    boolean[] answer = new boolean[checkBoxValues.length];

    for (int i = 0; i < checkBoxValues.length; i++) {

        answer[i] = GetAnswer(checkBoxValues[i]);

    }

    return answer;

}

public bool GetAnswer(string aCheckBoxValue)
{
        String[] values = aCheckBoxValue.split("_"); 
        int configId = Integer.parseInt(values[0]);
        boolean isAns = Boolean.parseBoolean(values[1]);

        for (TrueFalseConfigurationModel tm : dt.getTfModelList()) 
        {
            if (tm.getConfiguration_id() == configId) 
            {
                return tm.isAnswer() == isAns;
            }
        }
        return false;
}

注意我如何将方法中的一个大动作划分为创建较短方法的较小动作。然后,您可以继续以这种方式将GetAnswer方法本身划分为2种方法,如果您能找到一种划分它的逻辑方法。

答案 1 :(得分:0)

你可以减少

            if (tm.isAnswer() == isAns) { // are values from both true
                answer[i] = true;
            } else {
                answer[i] = false;
            }

通过

            answer[i] = tm.isAnswer() == isAns;