java - 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;
}
我浏览重新缩放的图像,使用块的适当(x 轴或 y 轴)尺寸(所有块具有相同的尺寸)增加水平或垂直偏移。相关的循环是:
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) {
。
解决方案
您可以尝试重构您的方法,例如
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;
}
推荐阅读
- javascript - JavaScript 获取元素名称值
- c# - Cosmos DB Newtonsoft 反序列化问题
- python - Python - 函数返回值
- c# - 如何注册一个ajaxcontrolkit?
- algolia - Algolia Instantsearch:自定义排序细化列表
- delphi - 模拟按键但仅限于特定窗口?
- azure - Azure Logic Apps 未在 Google 工作表中为每个实例插入一行
- laravel-5 - Laravel Api 资源控制器 json 格式
- python - 在python 3.6中将输入添加到csv中的现有行
- docker - Docker Compose File 无法获取 .env 变量