सबसे पहले, कृपया ध्यान दें कि कुछ ऐसा करना कानून के कानून केentity.underlyingEntity.underlyingEntity.method()
अनुसार कोड गंध माना जाता है । इस तरह, आप उपभोक्ता को बहुत सारे कार्यान्वयन विवरण दिखा रहे हैं। और ऐसी प्रणाली के विस्तार या संशोधन की प्रत्येक आवश्यकता को बहुत नुकसान होगा।
तो यह देखते हुए, मैं आपको CodeInChaos की टिप्पणी के अनुसार एक विधि HasRole
या IsAdmin
विधि रखने की User
सलाह दूंगा। इस तरह, जिस तरह से उपयोगकर्ता पर भूमिकाओं को लागू किया जाता है, वह उपभोक्ता के लिए कार्यान्वयन विवरण रहता है। और उपयोगकर्ता को यह पूछना और भी स्वाभाविक लगता है कि उसकी भूमिका के बारे में उससे पूछने और उसके आधार पर निर्णय लेने के बजाय उसकी भूमिका क्या है।
string
जब तक आवश्यक न हो, कृपया एस का उपयोग करने से भी बचें । चर 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();
}
}
यह हालांकि काफी क्रियात्मक है और प्रत्येक भूमिका के साथ जटिलता बढ़ेगी - आमतौर पर यह है कि जब आप पूरी तरह से डेमेटर के कानून का पालन करने का प्रयास करते हैं तो कोड कैसे समाप्त होता है। आपको सिस्टम की ठोस आवश्यकताओं के आधार पर डिज़ाइन में सुधार करना चाहिए।
आपके प्रश्न के अनुसार, मुझे लगता है कि आप बेहतर विकल्प के साथ सीधे एनम के साथ पहले विकल्प पर जाएंगे User
। क्या आपको अधिक तर्क की आवश्यकता है Role
, दूसरे विकल्प को एक प्रारंभिक बिंदु माना जाना चाहिए।
User.HasRole(Role.Admin)
।