2011-09-22 15 views
8

के लिए इनपुट आवश्यक है, मैंने जिस अनुप्रयोग को मैं आवश्यक रूप से विस्तार से बना रहा हूं उसका वर्णन करने की कोशिश की है, इसलिए निबंध के लिए मैं पहले से माफ़ी मांगता हूं!मेरे प्रोग्राम संरचना/डिजाइन

मैं सी ++ जूस ढांचे का उपयोग करके काफी बड़े संगीत अनुप्रयोग को डिजाइन और निर्माण की प्रक्रिया में हूं, संक्षेप में ओएससी संदेशों में ले जाता है और उन्हें ऑडियो और MIDI डेटा में बदल देता है। एप्लिकेशन में तीन 'मोड' हैं, प्रत्येक यह परिभाषित करता है कि ओएससी संदेशों द्वारा किस तरह की आवाज का उत्पादन किया जाएगा। प्रत्येक ओएससी संदेश 'ट्रिगर' ध्वनि को परिभाषित करने के लिए उपयोगकर्ता एक मोड और मोड सेटिंग्स का एक और गुच्छा लागू कर सकता है।

नीचे कार्यक्रमों के वर्ग संबंध और पदानुक्रम का मूल ब्लॉक आरेख अवलोकन है, या कम से कम मैं सैद्धांतिक रूप से यह कैसे कल्पना करता हूं। जूस शब्दावली को स्पष्ट करने के लिए, एक 'घटक' वर्ग मूल रूप से एक जीयूआई ऑब्जेक्ट/क्लास है जो स्क्रीन पर चीजें प्रदर्शित करता है और उपयोगकर्ता इंटरैक्शन की अनुमति देता है।

Basic block diagram http://liamlacey.web44.net/images/Software_block_diagram.jpg

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

  • OscInput:

    यहां प्रत्येक वर्ग करता है का एक संक्षिप्त विवरण है। केवल 1 वर्ग इस बेस क्लास से उत्तराधिकारी हो सकता है क्योंकि उसी यूडीपी पोर्ट पर एकाधिक श्रोताओं होने पर एप्लिकेशन क्रैश हो जाएगा।

  • Main - एप्लिकेशन स्टार्ट-अप। ओएससी इनपुट से प्रवेश करता है ताकि जब भी एक ओएससी संदेश प्राप्त होता है तो कॉलबैक फ़ंक्शन को इस कक्षा

  • MainWindow - ऐप्स मुख्य दस्तावेज़ विंडो - डिफ़ॉल्ट रूप से जूस ऐप्स के लिए कहा जाता है।

  • MainComponent - ऐप का मुख्य/पृष्ठभूमि घटक/जीयूआई - जूस ऐप्स के लिए डिफ़ॉल्ट।

  • Mode1Component/Mode2Component/Mode3Component - इन घटक वर्गों में से प्रत्येक का एक उदाहरण कहा जाता है और MainComponent जो उपयोगकर्ता द्वारा उपयोग किया जाता है कि प्रत्येक ओएससी संदेश करता है की सेटिंग में बदलाव करने से प्रदर्शित किया जाता है।

  • SubComponent1 - इस घटक वर्ग का एक उदाहरण उदाहरण और मेनकंपोनेंट से प्रदर्शित होता है।

  • SubComponent2 - इस घटक वर्ग के 48 उदाहरणों को SubComponent1 से बुलाया और प्रदर्शित किया जाता है। प्रत्येक इंस्टेंस का उपयोग एक अलग ओएससी संदेश के मूल्य को प्रदर्शित करने के लिए किया जाता है।

  • Mode1/Mode2/Mode3 - इन कक्षाओं में से प्रत्येक का एक उदाहरण मुख्य से कहा जाता है। सेटिंग्स वर्ग के भीतर मान/चर के आधार पर प्रत्येक वर्ग का उपयोग वास्तव में ओएससी संदेशों को ऑडियो या MIDI डेटा में परिवर्तित करने के लिए किया जाता है।

  • Settings - इस वर्ग का एक उदाहरण जो सेटिंग्स को स्टोर करने के लिए उपयोग किया जाता है जो प्रत्येक अलग ओएससी संदेश से ध्वनि उत्पन्न होती है को नियंत्रित करता है।

मैं काफी खुश हूं कि मेरे पास सभी घटक/जीयूआई कक्षाएं सही तरीके से रखी गई हैं और जुड़ी हैं। मुझे आने वाले ओएससी संदेश भी ठीक काम कर रहे हैं। लेकिन यह सेटिंग क्लास इंस्टेंस का रिश्ते है कि मुझे पूरा यकीन नहीं है कि इसे कैसे कार्यान्वित किया जाए। यहाँ रिश्तों मैं मदद के साथ की जरूरत है:

  • मोड 1, मोड 2, और Mode3 के एकल उदाहरणों सब सेटिंग वर्ग उदाहरण से मूल्यों को पुनः प्राप्त करने की जरूरत है
  • MainComponent, Mode1Component, Mode2Component, Mode3Component के एकल उदाहरणों सभी सेटिंग क्लास इंस्टेंस में मान भेजने की आवश्यकता है, साथ ही उदाहरण से मान पुनर्प्राप्त करने की आवश्यकता है।
  • SubComponent2 के सभी 48 उदाहरणों ओएससी संदेश प्राप्त करने की आवश्यकता है

