Pertama, harap dicatat bahwa melakukan sesuatu seperti entity.underlyingEntity.underlyingEntity.method()dianggap sebagai bau kode menurut Hukum Demeter . Dengan cara ini, Anda memaparkan banyak detail implementasi kepada konsumen. Dan setiap kebutuhan ekstensi atau modifikasi sistem seperti itu akan sangat menyakitkan.
Karena itu, saya sarankan Anda untuk memiliki HasRoleatau IsAdminmetode pada Userper CodesInChaos komentar. Dengan cara ini, cara bagaimana peran diterapkan pada pengguna tetap detail implementasi untuk konsumen. Dan juga rasanya lebih alami untuk bertanya kepada pengguna apa perannya alih-alih bertanya kepadanya tentang detail perannya dan kemudian memutuskan berdasarkan itu.
Harap hindari juga penggunaan stringkecuali jika diperlukan. nameadalah contoh stringvariabel yang baik karena isinya tidak diketahui sebelumnya. Di sisi lain, sesuatu seperti di rolemana Anda memiliki dua nilai berbeda yang terkenal pada waktu kompilasi, Anda sebaiknya menggunakan pengetikan yang kuat. Di situlah jenis enumerasi berperan ...
Membandingkan
public bool HasRole(string role)
dengan
public enum Role { Admin, User }
public bool HasRole(Role role)
Kasus kedua memberi saya lebih banyak ide tentang apa yang harus saya sampaikan. Itu juga mencegah saya dari keliru memasukkan tidak valid stringkalau-kalau saya tidak tahu tentang konstanta peran Anda.
Berikutnya adalah keputusan tentang bagaimana peran akan terlihat. Anda bisa menggunakan enum yang disimpan langsung di pengguna:
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;
}
}
Di sisi lain, jika Anda ingin peran Anda memiliki perilaku itu sendiri, itu pasti harus menyembunyikan rincian bagaimana jenisnya diputuskan:
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();
}
}
Namun ini sangat verbose dan kompleksitas akan meningkat dengan setiap penambahan peran - itu biasanya bagaimana kode berakhir ketika Anda mencoba untuk sepenuhnya mematuhi Hukum Demeter. Anda harus meningkatkan desain, berdasarkan persyaratan nyata sistem yang dimodelkan.
Menurut pertanyaan Anda, saya kira Anda sebaiknya pergi dengan opsi pertama dengan enum langsung User. Jika Anda membutuhkan lebih banyak logika pada Role, opsi kedua harus dianggap sebagai titik awal.
User.HasRole(Role.Admin).