Zuallererst beachten Sie bitte, dass so etwas entity.underlyingEntity.underlyingEntity.method()
nach dem Gesetz von Demeter als Code-Geruch betrachtet wird . Auf diese Weise legen Sie dem Verbraucher viele Implementierungsdetails offen. Und jeder Bedarf an Erweiterung oder Modifikation eines solchen Systems wird sehr schaden.
Daher würde ich Ihnen empfehlen, eine HasRole
oder IsAdmin
-Methode für den User
Kommentar von CodesInChaos zu verwenden. Auf diese Weise bleibt die Art und Weise, wie die Rollen auf dem Benutzer implementiert werden, ein Implementierungsdetail für den Verbraucher. Und es fühlt sich auch natürlicher an, den Benutzer nach seiner Rolle zu fragen, anstatt ihn nach Details seiner Rolle zu fragen und dann basierend darauf zu entscheiden.
Vermeiden Sie bitte auch die Verwendung von string
s, sofern dies nicht erforderlich ist. name
ist ein gutes Beispiel für eine string
Variable, da der Inhalt vorher nicht bekannt ist. Auf der anderen Seite so etwas wierole
wenn Sie beispielsweise zwei unterschiedliche Werte haben, die zum Zeitpunkt der Kompilierung bekannt sind, eine starke Typisierung verwenden. Hier kommt der Aufzählungstyp ins Spiel ...
Vergleichen Sie
public bool HasRole(string role)
mit
public enum Role { Admin, User }
public bool HasRole(Role role)
Der zweite Fall gibt mir viel mehr Vorstellung davon, was ich herumreichen sollte. Es verhindert auch, dass ich fälschlicherweise einen ungültigen Code weitergebe, string
falls ich keine Ahnung von Ihren Rollenkonstanten hatte.
Als nächstes wird entschieden, wie die Rolle aussehen soll. Sie können entweder die direkt auf dem Benutzer gespeicherte Aufzählung verwenden:
public enum Role
{
Admin,
User
}
public class User
{
private Role _role;
public bool HasRole(Role role)
{
return _role == role;
}
// or
public bool IsAdmin()
{
return _role == Role.Admin;
}
}
Wenn Sie möchten, dass sich Ihre Rolle selbst verhält, sollte sie die Details darüber, wie über ihren Typ entschieden wird, auf jeden Fall wieder verbergen:
public enum RoleType
{
User,
Admin
}
public class Role
{
private RoleType _roleType;
public bool IsAdmin()
{
return _roleType == RoleType.Admin;
}
public bool IsUser()
{
return _roleType == RoleType.User;
}
// more role-specific logic...
}
public class User
{
private Role _role;
public bool IsAdmin()
{
return _role.IsAdmin();
}
public bool IsUser()
{
return _role.IsUser();
}
}
Dies ist jedoch ziemlich ausführlich und die Komplexität würde mit jeder zusätzlichen Rolle zunehmen - so endet der Code normalerweise, wenn Sie versuchen, das Gesetz von Demeter vollständig einzuhalten. Sie sollten das Design basierend auf den konkreten Anforderungen des zu modellierenden Systems verbessern.
Ihrer Frage zufolge sollten Sie die erste Option mit Enum direkt aktivieren User
. Wenn Sie mehr Logik für die benötigen Role
, sollte die zweite Option als Ausgangspunkt in Betracht gezogen werden.
User.HasRole(Role.Admin)
.