क्या सभी एनमों को एक फ़ाइल में शामिल करना और कई वर्गों में इसका उपयोग करना एक बुरा अभ्यास है?


12

मैं एक महत्वाकांक्षी गेम डेवलपर हूं, मैं कभी-कभार इंडी गेम्स पर काम करता हूं, और थोड़ी देर के लिए मैं कुछ ऐसा कर रहा हूं, जो पहली बार में एक बुरे अभ्यास की तरह लग रहा था, लेकिन मैं वास्तव में यहां कुछ अनुभवी प्रोग्रामर से जवाब प्राप्त करना चाहता हूं।

मान लीजिए कि मेरे पास एक फ़ाइल है जिसे enumList.hमैं अपने खेल में उपयोग किए जाने वाले सभी शत्रुओं की घोषणा करता हूं:

// enumList.h

enum materials_t { WOOD, STONE, ETC };
enum entity_t { PLAYER, MONSTER };
enum map_t { 2D, 3D };
// and so on.

// Tile.h
#include "enumList.h"
#include <vector>

class tile
{
    // stuff
};

मुख्य विचार यह है कि मैं 1 फ़ाइल में गेम में सभी एनमों की घोषणा करता हूं , और फिर उस फ़ाइल को आयात करता हूं जब मुझे उस फाइल से यह घोषित करने की बजाय कि इसे उपयोग करने की आवश्यकता है, वहां से एक निश्चित एनम का उपयोग करने की आवश्यकता है। मैं ऐसा इसलिए करता हूं क्योंकि यह चीजों को साफ करता है, मैं प्रत्येक जगह पर केवल एक एनुम तक पहुंचने के लिए पृष्ठों को खोलने के बजाए 1 स्थान पर पहुंच सकता हूं ।

क्या यह एक बुरा अभ्यास है और क्या यह किसी भी तरह से प्रदर्शन को प्रभावित कर सकता है?


1
स्रोत संरचना प्रदर्शन को प्रभावित नहीं कर सकती है - यह अभी भी उसी के लिए संकलित किया जाएगा, चाहे वह कोई भी हो। तो वास्तव में यह एक सवाल है कि उन्हें कहाँ रखना सबसे अच्छा होगा, और छोटी सी दुश्मनी के लिए, एक फ़ाइल बहुत अच्छी नहीं लगती है।
स्टीफन डोनल

मैं और अधिक चरम मामलों में पूछ रहा था, एक गेम में बहुत सारे
एनम

4
यह एप्लिकेशन के प्रदर्शन को प्रभावित नहीं करेगा, लेकिन संकलन समय पर इसका नकारात्मक प्रभाव पड़ेगा। उदाहरण के लिए, यदि आप उन materials_tफ़ाइलों के लिए एक सामग्री जोड़ते हैं जो सामग्रियों में सौदा नहीं करती हैं, तो उन्हें फिर से बनाना होगा।
को रोबोट

14
यह आपके घर की सभी कुर्सियों को कुर्सी के कमरे में रखने जैसा है, इसलिए यदि आप बैठना चाहते हैं, तो आप जानते हैं कि कहाँ जाना है।
केविन क्लाइन

एक तरफ के रूप में, आप आसानी से दोनों कर सकते हैं , अपनी फ़ाइल में प्रत्येक एनम रखकर और उन फ़ाइलों के लिए एस के enumList.hसंग्रह के रूप में सेवा कर #includeरहे हैं। यह उन फ़ाइलों को अनुमति देता है, जो किसी भी चीज़ के लिए केवल एक एनम की आवश्यकता होती है, जबकि किसी भी चीज़ के लिए एक विलक्षण पैकेज प्रदान करना जो वास्तव में उन सभी को चाहता है।
जस्टिन टाइम -

जवाबों:


35

मुझे वास्तव में लगता है कि यह एक बुरा अभ्यास है। जब हम कोड की गुणवत्ता को मापते हैं, तो कुछ ऐसा होता है जिसे हम "ग्रैन्युलैरिटी" कहते हैं। एक ही फाइल में उन सभी एनमों को डालने से आपकी ग्रैन्युलैरिटी गंभीर रूप से ग्रस्त हो जाती है और इस तरह से स्थिरता भी बनी रहती है।

