4

我有一些以非常神秘的方式编写的代码。对于我以外的任何人来说,这肯定是一场维护噩梦。

它是字符串连接、三元运算符和使用+运算符连接的混搭。

所以我的问题是如何使这个语句可读?

tb.setTally_narration(
     tb.getTally_mode().equals("Ca") ? 
        "Receipt No. "
             .concat(tb.getTally_receipt_no())
             .concat(", "+tb.getTally_mode()) : 
        "Receipt No. "
             .concat(tb.getTally_receipt_no()+", "+tb.getTally_mode())
             .concat(", "+tb.getTally_instrument_no()+", "+tb.getTally_instrument_date()+", "+tb.getTally_instrument_bank())
);

编辑:我意识到这个问题是主观的。而且我觉得它属于codereview stackexchange网站。可以移到那里吗?

4

3 回答 3

4

这里有很多选择,但如果可维护性是您的目标(通常应该如此),那么请稍微冗长一些。

  • 使用 if-then 而不是 ?:
  • 使用 + 而不是 concat()
  • 使用一个或两个临时变量(编译器将对其进行优化)

所以:

String narration = "Receipt No.";

if (tb.getTally_mode().equals("Ca")) {
    narration += tb.getTally_receipt_no() 
              +  ", "
              +  tb.getTally_mode();
} else {
    narration += tb.getTally_receipt_no()
              +  ", "
              +  tb.getTally_mode()
              +  ", "
              +  tb.getTally_instrument_no()
              +  ", "
              +  tb.getTally_instrument_date()
              +  ", "
              +  tb.getTally_instrument_bank();
}

tb.setTally_narration(narration);
于 2013-09-03T17:53:56.583 回答
4
  String rNum    = tb.getTallyReceiptNum();
  String mode    = tb.getTallyMode();
  String iNum    = tb.getTallyInstrumentNum();
  String iDate   = tb.getTallyInstrumentDate();
  String iBank   = tb.getTallyInstrumentBank();

  String narration = String.format("Receipt No. %s, %s", rNum, mode);

  if(! "Ca".equals(mode)){
    narration = String.format("%s, %s, %s, %s", narration, iNum, iDate, iBank);
  }
  1. Java 格式的方法名称。
  2. String.format()允许将来进行格式更改。
  3. 调用equals()非空字符串(“Ca”),减少可能发生 NPE 的机会。
于 2013-09-03T18:16:20.567 回答
4

由于字符串的第一行似乎相同,我将其简单地写为:

StringBuilder narration = new StringBuilder("Receipt No. ");

narration.append(tb.getTally_receipt_no())
         .append(", ").append(tb.getTally_mode());
if (!"Ca".equals(tb.getTally_mode()))
{
    narration.append(", ").append(tb.getTally_instrument_no())
             .append(", ").append(tb.getTally_instrument_date())
             .append(", ").append(tb.getTally_instrument_bank());
}

tb.setTally_narration(narration.toString());
于 2013-09-03T18:17:10.487 回答