Il y a trop d'instructions if-else dans le système de l'entreprise. J'ai éliminé if-else avec des modèles de conception

J'ai utilisé une énumération pour éliminer l'instruction if-else dans l'article précédent. Si vous êtes intéressé, vous pouvez lire cet article:

"

Comment utiliser l'énumération pour éliminer if / else? - Utilisation avancée d'énumération

"

Cette fois, j'ai utilisé d'autres méthodes pour éliminer if-else.

Contexte

Vous devez utiliser des instructions if-else dans votre développement habituel. Cependant, un grand nombre d'instructions if-else ne sont pas propices à la lecture de code et affectent la complexité du code. Quoi qu'il en soit, j'ai eu mal à la tête en supprimant l'odeur de Sonar.

Il y avait trop de problèmes if-else dans le code de l'ancien système de l'entreprise, ce qui rendait le code inélégant. Pour expliquer ici, je simplifie la logique métier.

Supposons que je dispose d'une méthode pour calculer le prix réel, qui nécessite la saisie du niveau de l'utilisateur et du prix réel du produit, et renvoie le prix réel du produit. Le code est le suivant:

Voici levelle niveau de l'utilisateur, qui originalPriceest le prix d'origine du produit. Si le niveau utilisateur est "normal", le prix réel retourné est le prix d'origine multiplié par 1,0. Si le niveau d'utilisateur est "vip", le prix réel retourné est le prix d'origine multiplié par 0,9. Sinon, le prix d'origine est retourné.

En conséquence, le prix du "vip" est:

getActualPrice()测试的真实价格为:90.0

Le code ci-dessus peut sembler correct, mais le niveau de l'utilisateur peut également avoir super vip (svip) ou ssvip. Il peut y en avoir plus, alors cette méthode if-else sera très nombreuse. Et va souvent modifier cette méthode, qui viole le principe d'ouverture et de fermeture dans le principe de conception. Pour cette raison, je me demande si je peux réaliser une levelexpansion de niveau sans modifier cette méthode .

Utilisez des modèles de conception pour éliminer if-else

Après de longues délibérations, j'ai décidé d'utiliser des modèles de conception pour éliminer if-else.

CalculerStratégie

public interface CalculateStrategy {
    String userLevel();
    BigDecimal discount(BigDecimal originalPrice);
}

Ici, écrivez d'abord une interface de calcul, qui définit deux méthodes: l'obtention du niveau utilisateur et la méthode de calcul de prix correspondante.

NormalStratégie

@Component
public class NormalStrategy implements CalculateStrategy {
    @Override
    public String userLevel() {
        return "normal";
    }

    @Override
    public BigDecimal discount(BigDecimal originalPrice) {
        return originalPrice.multiply(new BigDecimal("1.0"));
    }
}

Classe d'implémentation de niveau normal.

@Component
public class VipStrategy implements CalculateStrategy {
    @Override
    public String userLevel() {
        return "vip";
    }

    @Override
    public BigDecimal discount(BigDecimal originalPrice) {
        return originalPrice.multiply(new BigDecimal("0.9"));
    }
}

Classe d'implémentation au niveau vip.

Notre code pour calculer le prix réel est le suivant:

Ici, j'ai créé une carte, la clé de la carte stocke le niveau utilisateur levelet la valeur stocke CalculateStrategyl'objet. Lorsque le système démarre, le conteneur IoC SaleServicecrée des objets, puis la carte stocke tous les CalculateStrategyobjets implémentés .

Ensuite, écrivez une getActualPriceWithStrategy()méthode pour calculer le prix réel du produit en fonction du niveau de l'utilisateur. Si l'utilisateur augmente le niveau, que vous devez ajouter la classe appropriée, telle que: SvipStrategy, SSvipStrategyet autres. De cette manière, il n'est pas nécessaire de modifier getActualPriceWithStrategy()le contenu et la sécurité de cette méthode est garantie.

Le code de test est le suivant:

Résultats de test:

getActualPriceWithStrategy()测试的真实价格为:90.0

En fait, j'ai utilisé le modèle de stratégie dans le modèle de conception ci-dessus. J'ai extrait l'algorithme dans if-else et l'ai encapsulé séparément dans une classe, de sorte que l'algorithme soit indépendant de l'appelant. Si vous modifiez l'algorithme, il vous suffit de changer la classe de l'algorithme, sans changer Votre interlocuteur.

Bien sûr, if-else ne peut pas être éliminé simplement en utilisant le mode stratégie, vous pouvez y penser:

"

Y a-t-il d'autres modèles de conception utilisés dans le code ci-dessus?

"

Recommandé dans le passé

Scannez le code QR pour devenir plus excitant. Ou recherchez Lvshen_9 sur WeChat , vous pouvez répondre pour obtenir des informations

1.回复"java" 获取java电子书;

2.回复"python"获取python电子书;

3.回复"算法"获取算法电子书;

4.回复"大数据"获取大数据电子书;

5.回复"spring"获取SpringBoot的学习视频。

6.回复"面试"获取一线大厂面试资料

7.回复"进阶之路"获取Java进阶之路的思维导图

8.回复"手册"获取阿里巴巴Java开发手册(嵩山终极版)

9.回复"总结"获取Java后端面试经验总结PDF版

10.回复"Redis"获取Redis命令手册,和Redis专项面试习题(PDF)

11.回复"并发导图"获取Java并发编程思维导图(xmind终极版)

Autre: cliquez sur [ Mes avantages ] pour avoir plus de surprises.

 

Je suppose que tu aimes

Origine blog.csdn.net/wujialv/article/details/109109402
conseillé
Classement