मेरे पास एक फ़ाइल है, जो इसे जल्दी से ढूंढने के लिए और विशिष्ट कार्यक्षमता के व्यवहार कोड (जैसे सामग्री इनम फ़ोल्डर में सामग्री व्यवहार आदि) के साथ इसे जल्दी से खोजने के लिए प्रति समूह है;

मुख्य विचार यह है कि मैं 1 फ़ाइल में गेम में सभी एनमों की घोषणा करता हूं, और फिर उस फ़ाइल को आयात करता हूं जब मुझे उस फाइल से यह घोषित करने की बजाय कि इसे उपयोग करने की आवश्यकता है, वहां से एक निश्चित एनम का उपयोग करने की आवश्यकता है। मैं ऐसा इसलिए करता हूं क्योंकि यह चीजों को साफ करता है, मैं केवल एक एनुम तक पहुंचने के लिए पृष्ठों को खोलने के बजाय 1 स्थान पर प्रत्येक एनुम तक पहुंच सकता हूं।

आप सोच सकते हैं कि यह साफ है, लेकिन वास्तव में, यह नहीं है। यह उन चीजों को युग्मित कर रहा है जो एक साथ कार्यक्षमता-और मॉड्यूल-वार से संबंधित नहीं हैं और आपके एप्लिकेशन की प्रतिरूपकता को घटाती हैं। आपके कोड आधार के आकार और आप अपने कोड को कैसे संरचित करना चाहते हैं, इसके आधार पर, यह आपके सिस्टम के अन्य भागों में एक बड़ी समस्या और अशुद्ध कोड / निर्भरता में विकसित हो सकता है। हालांकि, यदि आप सिर्फ एक छोटा, अखंड प्रणाली लिखते हैं, तो यह जरूरी नहीं है। फिर भी, मैं इसे एक छोटे से अखंड प्रणाली के लिए भी ऐसा नहीं करूंगा।


2
+1 ग्रैन्युलैरिटी का उल्लेख करने के लिए, मैंने अन्य उत्तरों को ध्यान में रखा, लेकिन आप एक अच्छा बिंदु बनाते हैं।
बगस्टर

प्रति फ़ाइल एकल फ़ाइल के लिए +1। एक के लिए यह खोजना आसान है।
मौरिस

11
यह उल्लेख नहीं करने के लिए कि एक ही स्थान पर उपयोग किए जाने वाले एकल एनुम मूल्य को जोड़ने से आपके संपूर्ण प्रोजेक्ट में प्रत्येक फ़ाइल को फिर से बनाना होगा।
रोबोट को

अच्छी सलाह। आपने वैसे भी अपना मन बदल लिया .. मुझे हमेशा CompanyNamespace.Enums जाना पसंद आया .... और एक आसान सूची प्राप्त हुई, लेकिन अगर कोड संरचना अनुशासित है, तो आपका दृष्टिकोण बेहतर है
मैट इवांस

21

हां, यह खराब अभ्यास है, प्रदर्शन के कारण नहीं बल्कि स्थिरता के कारण।

यह चीजों को "केवल ओसीडी में" साफ करता है "समान चीजों को एक साथ इकट्ठा करता है"। लेकिन यह वास्तव में "सफाई" का उपयोगी और अच्छा प्रकार नहीं है।

कोड संस्थाओं को सामंजस्य को अधिकतम करने और युग्मन को कम करने के लिए समूहीकृत किया जाना चाहिए , जो कि उन्हें बड़े पैमाने पर स्वतंत्र कार्यात्मक मॉड्यूल में समूहीकृत करके प्राप्त किया जाता है। उन्हें तकनीकी मानदंडों के अनुसार समूहित करना (जैसे सभी एनमों को एक साथ रखना) विपरीत को प्राप्त करता है - यह युगल कोड है जिसमें बिल्कुल कोई कार्यात्मक संबंध नहीं है और ऐसी एनम लगाता है जो केवल एक ही स्थान पर एक अलग फ़ाइल में उपयोग की जा सकती हैं।


