Trước hết, xin lưu ý rằng làm một cái gì đó giống như entity.underlyingEntity.underlyingEntity.method()
được coi là mùi mã theo Luật Demeter . Bằng cách này, bạn đang tiết lộ rất nhiều chi tiết triển khai cho người tiêu dùng. Và mỗi nhu cầu mở rộng hoặc sửa đổi một hệ thống như vậy sẽ làm tổn thương rất nhiều.
Vì vậy, tôi khuyên bạn nên có một HasRole
hoặc IsAdmin
phương pháp theo User
nhận xét của CodeInChaos. Bằng cách này, cách thức thực hiện vai trò trên người dùng vẫn là chi tiết triển khai cho người tiêu dùng. Và cũng cảm thấy tự nhiên hơn khi hỏi người dùng về vai trò của anh ta thay vì hỏi anh ta về chi tiết về vai trò của anh ta và sau đó quyết định dựa trên điều đó.
Xin vui lòng tránh sử dụng string
s trừ khi cần thiết. name
là một ví dụ tốt về string
biến vì nội dung không được biết trước. Mặt khác, một cái gì đó giống như role
nơi bạn có hai giá trị riêng biệt được biết đến tại thời điểm biên dịch, tốt hơn bạn nên sử dụng kiểu gõ mạnh. Đó là nơi loại liệt kê phát huy tác dụng ...
Đối chiếu
public bool HasRole(string role)
với
public enum Role { Admin, User }
public bool HasRole(Role role)
Trường hợp thứ hai cho tôi nhiều ý tưởng hơn về những gì tôi nên đi qua. Nó cũng ngăn tôi chuyển nhầm thành không hợp lệ string
trong trường hợp tôi không biết gì về hằng số vai trò của bạn.
Tiếp theo là quyết định về vai trò sẽ như thế nào. Bạn có thể sử dụng enum được lưu trữ trực tiếp trên người dùng:
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;
}
}
Mặt khác, nếu bạn muốn vai trò của mình có hành vi, chắc chắn nó sẽ lại ẩn các chi tiết về cách thức loại của nó được quyết định:
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();
}
}
Tuy nhiên, điều này khá dài dòng và sự phức tạp sẽ tăng lên với mỗi lần bổ sung vai trò - đó thường là cách mã kết thúc khi bạn cố gắng tuân thủ đầy đủ Luật của Demeter. Bạn nên cải tiến thiết kế, dựa trên các yêu cầu cụ thể của hệ thống được mô hình hóa.
Theo câu hỏi của bạn, tôi đoán bạn tốt hơn nên chọn tùy chọn đầu tiên với enum trực tiếp User
. Nếu bạn cần thêm logic trên Role
, tùy chọn thứ hai nên được coi là điểm bắt đầu.
User.HasRole(Role.Admin)
.