简化条件逻辑以提高可读性

时间:2019-04-24 15:14:07

标签: java

我有以下代码设置了plot.new()

vrstaProizvoda

看着private String napraviVrstuProizvoda(String kreditJeAktivanKod, String idArmPlana) { String vrstaProizvoda = null; if (kreditJeAktivanKod != null && kreditJeAktivanKod.equals("Y")) { vrstaProizvoda = VrstaProizvoda.STEP.value(); } else if (idArmPlana != null && !idArmPlana.isEmpty() && !idArmPlana.equals("0000")){ vrstaProizvoda = VrstaProizvoda.ARM.value(); } return vrstaProizvoda; } 语句,一切都在否定值。有没有更好的方式来编写else if条件,以便于阅读?还是不值得?

6 个答案:

答案 0 :(得分:2)

您可以按照以下方式写点东西:

!(idArmPlana == null || idArmPlana.isEmpty() || idArmPlana.equals("0000"))

逻辑仍然相同,但可读性更高。拥有长的and's or or's链永远都不是 super 可读的,但是在您拥有简单条件或将它们在一起的情况下进行此类操作,然后取反就可以了。

答案 1 :(得分:2)

要使其更易于阅读,只需创建具有逻辑名称的小函数:

private String napraviVrstuProizvoda(String kreditJeAktivanKod, String idArmPlana) {
    String vrstaProizvoda = null;
    if (isYes(kreditJeAktivanKod)) {
        vrstaProizvoda = VrstaProizvoda.STEP.value();
    } else if (!isZero(idArmPlana)){
        vrstaProizvoda = VrstaProizvoda.ARM.value();
    }
    return vrstaProizvoda;

}

function boolean isYes(String string){
  return (null != string && string.equals("Y");
}

function boolean isZero(String string){
 return (null != string && !string.isEmpty() && string.equals("0000");
}

答案 2 :(得分:1)

不确定Arrays.asList,但是重复出现的idArmPlana只能使用一次:

return "Y".equals(kreditJeAktivanKod)
        ? VrstaProizvoda.STEP.value()
        : !Arrays.<String>asList("", "0000", null).contains(idArmPlana)
        ? VrstaProizvoda.ARM.value()
        : null;

答案 3 :(得分:1)

使用Apache commons-lang3库,您可以:

import org.apache.commns.lang3.StringUtils;

if (StringUtils.isNotBlank(StringUtils.stripStart(idArmPlana,"0")))

stripStartHow to remove leading zeros from alphanumeric text?被盗

答案 4 :(得分:1)

我的偏好是其中之一:

private String napraviVrstuProizvoda(String kreditJeAktivanKod, String idArmPlana) {
    if ( (kreditJeAktivanKod != null) && kreditJeAktivanKod.equals("Y") ) {
        return VrstaProizvoda.STEP.value();
    } else if ( (idArmPlana != null) && !idArmPlana.isEmpty() && !idArmPlana.equals("0000") ) {
        return VrstaProizvoda.ARM.value();
    } else {
        return null;
    }
}

private String napraviVrstuProizvoda(String kreditJeAktivanKod, String idArmPlana) {
    if ( strEquals(kreditJeAktivanKod, "Y") ) {
        return VrstaProizvoda.STEP.value();
    } else if ( !strIsEmpty(idArmPlana) && !strEquals(idArmPlana, "0000") ) {
        return VrstaProizvoda.ARM.value();
    } else {
        return null;
    }
}

这里有许多重写,以显示一系列替代方法,并显示如何通过增量调整达到上述要求:

用更多的空格和括号重写。这样可以更轻松地挑选出长变量名,并使读者无需组织表达式逻辑:

private String napraviVrstuProizvoda(String kreditJeAktivanKod, String idArmPlana) {
    String vrstaProizvoda = null;
    if ( (kreditJeAktivanKod != null) && kreditJeAktivanKod.equals("Y") ) {
        vrstaProizvoda = VrstaProizvoda.STEP.value();
    } else if ( (idArmPlana != null) && !idArmPlana.isEmpty() && !idArmPlana.equals("0000") ) {
        vrstaProizvoda = VrstaProizvoda.ARM.value();
    }
    return vrstaProizvoda;
}

重写以删除默认的“ null”值。具有这样的价值是有问题的。考虑一下逻辑是否更为复杂。具有默认值将使编译器没有机会检测未处理的情况。

private String napraviVrstuProizvoda(String kreditJeAktivanKod, String idArmPlana) {
    String vrstaProizvoda;
    if ( (kreditJeAktivanKod != null) && kreditJeAktivanKod.equals("Y") ) {
        vrstaProizvoda = VrstaProizvoda.STEP.value();
    } else if ( (idArmPlana != null) && !idArmPlana.isEmpty() && !idArmPlana.equals("0000") ) {
        vrstaProizvoda = VrstaProizvoda.ARM.value();
    } else {
        vrstaProizvoda = null;
    }
    return vrstaProizvoda;
}

用多个返回值重写。这是我的偏爱,但有些人更喜欢单一的return语句,就像原始方法中那样。

private String napraviVrstuProizvoda(String kreditJeAktivanKod, String idArmPlana) {
    if ( (kreditJeAktivanKod != null) && kreditJeAktivanKod.equals("Y") ) {
        return VrstaProizvoda.STEP.value();
    } else if ( (idArmPlana != null) && !idArmPlana.isEmpty() && !idArmPlana.equals("0000") ) {
        return VrstaProizvoda.ARM.value();
    } else {
        return null;
    }
}

使用辅助方法重写(请参见下文)。这一点更加清晰,但是却以模糊测试逻辑为代价。在实践中,尽管经常鼓励将代码拆分为许多小方法,但在实践中并非总是如此。

private String napraviVrstuProizvoda(String kreditJeAktivanKod, String idArmPlana) {
    if ( strEquals(kreditJeAktivanKod, "Y") ) {
        return VrstaProizvoda.STEP.value();
    } else if ( !strIsEmpty(idArmPlana) && !strEquals(idArmPlana, "0000") ) {
        return VrstaProizvoda.STEP.value();
    } else {
        return null;
    }
}

Helper方法:

// Test that two strings are equal.  Handle null values.
private boolean strEquals(String value1, String value2) {
    if ( value1 == null ) {
        return ( value2 == null );
    } else if ( value2 == null ) {
        return false;
    } else {
        return value1.equals(value2);
    }
}

// Test that two strings are equal.  Handle null values.
private boolean strEquals(String value1, String value2) {
    boolean result;
    if ( value1 == null ) {
        result = ( value2 == null );
    } else if ( value2 == null ) {
        result = false;
    } else {
        result = value1.equals(value2);
    }
    return result;
}

// Test if a string is neither null nor empty.
private boolean strIsNotEmpty(String value) {
    return ( (value != null) && !value.isEmpty() );
}

答案 5 :(得分:1)

为已经给出的好答案添加另一种替代方法:

private String napraviVrstuProizvoda(String kreditJeAktivanKod, String idArmPlana) {
    return Optional.ofNullable(kreditJeAktivanKod).filter(e->e.equals("Y"))
           .isPresent()? VrstaProizvoda.STEP.value() :
           Optional.ofNullable(idArmPlana).filter(e->!e.equals("0000")).filter(e->!e.isEmpty())
           .isPresent()? VrstaProizvoda.ARM.value(): 
            null;
}
相关问题