Предупреждение SonarLint: уменьшение когнитивной сложности (16 вместо 15) для фрагментирования изображения - PullRequest
0 голосов
/ 30 сентября 2019

Я написал функцию, цель которой состоит в том, чтобы взять набор подизображений, определенных из масштабированного входного изображения (эти подизображения называются «масштабированные фрагменты масштабированного входного изображения»), и повторно собрать эти масштабированные фрагменты в выходное целое изображение. (чьи размеры соответствуют исходному изображению, масштабируется). Все куски имеют одинаковые размеры.

Функция определена ниже. Проблема в том, что SonarLint предупреждает меня о том, что когнитивная сложность равна 16 вместо 15, и я не хочу изменять ограничение SonarLint по умолчанию. Что я могу сделать?

Ниже описана функция следующего кода:

final BufferedImage reassembleChunksInASingleImage(final int inputImageWidth, final int inputImageHeight, final int scalingCoefficient, final int chunkWidth, final int chunkHeight, final List<BufferedImage> theChunks) {
    logger.log(Level.INFO, "Reassembling...");

    final int reassembled_chunks_image_width = scalingCoefficient * inputImageWidth;
    final int reassembledChunksImageHeight = scalingCoefficient * inputImageHeight;
    final int rescaled_chunk_width = scalingCoefficient * chunkWidth;
    final int rescaledChunkHeight = scalingCoefficient * chunkHeight;
    final BufferedImage reassembledChunksImage = new BufferedImage(reassembled_chunks_image_width, reassembledChunksImageHeight, BufferedImage.TYPE_INT_RGB);
    int indexOfTheChunkToUse = 0;
    for(int i = 0; i < reassembled_chunks_image_width; i += rescaled_chunk_width) {
        for(int j = 0; j < reassembledChunksImageHeight; j += rescaledChunkHeight) {

            final BufferedImage chunkToUse = theChunks.get(indexOfTheChunkToUse);
            int iForDraw = i;
            int jForDraw = j;
            final int deltaI = reassembled_chunks_image_width - (i + rescaled_chunk_width);
            final int deltaJ = reassembledChunksImageHeight - (j + rescaledChunkHeight);
            if(deltaI < 0) {
                iForDraw -= Math.abs(deltaI);
            }
            if(deltaJ < 0) {
                jForDraw -= Math.abs(deltaJ);
            }
            for(int x = 0; x < rescaled_chunk_width; x++) {
                for(int y = 0; y < rescaledChunkHeight; y++) {

                    int colorToDraw = chunkToUse.getRGB(x, y);
                    reassembledChunksImage.setRGB(iForDraw + x, jForDraw + y, colorToDraw);
                }
            }
            indexOfTheChunkToUse++;
        }
    }

    logger.log(Level.INFO, "Reassembling done.");
    return reassembledChunksImage;
}
  • Я перехожу по измененному изображению, увеличиваягоризонтальное или вертикальное смещение с адекватным (осевым или осевым) размером кусков (все куски имеют одинаковый размер). Соответствующие циклы: for(int i = 0; i < reassembled_chunks_image_width; i += rescaled_chunk_width) {for(int j = 0; j < reassembledChunksImageHeight; j += rescaledChunkHeight) {

  • Я установил цвет пикселя текущего измененного изображения равным цвету текущего чанка. Соответствующие циклы: for(int x = 0; x < rescaled_chunk_width; x++) {for(int y = 0; y < rescaledChunkHeight; y++) {.

  • Если текущий фрагмент находится за пределами масштабированного изображения, я сдвигаю его влево или вверх, а затем рисую. Соответствующие элементы управления: if(deltaI < 0) {if(deltaJ < 0) {.

1 Ответ

1 голос
/ 30 сентября 2019

вы можете попытаться изменить свой метод, например,

int iForDraw = getDraw(reassembled_chunks_image_width, rescaled_chunk_width, i);
int jForDraw = getDraw(reassembledChunksImageHeight, rescaledChunkHeight, j);

добавить небольшой метод, например, getDraw

private int getDraw(int reassembled_chunks_image_data, int rescaled_chunk_data, int index) {
    int result = index;
    int delta = reassembled_chunks_image_data - (index + rescaled_chunk_data);
    if (delta < 0) {
        result -= Math.abs(delta);
    }
    return result;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...