मुद्रण उपयोग / सहायता (--help) के लिए सबसे अच्छा अभ्यास क्या माना जाता है?


13

UNIX के CLI के लिए उपकरण लिखते समय, मुझे प्रोग्राम का प्रिंट आउट सहायता और / या उपयोग कैसे करना चाहिए?

मैं आमतौर पर उपयोग करता हूं fprintf(stderr, "help text here");, लेकिन इसके साथ कई मुद्दे हैं।

  • सबसे पहले, मुझे यकीन नहीं है, चाहे मुझे उपयोग करना चाहिए stderr। क्या यह ठीक है, या मुझे उपयोग करना चाहिए stdout?
  • जैसा कि आप कल्पना कर सकते हैं, सहायता पाठ काफी लंबा है, यह इस बात पर निर्भर करता है कि उपकरण में कितने विकल्प हैं। अब, मैं आमतौर पर, बस "strings like that\n"दूसरे पैरामीटर में कई डाल देता हूं । हालाँकि, यह मेरे स्रोत कोड को पचास या अधिक मदद पाठ के साथ भरता है। यह आसान प्रबंधनीय नहीं है। इसके बजाय मुझे क्या करना चाहिए?
  • जब कोई उपकरण C या C जैसी भाषा में नहीं लिखा जाता है, तो मैं यहां उन डॉक्स का उपयोग करना चाहता हूं जहां ( संभवत: पेरोस के साथ सबसे प्रमुख)। मैं उस C का उपयोग नहीं कर सकता, लेकिन क्या ऐसा कुछ है, जिसका मैं उपयोग कर सकता हूं?
  • मैं इसे एक headerfile.hअंदर में डालने पर विचार कर रहा था #define HELP "help text here", मैंने इसे कभी जंगली में नहीं देखा है, पता नहीं मुझे वास्तव में इसका उपयोग करना चाहिए या नहीं।

आदर्श रूप में, मैं पाठ को एक बाहरी फ़ाइल में रख सकता हूं, और इसे शामिल कर सकता हूं। इसके लिए उपयोग करना #includeगलत लगता है, हालांकि। तब मुझे क्या करना चाहिए?

विचार यह है कि एक सहायता पाठ हो, जो आसानी से प्रबंधनीय हो। स्रोत कोड के अंदर होने से यह वास्तव में सुविधाजनक नहीं है।


1
आपके सोर्स कोड में 50 लाइनों के बारे में क्या बुरा है? बस इसे अंत में रखें। ऐसा नहीं है कि आप नियमित रूप से इसके साथ खिलवाड़ करने जा रहे हैं।
whatsisname

2
@whatisname उपयोग, सामान्य और longopts के लिए मदद। मैं अंत में लगभग 200 लाइनों के तार को सिटकोड में समाहित करता हूं। उस के अलावा, मुझे नहीं लगता कि यह सबसे अच्छा अभ्यास है, आदि। मदद ग्रंथों में डालने का एक अधिक कुशल तरीका होना चाहिए, आदि
23

जवाबों:


8

अपने लक्ष्य मंच के इंटर्न से खुद को प्रेरित करें

BSD के सोर्स कोड पर एक नजर। उदाहरण के लिए, यहाँ हैं:

  • usage(void)NetBSD के /usr/bin/unameटूल [ स्रोत ] के लिए:

    usage(void)
    {
        fprintf(stderr, "usage: uname [-amnprsv]\n");
        exit(EXIT_FAILURE);
    }
    
  • usage(void)NetBSD के /usr/bin/telnet[ स्रोत ] के लिए

  • usage(void)OpenBSD के /bin/ls[ स्रोत ] के लिए

विकल्पों पर एक नजर है

और अपने लिए तय करें कि वे बेहतर हैं या बदतर। आप दूसरों को खोजने के लिए Google CodeSearch का उपयोग कर सकते हैं, जैसे:

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

मदद की 50 लाइनों के लिए एक गैर-मानक समाधान ...

यदि आप पाठ की 50 पंक्तियों से बचना पसंद नहीं करते हैं, तो आप बस एक पाठ फ़ाइल से मदद पढ़ सकते हैं (सादे पाठ में, या हो सकता है कि manअगर आप एक बना है तो सीधे सीधे स्रोत को पार्स करें )। मुझे लगता है कि एक बहुत ही सुंदर तरीका है (जैसा कि आप पाठ डॉक्टर को भी देख सकते हैं), हालांकि कोर सिस्टम प्रोग्राम के लिए जो उन्हें स्वाभाविक रूप से असुरक्षित बना देगा और विफलता का एक बिंदु पेश करेगा। अन्य लोगों को एक के लिए यह भारी का तर्क होगा usageया helpसंदेश, लेकिन ऐसा लगता नहीं इन तेजी से तंग छोरों में कहा जाता है है ...

जब संदेह में, दिग्गजों का पालन करें।


9

मैं उपयोग करता हूं stdout, क्योंकि कोई सहायता त्रुटि नहीं है।

