Как провести рефакторинг для сокращения операторов if? - PullRequest
0 голосов
/ 19 июня 2020

Учитывая этот класс конфигурации, чувствуется запах кода, так как здесь слишком много операторов if. Также будет добавлено намного больше переменных класса. На самом деле я создаю этот объект MailConfig с помощью фабричного метода stati c fromAttributes, который будет принимать список атрибутов. Теперь, как вы можете видеть в mapToConfig, это то же самое, поэтому установите значения MailConfig. Но будут также специальные атрибуты, требующие более сложной обработки. Как я могу провести рефакторинг, чтобы уменьшить количество «если»? Например, следующим будет новый

private final String mailServer

, это потребует добавления нового if в метод mapToConfig ...

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

Ответы [ 3 ]

1 голос
/ 19 июня 2020

Вы используете 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
    }
}
0 голосов
/ 19 июня 2020

Вы можете использовать stati c карту типа Map<String, BiConsumer<MailConfigBuilder, Attribute>>, чтобы избавиться от блока if else

import lombok.Builder;
import lombok.Data;

import java.util.List;
import java.util.Map;
import java.util.HashMap;
import java.util.Objects;
import java.util.function.BiConsumer;

@Data
@Builder
public class MailConfig {

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

    private static final Map<String, BiConsumer<MailConfigBuilder, Attribute>> map = new HashMap<>();

    static {
        map.put("subject",    (mailConfBuil, atr) -> {mailConfBuil.subject(atr.getAttribValue());});
        map.put("mailserver", (mailConfBuil, atr) -> {mailConfBuil.mailserver(atr.getAttribValue());});
        map.put("message",    (mailConfBuil, atr) -> {mailConfBuil.message(atr.getAttribValue());});
    }

    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) {
        map.get(att.getAttribName()).accept(config, att);
    }
}
0 голосов
/ 19 июня 2020

Вы можете использовать if / else, чтобы выйти, когда одно из условий истинно, или использовать случай переключения, чтобы сделать то же самое.

Вы должны убедиться, что attName не равно null, а attribValue тоже не равно .

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;
    }

}

Передавать только необходимые атрибуты, а не весь объект Attribute.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...