【问题标题】:Optimizing code for more clearness and efficiency优化代码以提高清晰度和效率
【发布时间】:2012-06-28 22:03:37
【问题描述】:

此代码运行良好,但我需要对其进行简化以更清晰并希望提高效率:

int i = 0;

if (p.cap()) n++;
if (p.creditcard()) n++;
if (p.email()) n++;
[...]
if (p.price()) n++;
if (p.url()) n++;
if (p.zip()) n++;

if (n == 0) p.standard();

正如代码所说,我需要调用多个方法(我不知道它们的数量有限)。每个 p.()* 方法都返回一个布尔值,并且只有当返回的值为 true 时,n 才会递增。如果 n==0(当调用的每个方法都返回 false 时会发生这种情况),那么我需要调用 p.standard()

如何编写更清晰高效的代码?我尝试了 or 条件,如下所示:

if (!( p.cap() || p.email() || p.isbn() || p.number() || p.phone() ||
       p.price() || p.time() || p.url() || p.zip() || p.creditcard()
    )) {
        p.standard();
}

但显然它不能正常工作(例如:如果 p.cap() 返回 true 则不会调用其他方法)。

我需要调用每个方法。

【问题讨论】:

  • java编译器通常会做很多优化,所以我会保留这样一段代码,而不是简短的可读性。
  • 为什么说第二个例子不能正常工作呢?如果不调用其他方法,这不就是你期待的优化吗?
  • @OtavioMacedo 它不能正常工作,因为我还需要调用其他方法。
  • 如果您想迁移,只需标记并要求模组进行迁移。请不要交叉发布。

标签: java optimization performance


【解决方案1】:

您没有指定是否要调用每个方法必须,但似乎您想调用它们而不考虑单个结果。所以使用简单的或运算符:| (不是短 电路或||)。

if (!( p.cap() | p.email() | p.isbn() | p.number() | p.phone() |
   p.price() | p.time() | p.url() | p.zip() | p.creditcard()
    )) {
        p.standard();
}

【讨论】:

    【解决方案2】:

    使用一些样板,您可以将其抽象为某种验证器接口:

    interface Validator {
        boolean validate(Foo p);
    }
    
    Validator[] validators = new Validator[] {
        new Validator() { boolean validate(Foo p) {return p.cap();} },
        new Validator() { boolean validate(Foo p) {return p.creditcard ();} },
        new Validator() { boolean validate(Foo p) {return p.email();} },
        // …
    }
    
    public int validateAll(Foo p, Validator[] validators) {
        int valid = 0;
        for (Validator v : validators) {
            if (v.validate(p)) valid++;
        }
        return valid;
    }
    
    if (validateAll(p, validators)) p.standard();
    

    这是代码的净增加,但它的优点是可以清楚地传达“在p 上运行所有这些检查”,并且检查列表是可扩展的。

    (我承认这可能很容易成为一个对您的需求来说过于繁重的解决方案。)

    【讨论】:

      【解决方案3】:

      在这里真的很难做到 - 没有足够的上下文......

      但是在 p 对象上创建一个新方法,该方法返回您要查找的值...然后从所有这些代码所在的位置调用它。

      类似

      int n = p.getPopulatedColumns();
      

      然后在该方法中,实现是什么并不重要 - 因为读者会知道意图。

      【讨论】:

        【解决方案4】:

        IMO 还有另一个非常优雅的解决方案。

        像这样创建一个验证方法:

        public static int validate(boolean ... booleans) {
            int n = 0;
            for (boolean b : booleans) {
                if (b) n++;
            }
            return n;
        }
        

        那么你可以这样调用这个方法:

        int n = validate(p.cap(), p.creditcard(), p.email());
        if (n == 0) p.standard();
        

        由于 validate 方法将布尔值作为可变参数,因此您可以根据需要添加任意数量(或尽可能少)的参数。

        或者,如果所有参数都为假,您可以简化为返回布尔值:

        public static boolean validate(boolean ... booleans) {
            int n = 0;
            for (boolean b : booleans) {
                if (b) n++;
            }
            return 0 == n;
        }
        

        这完全取决于您以后是否需要n 变量。

        【讨论】:

          猜你喜欢
          • 2012-04-26
          • 2014-05-06
          • 1970-01-01
          • 2012-06-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多