इसलिए मैं निम्नलिखित प्रश्न हैं:

  • कहाँ Settings वर्ग उदाहरण से तो सभी प्रासंगिक वर्ग उदाहरणों का उल्लेख किया कि बुलाया जाना चाहिए ऊपर इसके साथ संवाद कर सकते हैं? मैं केवल इस वर्ग के एक उदाहरण को चाहता हूं जिसे कई अन्य वर्गों द्वारा एक्सेस किया जाना चाहिए, तो क्या यह वैश्विक, सिंगलटन या स्थैतिक वर्ग होना चाहिए? मैं सिंगलटन डिज़ाइन पैटर्न का अध्ययन कर रहा हूं जो कि मैं देख रहा हूं, लेकिन मुझे लगता है कि अगर मैं वैकल्पिक तरीकों पर विचार कर सकता हूं तो मुझे इससे छुटकारा पाना चाहिए।

  • क्या यह Main कक्षा है जो ओएससी संदेशों के लिए सुनती है? ओएससी संदेशों के साथ-साथ मोड 1, मोड 2 और मोड 3 क्लास इंस्टेंस प्राप्त करने के लिए मैं SubComponent2 कैसे प्राप्त कर सकता हूं?

  • कार्यक्षमता कक्षाओं (मोड 1, मोड 2, और मोड 3) को मुख्य से बुलाया जाना चाहिए? मैं सभी कार्यक्षमता और जीयूआई कोड को अलग रखने की कोशिश कर रहा हूं क्योंकि मेरे पास कोई अन्य व्यक्ति जीयूआई प्रोग्रामिंग से निपट रहा है जबकि मैं एप्लिकेशन की कार्यक्षमता प्रोग्रामिंग से निपट रहा हूं।

  • क्या कोई भी मेरे कार्यक्रम के डिजाइन पैटर्न में किसी भी बड़ी खामियों को खोज सकता है?

किसी भी मदद की सराहना की जाएगी!

धन्यवाद

+5

हमें इस बीमियोथ का जवाब देने के लिए एक LiamLacey.StackExchange.Com वेबसाइट की आवश्यकता है। –

+2

प्रतिक्रिया प्राप्त करने के साथ शुभकामनाएं - शायद कुछ सलाह देने वाले किसी व्यक्ति द्वारा कुछ प्रबंधित करने के लिए प्रश्न को संकीर्ण करें। –

+0

हां मैं लंबे समय से चलने वाले प्रश्न के लिए क्षमा चाहता हूं - संक्षेप में संक्षेप में निबंध लिखने में हमेशा बेहतर रहा! –

उत्तर

1

"मुख्य" पर आपके सवालों के संबंध में: यदि आप "अनुप्रयोग स्टार्टअप" मिश्रण नहीं किया जाना चाहिए एक ही कक्षा/घटक में संदेश प्रसंस्करण के लिए जिम्मेदारी ("separation of concerns") के साथ। क्या आप प्रकाशक/ग्राहक पैटर्न

http://en.wikipedia.org/wiki/Publish/subscribe

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

http://geekswithblogs.net/theArchitectsNapkin/archive/2011/03/19/flow-design-cheat-sheet-ndash-part-i-notation.aspx

http://geekswithblogs.net/theArchitectsNapkin/archive/2011/03/20/flow-design-cheat-sheet-ndash-part-ii-translation.aspx

देखो एक सेटिंग वर्ग उदाहरण को लागू करने के रूप में एक सिंगलटन ठीक है, जब आप अपने कार्यक्रम में लगभग हर जगह उन सेटिंग्स की जरूरत है। कम से कम यह एक स्थिर वर्ग की तुलना में बेहतर टेस्टेबल है।लेकिन आपको वहां बहुत अधिक चीजें डालने से बचना चाहिए, क्योंकि बहुत सी चीजें सेटिंग्स पर निर्भर हो सकती हैं, जो बाद में रखरखाव पर नकारात्मक प्रभाव डाल सकती हैं।

+0

तो मुख्य के अलावा एक वर्ग तब 'ओएससी श्रोता' वर्ग होना चाहिए? क्या मुझे ओएससी संदेशों को कार्यक्रम में सही जगहों पर भेजने के लिए ऑब्जर्वर डिजाइन पैटर्न का उपयोग करना चाहिए? –

+0

@ लीम: या तो "मुख्य" ओएससी श्रोता है, और एक और वर्ग स्टार्टअप करता है, या "मुख्य" स्टार्टअप के लिए है और दूसरा सुनने के लिए है। "पर्यवेक्षक" प्रकाशक/ग्राहक का उप-समूह है, यहां लागू हो सकता है। यह आपका निर्णय है यदि यह सही उपकरण है, तो आप सबसे अच्छे विवरण जानते हैं। –

संबंधित मुद्दे