首页 > 解决方案 > SonarLint 警告:降低图像分块的认知复杂度(16 而非 15)

问题描述

我编写了一个函数,其目的是获取从重新缩放的输入图像定义的子图像集合(这些子图像称为“重新缩放的输入图像的重新缩放块”)并将这些重新缩放的块重新组合成输出的整个图像(其尺寸是输入图像的那些,重新缩放)。所有块都具有相同的尺寸。

该函数定义如下。问题是 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;
}

标签: javaawtcomplexity-theorysonarlint

解决方案


您可以尝试重构您的方法,例如

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;
}

推荐阅读