সি ++ এ অ-alচ্ছিক পয়েন্টার বনাম নন-কনস্ট্যান্ট রেফারেন্স


12

ইন অন্যান্য সি ++ বৈশিষ্ট্য, রেফারেন্স আর্গুমেন্ট এর গুগল সি ++ স্টাইল গাইড , আমি পড়তে অ-const রেফারেন্স ব্যবহার করা হবে না।

রেফারেন্স দ্বারা পাস করা সমস্ত পরামিতি অবশ্যই কনস্টের লেবেলযুক্ত হওয়া উচিত।

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

আমি সি ++ কোড যতটা সম্ভব বোঝা / বজায় রাখা সহজ করতে চাই, তাই আমি সাধারণত কোডিং স্টাইল গাইড পড়তে আগ্রহী। তবে একটি দলে সেরা অনুশীলনগুলি মানিয়ে নেওয়ার জন্য, আমি মনে করি যে শৈলী গাইড উপাদানগুলির পিছনে যুক্তি বোঝা একটি গুরুত্বপূর্ণ বিষয়।

নিরপেক্ষ উল্লেখগুলি কি আসলেই খারাপ? তাদের কেবলমাত্র গুগলকে নিষিদ্ধ করা নির্দিষ্ট বা এটি একটি সাধারণভাবে গৃহীত নিয়ম? পয়েন্টার হিসাবে আউটপুট প্যারামিটারগুলি প্রয়োগ করার জন্য অতিরিক্ত প্রচেষ্টাকে কী ন্যায়সঙ্গত করে?


2
"এর জন্য পয়েন্টার ব্যবহারের ফলে পুরো ফাংশন বডিটি বাদ যায়" এর, কী?
রাচেট ফ্রিক 9

@ratchetfreak আমি এটি পরিষ্কার করার চেষ্টা করেছি। আমি স্বীকার করি যে এর মতো ফাংশনগুলি কিছু ডিজাইনের ত্রুটিগুলি দেখাতে পারে। একটি পয়েন্টার সর্বদা আনুষ্ঠানিকভাবে alচ্ছিক তাই এটি ডিফেরেন্স করার আগে এটি পরীক্ষা করা উচিত।
নেকড়ে

4
গুগলের সি ++ স্টাইল গাইডটি বেশ পিছনের দিকে। আমার বিষয়গত মতামত, এটি পোড়ানো উচিত।
সিয়ুয়ান রেন

এই নির্দিষ্ট আইটেমটি হিসাবে, আমি মনে করি যুক্তিটি হ'ল প্রোগ্রামাররা একটি অ্যাম্পারস্যান্ড লিখতে বাধ্য করে যখন তর্কগুলি পরিষ্কার করে দেওয়া যেতে পারে inte
সিয়ুয়ান রেন 13

4
গুগল স্টাইল গাইড যেমন ছিল তেমন লেখা হয়েছিল, গুগল লিগ্যাসি প্রকল্পগুলিতে একজাতীয় কোডকে সমর্থন করার জন্য। যদি আপনি লিগ্যাসি প্রকল্পগুলিতে কাজ না করে থাকেন (যা শুরু থেকেই এই স্টাইল গাইডের সাথে লেখা ছিল) তবে সম্ভবত এটি ব্যবহার করা উচিত নয় (এটি প্রচুর নিয়ম সুনির্দিষ্ট করে যা নতুন কোডের জন্য উপযুক্ত নয় (সি ++ 11, সি ++ 14 , সি ++ 17))।
utnapistim

উত্তর:


18