3
सच; 'केवल ओसीडी में "समान चीजों को एक साथ इकट्ठा करते हैं" रास्ता "। अगर मैं कर सकता 100 upvotes।
डॉगवेदर

अगर मैं कर सकता था, तो मैं वर्तनी को संपादित करने में मदद करूँगा, लेकिन आपने SE 'संपादन' सीमा पर पहुंचने के लिए पर्याप्त त्रुटियां नहीं कीं। :-P
डॉगवेदर

दिलचस्प है कि लगभग सभी वेब फ़्रेमवर्क में फ़ाइलों को सुविधा के बजाय टाइप करके एकत्र करने की आवश्यकता होती है।
केविन क्लाइन

@kevincline: मैं "लगभग सभी" नहीं कहूंगा - बस वे जो कन्वेंशन-ओवर-कॉन्फ़िगरेशन पर आधारित हैं, और आम तौर पर, उनके पास एक मॉड्यूल अवधारणा भी होती है जो कार्यात्मक रूप से कोडिंग की अनुमति देती है।
माइकल बॉर्गवर्ड

8

खैर, यह सिर्फ डेटा है (व्यवहार नहीं)। संभवतः सबसे बुरी तरह से / सैद्धांतिक रूप से ऐसा हो सकता है कि एक ही कोड को शामिल किया जाता है और अपेक्षाकृत बड़े कार्यक्रम का निर्माण करने से अधिक बार संकलित किया जाता है।

यह केवल स्पष्ट असंभव है कि इस तरह के कार्यों में आपके कार्यों में और अधिक चक्र शामिल हो सकते हैं, यह देखते हुए कि उनके अंदर कोई व्यवहार / प्रक्रियात्मक कोड नहीं है (कोई लूप, कोई इफ़ेक्ट आदि नहीं)।

एक (अपेक्षाकृत) बड़ा कार्यक्रम शायद ही प्रदर्शन (निष्पादन की गति) को प्रभावित कर सकता है और किसी भी मामले में, बस एक दूरस्थ सैद्धांतिक चिंता है। अधिकांश (शायद सभी) संकलक प्रबंधन एक तरह से शामिल हैं जो ऐसी समस्याओं को रोकते हैं।

IMHO, जो लाभ आपको एकल फ़ाइल (अधिक पठनीय और अधिक प्रबंधनीय कोड) के साथ मिलते हैं, वे मोटे तौर पर किसी भी संभावित खामी से अधिक होते हैं।


5
आप एक बहुत अच्छी बात यह है कि मुझे लगता है कि सभी अधिक लोकप्रिय जवाब की अनदेखी कर रहे हैं - अपरिवर्तनीय डेटा किसी भी युग्मन बिल्कुल नहीं है।
माइकल शॉ

3
मुझे लगता है कि आपको उन परियोजनाओं पर काम करने की ज़रूरत नहीं है जो संकलन के लिए आधे घंटे या उससे अधिक समय लेंगे। यदि आपके पास एक फ़ाइल में आपके सभी एनम हैं और एक एकल एनम को बदलते हैं, तो यह एक लंबे ब्रेक का समय है। हेक, भले ही यह केवल एक मिनट लगे, यह अभी भी बहुत लंबा है।
डंक

