2009-05-03 10 views
7

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

मेरे सवाल यह है: आप में से किसी एक OO प्रतिमान में सांत्वना आवेदनों की अच्छा डिजाइन के बारे में पता तो मैं उन लोगों से सीख सकते हैं हैं? अच्छे कार्यान्वयन कोड विशेष रूप से स्वागत है।

संपादित करें: मैं कमांड लाइन एपीआई के बाद नहीं हूं, लेकिन अच्छे डिजाइन सिद्धांतों के बाद, और विशेष रूप से, अच्छे कार्यान्वयन से मैं सीख सकता हूं।

संपादित करें 2: आवेदन में सरल उपयोगकर्ता इंटरैक्शन है, लेकिन यह एक पूर्ण सीएलआई/आरईपीएल प्रकार नहीं है। टीएक्स कमांड के रूप में इसके बारे में सोचें, कम या ज्यादा। दिलचस्प बात यह है कि भले ही अच्छा सिद्धांत चारों ओर तैर रहा है (एक्स से अलग नहीं, पैटर्न पैटर्न वाई का उपयोग करें, आपको ओओ सिद्धांतों को जानना चाहिए ... [आपका कंप्यूटर विज्ञान प्रोफेसर बहुत गर्व होगा!]), कोई असली कोड नहीं है जिसे मैं ले सकता हूं कार्रवाई में इन अवधारणाओं को देखने के लिए देखो। फिर, शुद्ध ओओ प्रतिमान में एक अच्छा कमांड लाइन एप्लिकेशन के लिए मुझे (कोड!) कहाँ दिखना चाहिए?

+0

कंसोल क्षुधा आम तौर पर प्रकृति में उपयोगी हैं। WinForms डेस्कटॉप ऐप्स पर wwitching करके - आपके पास एक बेहतर सीखने का अनुभव हो सकता है - और कई और नमूना ऐप्स ढूंढें। – DOK

+0

कंसोल schmonsole। ओओ प्रोग्राम करने से पहले ओओ सीखने के बारे में सब कुछ। कोड पूर्ण करने के लिए एक सभ्य प्रारंभिक बिंदु है। उपयोगी ऐप आर्किटेक्चर गाइड के लिए सूचक के लिए – Will

उत्तर

7

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

किसी भी मामले में, यह कार्य तर्क कमांड लाइन को पारित कर दिया पर निर्भर करेगा, तो मैं उस हिस्से के बारे में मंथन होगा ...

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

मॉड्यूलर होने के लिए, प्रेषक को प्रत्येक कमांड टोकन (आमतौर पर कमांड लाइन स्ट्रिंग का पहला शब्द) को कमांड ऑब्जेक्ट में जोड़ने के लिए एक सारणित मैपिंग (उदाहरण के लिए, हैशटेबल) के साथ कॉन्फ़िगर किया जाना चाहिए। प्रेषक भारी विकल्प-पार्सिंग को भी संभाल सकता है, शायद भारी उठाने के लिए कुछ ऑफ-द-शेल्फ "गेटोपेट्स" लाइब्रेरी का उपयोग कर सकता है।

सरल शुरू करने के लिए, प्रत्येक कमांड ऑब्जेक्ट अपने काम करने के लिए एक सतत इंटरफेस लागू कर सकता है; इस तरह शायद कुछ:

public void execute(List<String> args) 

इस तरह, प्रवेश बिंदु डिस्पैचर बस कमान अनुरोध किया जा रहा पाता है, और यह executes

त्रुटि-हैंडलिंग के संबंध में: execute() विधि केवल त्रुटियों को संवाद करने के लिए अपवाद फेंक सकता है ... अपवाद को प्रेषक द्वारा पकड़ा और संसाधित किया जा सकता है, या बस स्क्रीन पर लॉग इन किया जा सकता है। वैकल्पिक रूप से, कमांड कमांड सामान्य निर्देशों के साथ एक त्रुटि संदेश को गठबंधन करने के लिए कुछ साझा usage फ़ंक्शन को आमंत्रित कर सकता है। मुझे नहीं लगता कि "प्रवेश बिंदु" को आपके द्वारा सुझाए गए समस्याओं के बारे में अवगत कराया जाना चाहिए; अगर आपको मजबूत त्रुटि-प्रबंधन की आवश्यकता है (उदाहरण के लिए, लॉगिंग या क्षमताओं को अलर्ट करने के लिए), ऐसा लगता है कि यह एक अलग घटक में है जो कमांड ऑब्जेक्ट को प्रदान किया जा सकता है।

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

3

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

कहा करने के बाद कि आप कर सकते हैं तो कृपया हमारे सवाल का विस्तार करें कि वे चिंता के प्रमुख क्षेत्र कहां हैं?

आप App Architecture Guide से Microsoft से कई पैटर्न पर आकर्षित कर सकते हैं।

+1

+1! –

+0

वही है। गाइड, उत्कृष्ट लिंक के लिए +1। –

+0

कोई भी मैक पर 10.5.6 चल रहे मैक पर पूर्वावलोकन के साथ ऐप आर्किटेक्चर गाइड खोलने में सक्षम है? – msi

1

जावा में मैं अक्सर Apache CLI का उपयोग करता हूं, मैंने ".NET के लिए CLI" googled है लेकिन यह अभी तक कोई कार्यान्वयन प्रतीत नहीं होता है। कंसोल पैरामीटर प्राप्त करने के लिए जावा दृष्टिकोण को पढ़ने के लिए शायद आपके लिए उपयोगी है।

अपने अनुप्रयोग की वास्तुकला के लिए, यह वास्तुकला आप एक वेब एप्लिकेशन में आपके द्वारा उपयोग से नहीं बहुत अलग होना चाहिए, अंतर सांत्वना अपनी प्रस्तुति स्तरीय के इंटरफेस है। शायद आप व्यापार स्तर से कंसोल और उपाध्यक्ष तक मॉडल प्राप्त करने के लिए कुछ 'कंसोल नियंत्रक' को परिभाषित कर सकते हैं। अनुरोध के रूप में हर उपयोगकर्ता इनपुट के बारे में सोचें;)।

http://en.wikipedia.org/wiki/REPL

जाहिर है, एक डोमेन विशिष्ट (कंसोल) आवेदन एक ट्यूरिंग पूरा भाषा समर्थन नहीं कर रहा है, लेकिन बहुत से:

+0

अच्छा सूचक - मुझे अपाचे कॉमन्स पुस्तकालयों पर अधिक ध्यान देना चाहिए – msi

1

इसकी सबसे (चरम) सामान्य अर्थ में, एक सांत्वना आवेदन आरईपीएल का एक प्रकार है मुद्दों का ओवरलैप, और एक अच्छा आरईपीएल एक बहुत मजबूत कमांड लाइन आवेदन होना चाहिए। मुझे यकीन है कि आप एक ठेठ आरईपीएल के डिजाइन और कार्यान्वयन का बहुत कुछ सीख सकते हैं। (अधिकांश आरईपीएल ओपन सोर्स हैं। (ओओ आरईपीएल के लिए रूबी या पायथन का प्रयास करें))

0

एक कार्यक्रम विशेष रूप से सी # में अच्छा वास्तुशिल्प डिजाइन के लिए के लिए आप OO डिजाइन अवधारणाओं से परिचित पूरी तरह से OO की advanage लेने के लिए किया जाना चाहिए मानदंड

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