重构标记的循环

2022-09-02 11:57:59

在我确信标记的中断/继续在这里完全是“nono”之后,我需要帮助从我的代码中删除标签。

我有一个正方形矩阵和一个长度相同的向量。向量中已经有一些值,根据矩阵中的值,向量在循环中会发生变化。

我希望,代码片段基本上是可以理解的...

vectorLoop:
for( int idx = 0; idx < vectorLength; idx++) {
    if( conditionAtVectorPosition( v, idx ) ) continue vectorLoop;

    matrixLoop:
    for( rowIdx = 0; rowIdx < n; rowIdx++ ) {
        if( anotherConditionAtVector( v, rowIdx ) ) continue matrixLoop;
        if( conditionAtMatrixRowCol( m, rowIdx, idx ) ) continue vectorLoop;
    }
    setValueInVector( v, idx );
}     

请说服我,没有标签有一个更具可读性/更好的版本。


答案 1

看看到目前为止提出的解决方案:

  • 它们看起来都不如原始的可读性,因为它们涉及在代码机制上花费更多的代码,而不是在算法本身上。

  • 其中一些是坏的,或者在编辑之前。最可怕的是,人们不得不非常努力地思考如何编写没有标签的代码,并且不破坏任何东西。

  • 有些测试会受到两次运行相同测试的性能损失,这可能并不总是微不足道的。另一种方法是存储和传递圆形布尔值,这会变得丑陋。

  • 将代码的相关部分重构为方法实际上是一个禁忌:它重新排列了代码在文件中的布局方式,但对它的执行方式没有影响。

所有这些都使我相信,至少在这个问题的情况下,标签是正确的解决方案,不需要重构。当然,在某些情况下,标签使用不正确,应该重构掉。我只是不认为它应该被视为一些牢不可破的规则。


答案 2

@Patrick你假设调用 setValueInVector( v, idx );在第二个循环的末尾是可以的。如果代码要完全相同,从逻辑上讲,它必须重写为如下所示:

for( int idx = 0; idx 

推荐