우선, Demeter의 법칙에entity.underlyingEntity.underlyingEntity.method()
따라 비슷한 일을하는 것은 코드 냄새로 간주됩니다 . 이런 식으로 소비자에게 많은 구현 세부 사항을 노출시킵니다. 그리고 그러한 시스템을 확장하거나 수정해야 할 때마다 많은 피해를 입을 것입니다.
따라서 코드 인 카오스의 의견 에 따라 HasRole
또는 IsAdmin
방법을 사용 하는 것이 좋습니다 User
. 이러한 방식으로 사용자에게 역할이 구현되는 방식은 소비자에 대한 구현 세부 사항으로 남아 있습니다. 또한 자신의 역할에 대한 세부 정보를 요청한 다음 그에 따라 결정하는 대신 사용자에게 자신의 역할이 무엇인지 묻는 것이 더 자연스러운 느낌입니다.
string
필요한 경우가 아니면 s를 사용 하지 마십시오 . 내용을 미리 알 수 없기 때문에 변수 name
의 좋은 예입니다 string
. 반면 role
에 컴파일 타임에 잘 알려진 두 개의 고유 한 값이있는 경우 강력한 타이핑을 사용하는 것이 좋습니다. 열거 형이 작동하는 곳입니다 ...
비교
public bool HasRole(string role)
와
public enum Role { Admin, User }
public bool HasRole(Role role)
두 번째 경우는 내가 무엇을 전달해야하는지에 대한 더 많은 아이디어를 제공합니다. 그것은 또한 string
당신의 역할 상수에 대해 전혀 몰랐을 때 잘못으로 잘못 전달하는 것을 막습니다 .
다음은 역할이 어떻게 보일지에 대한 결정입니다. 사용자에게 직접 저장된 enum을 사용할 수 있습니다.
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;
}
}
반면에, 당신의 역할이 행동 자체를 가지길 원한다면, 그 유형이 어떻게 결정되는지에 대한 세부 사항을 다시 숨겨야합니다.
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();
}
}
그러나 이것은 매우 장황하며 각 역할 추가에 따라 복잡성이 증가합니다. 이는 일반적으로 Demeter의 법칙을 완전히 준수하려고 할 때 코드가 끝나는 방식입니다. 모델링 할 시스템의 구체적인 요구 사항에 따라 설계를 개선해야합니다.
귀하의 질문에 따르면 enum을 직접 사용하는 첫 번째 옵션을 사용하는 것이 좋습니다 User
. 에 대한 논리가 더 필요한 Role
경우 두 번째 옵션을 시작점으로 고려해야합니다.
User.HasRole(Role.Admin)
.