[JAVA] Exemple de conception / code des conditions d'affichage du menu de l'application Web

L'histoire du système en entreprise. Après m'être connecté, lorsque j'ai étudié les conditions dans lesquelles le menu change en fonction de l'entreprise et des personnes, je me suis dit "N'est-il pas préférable d'utiliser le cours?", Alors prenez note de vos réflexions.

Code actuel

Les classes d'entreprise et les classes d'utilisateurs suivantes existent, et les vues qui utilisent ces informations sont implémentées. Ici, getter et setter sont supposés être implémentés automatiquement par @ Data. De plus, le nombre magique ne doit pas être utilisé à l'origine, mais la constance est omise.

Classe d'entreprise

Company.java



/**
 *Classe pour stocker les informations sur l'entreprise
 */
@Data
public class Company {
    private String companyId; //ID de l'entreprise
    private int option1Flg;   //Indicateur de l'option 1 (0 ou 1)
    private int option2Flg;   //Indicateur de l'option 2 (0 ou 1)
}

Classe d'utilisateurs

User.java


/**
 *Classe pour stocker les informations utilisateur
 */
@Data
public class User {
    private String userId;  //Identifiant d'utilisateur
    private int userType;   //Type d'utilisateur (0: utilisateur général, 1: administrateur)
}

Vue du menu

menu.jsp


<% if (company.getOption1Flg() == 1) { %>
    //Afficher le menu 1
<% } %>
<% if (company.getOption2Flg() == 1) { %>
    //Afficher le menu 2
<% } %>
<% if (user.getUserType() == 1
        && (company.getOption1Flg() == 1 || company.getOption2Flg() == 1)) { %>
    //Afficher le menu administrateur
<% } %>

Considérez la société comme un objet de la classe Entreprise et l'utilisateur comme un objet de la classe Utilisateur.

Fondamentalement, si chaque option est 1, il affiche simplement le menu respectif. Seul le menu admin est spécial, il sera affiché si l'utilisateur est un administrateur et l'une des options est 1.

N'est-ce pas un code que vous avez vu depuis un moment? À l'heure actuelle, il n'y a pas de problème à première vue.

Code après changement de spécification (mauvais exemple)

J'ai dû modifier les spécifications comme suit.

--Ajouter un lecteur au type d'utilisateur --Ajouter des options 3-5

Codons cela à nouveau, mais suivons d'abord le format d'origine.

Classe d'entreprise

Company.java



/**
 *Classe pour stocker les informations sur l'entreprise
 */
@Data
public class Company {
    private String companyId; //ID de l'entreprise
    private int option1Flg;   //Indicateur de l'option 1 (0 ou 1)
    private int option2Flg;   //Indicateur de l'option 2 (0 ou 1)
    private int option3Flg;   //Indicateur de l'option 3 (0 ou 1)
    private int option4Flg;   //Drapeau de l'option 4 (0 ou 1)
    private int option5Flg;   //Drapeau de l'option 5 (0 ou 1)
}

Classe d'utilisateurs

User.java


/**
 *Classe pour stocker les informations utilisateur
 */
@Data
public class User {
    private String userId;  //Identifiant d'utilisateur
    private int userType;   //Type d'utilisateur (0: utilisateur général, 1: administrateur, 2: lecteur)
}

Vue du menu

menu.jsp


<% if (company.getOption1Flg() == 1) { %>
    //Afficher le menu 1
<% } %>
<% if (company.getOption2Flg() == 1) { %>
    //Afficher le menu 2
<% } %>
<% if (user.getUserType() == 2 && company.getOption3Flg() == 3) { %>
    //Afficher le menu 3
<% } %>
<% if (user.getUserType() == 2 && company.getOption4Flg() == 4) { %>
    //Afficher le menu 4
<% } %>
<% if (user.getUserType() == 2 && company.getOption5Flg() == 5) { %>
    //Afficher le menu 5
<% } %>
<% if (user.getUserType() == 1
        && (company.getOption1Flg() == 1 || company.getOption2Flg() == 1) 
            || company.getOption3Flg() == 1) || company.getOption4Flg() == 1)) { %>
    //Afficher le menu administrateur
<% } %>

La vue du menu peut toujours être identifiée, mais vous pouvez voir que le code est devenu assez gênant. Si les spécifications sont modifiées à l'avenir, je pense que ce sera mauvais.

Solution: ajoutez une classe de menu

