-
Notifications
You must be signed in to change notification settings - Fork 109
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Опциональный параметр диагностики Typo (caseInsensitive) #2945
base: develop
Are you sure you want to change the base?
Conversation
Не могу не задать вопрос. Что по перфомансу на большой конфигурации типа ерп? |
|
||
Arrays.stream(camelCaseSplitedWords) | ||
Arrays.stream(camelCaseSplitWords) | ||
.distinct() |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Обоснуй?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
в пользовательских конфигах могут использоваться варианты слов с заглавной\строчной, да и случайно могут дубли оказаться.
этот distinct() призван сократить количество элементов коллекции, а даже если дублей нет, то производительность не должна сильно пострадать
if (caseInsensitive) { | ||
camelCaseSplitWords = Arrays.stream(camelCaseSplitWords) | ||
.map(String::toLowerCase) | ||
.toArray(String[]::new); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Если на этом шаге уже есть перегонка в стрим, но нет смысла гонять их стрима в массив и обратно. Можно сразу начать обрабатывать стрим. Предлагаю засунуть в Stream до условия, в условии сделать toLowerCase и distinct() (если он действительно нужен), а вне условия уже оставить оставшийся код стрима.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
стало не актуально
вместо приведения к нижнему регистру я изменил тип коллекции, чтобы можно было их сравнивать либо с учетом, либо без учета регистра в зависимости от параметра диагностики
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Только ты сложность алгоритма увеличил. contains в set работает за O(1), а в List - за O(n)
Спасибо! Пара мелких замечаний. |
проверю) нужна будет консультация по тому, как грамотно сделать замер |
@ovcharenko-di Только не забыть выключить защитник винды и прогонять два-три раза подряд (без больших пауз), чтобы на прогретых дисках |
Исправил замечания по Stream->Array->Stream. Проверка ERP без регл. отчетов на одной этой диагностике выполняется с разницей +/- 2 секунды относительно develop. |
@nixel2007 разобрался. Далее в дело вступает JLanguageTool, который, видимо, пропускает аббревиатуры. А раз я сейчас все токены лихо привожу к нижнему регистру, то он считает, что это обычное слово. Буду думать, как это исправить. @EightM , может быть, у тебя есть идеи? |
параметр позволяет не учитывать регистр в словаре исключений
7f163b9
to
d55c07a
Compare
проверил, разницы особой нет |
Kudos, SonarCloud Quality Gate passed! |
@EightM plz review |
var delimiter = ","; | ||
String exceptions = SPACES_PATTERN.matcher(info.getResourceString("diagnosticExceptions")).replaceAll(""); | ||
if (!userWordsToIgnore.isEmpty()) { | ||
exceptions = exceptions + delimiter + SPACES_PATTERN.matcher(userWordsToIgnore).replaceAll(""); | ||
} | ||
|
||
if (caseInsensitive) { | ||
exceptions = exceptions.toLowerCase(); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
В параметрах lowerCase должна быть явно указана локаль (в проекте вроде используется English)
https://rules.sonarsource.com/java/RSPEC-1449
|
||
@Override | ||
public void configure(Map<String, Object> configuration) { | ||
super.configure(configuration); | ||
minWordLength = Math.max(minWordLength, DEFAULT_MIN_WORD_LENGTH); | ||
} | ||
|
||
private Set<String> getWordsToIgnore() { | ||
private List<String> getWordsToIgnore() { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
В чем логика замены Set на List?
.filter(Predicate.not(String::isBlank)) | ||
.filter(element -> element.length() >= minWordLength) | ||
.filter(Predicate.not(wordsToIgnore::contains)) | ||
.filter(element -> wordsToIgnore.stream().noneMatch(word |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Здесь замена Set на List сделала поиск слова медленнее. contains в сете работает за О(1), здесь же теперь линейный поиск за O(N), в результате сложность всего стрима стала из линейной квадратичной
@ovcharenko-di |
@theshadowco на своих проектах я как-то уже смирился с тем, что словарь чувствителен к регистру сейчас я бы вообще закрыл этот issue, но если сообщество считает, что надо реализовать - могу добить, в принципе) |
Параметр позволяет не учитывать регистр в словаре исключений.
Описание
Добавил необязательный параметр в диагностику Typo, который позволяет не учитывать регистр в словаре исключений.
Реализовано путем приведения элементов коллекции слов-исключений и токенов к нижнему регистру.
Связанные задачи
Closes #2889
Чеклист
Общие
gradlew precommit
)Для диагностик
Дополнительно