Öncelikle, böyle entity.underlyingEntity.underlyingEntity.method()bir şey yapmanın Demeter Yasasına göre kod kokusu olarak kabul edildiğini lütfen unutmayın . Bu şekilde, tüketiciye çok sayıda uygulama detayı sunarsınız. Ve böyle bir sistemin genişletilmesi veya değiştirilmesi için her ihtiyaç çok acıtacaktır.
Bu nedenle, size CodesInChaos'un yorumuna göre bir yöntem HasRoleveya IsAdminyöntem kullanmanızı Useröneririm. Bu şekilde, rollerin kullanıcı üzerinde nasıl uygulandığı, tüketici için uygulama detayı olarak kalır. Ayrıca kullanıcıya, rolünün ayrıntılarını sormak yerine rolünün ne olduğunu sormak ve ardından buna dayanarak karar vermek daha doğaldır.
Lütfen stringgerekli olmadıkça s kullanmaktan kaçının . içeriği nameiyi bir örnek stringolduğundan, değişkene iyi bir örnektir . Öte yandan, rolederleme zamanında iyi bilinen iki ayrı değerin olduğu bir şey varsa, güçlü yazı yazmayı daha iyi kullanmalısınız. Numaralandırma türü devreye giriyor.
Karşılaştırmak
public bool HasRole(string role)
ile
public enum Role { Admin, User }
public bool HasRole(Role role)
İkinci vaka, etrafta neler geçirmem gerektiği konusunda daha fazla fikir veriyor. Ayrıca string, rol sabitleriniz hakkında hiçbir fikrimin olmaması durumunda hatalı bir şekilde geçersiz kalmamı engelliyor .
Bundan sonra rolün nasıl görüneceğine dair karar. Doğrudan kullanıcıya depolanan enum'u kullanabilirsiniz:
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;
}
}
Öte yandan, rolünüzün bir davranışa sahip olmasını istiyorsanız, türünün nasıl karar verildiğinin ayrıntılarını kesinlikle tekrar gizlemesi gerekir:
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();
}
}
Bununla birlikte, bu oldukça ayrıntılı ve karmaşıklık her rol ekleme ile birlikte artacaktır - genellikle Demeter Yasasına tam olarak uymaya çalıştığınızda genellikle kod sona erer. Modellenmekte olan sistemin somut gereksinimlerine dayanarak tasarımı geliştirmelisiniz.
Sorunuza göre, doğrudan enum ile ilk seçeneği ile gitmek daha iyi olur sanırım User. Daha fazla mantığa ihtiyacınız olursa Role, ikinci seçenek bir başlangıç noktası olarak düşünülmelidir.
User.HasRole(Role.Admin).