2
संस्करण नियंत्रण के तहत मॉड्यूल एक्स में काम करने वाले किसी भी व्यक्ति को काम करने के लिए हर बार मॉड्यूल एक्स और एनम मिलना चाहिए। इसके अलावा, यह मुझे युग्मन के एक रूप के रूप में प्रभावित करता है यदि, हर बार जब आप एनम फ़ाइल को बदलते हैं, तो आपका परिवर्तन संभावित रूप से आपकी परियोजना के हर एक मॉड्यूल को प्रभावित करता है। यदि आपकी परियोजना इतनी बड़ी है कि सभी या अधिकांश टीम के सदस्य परियोजना के हर हिस्से को नहीं समझते हैं, तो एक वैश्विक दुश्मनी बहुत खतरनाक है। एक वैश्विक अपरिवर्तनीय चर भी एक वैश्विक परिवर्तनशील चर के रूप में बुरा नहीं है, लेकिन यह अभी भी आदर्श नहीं है। उस ने कहा, एक वैश्विक दुश्मनी <10 सदस्यों वाली टीम पर ज्यादातर ठीक है।
ब्रायन

3

मेरे लिए यह सब आपके प्रोजेक्ट के दायरे पर निर्भर करता है। अगर 10 स्ट्रक्चर्स के साथ एक फाइल है और केवल वही हैं जो कभी उपयोग किए गए हैं, तो मैं पूरी तरह से इसके लिए एक .h फाइल रखने में सहज होगा। यदि आपके पास कई अलग-अलग प्रकार की कार्यक्षमता है, तो इकाइयां, अर्थव्यवस्था, भवन आदि कहें, मैं निश्चित रूप से चीजों को विभाजित करूंगा। एक इकाई बनाएँ। जहाँ सभी संरचनाएँ जो इकाइयों के साथ काम करती हैं, निवास करती हैं। यदि आप इकाइयों के साथ कुछ करना चाहते हैं, तो आपको इकाइयों को शामिल करना ज़रूरी है। लेकिन यह भी एक अच्छा "पहचानकर्ता" है कि इकाइयों के साथ कुछ इस फ़ाइल में किया जाता है।

इसे इस तरह से देखें, आप सुपरमार्केट नहीं खरीदते हैं क्योंकि आपको कोक की आवश्यकता हो सकती है;)


3

मैं C ++ देव नहीं हूं, इसलिए यह उत्तर OOA और D के लिए अधिक सामान्य होगा:

आमतौर पर, कोड ऑब्जेक्ट्स को कार्यात्मक प्रासंगिकता के संदर्भ में वर्गीकृत किया जाना चाहिए, न कि भाषा-विशिष्ट निर्माणों के संदर्भ में। मुख्य हाँ-कोई सवाल जो हमेशा पूछा जाना चाहिए, "क्या अंत कोडर को लाइब्रेरी का उपभोग करते समय प्राप्त होने वाली अधिकांश या सभी वस्तुओं का उपयोग करने की उम्मीद की जाएगी?" यदि हाँ, तो दूर। यदि नहीं, तो कोड ऑब्जेक्ट्स को विभाजित करने और उन्हें उन अन्य वस्तुओं के करीब रखने पर विचार करें जिनकी उन्हें आवश्यकता है (जिससे यह संभावना बढ़ जाती है कि उपभोक्ता को उन सभी चीजों की आवश्यकता होगी जो वे वास्तव में एक्सेस कर रहे हैं)।

मूल अवधारणा "उच्च सामंजस्य" है; कोड सदस्यों (एक वर्ग के तरीकों से सभी तरह से एक नाम स्थान या DLL, और खुद DLL में) को व्यवस्थित किया जाना चाहिए ताकि एक कोडर में वे सभी चीजें शामिल हो सकें जिनकी उन्हें जरूरत है, और कुछ भी नहीं। यह समग्र डिजाइन को परिवर्तन के प्रति अधिक सहिष्णु बनाता है; जिन चीजों को बदलना होगा, उन्हें अन्य कोड वस्तुओं को प्रभावित किए बिना हो सकता है, जिन्हें बदलना नहीं था। कई परिस्थितियों में यह एप्लिकेशन को अधिक मेमोरी-कुशल भी बनाता है; एक DLL को पूरी तरह से मेमोरी में लोड किया जाता है, इस बात की परवाह किए बिना कि उन निर्देशों में से कितने को कभी भी प्रक्रिया द्वारा निष्पादित किया जाता है। "लीन" अनुप्रयोगों को डिजाइन करना इसलिए ध्यान देने की आवश्यकता है कि मेमोरी में कितना कोड खींचा गया है।

