टंकण के लिए टंकण का उपयोग क्यों करें?


12

C (ANSI, C99, आदि) में, संरचनाएं अपने स्वयं के नामस्थान में रहती हैं। लिंक की गई सूची के लिए एक संरचना कुछ इस तरह दिख सकती है:

struct my_buffer_type {
   struct my_buffer_type * next;
   struct my_buffer_type * prev;
   void * data;
};

हालांकि, अधिकांश सी प्रोग्रामर के लिए यह बहुत स्वाभाविक लगता है कि वे निम्नलिखित की तरह उन संरचनाओं को स्वचालित रूप से टाइप करें

typedef struct tag_buffer_type {
   struct tag_buffer_type * next;
   struct tag_buffer_type * prev;
   void * data;
} my_buffer_type;

और फिर संरचना को एक सामान्य प्रकार की तरह संदर्भित करें, अर्थात get_next_element(my_buffer_type * ptr)

अब मेरा प्रश्न है: क्या इसका कोई विशेष कारण है?

विकिपीडिया कहता है http://en.wikipedia.org/wiki/Typedef#Usage_concerns

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

अन्य लोगों का तर्क है कि टाइपडेफ़्स के उपयोग से कोड को बनाए रखना आसान हो सकता है। K & R का कहना है कि एक टाइपेडिफ का उपयोग करने के दो कारण हैं। सबसे पहले, यह एक प्रोग्राम को अधिक पोर्टेबल बनाने का साधन प्रदान करता है। प्रोग्राम के स्रोत फ़ाइलों में यह हर जगह एक प्रकार बदलने के लिए होने के बजाय, केवल एक टाइप किए गए कथन को बदलना होगा। दूसरा, एक टाइप्डफ एक जटिल घोषणा को समझने में आसान बना सकता है।

मुझे व्यक्तिगत रूप से आश्चर्य होता है कि यदि अलग-अलग structनेमस्पेस का कभी-कभी लाभ नहीं होता है, तो कभी-कभी टाइप-बीड स्ट्रक्चर का उपयोग नहीं करना चाहिए और चूंकि आसपास कई सी प्रोग्रामिंग संस्कृतियां हैं (विंडोज सी प्रोग्रामिंग में मेरे अनुभव में लिनक्स सी प्रोग्रामिंग की तुलना में अलग परंपराएं हैं) यदि अन्य हैं ऐसी परंपराएं जिनके बारे में मुझे जानकारी नहीं है।

तब मुझे ऐतिहासिक विचारों (पूर्ववर्तियों, सी के पहले संस्करणों) में दिलचस्पी है।


4
एक करने के उद्देश्य typedef है एक चर के वास्तविक प्रकार को छिपाने के लिए। time_tएक उदाहरण के रूप में लें : यदि लोग अंतर्निहित पूर्णांक प्रकार का उपयोग करते हुए घूमते हैं, तो कार्यान्वयन में परिवर्तन ऐसा था जो 2038 में आवश्यक होगा और एक बहुत सारे कोड को तोड़ देगा। यदि लोग बिना समझे संरचनाओं का उपयोग कर रहे हैं, तो यह प्रोग्रामर की विफलता है, न कि निर्माण की।
ब्लरफ्ल

जवाबों:


14

मैंने एक बड़े प्रोजेक्ट पर काम किया, जो बड़े पैमाने पर टाइपडिफेल स्ट्रक्चर का इस्तेमाल करता था। हमने कुछ कारणों से ऐसा किया। कृपया ध्यान रखें कि यह पूर्व C99 और नेमस्पेस अलगाव था।

  1. इसके my_buffer_type *bufferबजाय टाइप करना आसान था struct tag_buffer_type *buffer, और कोडबेस (1M + लोके) के आकार के लिए जिसने बड़ा बदलाव किया।

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

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

  4. पोर्टेबिलिटी एक चिंता थी क्योंकि हमने सर्वर के साथ आधा दर्जन प्लेटफार्मों के लिए लिखा था और क्लाइंट के साथ कुछ अधिक।


5

हर बार टाइप करने के बजाय

struct my_buffer_type *buffer;

यदि आप typedefइसे सीधे उपयोग कर सकते हैं

my_buffer_type *buffer;

typedefकोड लिखने के लिए और पठनीयता बढ़ाने के लिए आवश्यक कीस्ट्रोक्स की संख्या को कम करने के लिए मुख्य उपयोग है।


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