স্ট্রাইকগুলির জন্য টাইপডেফগুলি কেন ব্যবহার করবেন?


12

সি (এএনএসআই, সি 99, ইত্যাদি) এ স্ট্রাইকগুলি তাদের নিজস্ব জায়গাতেই থাকে। একটি লিঙ্কযুক্ত তালিকার কাঠামো এর মতো দেখতে পারে:

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.wikedia.org/wiki/Typedef#Usage_concerns

কিছু লোক টাইপডেফের ব্যাপক ব্যবহারের বিরোধী। বেশিরভাগ আর্গুমেন্ট এই ধারণাটিকে কেন্দ্র করে যে টাইপিডেফগুলি কেবল একটি ভেরিয়েবলের আসল ডেটা টাইপ লুকায়। উদাহরণস্বরূপ, লিনাক্স কার্নেল হ্যাকার এবং ডকুমেন্টমেনার গ্রেগ ক্রোয়া-হার্টম্যান ফাংশন প্রোটোটাইপ ঘোষণা ব্যতীত অন্য কোনও কিছুর জন্য তাদের ব্যবহারকে নিরুৎসাহিত করে। তিনি যুক্তি দিয়েছিলেন যে এই অনুশীলনটি কেবল অযৌক্তিকভাবে কোডকেই অবিচ্ছিন্ন করে না, এটি প্রোগ্রামাররা দুর্ঘটনাক্রমে বড় কাঠামোগুলি তাদের সাধারণ ধরণের বলে ভেবে ভুলভাবে ব্যবহার করতেও পারে [[৪]

আবার কেউ কেউ যুক্তি দেয় যে টাইপডেফসের ব্যবহার কোড বজায় রাখা সহজ করে তুলতে পারে। কে অ্যান্ড আর বলেছে যে টাইপেফ ব্যবহারের দুটি কারণ রয়েছে। প্রথমত, এটি কোনও প্রোগ্রামকে আরও বহনযোগ্য করে তোলার একটি উপায় সরবরাহ করে। প্রোগ্রামের উত্স ফাইলগুলির জুড়ে এটি যে কোনও জায়গায় পরিবর্তিত হওয়ার পরিবর্তে কেবলমাত্র একটি একক টাইপডেফ বিবৃতি পরিবর্তন করতে হবে। দ্বিতীয়ত, একটি টাইপিডেফ একটি জটিল ঘোষণা বুঝতে সহজতর করতে পারে।

আমি ব্যক্তিগতভাবে আশ্চর্য হয়েছি যে structকখনও কখনও টাইপডেফ স্ট্রাক্ট ব্যবহার না করার জন্য পৃথক নেমস্পেস থাকার যথেষ্ট সুবিধা নেই এবং যেহেতু চারপাশে বেশ কয়েকটি সি প্রোগ্রামিং সংস্কৃতি রয়েছে (উইন্ডোজ সি প্রোগ্রামিংয়ে আমার অভিজ্ঞতায় লিনাক্স সি প্রোগ্রামিংয়ের চেয়ে আলাদা traditionsতিহ্য রয়েছে) যদি অন্য থাকে traditionsতিহ্যগুলি যে সম্পর্কে আমি অবগত নই।

তারপরে আমি historicalতিহাসিক বিবেচনায় আগ্রহী (পূর্বসূরি, সি এর প্রথম সংস্করণ)।


4
একটি এর উদ্দেশ্য typedef হ'ল ভেরিয়েবলের আসল প্রকারটি লুকানো। time_tউদাহরণ হিসাবে ধরুন : লোকেরা যদি অন্তর্নিহিত পূর্ণসংখ্যার প্রকারটি ব্যবহার করে ঘুরে বেড়ায়, তবে বাস্তবায়নের পরিবর্তনটি ছিল 2038 সালে প্রয়োজনীয় কোডটি ভয়াবহভাবে ভেঙে দেবে। - যদি লোকেরা বুঝতে না পেরে স্ট্রাকচার ব্যবহার করে থাকে তবে এটি প্রোগ্রামারটিতে ব্যর্থতা, নির্মাণে নয়।
blrfl

উত্তর:


14

আমি একটি বৃহত প্রকল্পে কাজ করেছি যা টাইপেফ স্ট্রাক্টগুলি ব্যাপকভাবে ব্যবহার করে used আমরা বেশ কয়েকটি কারণে তা করেছি। দয়া করে মনে রাখবেন যে এটি পূর্ব -৯৯ এবং নেমস্পেস বিভাজন ছিল।

  1. এটির my_buffer_type *bufferপরিবর্তে টাইপ করা সহজ ছিল struct tag_buffer_type *bufferএবং কোডবেজের আকারের জন্য (1 এম + লোকাল) যা একটি বড় পার্থক্য করেছে।

  2. এটি স্ট্রাকচারকে কোনও বস্তুতে বিমূর্ত করে তোলে। স্ট্রাক্টের মধ্যে প্রতিটি পৃথক ভেরিয়েবলের উপর ফোকাস করার পরিবর্তে, আমরা উপস্থাপিত ডেটা অবজেক্টের উপর ফোকাস করব। এই বিমূর্তনের ফলে কোডটি লেখার ক্ষেত্রে আরও কার্যকর এবং সহজতর হয়।

    • আমি মনে করি এটি আপনার প্রদান করা গ্রেগ ক্রোহ-হার্টম্যানকে দায়ী করা উক্তির সাথে সরাসরি বৈপরীত্য। এফডব্লিউআইডাব্লু, প্রকল্পটি একটি ক্লায়েন্ট / সার্ভার অ্যাপ্লিকেশন ছিল এবং কার্নেল নয় তাই অবশ্যই বিবেচনায় নেওয়ার জন্য কিছু আলাদা বিবেচনা রয়েছে।
  3. কাঠামোটিকে কোনও অবজেক্ট হিসাবে চিকিত্সা করা আমাদের তথ্যের আরও ভালভাবে সজ্জিত করতে সক্ষম করে। কোড পর্যালোচনা বেশ কয়েকটি পরিস্থিতিতে ধরা পড়ে যেখানে একটি নতুন বিকাশকারী আমরা স্থাপন করা এনক্যাপসুলেশন নীতি লঙ্ঘন করবে। টাইপডেফ স্ট্রাকস ব্যবহার করা সত্যিই এই লঙ্ঘনগুলিকে সুস্পষ্ট করে তুলেছে।

  4. পোর্টেবিলিটিটি উদ্বেগজনক ছিল কারণ আমরা সার্ভারের সাথে অর্ধ-ডজন প্ল্যাটফর্মের জন্য এবং ক্লায়েন্টের সাথে আরও কয়েকজন লিখেছিলাম।


5

প্রতিবার টাইপ না করে

struct my_buffer_type *buffer;

আপনি যদি typedefএটি সরাসরি ব্যবহার করতে পারেন

my_buffer_type *buffer;

typedefএর মূল ব্যবহার হ'ল কোডটি লেখার জন্য প্রয়োজনীয় কীস্ট্রোকের সংখ্যা হ্রাস করা এবং পঠনযোগ্যতা বাড়ানো।


আপনি ঠিক বলেছেন তবে আমি এই প্রশ্নটি ইতিমধ্যে আমার প্রশ্নে বর্ণনা করেছি।
ওয়ার্লবেল
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.