Compte tenu de cette classe de configuration, l'odeur de code est là, qu'il y a beaucoup de déclarations. Il y aura également beaucoup plus de variables de classe qui seront ajoutées. En fait, je crée cet objet mailconfig avec une méthode statique de l'usine de produits de base qui prendra une liste d'attributs. Maintenant, comme vous pouvez le constater dans la carteConfig, il est de la même manière que définissez les valeurs de la messagerie. Mais il y aura également des attributs spéciaux qui ont besoin d'une manipulation plus complexe. Comment puis-je refrorcer cela pour réduire la quantité d'IFS? Par exemple, comme suit, il y aura un nouveau ceci nécessaire pour ajouter un nouveau si dans la méthode MapToconfig aussi ... P> 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 Réponses :
Vous pouvez utiliser si / sinon, pour partir lorsque l'une des conditions est vraie ou utilisez un étui de commutation pour faire de même.
Vous devez vérifier que ATTNAMEIS n'est pas null, et AttribValueis non nulle non plus. p> ne passe que les attributs nécessaires, pas l'objet d'attribut entier. P> P>
Utilisez-vous Java 8+? Si oui, vous pouvez utiliser une carte
Vous pouvez utiliser une carte statique de type mappe
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);
}
}
semble intéressant, n'a pas utilisé de biconsumer auparavant, jettera un coup d'œil à.