Подскажите, пожалуйста, как сократить/улучшить реализацию метода checkLabels
Просьба подсказать как улучшить реализацию метода checkLabels.
Моя реализация:
public Label checkLabels(TextAnalyzer[] analyzers, String text) {
for (int i = 0; i < analyzers.length; i++)
if (analyzers[i].processText(text) != Label.OK) {
return analyzers[i].processText(text);
}
return Label.OK;
}
}
Суть задания в следующем: Необходимо фильтровать комментарии на неком портале, а именно фильтровать спам, комментарии с негативным содержанием и слишком длинные комментарии.
Спам будем фильтровать по наличию указанных ключевых слов в тексте. Негативное содержание будем определять по наличию одного из трех смайликов - :( =( :|. Слишком длинные комментарии будем определять исходя из данного числа - максимальной длины комментария. Необходимо написать метод checkLabels, который будет возвращать метку для комментария по набору анализаторов текста. checkLabels должен возвращать первую не-OK метку в порядке данного набора анализаторов, и OK, если все анализаторы вернули OK. Наследники класса KeywordAnalyzer проверяют текст на наличие каких-либо ключевых слов (в случае спама мы получаем их из конструктора, в случае негативного текста мы заранее знаем набор грустных смайликов) и в случае нахождения одного из ключевых слов возвращают Label (SPAM и NEGATIVE_TEXT соответственно), а если ничего не нашлось - возвращают OK.
Возможно такой вариант реализации метода будет лучше? (заменила "старый" стиль написания цикла for на "новый"):
public Label checkLabels(TextAnalyzer[] analyzers, String text) {
for (TextAnalyzer an : analyzers) {
Label result = an.processText(text);
if (result != Label.OK)
return result;
}
return Label.OK;
}
}
Весь код:
public interface TextAnalyzer {
Label processText(String text);
}
public enum Label {
SPAM, NEGATIVE_TEXT, TOO_LONG, OK
}
public abstract class KeywordAnalyzer implements TextAnalyzer {
protected abstract String[] getKeywords();
protected abstract Label getLabel();
public Label processText(String text) {
String[] keywords = getKeywords();
for (String keyword : keywords) {
if (text.contains(keyword)) {
return getLabel();
}
}
return Label.OK;
}
}
public class SpamAnalyzer extends KeywordAnalyzer {
private String[] keywords;
public SpamAnalyzer(String[] keywords) {
this.keywords = keywords;
}
@Override
protected String[] getKeywords() {
return keywords;
}
@Override
protected Label getLabel() {
return Label.SPAM;
}
}
public class NegativeTextAnalyzer extends KeywordAnalyzer {
private final String[] KEYWORDS = {":(", "=(", ":|"};
@Override
protected String[] getKeywords() {
return KEYWORDS;
}
@Override
protected Label getLabel() {
return Label.NEGATIVE_TEXT;
}
}
public class TooLongTextAnalyzer implements TextAnalyzer {
private int maxLength;
public TooLongTextAnalyzer(int limit) {
this.maxLength = limit;
}
@Override
public Label processText(String text) {
if (text.length() > maxLength)
return Label.TOO_LONG;
else
return Label.OK;
}
}
public class Main {
public static void main(String[] args) {
// инициализация анализаторов для проверки в порядке данного набора анализаторов
String[] spamKeywords = {"spam", "bad"};
int commentMaxLength = 40;
TextAnalyzer[] textAnalyzers1 = {
new SpamAnalyzer(spamKeywords),
new NegativeTextAnalyzer(),
new TooLongTextAnalyzer(commentMaxLength)
};
TextAnalyzer[] textAnalyzers2 = {
new SpamAnalyzer(spamKeywords),
new TooLongTextAnalyzer(commentMaxLength),
new NegativeTextAnalyzer()
};
public Label checkLabels(TextAnalyzer[] analyzers, String text) {
for (int i = 0; i < analyzers.length; i++)
if (analyzers[i].processText(text) != Label.OK) {
return analyzers[i].processText(text);
}
return Label.OK;
}
Заранее большое спасибо!
Ответы (1 шт):
Может быть
public Label checkLabels(final TextAnalyzer[] analyzers, final String text) {
for (int i = 0; i < analyzers.length; i++) {
final Label value = analyzers[i].processText(text);
if (value != Label.OK) {
return value;
}
}
return Label.OK;
}