मैं एक कार्ड गेम तैयार करने का प्रयास कर रहा हूँ जहाँ कार्ड में दो महत्वपूर्ण सुविधाएँ हैं:
पहला एक प्रभाव है। ये गेम स्टेट में होने वाले बदलाव हैं जब आप कार्ड खेलते हैं। प्रभाव के लिए इंटरफ़ेस इस प्रकार है:
boolean isPlayable(Player p, GameState gs);
void play(Player p, GameState gs);
और आप कार्ड को खेलने योग्य मान सकते हैं यदि और केवल तभी यदि आप इसकी लागत को पूरा कर सकते हैं और इसके सभी प्रभाव खेलने योग्य हैं। इस तरह:
// in Card class
boolean isPlayable(Player p, GameState gs) {
if(p.resource < this.cost) return false;
for(Effect e : this.effects) {
if(!e.isPlayable(p,gs)) return false;
}
return true;
}
ठीक है, अब तक, बहुत सरल है।
कार्ड पर सुविधाओं का अन्य सेट क्षमता है। ये क्षमताएं खेल की स्थिति में परिवर्तन हैं जिन्हें आप इच्छाशक्ति पर सक्रिय कर सकते हैं। जब इन के लिए इंटरफ़ेस के साथ आ रहा है, मुझे एहसास हुआ कि उन्हें यह निर्धारित करने के लिए एक विधि की आवश्यकता है कि क्या वे सक्रिय हो सकते हैं या नहीं, और सक्रियण को लागू करने के लिए एक विधि है। यह होना समाप्त होता है
boolean isActivatable(Player p, GameState gs);
void activate(Player p, GameState gs);
और मुझे एहसास है कि इसे "खेलने" के बजाय "सक्रिय" कहने के अपवाद के साथ, Ability
और Effect
सटीक एक ही हस्ताक्षर है।
क्या एक समान हस्ताक्षर के साथ कई इंटरफेस होना बुरी बात है? क्या मुझे बस एक का उपयोग करना चाहिए, और एक ही इंटरफ़ेस के दो सेट हैं? यथा:
Set<Effect> effects;
Set<Effect> abilities;
यदि हां, तो क्या पुनर्रचना चरणों मैं नीचे सड़क अगर वे असमान (और अधिक सुविधाओं जारी कर रहे हैं के रूप में) हो जाते हैं, विशेष रूप से अगर वे अलग-अलग (वे दोनों लाभ कुछ अन्य नहीं करना चाहिए अर्थात्, के रूप में केवल एक ही प्राप्त कर रहा करने के लिए विरोध लेना चाहिए और दूसरा एक पूर्ण उपसमूह है)? मुझे विशेष रूप से चिंता है कि कुछ परिवर्तन होते ही उनका संयोजन गैर-टिकाऊ होगा।
बारीक अक्षर:
मुझे लगता है कि यह सवाल खेल के विकास से पैदा हुआ है, लेकिन मुझे लगता है कि यह उस तरह की समस्या है जो आसानी से गैर-खेल के विकास में रेंग सकती है, खासकर जब एक आवेदन में कई ग्राहकों के व्यापार मॉडल को समायोजित करने का प्रयास किया जाता है जैसा कि बस के साथ होता है हर परियोजना जो मैंने कभी एक से अधिक व्यावसायिक प्रभाव के साथ की है ... इसके अलावा, उपयोग किए जाने वाले स्निपेट जावा स्निपेट हैं, लेकिन यह आसानी से ऑब्जेक्ट ओरिएंटेड भाषाओं की भीड़ पर लागू हो सकता है।