forked from eugenedobro/JavaStepIC
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathTextAnalyzer.java
More file actions
107 lines (86 loc) · 4.69 KB
/
Copy pathTextAnalyzer.java
File metadata and controls
107 lines (86 loc) · 4.69 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
/*
Пришло время попробовать реализовать иерархию классов определенного вида и решить конкретную задачу.
Представим, вы делаете систему фильтрации комментариев на каком-то веб-портале, будь то новости, видео-хостинг, а может даже для системы онлайн-обучения :)
Вы хотите фильтровать комментарии по разным критериям, уметь легко добавлять новые фильтры и модифицировать старые.
Допустим, мы будем фильтровать спам, комментарии с негативным содержанием и слишком длинные комментарии.
Спам будем фильтровать по наличию указанных ключевых слов в тексте.
Негативное содержание будем определять по наличию одного из трех смайликов – :( =( :|
Слишком длинные комментарии будем определять исходя из данного числа – максимальной длины комментария.
Вы решили абстрагировать фильтр в виде следующего интерфейса:
interface TextAnalyzer {
Label processText(String text);
}
Label – тип-перечисление, которые содержит метки, которыми будем помечать текст:
enum Label {
SPAM, NEGATIVE_TEXT, TOO_LONG, OK
}
Дальше, вам необходимо реализовать три класса, которые реализуют данный интерфейс: SpamAnalyzer, NegativeTextAnalyzer и TooLongTextAnalyzer.
SpamAnalyzer должен конструироваться от массива строк с ключевыми словами. Объект этого класса должен сохранять в своем состоянии этот массив строк в приватном поле keywords.
NegativeTextAnalyzer должен конструироваться конструктором по-умолчанию.
TooLongTextAnalyzer должен конструироваться от int'а с максимальной допустимой длиной комментария. Объект этого класса должен сохранять в своем состоянии это число в приватном поле maxLength.
Наверняка вы уже заметили, что SpamAnalyzer и NegativeTextAnalyzer во многом похожи – они оба проверяют текст на наличие каких-либо ключевых слов (в случае спама мы получаем их из конструктора, в случае негативного текста мы заранее знаем набор грустных смайликов) и в случае нахождения одного из ключевых слов возвращают Label (SPAM и NEGATIVE_TEXT соответственно), а если ничего не нашлось – возвращают OK.
Давайте эту логику абстрагируем в абстрактный класс KeywordAnalyzer следующим образом:
Выделим два абстрактных метода getKeywords и getLabel, один из которых будет возвращать набор ключевых слов, а второй метку, которой необходимо пометить положительные срабатывания. Нам незачем показывать эти методы потребителям классов, поэтому оставим доступ к ним только для наследников.
Реализуем processText таким образом, чтобы он зависел только от getKeywords и getLabel.
Сделаем SpamAnalyzer и NegativeTextAnalyzer наследниками KeywordAnalyzer и реализуем абстрактные методы.
Последний штрих – написать метод checkLabels, который будет возвращать метку для комментария по набору анализаторов текста. checkLabels должен возвращать первую не-OK метку в порядке данного набора анализаторов, и OK, если все анализаторы вернули OK.
Используйте, пожалуйста, модификатор доступа по-умолчанию для всех классов.
В итоге, реализуйте классы KeywordAnalyzer, SpamAnalyzer, NegativeTextAnalyzer и TooLongTextAnalyzer и метод checkLabels. TextAnalyzer и Label уже подключены, лишние импорты вам не потребуются.
*/
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;
}
}
class SpamAnalyzer extends KeywordAnalyzer implements TextAnalyzer {
private String[] keywords;
public SpamAnalyzer(String[] keywords) {
this.keywords = keywords;
}
@Override
protected String[] getKeywords() {
return keywords;
}
@Override
protected Label getLabel() {
return Label.SPAM;
}
}
class NegativeTextAnalyzer extends KeywordAnalyzer implements TextAnalyzer {
private final String[] KEYWORDS = {":(", "=(", ":|"};
@Override
protected String[] getKeywords() {
return KEYWORDS;
}
@Override
protected Label getLabel() {
return Label.NEGATIVE_TEXT;
}
}
class TooLongTextAnalyzer implements TextAnalyzer {
private int maxLength;
public TooLongTextAnalyzer(int threshold) {
this.maxLength = threshold;
}
@Override
public Label processText(String text) {
if (text.length() > maxLength)
return Label.TOO_LONG;
else
return Label.OK;
}
}
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;
}