提问者:小点点

如何重构以减少if语句?


给出这个config类的代码气味是存在的,即有很多if语句。 此外,还将添加更多的类变量。 实际上,我是用一个静态工厂方法fromAttributes创建这个MailConfig对象的,它将接受一个属性列表。 现在,正如您在mapToConfig中看到的,设置mailconfig值的方式是相同的。 但是也会有一些特殊的属性需要更复杂的处理。 我如何重构它,以减少IFS的数量? 例如,接下来将有一个新的

private final String mailServer

在mapToConfig方法中添加新if时也需要这样做。。。

    import lombok.Builder;
    import lombok.Data;

    import java.util.List;
    import java.util.Objects;

    @Data
    @Builder
    public class MailConfig {

        private final String subject;
        private final String mailserver;
        private final String message;


        public static MailConfig fromAttributes(List<Attribute> listofAttributes) {
            Objects.requireNonNull(listofAttributes, "list of attributes must not be null");
            MailConfigBuilder config = MailConfig.builder();
            listofAttributes.stream()
                    .forEach(att -> mapToConfig(config, att));
            return config.build();
        }

        private static void mapToConfig(MailConfigBuilder config, Attribute att) {
            if (att.getAttribName().equalsIgnoreCase("subject")){
                config.subject(att.getAttribValue());
            }
            if (att.getAttribName().equalsIgnoreCase("mailserver")){
                config.mailserver(att.getAttribValue());
            }
            if (att.getAttribName().equalsIgnoreCase("message")){
                config.message(att.getAttribValue());
            }
        }
    }

共2个答案

匿名用户

您可以使用if/else,在其中一个条件为真时离开,或者使用switch case来执行同样的操作。

您必须验证attName不为null,并且attribValuei也不为null。

private static void mapToConfig(MailConfigBuilder config, String attName, String attribValue) {

    switch (attName.toLowerCase()) {
        case "subject":
            config.subject(attribValue);
            break;
        case "mailserver":
            config.mailserver(attribValue);
            break;              
        case "message":
            config.message(attribValue);
            break;
        default:
            break;
    }

}

只传递所需的属性,而不是整个属性对象。

匿名用户

你在用Java 8+吗? 如果是,你可以使用地图

class MapExample {

    public static void mapper(Object o) throws Exception {
        //initializing here, really should do this outside the function of course
        Map<String, Runnable> routes = new HashMap<>();

        //populate map
        routes.put('subject', () -> config.subject(o.getAttribValue));
        //and so on, for all cases

        //use like this
        String example = att.getAttribName();
        routes.get(example).run();   // runs the method mapped to "subject" above
    }
}