গুগলের স্টাইল গাইডের পিছনে যুক্তিটি কোনও প্যারামিটার কোনও ইনপুট প্যারামিটার বা আউটপুট প্যারামিটার কিনা তা কোনও ফাংশনের কল সাইট থেকে পরিষ্কার করে দেওয়া। ( আরও আলোচনার জন্য এখানে দেখুন )) অন্যান্য ভাষাগুলি ডিজাইন দ্বারা স্পষ্ট করে পরামিতি তৈরি করে; সি #, উদাহরণস্বরূপ, একটি outকীওয়ার্ড রয়েছে যা কল সাইটে অবশ্যই ব্যবহার করা উচিত । সি ++ যেহেতু এটি স্পষ্ট করে না, গুগল কনস্ট রেফ ব্যবহার করা পছন্দ করে। এটি পরিষ্কার করার জন্য পয়েন্টার বনাম।

এটি কি কেবল গুগলের নিয়ম? না, তবে আমি সন্দেহ করি যে এটি খুব বিস্তৃত। আমার মনে হয় না আমি এটি Google এর স্টাইল গাইড এবং এমন গোষ্ঠীর বাইরে দেখেছি যা গুগল স্টাইল গাইডের অংশগুলিতে স্পষ্টভাবে মেনে চলে। (উদাহরণস্বরূপ, আমি ধারণাটি পছন্দ করি যখন আমি যখন বহু বছর আগে প্রথমবার গুগল স্টাইল গাইডটি পড়েছি এবং এটি আমার নিজের কোডের জন্য ব্যবহার করেছি))

বিশেষত, সদ্য ঘোষিত সি ++ কোর গাইডলাইনগুলি (প্রায়) সমস্ত কিছুর জন্য আউটপুট প্যারামিটারগুলিতে রিটার্ন মানগুলি পছন্দ করে এবং বাকীগুলির জন্য অ-কনস্ট্যান্ট রেফ ব্যবহার করে। গুগলের পয়েন্টার বনাম রেফারেন্সগুলির ব্যবহার আউটপুট প্যারামিটারগুলি আরও পরিষ্কার করে তুলতে পারে, তবে ফেরতের মানগুলি আরও স্পষ্ট। এখন যেহেতু সি ++ 11 তে মানক পদক্ষেপ রয়েছে (মূল্যবান উল্লেখগুলি, &&অনেক ধরণের রিটার্ন সস্তার করতে) এবং টিপলস (একাধিক মান ফেরত দেওয়ার সহজ উপায়কে মঞ্জুরি দেয়), আউট প্যারামিটারগুলির জন্য অনেকগুলি ব্যবহারের ক্ষেত্রে আর প্রয়োগ হয় না।

সি ++ কোর নির্দেশিকাগুলির পেছনে কিছু বড় নাম রয়েছে (বার্জার্ন স্ট্রস্ট্রপ, হার্ব সুটার) মাইক্রোসফ্ট দ্বারা সমর্থিত এবং সর্বশেষ সি ++ বৈশিষ্ট্যগুলি (গুগলের স্টাইল গাইডের বিপরীতে) আলিঙ্গন করেছে, তাই আমি আশা করি এর সুপারিশগুলি গুগলের চেয়ে বেশি জনপ্রিয় হবে।


