降低函数的圈复杂度

Reduce cyclomatic complexity of a function

此函数检查拼字板的单元格是否为双字母奖励。它的圈复杂度为 23,高于 20 的阈值。我不知道如何用另一种方法来做,我认为这是唯一的方法。 这是我的功能:

checkDoubleLetterCell(row: number, column: number): boolean
{
    if((row === middle- 1 || row === middle + 1)
    && (column === middle - 1 || column === middle + 1)
    || (row === 0 || row == SCRABBLE_SIZE - 1 || row === middle) 
    && (column === middle + Math.round(middle/2) || column === middle - Math.round(middle/2))
    || (column === 0 || column === SCRABBLE_SIZE - 1 || column === middle)
    && (row === middle + Math.round(middle/2) || row === middle - Math.round(middle/2))
    || (column === middle + 1 || column === middle - 1)
    && (row === middle + Math.round(middle/2) + 1 || row === middle - Math.round(middle/2) - 1)
    || (row === middle + 1 || row === middle - 1)
    && (column === middle + Math.round(middle/2) + 1 || column === middle - Math.round(middle/2) - 1))
    {
        return true;
    }
    return false;
}

解决方案是在数据而不是程序代码中表示静态知识。如果有关双字母方块位置的知识以静态初始化的数据结构表示,比如正确维度的布尔矩阵 dblScore,那么您的代码将减少为:

checkDoubleLetterCell(row: number, column: number): boolean
{
    return dblScore[row,column]; 
}

过度复杂通常是选择 ill-fitting 表示的 side-effect。一般规则:静态知识应该用数据表示,而不是过程逻辑。