यह अवधारणा लगभग सभी स्तर के कोड संगठन पर लागू होती है, जिसमें स्थिरता, स्मृति-दक्षता, प्रदर्शन, निर्माण गति, आदि पर प्रभाव की अलग-अलग डिग्री होती है। यदि किसी कोडर को केवल एक वस्तु तक पहुंचने के लिए बल्कि अखंड आकार के एक हेडर / डीएलएल का संदर्भ देना पड़ता है, तो जो उस DLL में किसी अन्य वस्तु पर निर्भर नहीं करता है, तो उस वस्तु को DLL में शामिल किए जाने पर शायद पुनर्विचार किया जाना चाहिए। हालाँकि यह संभव है कि बहुत दूर दूसरे रास्ते से भी जाया जाए; हर वर्ग के लिए एक DLL एक बुरा विचार है, क्योंकि यह निर्माण गति को धीमा कर देता है (अधिक डीएलएल संबंधित ओवरहेड के साथ पुनर्निर्माण करने के लिए) और एक दुःस्वप्न का संस्करण बनाता है।

बिंदु में मामला: यदि आपके कोड लाइब्रेरी के किसी भी वास्तविक-विश्व उपयोग में उन सभी या अधिकांश एन्यूमरेशन का उपयोग करना शामिल होगा जो आप इस एकल "एनुमेरेशंस.एच" फ़ाइल में डाल रहे हैं, तो हर तरह से उन्हें एक साथ जोड़ सकते हैं; आपको पता चल जाएगा कि उन्हें कहां खोजना है। लेकिन अगर आपके उपभोगकर्ता कोडर को हेडर में आपके द्वारा प्रदान किए जा रहे दर्जन भर एन्यूमरेशन्स में से केवल एक या दो की आवश्यकता हो सकती है, तो इससे पहले कि मैं आपको एक अलग लाइब्रेरी में रखने के लिए प्रोत्साहित करूं और इसे बाकी के एन्यूमरेशन्स के साथ बड़ा बना दूं। । यह आपके कोडर को केवल एक या दो प्राप्त करने की अनुमति देता है जो वे अधिक अखंड DLL से लिंक किए बिना चाहते हैं।


2

जब आप एक ही कोड-बेस पर कई डेवलपर्स काम कर रहे हों तो इस तरह की बात एक मुद्दा बन जाती है।

मैंने निश्चित रूप से इसी तरह की वैश्विक फाइलों को मर्ज टकराव और सभी प्रकार के दु: खों (बड़े) प्रोजेक्ट्स के लिए एक नेक्सस बनते देखा है।

हालाँकि, यदि आप प्रोजेक्ट पर काम करने वाले केवल एक हैं, तो आपको जो कुछ भी सबसे अधिक आरामदायक है, उसे करना चाहिए, और यदि आप उनके पीछे की प्रेरणा को समझते हैं (और सहमत हैं) तो केवल "सर्वोत्तम प्रथाओं" को अपनाएँ।

कुछ गलतियाँ करना और उनसे सीखना बेहतर है कि आप अपने जीवन के बाकी हिस्सों के लिए कार्गो पंथ प्रोग्रामिंग प्रथाओं के साथ फंस गए हैं।


1

हां, किसी बड़े प्रोजेक्ट पर ऐसा करना बुरा है। चुम्मा।

युवा सहकर्मी ने एक कोर .h फ़ाइल में एक साधारण चर का नाम बदल दिया और 100 इंजीनियरों ने अपनी सभी फाइलों के पुनर्निर्माण के लिए 45 मिनट इंतजार किया, जिसने सभी के प्रदर्शन को प्रभावित किया। ;)

सभी परियोजनाएं वर्षों में छोटी, गुब्बारा शुरू करती हैं, और हम उन लोगों को शाप देते हैं जिन्होंने तकनीकी ऋण बनाने के लिए शुरुआती शॉर्टकट ले लिए थे। सर्वोत्तम प्रथाओं, वैश्विक .h सामग्री को सीमित रखें जो कि आवश्यक वैश्विक है।


