为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕雪6442864 2022-10-20 14:55:39
我有以下设置的代码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条件以便更容易阅读?还是不值得?
查看完整描述

5 回答

?
红颜莎娜

TA贡献1842条经验 获得超12个赞

你可以写一些类似的东西:

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

逻辑仍然相同,但可读性更高。拥有长链的and's or or's永远不会超级可读,但是在你有简单条件的地方做这样的事情,或者它们在一起,然后否定结果可以工作。


查看完整回答
反对 回复 2022-10-20
?
三国纷争

TA贡献1804条经验 获得超7个赞

为了更容易阅读,只需创建具有逻辑名称的小函数:


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");

}


查看完整回答
反对 回复 2022-10-20
?
长风秋雁

TA贡献1757条经验 获得超7个赞

我的偏好是其中之一:


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() );

}


查看完整回答
反对 回复 2022-10-20
?
撒科打诨

TA贡献1934条经验 获得超2个赞

要为已经给出的好答案添加另一种选择:


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;

}


查看完整回答
反对 回复 2022-10-20
?
子衿沉夜

TA贡献1828条经验 获得超3个赞

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


import org.apache.commns.lang3.StringUtils;


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

stripStart如何从字母数字文本中删除前导零?


查看完整回答
反对 回复 2022-10-20
  • 5 回答
  • 0 关注
  • 94 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信