Je pense qu'il existe différentes solutions, mais je vais le concevoir pour ajouter une classe de menu. En même temps, la classe existante ajoutera également une méthode de détermination d'état.

Classe d'entreprise

Company.java



/**
 *Classe pour stocker les informations sur l'entreprise
 */
@Data
public class Company {
    private String companyId; //ID de l'entreprise
    private int option1Flg;   //Indicateur de l'option 1 (0 ou 1)
    private int option2Flg;   //Indicateur de l'option 2 (0 ou 1)
    private int option3Flg;   //Indicateur de l'option 3 (0 ou 1)
    private int option4Flg;   //Drapeau de l'option 4 (0 ou 1)
    private int option5Flg;   //Drapeau de l'option 5 (0 ou 1)

    public boolean isEnabledOption1() {
        return option1Flg == 1;
    }
    public boolean isEnabledOption2() {
        return option2Flg == 1;
    }
    public boolean isEnabledOption3() {
        return option3Flg == 1;
    }
    public boolean isEnabledOption4() {
        return option4Flg == 1;
    }
    public boolean isEnabledOption5() {
        return option5Flg == 1;
    }
    public boolean isEnabledAdminOption() {
        return isEnabledOption1() 
            || isEnabledOption2() 
            || isEnabledOption3() 
            || isEnabledOption4();
    }
}

Classe d'utilisateurs

User.java


/**
 *Classe pour stocker les informations utilisateur
 */
@Data
public class User {
    private String userId;  //Identifiant d'utilisateur
    private int userType;   //Type d'utilisateur (0: utilisateur général, 1: administrateur, 2: lecteur)

    public boolean isNormalUser() {
        return userType == 0;
    }
    public boolean isAdmin() {
        return userType == 1;
    }
    public boolean isLeader() {
        return userType == 2;
    }
}

Classe de menu

User.java


/**
 *Classe de menu
 */
@RequiredArgsConstructor
@Getter
public class Menu {
    private final Company company;
    private final User user;

    public boolean isEnabledMenu1() {
        return company.isEnabledOption1();
    }

    public boolean isEnabledMenu2() {
        return company.isEnabledOption2();
    }

    public boolean isEnabledMenu3() {
        return user.isLeader() && company.isEnabledOption3();
    }

    public boolean isEnabledMenu4() {
        return user.isLeader() && company.isEnabledOption4();
    }

    public boolean isEnabledMenu5() {
        return user.isLeader() && company.isEnabledOption5();
    }

    public boolean isEnabledAdminMenu() {
        return user.isAdmin() && company.isEnabledAdminOption();
    }
}

Vue du menu

menu.jsp



<% if (menu.isEnabledMenu1()) { %>
    //Afficher le menu 1
<% } %>
<% if (menu.isEnabledMenu2()) { %>
    //Afficher le menu 2
<% } %>
<% if (menu.isEnabledMenu3()) { %>
    //Afficher le menu 3
<% } %>
<% if (menu.isEnabledMenu4()) { %>
    //Afficher le menu 4
<% } %>
<% if (menu.isEnabledMenu5()) { %>
    //Afficher le menu 5
<% } %>
<% if (menu.isEnabledAdminMenu()) { %>
    //Afficher le menu administrateur
<% } %>

Après l'amélioration, je pense que les conditions d'affichage du menu et le statut de l'entreprise et des utilisateurs sont devenus très faciles à comprendre. Dans une application réelle, il est possible de créer une classe qui correspond à un menu tel que MenuItem et de laisser cette classe prendre une décision, mais cet article s'arrêtera ici.

Enfin: soyez prudent lorsque l'utilisateur commence à juger de la valeur

Dans cet exemple, un problème est survenu lors du démarrage de la détermination directe de l'état de l'entreprise ou de l'utilisateur dans la vue du menu. Cependant, dans l'orientation objet

** Ne demandez pas, commandez **

C'est l'idée de base. Cela dépend de la responsabilité de la classe, mais laissons le traitement de côté avec la valeur.

Vous verrez souvent ce type de code dans les projets hérités. La plupart du temps hors de contrôle, c'est généralement le résultat de commencer par ces petites pauses et de les laisser non refactorisées. Si possible, soyez proactif dans la refactorisation.

Recommended Posts

Exemple de conception / code des conditions d'affichage du menu de l'application Web
Exemple d'application du modèle de conception (n ° 1)