आप समीक्षा प्रणाली का उपयोग नहीं कर रहे हैं अगर कोई (युवा या बूढ़ा, वही) सिर्फ (मस्ती से) हर किसी को परियोजना का पुनर्निर्माण कर सकता है, तो आप arent?
सैन्टकस

1

इस मामले में, मैं कहूंगा कि आदर्श जवाब यह है कि यह कैसे enums खपत होती है पर निर्भर करता है, लेकिन वह सबसे परिस्थितियों में यह शायद अलग से सभी enums परिभाषित करने के लिए सबसे अच्छा है, लेकिन अगर उनमें से किसी को पहले से ही डिजाइन द्वारा मिलकर कर रहे हैं, तो आप एक प्रदान करना चाहिए कहा जाता है कि सामूहिक रूप से युग्मित दुश्मनी शुरू करने के साधन। वास्तव में, आपके पास पहले से मौजूद जानबूझकर युग्मन की मात्रा तक युग्मन सहिष्णुता है, लेकिन अब और नहीं।

इसे ध्यान में रखते हुए, सबसे लचीला समाधान प्रत्येक एनुम को एक अलग फ़ाइल में परिभाषित करने की संभावना है, लेकिन युग्मित पैकेज प्रदान करते हैं जब ऐसा करने के लिए उचित हो (जैसा कि शामिल एनम के इच्छित उपयोग द्वारा निर्धारित किया जाता है)।


एक ही फ़ाइल में अपने सभी एन्यूमरेशन्स को परिभाषित करना उन्हें एक साथ जोड़े देता है, और एक्सटेंशन के कारण किसी भी कोड पर निर्भर करता है जो एक या एक से अधिक एनम पर निर्भर करता है, चाहे वह कोड वास्तव में किसी भी अन्य एंम का उपयोग करता हो

#include "enumList.h"

// Draw map texture.  Requires map_t.
// Not responsible for rendering entities, so doesn't require other enums.
// Introduces two unnecessary couplings.
void renderMap(map_t, mapIndex);

renderMap()बहुत अधिक केवल के बारे में पता है map_t, क्योंकि अन्यथा किसी भी परिवर्तन दूसरों को प्रभावित करेगा, भले ही यह वास्तव में दूसरों के साथ बातचीत नहीं करता है।

#include "mapEnum.h" // Theoretical file defining map_t.

void renderMap(map_t, mapIndex);

हालांकि, उस मामले में जहां घटकों को पहले से ही एक साथ युग्मित किया जाता है, एक ही पैकेज में कई एनम प्रदान करने से आसानी से अतिरिक्त स्पष्टता और सरलता प्रदान की जा सकती है, बशर्ते कि एंमों के युग्मित होने का एक स्पष्ट तार्किक कारण हो, उन एनमों का उपयोग भी युग्मित है। और जो उन्हें प्रदान करता है वह किसी अतिरिक्त कपलिंग का परिचय नहीं देता है।

#include "entityEnum.h"    // Theoretical file defining entity_t.
#include "materialsEnum.h" // Theoretical file defining materials_t.

// Can entity break the specified material?
bool canBreakMaterial(entity_t, materials_t);

इस मामले में, इकाई प्रकार और सामग्री प्रकार के बीच कोई प्रत्यक्ष, तार्किक संबंध नहीं है (यह मानते हुए कि इकाइयां परिभाषित सामग्रियों में से एक नहीं हैं)। यदि, हालांकि, हमारे पास एक मामला था, उदाहरण के लिए, एक एनम स्पष्ट रूप से दूसरे पर निर्भर है, तो यह सभी युग्मित एनमों (साथ ही किसी अन्य युग्मित घटकों) के साथ एक एकल पैकेज प्रदान करने के लिए समझ में आता है, ताकि युग्मन हो सके जितना संभव हो उतना उस पैकेज को अलग किया जाए।

// File: "actionEnums.h"

