【问题标题】:Simplify code in Java用 Java 简化代码
【发布时间】:2012-06-01 03:29:12
【问题描述】:

我有一个 Java 方法必须多次执行一段代码:

            // Obtengo los 7 bits de direccion
            clockStateIndex = dataStateIndex;
            for(int bit = 7; bit > 0; --bit){           
                clockStateIndex = clockSource.nextClearBit(clockStateIndex);                    // Siguiente bit en SCL
                clockStateIndex = clockSource.nextSetBit(clockStateIndex);
                testIndex = (clockSource.nextClearBit(clockStateIndex) - clockStateIndex)/2;    // Busco la mitad del bit clock
                bitSet(direccion, data.get(testIndex), bit);                // Compruebo SDA en la mitad del bit SCL
            }
            // Obttengo el bit R/W
            clockStateIndex = clockSource.nextClearBit(clockStateIndex);    // Siguiente bit en SCL
            clockStateIndex = clockSource.nextSetBit(clockStateIndex);
            testIndex = (clockSource.nextClearBit(clockStateIndex) - clockStateIndex)/2;    // Busco la mitad del bit clock
            rwBit = data.get(testIndex);        // Obtengo el estado del bit R/W en el medio del bit SCL

            // Obtengo el bit de ACK
            clockStateIndex = clockSource.nextClearBit(clockStateIndex);    // Siguiente bit en SCL
            clockStateIndex = clockSource.nextSetBit(clockStateIndex);
            testIndex = (clockSource.nextClearBit(clockStateIndex) - clockStateIndex)/2;    // Busco la mitad del bit clock
            ackBit = data.get(testIndex);       // Obtengo el estado del bit R/W en el medio del bit SCL

            // Si tengo un ACK obtengo los 8 bits de dato
            if(ackBit == false){
                for(int bit = 8; bit > 0; --bit){           
                    clockStateIndex = clockSource.nextClearBit(clockStateIndex);    
                    clockStateIndex = clockSource.nextSetBit(clockStateIndex);
                    testIndex = (clockSource.nextClearBit(clockStateIndex) - clockStateIndex)/2;    
                    bitSet(i2cData, data.get(testIndex), bit);      
                }
            }

如你所见:

clockStateIndex = clockSource.nextClearBit(clockStateIndex);    
clockStateIndex = clockSource.nextSetBit(clockStateIndex);
testIndex = (clockSource.nextClearBit(clockStateIndex) - clockStateIndex)/2;    

重复很多次。我无法创建#defines 来简化我的代码,比如 nextBit();替换该代码。有没有其他方法可以简化它? 如果创建一个方法,我将必须传递两个大小约为 200 个元素的 BitSet 并返回 2 个 int 元素(我不知道在 Java 中这样做很热,因为我没有像 C 中那样的指针)

希望你能帮助我:)

【问题讨论】:

  • 实际上,当谈到Java 中的对象时,您所拥有的只是指针(引用),而根本没有对象。将对象传递给方法需要地址所需的字节数(通常为 4 或 8 个),而与对象的大小无关。创建一个方法。

标签: java simplify


【解决方案1】:

我会将它包装在一个函数中:

// Instance based (inside classes)
{SCOPE MODIFIER} void ClockWork()
{
    clockStateIndex = clockSource.nextClearBit(clockStateIndex);    
    clockStateIndex = clockSource.nextSetBit(clockStateIndex);
    testIndex = (clockSource.nextClearBit(clockStateIndex) - clockStateIndex) / 2;  
}

至于基于静态的方法,这取决于您在哪里实现代码。

【讨论】:

  • 在不诉诸预编译器文本处理的情况下,@Cole 走上了正轨。当然,复制粘贴代码以提高性能是可以的。味道不好,但很快。
  • 是的,但是所有变量都在方法中,所以我必须将它们传递给新方法,它是否对性能影响太大? clockSource 是一个包含大约 200 个元素的 BitSet,我必须返回 2 个元素(testIndex 和 clockStateIndex)我该怎么做?
  • @Andres 如果它那么大,我会将它包装在一个类中。处理这样的数组很糟糕。
  • 它在静态类中,因为它只将 BitSet 解码为返回我创建的对象的数据,为什么以这种方式使用 BitSet 是不好的?
  • @Andres 不断传递数组是不好的
【解决方案2】:

最简单的解决方案是为此操作创建一个对象:

class ClockState {
    private int clearBit;
    private int setBit;
    private int testIndex;

    public ClockState( int clearBit, int setBit, int testIndex ) {
        this.clearBit = clearBit;
        this.setBit = setBit;
        this.testIndex = testIndex;
    }

    public int getClearBit() { return this.clearBit; }
    public int getSetBit() { return this.setBit; }
    public int getTestIndex { return this.textIndex; }

    public static ClockState create( ClockSource clockSource, int clockStateIndex ) {
      int clearBit = clockSource.nextClearBit(clockStateIndex);    
      int setBit = clockSource.nextSetBit(clearBit);
      int testIndex = (clockSource.nextClearBit(setBit) - setBit)/2; 
      return new ClockState( clearBit, setBit, testIndex );
    }

}

然后您的代码将如下所示:

        clockStateIndex = dataStateIndex;
        for(int bit = 7; bit > 0; --bit){           
            ClockState state = ClockState.create( clockSource, clockStateIndex );
            clockStateIndex = state.getSetBit();
            bitSet(direccion, data.get(state.getTestIndex()), bit);
        }

对于所有其他调用,依此类推。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-09
    • 1970-01-01
    • 1970-01-01
    • 2015-01-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多