猿问

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

我有以下设置的代码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声明,一切都是否定价值观。有没有更好的方法来编写idArmPlana条件以便更容易阅读?还是不值得?


慕雪6442864
浏览 150回答 5
5回答

红颜莎娜

你可以写一些类似的东西:!(idArmPlana == null || idArmPlana.isEmpty() || idArmPlana.equals("0000"))逻辑仍然相同,但可读性更高。拥有长链的and's or or's永远不会超级可读,但是在你有简单条件的地方做这样的事情,或者它们在一起,然后否定结果可以工作。

三国纷争

为了更容易阅读,只需创建具有逻辑名称的小函数: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");}

长风秋雁

我的偏好是其中之一: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;}重写以删除默认的“空”值。拥有这样的价值是有问题的。考虑一下逻辑是否要复杂得多。拥有默认值会剥夺编译器检测未处理案例的机会。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;    }}辅助方法:// 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() );}

撒科打诨

要为已经给出的好答案添加另一种选择: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;}

子衿沉夜

使用 Apache commons-lang3 库,您可以:import org.apache.commns.lang3.StringUtils;if (StringUtils.isNotBlank(StringUtils.stripStart(idArmPlana,"0")))stripStart从如何从字母数字文本中删除前导零?
随时随地看视频慕课网APP

相关分类

Java
我要回答