enum action_t { ATTACK, DEFEND, SKILL, ITEM };               // Action type.
enum skill_t  { DAMAGE, HEAL, BUFF, DEBUFF, INFLICT, NONE }; // Skill subtype.

// -----

#include "actionTypes.h" // Provides action_t & skill_t from "actionEnums.h", and class Action (which couples them).
#include "entityEnum.h"  // Theoretical file defining entity_t.

// Assume ActFlags is or acts as a table of flags indicating what is and isn't allowable, based on entity_t and Action.
ImplementationDetail ActFlags;

// Indicate whether a given type of entity can perform the specified action type.
// Assume class Action provides members type() and subtype(), corresponding to action_t and skill_t respectively.
// Is only slightly aware of the coupling; knows type() and subtype() are coupled, but not how or why they're coupled.
bool canAct(entity_t e, const Action& act) {
    return ActFlags[e][act.type()][act.subtype()];
}

लेकिन अफसोस ... यहां तक ​​कि जब दो Enums आंतरिक रूप से एक साथ युग्मित होते हैं, भले ही यह कुछ ऐसा हो जैसा कि "दूसरी Enum पहले enum के लिए उपश्रेणियाँ प्रदान करता है", वहाँ अभी भी एक समय आ सकता है जहाँ केवल एक enums आवश्यक है।

#include "actionEnums.h"

// Indicates whether a skill can be used from the menu screen, based on the skill's type.
// Isn't concerned with other action types, thus doesn't need to be coupled to them.
bool skillUsableOnMenu(skill_t);

// -----
// Or...
// -----

#include "actionEnums.h"
#include "gameModeEnum.h" // Defines enum gameMode_t, which includes MENU, CUTSCENE, FIELD, and BATTLE.

// Used to grey out blocked actions types, and render them unselectable.
// All actions are blocked in cutscene, or allowed in battle/on field.
// Skill and item usage is allowed in menu.  Individual skills will be checked on attempted use.
// Isn't concerned with specific types of skills, only with broad categories.
bool actionBlockedByGameMode(gameMode_t mode, action_t act) {
    if (mode == CUTSCENE) { return true; }
    if (mode == MENU) { return (act == SKILL || act == ITEM); }

    //assert(mode == BATTLE || mode == FIELD);
    return false;
}

इसलिए, जब से हम दोनों जानते हैं कि हमेशा ऐसी स्थितियां हो सकती हैं जहां एक ही फाइल में कई एन्यूमरेशन्स को परिभाषित करना अनावश्यक युग्मन जोड़ सकता है, और यह कि एकल पैकेज में युग्मित एनम प्रदान करना, इच्छित उपयोग को स्पष्ट कर सकता है और हमें वास्तविक युग्मन कोड को स्वयं के रूप में अलग करने की अनुमति देता है। जितना संभव हो, आदर्श समाधान प्रत्येक एन्यूमरेशन को अलग-अलग परिभाषित करना है, और किसी भी ऐसे एनम के लिए संयुक्त पैकेज प्रदान करना है जो अक्सर एक साथ उपयोग करने का इरादा रखते हैं। एक ही फ़ाइल में परिभाषित केवल वे ही होंगे जो आंतरिक रूप से एक साथ जुड़े होते हैं, जैसे कि एक का उपयोग दूसरे के उपयोग की भी आवश्यकता होती है।

// File: "materialsEnum.h"
enum materials_t { WOOD, STONE, ETC };

// -----

// File: "entityEnum.h"
enum entity_t { PLAYER, MONSTER };

// -----

// File: "mapEnum.h"
enum map_t { 2D, 3D };

// -----

// File: "actionTypesEnum.h"
enum action_t { ATTACK, DEFEND, SKILL, ITEM };

// -----

// File: "skillTypesEnum.h"
enum skill_t  { DAMAGE, HEAL, BUFF, DEBUFF, INFLICT, NONE };

// -----

// File: "actionEnums.h"
#include "actionTypesEnum.h"
#include "skillTypesEnum.h"
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.