আপনার উত্তরের জন্য ধন্যবাদ (সি # তে সংক্ষিপ্ত ভ্রমণের জন্যও)। সহজ পর্যালোচনা অবশ্যই একটি গুরুত্বপূর্ণ বিষয়, বিশেষত ওপেন সোর্স প্রকল্পগুলিতে। আধুনিক সি ++ এ সস্তা রিটার্ন সহ, এই বিবেচনাগুলি তাদের গুরুত্ব হারাবে। পুরানো লিগ্যাসি সফ্টওয়্যার এবং এটির পুরানো সংকলকগুলির সাথে এটি এখনও সহায়ক হতে পারে।
ওল্ফ

আমি এটি সম্পর্কে ভুলে যাইনি, তবে সি ++ মূল গাইডলাইনগুলি পাওয়া তত দ্রুত নয়। এটি আকর্ষণীয় যে এটি দর্শন দর্শনের নিয়মের পিছনে যুক্তি প্রদর্শন করে এবং প্রোগ্রামিংয়ের জন্য একটি আধুনিকীকরণ দৃষ্টিভঙ্গি ("কোডের মধ্যে সরাসরি ধারণাগুলি প্রকাশ করে" পাইথনের জেনের মতো খানিকটা পড়ায়) দেখায় communicate
ওল্ফ

পরিপূরক: সি ++ কোড নির্দেশিকাগুলির দর্শন বিভাগের সরাসরি লিঙ্ক ।
ওল্ফ

1

অবৈধ পয়েন্টারটি পাস করার জন্য দুটি বিকল্প রয়েছে, প্রথমে চেক করুন এবং তাড়াতাড়ি প্রত্যাবর্তন করুন বা এটি অনির্ধারিত আচরণ হতে দিন (আপনি যদি দৃ rob়তার চেয়ে গতি সম্পর্কে বেশি যত্নশীল হন)।

চেক করা যেমন সহজ:

void foo(void* buffer){
    if(buffer == nullptr)
        return;

    //actually foo

    // note no increase in indentation required

}

এই ধরণের চেকটি সাধারণত প্যারামিটার চেক হিসাবে গ্রহণ করা হয়। আপনি যদি কোডটি দেখেন তবে এটি বেশ স্পষ্ট যে আপনি নন-নাল পয়েন্টারটি পাস করার আশা করছেন এবং তা না হলে তাড়াতাড়ি ফিরে আসবেন। এটি আপনাকে অবৈধ পয়েন্টারগুলির বিষয়ে এতটা চিন্তা করতে দেয় না।


ভাল, আমি এই প্যাটার্নটি সম্পর্কে ভেবেছিলাম এবং এটি একেবারে যুক্তিসঙ্গত বলে মনে করি। দুঃখজনকভাবে এটি assert(buffer);জেনে যতটা পরিষ্কার মনে হচ্ছে না যে দাবিটি কেবলমাত্র ডিবাগ সংস্করণের জন্য সক্রিয়, আমি মাঝে মাঝে rt_assert(buffer);একটি ব্যতিক্রম ছুঁড়ে ফেলতে চাই। returnচেহারাগুলির ইন্ডেন্টেশনটি কিছুটা বিপজ্জনক বলে মনে হচ্ছে ... বিটিডাব্লু: আপনার কোড স্নিপেট আউটপুটের জন্য পয়েন্টার সম্পর্কে আমার প্রশ্নের ভাল চিত্র।
নেকড়ে 10

1

এটি আপনার পর্যবেক্ষণে নেমে আসে If an output parameter is required

কেবলমাত্র যেখানে ফাংশন স্বাক্ষরের আউটপুট প্যারামিটার থাকা আবশ্যক তা যখন এটি বাহ্যিক এপিআই দ্বারা নির্দিষ্ট করা হয়, এবং এরকম ক্ষেত্রে আপনি কেবলমাত্র বাহ্যিক এপিআই এমন কোনও কিছুতে আবৃত করেন যা নিশ্চিত করে যে সেখানে সর্বদা একটি বৈধ পয়েন্টি রয়েছে।

অভ্যন্তরীণভাবে আপনি আউটপুট প্যারামিটারগুলি এড়িয়ে যান রিটার্নের প্রকারটিকে "আউটস" এর সমস্তের মিশ্রণ হিসাবে বাড়িয়ে


আপনি বলতে চাচ্ছেন, একমাত্র জায়গা যেখানে আমি একটি বাধ্যতামূলক পয়েন্টার সরবরাহ করতে সক্ষম নই? সত্য, তবে আমি নিশ্চিত না যে আপনার বিধিটি The only place where...সব ক্ষেত্রেই প্রযোজ্য কিনা। আপনি যা পরামর্শ দেন তার মতো দেখতে: আপনার নিজের প্রোগ্রামগুলির ফাংশনে আউটপুট পরামিতিগুলি এড়ানো avoid নতুন প্রোগ্রামের জন্য সত্য।
নেকড়ে

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