重构当前方法的最佳方法
Best way to refactor current method
我非常努力地重构这段代码,但没有成功。请告诉我该怎么做。我已经在那里待了几个小时试图找到解决方案。我已经阅读了《清洁代码》一书的一些摘录,但是,作为初学者,我真的很难重构。抱歉,这是我第一次诚实的尝试,但我无法弄清楚如何制作大小为 ~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;
}
你可以减少
if (tm.isAnswer() == isAns) { // are values from both true
answer[i] = true;
} else {
answer[i] = false;
}
由
answer[i] = tm.isAnswer() == isAns;
请记住,短并不一定意味着更好。很多时候,更长的方法可以更具可读性,并且将来更容易理解和维护。有时您需要在第一次编写代码后一年或两年查看您的代码,如果您在编写的代码太短以至于无法理解您的意图后无法理解它,那将一文不值在那种方法中。当然,另一个极端也是要避免的,太长的方法不是模块化的,如果你只想改变它的特定部分,可能很难理解。
在我看来,你写的那个方法很长,不需要缩短。
但为了回答您的问题,您始终可以通过将方法划分为更多方法来缩短方法。例如你的情况:
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 个方法,如果您能找到一种合乎逻辑的方法来划分它的话。
我非常努力地重构这段代码,但没有成功。请告诉我该怎么做。我已经在那里待了几个小时试图找到解决方案。我已经阅读了《清洁代码》一书的一些摘录,但是,作为初学者,我真的很难重构。抱歉,这是我第一次诚实的尝试,但我无法弄清楚如何制作大小为 ~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;
}
你可以减少
if (tm.isAnswer() == isAns) { // are values from both true
answer[i] = true;
} else {
answer[i] = false;
}
由
answer[i] = tm.isAnswer() == isAns;
请记住,短并不一定意味着更好。很多时候,更长的方法可以更具可读性,并且将来更容易理解和维护。有时您需要在第一次编写代码后一年或两年查看您的代码,如果您在编写的代码太短以至于无法理解您的意图后无法理解它,那将一文不值在那种方法中。当然,另一个极端也是要避免的,太长的方法不是模块化的,如果你只想改变它的特定部分,可能很难理解。
在我看来,你写的那个方法很长,不需要缩短。
但为了回答您的问题,您始终可以通过将方法划分为更多方法来缩短方法。例如你的情况:
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 个方法,如果您能找到一种合乎逻辑的方法来划分它的话。