[JAVA] Design / Codebeispiel für die Anzeige des Webanwendungsmenüs

Die Geschichte des Systems im Geschäft. Nachdem ich mich angemeldet hatte und die Bedingungen untersucht hatte, unter denen sich das Menü je nach Unternehmen und Personen ändert, dachte ich einmal: "Ist es nicht besser, eine Klasse zu verwenden?". Notieren Sie sich also Ihre Gedanken.

Aktueller Code

Die folgenden Unternehmensklassen und Benutzerklassen sind vorhanden, und Ansichten, die diese Informationen verwenden, werden implementiert. Hier wird angenommen, dass Getter und Setter von @ Data automatisch implementiert werden. Auch die magische Zahl sollte ursprünglich nicht verwendet werden, aber die Konstantisierung wird weggelassen.

Firmenklasse

Company.java



/**
 *Klasse zum Speichern von Unternehmensinformationen
 */
@Data
public class Company {
    private String companyId; //Firmen-ID
    private int option1Flg;   //Option 1 Flag (0 oder 1)
    private int option2Flg;   //Option 2 Flag (0 oder 1)
}

Benutzerklasse

User.java


/**
 *Klasse zum Speichern von Benutzerinformationen
 */
@Data
public class User {
    private String userId;  //Benutzeridentifikation
    private int userType;   //Benutzertyp (0: allgemeiner Benutzer, 1: Administrator)
}

Menüansicht

menu.jsp


<% if (company.getOption1Flg() == 1) { %>
    //Menü anzeigen 1
<% } %>
<% if (company.getOption2Flg() == 1) { %>
    //Menü anzeigen 2
<% } %>
<% if (user.getUserType() == 1
        && (company.getOption1Flg() == 1 || company.getOption2Flg() == 1)) { %>
    //Administratormenü anzeigen
<% } %>

Stellen Sie sich Unternehmen als Objekt der Unternehmensklasse und Benutzer als Objekt der Benutzerklasse vor.

Wenn jede Option 1 ist, wird grundsätzlich nur das entsprechende Menü angezeigt. Nur das Admin-Menü ist etwas Besonderes. Es wird angezeigt, wenn der Benutzer ein Admin ist und eine der Optionen 1 ist.

Ist es nicht ein Code, den Sie schon eine Weile gesehen haben? Derzeit gibt es auf den ersten Blick kein Problem.

Code nach Spezifikationsänderung (schlechtes Beispiel)

Ich musste die Spezifikationen wie folgt ändern.

Lassen Sie uns dies noch einmal codieren, aber zuerst folgen wir dem Originalformat.

Firmenklasse

Company.java



/**
 *Klasse zum Speichern von Unternehmensinformationen
 */
@Data
public class Company {
    private String companyId; //Firmen-ID
    private int option1Flg;   //Option 1 Flag (0 oder 1)
    private int option2Flg;   //Option 2 Flag (0 oder 1)
    private int option3Flg;   //Option 3 Flag (0 oder 1)
    private int option4Flg;   //Option 4 Flag (0 oder 1)
    private int option5Flg;   //Option 5 Flag (0 oder 1)
}

Benutzerklasse

User.java


/**
 *Klasse zum Speichern von Benutzerinformationen
 */
@Data
public class User {
    private String userId;  //Benutzeridentifikation
    private int userType;   //Benutzertyp (0: allgemeiner Benutzer, 1: Administrator, 2: Leser)
}

Menüansicht

menu.jsp


<% if (company.getOption1Flg() == 1) { %>
    //Menü anzeigen 1
<% } %>
<% if (company.getOption2Flg() == 1) { %>
    //Menü anzeigen 2
<% } %>
<% if (user.getUserType() == 2 && company.getOption3Flg() == 3) { %>
    //Menü anzeigen 3
<% } %>
<% if (user.getUserType() == 2 && company.getOption4Flg() == 4) { %>
    //Menü anzeigen 4
<% } %>
<% if (user.getUserType() == 2 && company.getOption5Flg() == 5) { %>
    //Menü anzeigen 5
<% } %>
<% if (user.getUserType() == 1
        && (company.getOption1Flg() == 1 || company.getOption2Flg() == 1) 
            || company.getOption3Flg() == 1) || company.getOption4Flg() == 1)) { %>
    //Administratormenü anzeigen
<% } %>

