2008-08-29 4 views
1

Ich habe ein kleines Dilemma, dass Sie vielleicht mir helfen können, auszusortieren.Klasse Design Entscheidung

Ich habe heute an der Änderung der ASP.NET-Mitgliedschaft gearbeitet, um eine Ebene der Indirektion hinzuzufügen. Grundsätzlich unterstützt die Mitgliedschaft von ASP.NET Benutzer und Rollen, wobei alle Autorisierungsregeln darauf basieren, ob ein Benutzer zu einer Rolle gehört oder nicht.

Was ich tun muss, ist das Konzept der Funktion hinzufügen, wo ein Benutzer zu einer Rolle (oder Rollen) gehören wird und die Rolle eine oder mehrere Funktionen zugeordnet werden, so dass wir eine bestimmte Aktion basierend zulassen können wenn der Benutzer zu einer Rolle gehört, der eine Funktion zugewiesen ist.

Nachdem das gesagt wurde, hat mein Problem nichts damit zu tun, es ist ein generisches Klassenentwurfsproblem.

Ich möchte eine abstrakte Methode in meiner Basis RoleProvider-Klasse zur Verfügung stellen, um die Funktion zu erstellen (und beibehalten), aber ich möchte es optional eine Beschreibung für diese Funktion zu speichern, also muss ich meine CreateFunction-Methode mit erstellen eine Überladung, wobei eine Unterschrift den Namen akzeptiert und die andere den Namen und die Beschreibung annimmt.

Ich kann eines der folgenden Szenarien denkt:

  1. Erstellen beiden Signaturen mit dem abstrakten Modifikator. Dies hat das Problem, dass der Implementierer die Best Practice, die besagt, dass eine Überladung die andere mit den normalisierten Parametern aufrufen sollte, nicht respektieren sollte, und die Logik sollte nur in der letzten sein (die mit allen Parametern). Außerdem ist es nicht schön, dass beide Methoden vom Entwickler implementiert werden müssen.

  2. Erstellen Sie die erste wie virtuelle, und die zweite wie abstrakt. Rufen Sie die Sekunde von Anfang an auf, und erlauben Sie dem Implementierer, das Verhalten zu überschreiben. Es hat das gleiche Problem, der Implementierer könnte beim Überschreiben "schlechte Entscheidungen" treffen.

  3. Gleich wie zuvor, aber nicht zulassen, dass die erste überschrieben wird (entfernen Sie den virtuellen Modifikator). Das Problem hierbei ist, dass der Implementierer sich bewusst sein muss, dass die Methode mit einer Nullbeschreibung aufgerufen werden kann und damit umgehen muss.

Ich denke, die beste Option, die dritte ist ...

Wie dieses Szenario im Allgemeinen behandelt wird? Wenn Sie eine abstrakte Klasse entwerfen, enthält sie überladene Methoden. Es ist nicht ungewöhnlich, dass ich glaube, ...

Antwort

1

Ich fühle mich die beste Kombination aus Trockenheit und zwingt den Vertrag ist, wie (in Pseudo-Code) folgt:

class Base { 
    public final constructor(name) { 
    constructor(name, null) 
    end 

    public abstract constructor(name, description); 
} 

oder alternativ:

class Base { 
    public abstract constructor(name); 

    public final constructor(name, description) { 
    constructor(name) 
    this.set_description(description) 
    } 

    private final set_description(description) { 
    ... 
    } 
} 

Es gibt eine Regel in Java, die diese Entscheidung unterstützt: "Niemals nicht-finale Methoden von einem Konstruktor aufrufen."

0

Um den ersten Teil Ihres Beitrags zu beantworten, sehen Sie sich AzMan (Authorization Manager) an, der übrigens in Windows integriert ist. Es hat die Fähigkeit, Operationen zu spezifizieren, die in Rollen neu kombiniert oder direkt Benutzern zugewiesen werden können.

Check out

Um den zweiten Teil Ihrer Frage zu beantworten, würde ich nicht eine abstrakte Klasse verwenden. Stellen Sie stattdessen einfach die Funktionalität im Konstruktor zur Verfügung und machen Sie damit fertig. Es bewirkt, dass Sie das angegebene Verhalten wünschen und dass es nicht geändert werden soll. Warum sollten die Nachkommen gezwungen werden, die Implementierung bereitzustellen?

Verwandte Themen