Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 重构标记循环_Java_Refactoring_Label - Fatal编程技术网

Java 重构标记循环

Java 重构标记循环,java,refactoring,label,Java,Refactoring,Label,在我确信带标签的break/continues完全是“no”之后,我需要帮助从代码中删除标签 我有一个正方形矩阵和一个长度相同的向量。向量中已经有一些值,根据矩阵中的值,向量在循环中会发生变化 我希望,代码片段基本上可以理解 vectorLoop: for( int idx = 0; idx < vectorLength; idx++) { if( conditionAtVectorPosition( v, idx ) ) continue vectorLoop; mat

在我确信带标签的break/continues完全是“no”之后,我需要帮助从代码中删除标签

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

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

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 );
}     
矢量循环:
for(int-idx=0;idx
请说服我,有一个没有标签的更可读/更好的版本。

很容易,我的好朋友

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

  for( rowIdx = 0; rowIdx < n; rowIdx++ ) {
    if( anotherConditionAtVector( v, rowIdx ) ) continue;
    if( conditionAtMatrixRowCol( m, rowIdx, idx ) ) break;
  }
  if( !conditionAtMatrixRowCol( m, rowIdx, idx ) )
    setValueInVector( v, idx );
}
for(int-idx=0;idx

编辑:完全正确,你是安德斯。我对我的解决方案进行了编辑,也考虑到了这一点。

@Patrick您假设正在调用setValueInVector(v,idx);在第二个循环结束时,一切正常。如果代码在逻辑上是相同的,则必须重写为如下内容:

for( int idx = 0; idx
对于(int idx=0;idx这对您有用吗?我将内部循环提取到一个方法CheckedEntireMatrix中(您可以比我更好地命名它)-而且我的java有点生锈..但我认为它传达了信息

for( int idx = 0; idx < vectorLength; idx++) {
    if( conditionAtVectorPosition( v, idx ) 
    || !CheckedEntireMatrix(v)) continue;

    setValueInVector( v, idx );
}

private bool CheckedEntireMatrix(Vector v)
{
    for( rowIdx = 0; rowIdx < n; rowIdx++ ) {
        if( anotherConditionAtVector( v, rowIdx ) ) continue;
        if( conditionAtMatrixRowCol( m, rowIdx, idx ) ) return false;
    }   
    return true;
}
for(int-idx=0;idx
Gishu有一个正确的想法:

for( int idx = 0; idx < vectorLength; idx++) {
    if (!conditionAtVectorPosition( v, idx ) 
        && checkedRow(v, idx))
         setValueInVector( v, idx );
}

private boolean checkedRow(Vector v, int idx) {
    for( rowIdx = 0; rowIdx < n; rowIdx++ ) {
        if( anotherConditionAtVector( v, rowIdx ) ) continue;
        if( conditionAtMatrixRowCol( m, rowIdx, idx ) ) return false;
    }  
    return true;
}
for(int-idx=0;idx
我不太确定是否理解第一个问题。 我会复制Gishu并写下这样的内容(如果有错误,请道歉):

for(int-idx=0;idx
阅读您的代码

  • 我注意到您在conditionAtVectorPosition中删除了无效的向量位置,然后在另一个ConditionAtVector中删除了无效的行
  • 检查另一个ConditionAtVector上的行似乎是多余的,因为不管idx的值是什么,另一个ConditionAtVector只取决于行索引(假设另一个ConditionAtVector没有副作用)
所以你可以这样做:

  • 首先使用conditionAtVectorPosition获取有效位置(这些是有效列)
  • 然后使用另一个ConditionAtVector获取有效行
  • 最后,使用有效的列和行使用conditionAtMatrixRowCol

我希望这能有所帮助。

看看目前提供的解决方案:

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

  • 最糟糕的是,人们不得不认真思考如何在没有标签的情况下编写代码而不破坏任何东西

  • 有些测试会带来两次相同测试的性能损失,这可能并不总是微不足道的。另一种方法是存储和传递布尔值,这会变得很难看

  • 将代码的相关部分重构成一个方法实际上是不可行的:它会重新安排代码在文件中的布局,但不会影响代码的执行方式

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

@:

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

将第二个循环外部化到算法之外并不一定不可读。如果方法名称选择得当,它可以提高可读性

最糟糕的是,人们不得不认真思考如何在没有标签的情况下编写代码而不破坏任何东西

我有一个不同的观点:其中一些被破坏了,因为很难理解原始算法的行为

有些测试会带来两次相同测试的性能损失,这可能并不总是微不足道的。另一种方法是存储和传递布尔值,这会变得很难看

性能
for( int idx = 0; idx < vectorLength; idx++) {
    if( !conditionAtVectorPosition( v, idx ) && CheckedEntireMatrix(v))
        setValueInVector( v, idx );
}

inline bool CheckedEntireMatrix(Vector v) {
    for(rowIdx = 0; rowIdx < n; rowIdx++)
        if ( !anotherConditionAtVector(v,rowIdx) && conditionAtMatrixRowCol(m,rowIdx,idx) ) 
            return false;
    return true;
}