Die Menüansicht kann weiterhin identifiziert werden, aber Sie können sehen, dass der Code ziemlich problematisch geworden ist. Wenn die Spezifikationen in Zukunft geändert werden, denke ich, wird es schlecht sein.

Lösung: Fügen Sie eine Menüklasse hinzu

Ich denke, es gibt verschiedene Lösungen, aber ich werde es so gestalten, dass eine Menüklasse hinzugefügt wird. Gleichzeitig fügt die vorhandene Klasse eine Zustandsbestimmungsmethode hinzu.

Firmenklasse

Company.java



/**
 *Klasse zum Speichern von Unternehmensinformationen
 */
@Data
public class Company {
    private String companyId; //Firmen-ID
    private int option1Flg;   //Option 1 Flag (0 oder 1)
    private int option2Flg;   //Option 2 Flag (0 oder 1)
    private int option3Flg;   //Option 3 Flag (0 oder 1)
    private int option4Flg;   //Option 4 Flag (0 oder 1)
    private int option5Flg;   //Option 5 Flag (0 oder 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();
    }
}

Benutzerklasse

User.java


/**
 *Klasse zum Speichern von Benutzerinformationen
 */
@Data
public class User {
    private String userId;  //Benutzeridentifikation
    private int userType;   //Benutzertyp (0: allgemeiner Benutzer, 1: Administrator, 2: Leser)

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

Menüklasse

User.java


/**
 *Menüklasse
 */
@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();
    }
}

Menüansicht

menu.jsp



<% if (menu.isEnabledMenu1()) { %>
    //Menü anzeigen 1
<% } %>
<% if (menu.isEnabledMenu2()) { %>
    //Menü anzeigen 2
<% } %>
<% if (menu.isEnabledMenu3()) { %>
    //Menü anzeigen 3
<% } %>
<% if (menu.isEnabledMenu4()) { %>
    //Menü anzeigen 4
<% } %>
<% if (menu.isEnabledMenu5()) { %>
    //Menü anzeigen 5
<% } %>
<% if (menu.isEnabledAdminMenu()) { %>
    //Administratormenü anzeigen
<% } %>

Nach der Verbesserung denke ich, dass die Anzeigebedingungen des Menüs und der Status des Unternehmens und der Benutzer sehr einfach zu verstehen sind. In einer realen Anwendung ist es möglich, eine Klasse zu erstellen, die einem Menü wie MenuItem entspricht, und diese Klasse eine Entscheidung treffen zu lassen. Dieser Artikel wird jedoch hier beendet.

Schließlich: Seien Sie vorsichtig, wenn der Benutzer beginnt, den Wert zu beurteilen

In diesem Beispiel gab es ein Problem beim direkten Bestimmen des Status des Unternehmens oder Benutzers in der Menüansicht. Allerdings in Objektorientierung

** Nicht fragen, bestellen **

Ist die Grundidee. Es hängt von der Verantwortung der Klasse ab, aber lassen wir die Verarbeitung der Seite mit dem Wert überlassen.

Diese Art von Code wird häufig in älteren Projekten angezeigt. Meistens außer Kontrolle geraten, ist es normalerweise das Ergebnis, mit diesen kleinen Pausen zu beginnen und sie nicht zu überarbeiten. Wenn möglich, seien Sie beim Refactoring proaktiv.

Recommended Posts

Design / Codebeispiel für die Anzeige des Webanwendungsmenüs
Anwendungsbeispiel für Entwurfsmuster (Nr. 1)