यदि यह C में एक लंबी मदद है, तो मैं यहां डॉक्स की नकल करने की कोशिश करता हूं:

printf("This is the help for MyWonderfulApp\n"
       "Options are:\n"
       "    --help: display what you are reading now\n"
       "    --quiet: output nothing\n");

लेकिन ज्यादातर समय मैं समर्पित टैग manका उपयोग करके एक पृष्ठ लिखता हूं nroff -man। इन-ऐप मदद केवल उस manपृष्ठ को संदर्भित करने में शामिल है ।


लेकिन मदद आवश्यक रूप से वांछनीय मानक आउटपुट नहीं है, क्या यह है? कैसे के बारे में stdlog?
ग्रेफेड

@ ग्रेफेड: stdlogमानक C है?
मौविसील

@mouviciel: ... मुझे लगा कि यह था। मुझे नहीं लगता। सी ++ एक संबंधित मानक धारा है ( cin, cout, cerr, और clog), तो मैं मैंने सोचा था कि लगता है कि stdlogसी मानक में था। मेरी गलती।
ग्रेफेड

2

अगर मैं तुम्हें होगा मैं बस के स्रोतों को खोल दिया था grep, tail, cat, your_other_favorite_unix_shell_commandदेखने के लिए कि यह कैसे वहाँ किया है। मुझे पूरा यकीन है कि उनके तरीके बहुत अच्छी तरह से सोचे गए हैं और कई लोगों द्वारा बनाए रखा जा सकता है।

के बारे में stderrया stdout। यह वास्तव में सरल है, अगर कोई त्रुटि है - stderrअगर यह सिर्फ जानकारी है - तो लिखें stdout। उदाहरण के लिए, यदि मैं आपके उपकरण को गलत विकल्पों के साथ चलाता हूं, तो आप एक त्रुटि प्रदर्शित कर सकते हैं, कहते हैं Use --help for usage, यह एक में है stderr। यदि मैं आपके टूल को एक वैध विकल्प के साथ चलाता हूं --help, तो कृपया उपयोग करें stdout

यदि यह आपकी प्राथमिकता है कि आपके कोड के पास लंबे समय तक मदद के तार न हों, तो न करें। हेडर फ़ाइल में #define पूरी तरह से ठीक है, लेकिन यह वास्तव में एक व्यक्तिगत प्राथमिकता है। अगर मुझे कमांड लाइन टूल का कोड पढ़ना होता है, तो मैं इसकी मदद स्ट्रिंग को एक फ़ाइल के अंदर करना पसंद करूंगा जो उपयोगकर्ता द्वारा दिए गए विकल्पों को संभालती है।


2
यह उनके सवाल का जवाब नहीं है।
माव्रिक

हम्म, माइनस-इंग के साथ क्या हो रहा है? किस लिए?
devmiles.com

@Mavrik: पहला पैराग्राफ करता है।
प्रात

1

मैं गन्नो गेटटॉप्स लाइब्रेरी का उपयोग करता हूं । मदद के लिए एक उदाहरण के लिए, इस नमूना परियोजना को देखें , विशेष रूप से parser.y के तल पर मुख्य विधि ।

चूंकि यह घुंघराले ब्रेसिज़ में लिपटे हुए हैं, इसलिए मैं जिस vim एडिटर का उपयोग करता हूं वह लाइनों को एक साथ जोड़ सकता है, और जब मुझे ज़रूरत होती है तो मैं उन्हें नोटिस भी नहीं करता।


1

यदि मैं सी का उपयोग करता हूं या बूस्ट लाइब्रेरी पर निर्भर नहीं होना पसंद करता हूं, तो मैं जीएनयू के साथ रहना चाहता हूं getopt। अन्यथा मैं Boost Program Options को प्राथमिकता देता हूं जो प्रिंट स्वचालित रूप से मदद करता है।

जब मैं विकल्पों को संभालने की बात करता हूं तो मैं सबसे अच्छे तरीकों में से एक सही विकल्प का अनुमान लगाने पर विचार करता हूं। मैंने इसे Git से सीखा और अब अपनी परियोजनाओं में उसी का उपयोग करता हूं। यदि उपयोगकर्ता किसी अज्ञात कमांड लाइन विकल्प में प्रवेश करता है तो यह मूल रूप से दमरेउ-लेवेंसाइट दूरी का उपयोग करता है।

मैंने इस बारे में एक छोटा सा लेख लिखा था जिसका उपयोग आप एक उदाहरण के रूप में कर सकते हैं।

आशा है ये मदद करेगा :)


1

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

तब आप उस पाठ फ़ाइल को कानूनी C शीर्ष लेख फ़ाइल में बदलने के लिए निम्न sed स्क्रिप्ट का उपयोग कर सकते हैं :

s/\"/\\\"/g
s/$/\\n"/
s/^/"/
1i\
const char *helpStr = 
$a\
;

फिर, अपने हेडर फ़ाइल को अपने स्रोत कोड में #include करने पर , आप बस अपने पाठ का उपयोग करके लिख सकते हैं

cout << helpStr;
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.