में ब्लॉग पोस्ट की इस श्रृंखला , एरिक Lippert जादूगरों और उदाहरण है, जहां के रूप में योद्धाओं का उपयोग कर वस्तु उन्मुख डिजाइन में एक समस्या का वर्णन करता है:
abstract class Weapon { }
sealed class Staff : Weapon { }
sealed class Sword : Weapon { }
abstract class Player
{
public Weapon Weapon { get; set; }
}
sealed class Wizard : Player { }
sealed class Warrior : Player { }
और फिर कुछ नियम जोड़ता है:
- एक योद्धा केवल एक तलवार का उपयोग कर सकता है।
- एक जादूगर केवल एक कर्मचारी का उपयोग कर सकता है।
वह तब आपके द्वारा चलाए जा रहे समस्याओं को प्रदर्शित करने के लिए जाता है यदि आप सी # प्रकार प्रणाली का उपयोग करके इन नियमों को लागू करने का प्रयास करते हैं (उदाहरण के लिए Wizardवर्ग को यह सुनिश्चित करने के लिए जिम्मेदार बनाते हैं कि एक विज़ार्ड केवल एक कर्मचारी का उपयोग कर सकता है)। आप लिस्कोव सबस्टीट्यूशन सिद्धांत का उल्लंघन करते हैं, रन-टाइम अपवादों को जोखिम में डालते हैं या उस कोड के साथ समाप्त हो जाते हैं जिसका विस्तार करना मुश्किल है।
इसका समाधान यह है कि खिलाड़ी वर्ग द्वारा कोई सत्यापन नहीं किया जाता है। इसका उपयोग केवल राज्य को ट्रैक करने के लिए किया जाता है। फिर, किसी खिलाड़ी को हथियार देने के बजाय:
player.Weapon = new Sword();
राज्य Commandको Rules के अनुसार संशोधित किया गया है :
... हम एक
Commandवस्तु बनाते हैं जिसेWieldदो गेम स्टेट ऑब्जेक्ट्स कहते हैं, aPlayerऔर aWeapon। जब उपयोगकर्ता सिस्टम के लिए एक कमांड जारी करता है "इस विज़ार्ड को उस तलवार को मिटा देना चाहिए", तो उस कमांड का मूल्यांकनRuleएस के एक सेट के संदर्भ में किया जाता है , जोEffectएस के अनुक्रम का उत्पादन करता है । हमारे पास एकRuleऐसा है जो कहता है कि जब कोई खिलाड़ी किसी हथियार को छेड़ने का प्रयास करता है, तो प्रभाव यह होता है कि मौजूदा हथियार, यदि कोई है, तो उसे गिरा दिया जाता है और नया हथियार खिलाड़ी का हथियार बन जाता है। हमारे पास एक और नियम है जो पहले नियम को मजबूत करता है, जो कहता है कि पहले नियम के प्रभाव तब लागू नहीं होते हैं जब कोई जादूगर तलवार लहराने की कोशिश करता है।
मैं इस विचार को सिद्धांत रूप में पसंद करता हूं, लेकिन इस बारे में एक चिंता है कि इसका उपयोग कैसे किया जा सकता है।
कुछ भी नहीं लगता है कि एक डेवलपर को केवल एक पर सेट करके Commandsऔर चक्कर लगाने से रोकना है । संपत्ति से सुलभ होने की जरूरत है , तो यह नहीं किया जा सकता, आदेश ।RuleWeaponPlayerWeaponWieldprivate set
तो, क्या करता है ऐसा करने से एक डेवलपर को रोकने? क्या उन्हें सिर्फ याद नहीं करना है?