क्या हेडर फ़ाइल या स्रोत फ़ाइल में दस्तावेज़ों को दस्तावेज़ करना बेहतर है?


86

"स्रोत" और "हेडर" फ़ाइल (मुख्य रूप से C और C ++) के बीच अंतर करने वाली भाषाओं में, क्या हेडर फ़ाइल में दस्तावेज़ों को बनाना बेहतर है:

( CCAN से प्राप्त )

/**
 * time_now - return the current time
 *
 * Example:
 *  printf("Now is %lu seconds since epoch\n", (long)time_now().tv_sec);
 */
struct timeval time_now(void);

या स्रोत फ़ाइल में?

(PostgreSQL से प्राप्त)

/*
 * Convert a UTF-8 character to a Unicode code point.
 * This is a one-character version of pg_utf2wchar_with_len.
 *
 * No error checks here, c must point to a long-enough string.
 */
pg_wchar
utf8_to_unicode(const unsigned char *c)
{
...

ध्यान दें कि कुछ चीजें हेडर में ही परिभाषित की जाती हैं, जैसे कि संरचना, मैक्रोज़ और static inlineफ़ंक्शन। मैं केवल उन चीजों के बारे में बात कर रहा हूं जो हेडर फ़ाइल में घोषित की गई हैं और स्रोत फ़ाइल में परिभाषित की गई हैं।

यहां कुछ तर्क दिए गए हैं, जिनके बारे में मैं सोच सकता हूं। मैं स्रोत फ़ाइल में दस्तावेज़ीकरण की ओर झुक रहा हूं, इसलिए मेरे "प्रो-हेडर" तर्क कुछ कमजोर हो सकते हैं।

समर्थक हैडर:

  • प्रलेखन देखने के लिए उपयोगकर्ता को स्रोत कोड की आवश्यकता नहीं है।
    • स्रोत प्राप्त करने के लिए असुविधाजनक, या असंभव भी हो सकता है।
    • यह इंटरफ़ेस और कार्यान्वयन को अलग रखता है।

समर्थक स्रोत:

  • यह हेडर को बहुत छोटा बना देता है, जिससे पाठक को समग्र रूप से मॉड्यूल की एक पक्षी-दृष्टि मिलती है।
  • यह अपने कार्यान्वयन के साथ एक फ़ंक्शन के प्रलेखन को जोड़ देता है, यह देखना आसान है कि एक फ़ंक्शन वह करता है जो वह कहता है।

जवाब देते समय, कृपया तर्क से सावधान रहें कि कौन से उपकरण और "आधुनिक आईडीई" क्या कर सकते हैं। उदाहरण:

  • प्रो-हेडर: कोड फोल्डिंग कमेंट हेडर्स को कमेंट छिपाकर अधिक नेविगेट करने में मदद कर सकता है।
  • Pro-source: cscope की Find this global definitionसुविधा आपको हेडर फ़ाइल (जहां घोषणा है) के बजाय स्रोत फ़ाइल (जहाँ परिभाषा है) पर ले जाती है।

मैं यह नहीं कह रहा हूं कि इस तरह के तर्क न दें, लेकिन ध्यान रखें कि हर कोई आपके द्वारा उपयोग किए जाने वाले टूल के साथ उतना सहज नहीं है।


एक ही प्रश्न पास्कल / डेल्फी पर लागू हो सकता है जहां हमारे पास स्रोत और हेडर फाइलें नहीं हैं, लेकिन इंटरफ़ेस और कार्यान्वयन अनुभाग हैं।
जनवरी डॉगजेन

1
यह भी देखें stackoverflow.com/questions/355619/…
cp.engr

जवाबों:


96

मेरे विचार...

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

  • स्रोत फ़ाइल में फ़ंक्शन कैसे काम करता है (यदि यह कोड से स्पष्ट नहीं है), या अधिक सटीक, परिभाषा के करीब।

हेडर में पक्षियों की आंखों की बात के लिए, आपको जरूरी नहीं कि प्रलेखन की आवश्यकता है - आप एक बार में घोषणाओं के समूहों को दस्तावेज कर सकते हैं।

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


13
+1 - अर्थात हेडर में इंटरफ़ेस का दस्तावेज़। स्रोत में कैसे और क्यों का विवरण है।
जल्‍दी से जल्‍दी_जून

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

स्वाभाविक रूप से, कभी-कभी घोषणा और परिभाषा एक ही होती है।
Deduplicator

@ डेडप्लिकेटर - जब वही नियम अभी भी विशेष मामले में सही बात की ओर ले जाते हैं, तो हर विशेष मामले के लिए उन नियमों को क्यों प्रतिध्वनित किया जाता है? निश्चित रूप से एक समर्पणकर्ता को यह नहीं चाहिए?
स्टीव

1
@ डेडप्लिकेटर - बेशक जो आपकी सलाह का पालन नहीं करने के लिए एक बड़े पैमाने पर तर्क दिया है, लेकिन मैं इसके साथ चिपका रहा हूं।
स्टीव

34

यदि आप Doxygen जैसे उपकरण का उपयोग करने जा रहे हैं (पहले उदाहरण में ध्यान दें, जो वास्तव में एक Doxygen टिप्पणी जैसा दिखता है क्योंकि यह इसके साथ शुरू होता है /**) तो यह वास्तव में कोई फर्क नहीं पड़ता - Doxygen आपके हेडर और स्रोत फ़ाइलों को देखेगा और ढूंढेगा प्रलेखन उत्पन्न करने के लिए सभी टिप्पणियाँ।

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

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


2
+1 - यह साबित करने के साथ कि यदि आप Doxygen का उपयोग करते हैं, तो इसका मतलब यह नहीं है कि आप कभी भी स्रोत से सीधे पढ़ने नहीं जा रहे हैं। Doxygen एनोटेशन कभी-कभी मानक पैटर्न के रूप में भी उपयोगी होते हैं, और अगर यह एनोटेशन आपके द्वारा वर्णित कोड के करीब है, तो यह उपयोगी है।
स्टीव ३४

1
@ Steve314 ofcourse मैंने यह नहीं कहा कि आप कभी भी किसी लाइब्रेरी के सोर्स कोड को नहीं देखना चाहेंगे - लेकिन यह वह पहला स्थान नहीं होगा, जिसे आप एपीआई की तरह दिखते हैं और उसका उपयोग कैसे करते हैं।
जेसपर

मैं हेडर में एपीआई से संबंधित हर चीज को रखने की वकालत करूंगा (या कम से कम या तो हेडर या सोर्स में), क्योंकि यह एक जगह पर डॉक्यूमेंटेशन अपडेट करने के दौरान संभावित गड़बड़ी से बचता है, दूसरे में नहीं।
जोपसैट

12

हमने इस समस्या को हल किया (लगभग 25 साल पहले) #defines (उदाहरण के लिए सार्वजनिक, निजी इत्यादि) का एक गुच्छा बनाकर, जो कि कुछ भी नहीं करने के लिए हल किया गया था) जो कि स्रोत फ़ाइल में उपयोग किया जा सकता है और एक स्कोप स्क्रिप्ट (भयावहता) द्वारा स्कैन किया गया था !) .h फ़ाइलों को ऑटो-जनरेट करने के लिए। इसका मतलब यह है कि सभी टिप्पणियां स्रोत में रहती थीं और उन्हें (। उपयुक्त) उत्पन्न .h फ़ाइल में कॉपी किया गया था। मुझे पता है कि यह बहुत पुराना स्कूल है, लेकिन इसने इस तरह के इनलाइन प्रलेखन को सरल बना दिया है।


1
हम्म मुझे पता है कि यह शैली उपयोगी हो सकती है, लेकिन मेरे दृष्टिकोण से मैंने हमेशा पाया कि इस तरह का प्रलेखन सर्वथा कष्टप्रद है ...
ओसिरिसगोत्रा

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

हालांकि मैं शायद इसके लिए विकल्प नहीं चुनूंगा, हेडर में टिप्पणियों को संभालने का एक दिलचस्प तरीका। क्या उत्पन्न हेडर संस्करण नियंत्रण में होंगे? या यह पुनर्वितरण योग्य स्रोत बनाने के लिए कुछ रिलीज प्रक्रिया है? (लेकिन डेवलपर्स द्वारा उपयोग नहीं किया जाता है)
विचार 2442

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

3
हमारे मामले में हमने संस्करण नियंत्रण के तहत उत्पन्न फ़ाइलों में से कोई भी नहीं रखा क्योंकि वे आसानी से और सीधे (फिर से) ट्रैक की गई फ़ाइलों से प्राप्त हुए थे।
पीटर रोवेल

9

यह मानते हुए एक बड़ी परियोजना के भीतर कोड है (जहां डेवलपर्स स्रोत और हेडर के बीच ले जाया जा रहा अक्सर) , और यह प्रदान नहीं है एक पुस्तकालय / मध्यम बर्तन, जहां दूसरों के स्रोत की पहुंच नहीं हो सकता है, मैं इस काम करता मिल गया है श्रेष्ठ...

  • शीर्ष लेख:
    1-2 पंक्ति टिप्पणियाँ, केवल तभी जब वे आवश्यक हों।
    कभी-कभी संबंधित कार्यों के एक समूह के ऊपर टिप्पणियाँ भी सहायक होती हैं।
  • स्रोत:
    कार्य के ऊपर सीधे एपीआई पर प्रलेखन (यदि आप चाहें तो सादा-पाठ या डॉक्सीजेन)
  • कार्यान्वयन विवरण रखें, केवल फ़ंक्शन के शरीर में कोड को संशोधित करने वाले डेवलपर के लिए प्रासंगिक है।

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

बेशक, आप एक सम्मेलन को चुन सकते हैं और सभी देवों का पालन सुनिश्चित कर सकते हैं, मैंने सिर्फ सम्मेलन को सबसे प्राकृतिक-फिट के ऊपर पाया और कम से कम परेशानी को बनाए रखा।


अंतिम रूप से, बड़ी परियोजनाओं के लिए - एक शीर्षलेख में छोटे सुधार करने के लिए एक झुकाव का इलाज करता है जब आप जानते हैं कि इसके संभावित रूप से 100 या 1000 की फ़ाइलों को फिर से संकलित करने का कारण बनता है जब अन्य संस्करण नियंत्रण को अपडेट करते हैं - बाइसेक्टिंग को भी धीमा कर देते हैं।


5

मेरी (बल्कि सीमित और पक्षपाती) राय में, मैं सोच का प्रो-सोर्स कोड तरीका हूं। जब मैं सी ++ में बिट्स और टुकड़े करता हूं, तो मैं आमतौर पर हेडर फ़ाइल को एक बार संपादित करता हूं और फिर मैं वास्तव में इसे देखने के लिए वापस नहीं जाता हूं।

जब मैं स्रोत फ़ाइल में प्रलेखन रखता हूं, तो मैं हमेशा इसे देख रहा होता हूं जब मैं कोड संपादित कर रहा हूं या पढ़ रहा हूं। मुझे लगता है कि यह आदत की बात है।

लेकिन यह सिर्फ मुझे है ...


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

आप doxygen के साथ प्रलेखन उत्पन्न कर सकते हैं - यह .c फ़ाइलों से भी लेता है। इस प्रकार आप संकलित पुस्तकालयों के साथ आसानी से प्रलेखन वितरित कर सकते हैं। लेकिन परेशानी IDE के साथ होगी जो हेडर फ़ाइलों को पार्स कर सकती है और फ़ंक्शन का उपयोग करते समय आपको दस्तावेज़ दे सकती है ... लेकिन शायद यह कुछ तैनाती स्क्रिप्ट को हल कर सकता है जो फ़ंक्शन टिप्पणियों को .c में .h में कॉपी करेगा ...
Vit Bernatik

5

टिप्पणियाँ दस्तावेज़ीकरण नहीं हैं। एक फ़ंक्शन के लिए प्रलेखन आमतौर पर पाठ का 2K हो सकता है, संभवतः आरेख के साथ - उदाहरण के लिए विंडोज एसडीके में कार्यों के लिए प्रलेखन देखें। यहां तक ​​कि अगर आपका कमेंट-टू-डॉक इस तरह की अनुमति देता है, तो आप उस कोड को बना रहे होंगे जिसमें टिप्पणी अपठनीय है। यदि आप प्रलेखन का उत्पादन करना चाहते हैं, तो शब्द-प्रोसेसर का उपयोग करें।


अद्यतन, यह इन दिनों दस्तावेज़ के लिए बहुत आसान है (क्यूटी निर्माता की तरह सामान के साथ) बस doxygen (या क्लोन) तरीके से दस्तावेज़ करने के लिए, उदाहरण के लिए, qtc में आपने टिप्पणी से पहले कुछ बार / कुंजी मारा और आधा। आपके लिए काम किया जाता है इस तरह की चीजों के कारण, मुझे संदेह है कि लोग अपने कोड को दस्तावेज करने के लिए एक वर्ड प्रोसेसर पर कूदना चाहेंगे। मैं ऐसा करता था, 2005 में वापस दे दिया गया था, लेकिन अब मैं ऐसा कभी नहीं करूंगा। यहां तक ​​कि एक html संपादक का उपयोग करना अब काफी पुरातन लगता है।
ओसिरिसगोत्रा

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

4

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

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


0

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


1
इससे पहले किए गए 7 से अधिक अंकों की व्याख्या नहीं की जा सकती है और पहले ही 7 उत्तरों में समझाया गया है
gnat

1
@ 7 से पहले के उत्तर में केवल एक हेडर के खिलाफ कोड के पक्ष में है। और वह एक बिलकुल अलग तर्क दे रहा है।
स्लाव
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.