টাইপিডেফ কখন ব্যবহার করবেন?


14

আমি কখন এবং কখন সি ++ তে টাইপডেফ ব্যবহার করব সে সম্পর্কে আমি কিছুটা বিভ্রান্ত। আমি মনে করি এটি পাঠযোগ্যতা এবং স্পষ্টতার মধ্যে একটি ভারসাম্যপূর্ণ কাজ।

কোনও টাইপডেফ ছাড়াই এখানে একটি কোড নমুনা রয়েছে:

int sum(std::vector<int>::const_iterator first, 
        std::vector<int>::const_iterator last)
{
    static std::map<std::tuple<std::vector<int>::const_iterator,
                               std::vector<int>::const_iterator>,
                    int> lookup_table;

    std::map<std::tuple<std::vector<int>::const_iterator,
                        std::vector<int>::const_iterator>, int>::iterator lookup_it =
        lookup_table.find(lookup_key);

    if (lookup_it != lookup_table.end())
        return lookup_it->second;            

    ...
}

বেশ কুরুচিপূর্ণ আইএমও। সুতরাং আমি এটিকে আরও সুন্দর দেখানোর জন্য ফাংশনের মধ্যে কিছু টাইপিডেফ যুক্ত করব:

int sum(std::vector<int>::const_iterator first, 
        std::vector<int>::const_iterator last)
{
    typedef std::tuple<std::vector<int>::const_iterator,
                       std::vector<int>::const_iterator> Lookup_key;
    typedef std::map<Lookup_key, int> Lookup_table;

    static Lookup_table lookup_table;

    Lookup_table::iterator lookup_it = lookup_table.find(lookup_key);

    if (lookup_it != lookup_table.end())
        return lookup_it->second;            

    ...
}

কোডটি এখনও কিছুটা আনাড়ি, তবে আমি বেশিরভাগ দুঃস্বপ্নের উপাদান থেকে মুক্তি পাই। তবে এখনও ইন্টি ভেক্টর পুনরুক্তি রয়েছে, এই রূপটি সেগুলি থেকে মুক্তি পেয়েছে:

typedef std::vector<int>::const_iterator Input_iterator;

int sum(Input_iterator first, Input_iterator last)
{
    typedef std::tuple<Input_iterator, Input_iterator> Lookup_key;
    typedef std::map<Lookup_key, int> Lookup_table;

    static Lookup_table lookup_table;

    Lookup_table::iterator lookup_it = lookup_table.find(lookup_key);

    if (lookup_it != lookup_table.end())
        return lookup_it->second;            

    ...
}

এটি দেখতে পরিষ্কার দেখাচ্ছে, তবে কী এখনও এটি পাঠযোগ্য?

আমি কখন টাইপডিফ ব্যবহার করব? আমার সাথে সাথে দুঃস্বপ্নের টাইপ? যত তাড়াতাড়ি এটি ঘটে একাধিকবার? আমি তাদের কোথায় রাখব? আমি কি তাদের ফাংশন স্বাক্ষরগুলিতে ব্যবহার করব বা এগুলি বাস্তবায়নে রাখব?


1
সদৃশ নয়, তবে কিছুটা আমার প্রশ্নোত্তরের সাথে সম্পর্কিত প্রোগ্রামার্স.স্ট্যাকেক্সচেঞ্জ
সেকশনস

typedef Input_iterator std::vector<int>::const_iterator;পিছনের দিকে
জোহাঁসন

1
পাঠযোগ্যতা এবং স্বচ্ছতার মধ্যে পার্থক্য আছে?
নিল

যখন #defineযথেষ্ট ভাল।
টমাস এডিং

উত্তর:


6

আপনার শেষ উদাহরণটি খুব বেশি পঠনযোগ্য তবে এটি আপনি টাইপডেফকে কোথায় সংজ্ঞায়িত করেন তার উপর নির্ভর করে। স্থানীয় স্কোপ টাইপইফগুলি (আপনার দ্বিতীয় উদাহরণের মতো) IMVHO প্রায় সর্বদা একটি জয়।

আমি এখনও আপনার তৃতীয় উদাহরণটি সবচেয়ে ভাল পছন্দ করি তবে আপনি নামটি সম্পর্কে ভাবতে চাইতে পারেন এবং পুনরাবৃত্তকারীদের নাম দিতে পারেন যা ধারকটির উদ্দেশ্য বলে।

অন্য বিকল্পটি হ'ল আপনার ফাংশনটি বাইরে টেমপ্লেট তৈরি করা, যাতে এটি বিভিন্ন পাত্রেও কাজ করে। লাইন বরাবর

template <typename Input_iterator> ... sum(Input_iterator first, Input_iterator last) 

যা এসটিএল-এর চেতনায়ও রয়েছে।


2

typedefকোনও ফাংশনটির পরিবর্তনশীল ঘোষণার সমতুল্য হিসাবে ভাবেন : এটি সেখানে তাই আপনি ...

  • ... একই ধরণের পুনরায় ব্যবহার করার সময় নিজেকে পুনরাবৃত্তি করতে হবে না (যা আপনার প্রথম দুটি উদাহরণ ব্যবহার করে)।
  • ... এই ধরণের বিশ্রী বিবরণগুলি গোপন করতে পারে যাতে তারা সবসময় প্রদর্শনীতে না থাকে।
  • ... নিশ্চিত করুন যে প্রকারের পরিবর্তনগুলি তারা ব্যবহৃত প্রতিটি জায়গায় প্রতিফলিত হয়েছে।

ব্যক্তিগতভাবে, আমি বারবারের মতো দীর্ঘ টাইপের নামগুলি পড়তে হলে আমি ঝলমলে std::vector<int>::const_iterator

আপনার তৃতীয় উদাহরণটি অকারণে নিজেকে পুনরাবৃত্তি করে না এবং এটি পড়া সহজ।


1

typedefঘোষণাগুলি মূলত এনক্যাপসুলেশন হিসাবে একই উদ্দেশ্যে পরিবেশন করে। সেই কারণে, তারা প্রায় সবসময় আপনার ক্লাসের মতো একই নামকরণের কনভেনশন অনুসরণ করে একটি শিরোনাম ফাইলে সবচেয়ে ভাল ফিট করে কারণ:

  • আপনার যদি প্রয়োজন হয় তবে typedefসম্ভাবনাগুলি হ'ল আহ্বানকারীরাও বিশেষত আপনার উদাহরণে যেমন এটি আর্গুমেন্টে ব্যবহৃত হয়।
  • আপনার নিজের শ্রেণীর সাথে এটি প্রতিস্থাপন সহ যে কোনও কারণের জন্য যদি ধরণের পরিবর্তন করতে হয় তবে আপনাকে কেবল এটি এক জায়গায় করতে হবে।
  • বারবার জটিল ধরণের লেখার কারণে এটি আপনাকে ভুলের ঝুঁকিতে ফেলেছে।
  • এটি অপ্রয়োজনীয় বাস্তবায়ন বিবরণ গোপন করে।

অন্যদিকে, যদি আপনি এটিকে আরও বিমূর্ত করেন তবে আপনার মেমোয়েজেশন কোডটি অনেক ক্লিনার হতে পারে:

if (lookup_table.exists(first, last))
    return lookup_table.get(first, last);

আপনার পরামর্শটি আরও পরিচ্ছন্ন দেখতে পারে তবে দু'বার অনুসন্ধান করে সময় নষ্ট করে।
ডেরেক লেডবেটার

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