1. Моя попытка
Первый пример плохого кода на веб-сайте Anti-If Campaign кажется мне довольно тривиальным и стандартным. Решение, как указывалось во множестве книг, других вопросов и веб-сайтов StackOverflow, - это полиморфизм.
Однако, второй пример с сервером мне не кажется таким простым, что свидетельствует о том, что я не очень хороший программист, наверное. Я хотел бы, чтобы кто-то подтвердил, если мои попытки решения верны; или, если нет, дайте лучше. (Мои баллы пронумерованы, так что ответ может более легко ссылаться на них, это , а не иерархический порядок.)
- Даже если есть только один if-null условие выделено, в этом примере множество таких случаев. Я думаю, что лучший способ решения проблемы такого типа - использовать Null Object Pattern .
- Вероятно, самая большая проблема с этим фрагментом кода - это даже не сами if, но огромное количество вложений, из которых мы можем встретить до 5 уровней.
- Условное
if (getArea() == 1)
не кажется мне таким уж плохим, если оно только в этой части кодовой базы. Но это, конечно, не раскрывает столько смысла и намерений для читателя. Что означает 1? Это достаточная оговорка? Тогда, возможно, было бы лучше заменить его на что-то вроде if (validArea())
. Он также не привязан ни к какому объекту, поэтому я не могу легко установить отношения sh. - Я думаю, что если предложение может также извлечь выгоду из Фабрики или Шаблонного Метода, в зависимости от того, каковы отношения объектов - мне не очень понятно, какой будет правильный выбор из этого кусок кода, но, возможно, кто-то более опытный может иметь лучшее решение
2. Ссылочный код
Для справки, это фрагмент кода (Java) на веб-сайте (есть некоторая странность с отступом и комментированием строки else
, я думаю):
public ArrayList eseguiAnalisi() {
ArrayList listaSegnalazioni = new ArrayList();
List domande = null;
List risposte = null;
Domanda domanda = null;
DAOReques req = new DAOReques();
DAOArea ar = new DAOArea();
ar.setIdQuestionario(getIdQuestionario());
boolean quizDomandaNonForzata = false; // warning 7
try {
//set Aree e
if (getArea() == 1) { // Highlight #1
List aree = ar.getAree();
Area area = null;
for (int i = 0; i < aree.size(); i++) {
area = (Area) aree.get(i);
domande = req.getDomande(getIdQuestionario(),area.getIdArea());
if (domande != null) {
for (int j = 0; j < domande.size(); j++) {
domanda = (Domanda) domande.get(j);
risposte = req.getRisposteDomanda(getIdQuestionario(),domanda.getIdDomanda());
if (risposte != null)
domanda.setRisposte(risposte);
}
}
}
area.setDomandeArea(domande);
if (aree != null) // Highlight #2
setAreeDomande(aree);
} //else { // I think there was an indentation mistake in the website...
// set ListaDomande
domande = req.getDomande(getIdQuestionario());
for (int i = 0; i < domande.size(); i++) {
domanda = (Domanda) domande.get(i);
risposte = req.getRisposteDomanda(getIdQuestionario(),domanda.getIdDomanda());
if (risposte != null)
domanda.setRisposte(risposte);
}
if (domande!=null)
setDomande(domande);
//}
} catch (DAOException de) {
de.printStackTrace();
}