সি ++ ক্লাসে সদস্য ভেরিয়েবলগুলিতে উপসর্গ কেন ব্যবহার করবেন


150

সদস্যের ভেরিয়েবলগুলি চিহ্নিত করার জন্য প্রচুর সি ++ কোড সিনট্যাক্টিকাল কনভেনশন ব্যবহার করে। সাধারণ উদাহরণ অন্তর্ভুক্ত

  • m_ memberName পাবলিক সদস্যদের জন্য (যেখানে পাবলিক সদস্যদের এ সব ব্যবহার করা হয়)
  • _ সদস্য নাম ব্যক্তিগত সদস্য বা সকল সদস্যের জন্য ame

অন্যরা যখনই কোনও সদস্য ভেরিয়েবল ব্যবহার করা হয় তখন এই-> সদস্যটি ব্যবহার করে প্রয়োগ করার চেষ্টা করে ।

আমার অভিজ্ঞতায়, বেশিরভাগ বৃহত্তর কোড বেসগুলি নিয়মিতভাবে এই জাতীয় বিধি প্রয়োগ করতে ব্যর্থ হয়।

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

এই কনভেনশনটি আজও সি ++ তে কার্যকর বা এটি কেবল একটি অ্যানক্রোনিজম। বিশেষত এটি লাইব্রেরি জুড়ে তাই অসম্পূর্ণভাবে ব্যবহৃত হয়। অন্যান্য ভাষা কি দেখায় নি যে সদস্য উপসর্গ ব্যতীত কেউ কি করতে পারে?


15
আমি এটি পছন্দ করি; জটিল কোডবেজে কোন ভার্স স্থানীয় এবং কোনটি নয় তা জানা গুরুত্বপূর্ণ। আমি সাধারণত এটিকে বাধ্য করে ওভারটির উপসর্গটি ব্যবহার করি - যা আমি অনেক অতিরিক্ত টাইপিং এবং alচ্ছিক বলে মনে করি (যেখানে নামকরণ আপনাকে এটি করতে বাধ্য করবে)
জো

5
অ্যাট্রিবিউটের জন্য @ এর কারণে আপনি এটি রুবিতে কখনও দেখেননি এবং সরাসরি গুণাবলী ব্যবহারের পক্ষে অগ্রাধিকার হিসাবে অ্যাক্সেসর তৈরির বুদ্ধিমান।
স্টিভ জেসোপ

6
পিইপি 8 অনুসারে অ-সর্বজনীন সদস্য ভেরিয়েবলগুলি পাইথনের একটি আন্ডারস্কোর (উদাহরণ self._something = 1:) সহ উপস্থাপিত হতে হবে ।
নাথান ওসমান

2
এগুলি সনাক্ত করতে সম্পাদকের সিনট্যাক্স হাইলাইট করা উচিত নয়?
খুব

2
আপনি this->memberপাইথন কোডের সমতুল্য দেখেছেন । পাইথনে এটি সাধারণত হবে self.memberএবং এটি কেবল একটি সম্মেলন নয়, এটি ভাষা দ্বারা প্রয়োজনীয়।
matec

উত্তর:


48

একটি নেতৃস্থানীয় আন্ডারস্কোর ব্যবহার সম্পর্কে আপনাকে সতর্কতা অবলম্বন করতে হবে। একটি শব্দের মূল অক্ষরের আগে একটি শীর্ষস্থানীয় আন্ডারস্কোর সংরক্ষণ করা হয়। উদাহরণ স্বরূপ:

_Foo

_L

সমস্ত সংরক্ষিত শব্দ যখন

_foo

_l

না. অন্যান্য পরিস্থিতি রয়েছে যেখানে ছোট হাতের অক্ষরের আগে নেতৃস্থানীয় আন্ডারস্কোরগুলিকে অনুমতি দেওয়া হয় না। আমার নির্দিষ্ট ক্ষেত্রে, আমি দেখতে পেলাম যে _ এল ভিজ্যুয়াল সি ++ 2005 দ্বারা সংরক্ষিত ছিল এবং সংঘর্ষটি কিছু অপ্রত্যাশিত ফলাফল তৈরি করেছে।

স্থানীয় ভেরিয়েবলগুলি চিহ্নিত করতে এটি কতটা কার্যকর তা সম্পর্কে আমি বেড়াতে আছি।

কোন শনাক্তকারীদের সংরক্ষণ করা হয়েছে সে সম্পর্কে এখানে একটি লিঙ্ক দেওয়া হয়েছে: সি ++ সনাক্তকারীতে আন্ডারস্কোর ব্যবহার সম্পর্কে কী বিধি রয়েছে?


4
প্রকৃতপক্ষে _ফু এবং _ এল উভয়ই নাম স্থানের স্কোপে সংরক্ষিত।

13
তবে তারা সদস্যের পরিবর্তনশীল নাম হিসাবে ঠিক আছে। আমি উপসর্গটিকে আন্ডারস্কোর করি না, কারণ নিয়মগুলি খুব বিভ্রান্তিকর এবং আমি অতীতে জ্বলে উঠেছিলাম।
জুয়ান

11
এগুলি সংরক্ষিত শব্দ নয়। তারা সংরক্ষিত নাম। যদি সেগুলি সংরক্ষণ করা থাকে তবে আপনি এগুলি ব্যবহার করতে পারবেন না। কারণ সেগুলি সংরক্ষিত নাম, আপনি এগুলি ব্যবহার করতে পারেন তবে নিজের ঝুঁকিতে।
টনিক

235

আমি সব ভাল উপসর্গের পক্ষে ।

আমি মনে করি (সিস্টেম) হাঙ্গেরিয়ান স্বরলিপি উপসর্গগুলি প্রাপ্ত বেশিরভাগ "খারাপ রেপ" এর জন্য দায়ী।

এই নোটেশনটি দৃ strongly়ভাবে টাইপ করা ভাষায় যেমন সি ++ "এলপিএসজেড" তে মূলত অর্থহীন, যখন আপনার স্ট্রিংটি নুল টার্মিনেটেড স্ট্রিংয়ের দীর্ঘ পয়েন্টার, যখন: বিভাগযুক্ত আর্কিটেকচারটি প্রাচীন ইতিহাস, সি ++ স্ট্রিংগুলি সাধারণ কনভেনশন পয়েন্টারগুলি দ্বারা নুল-টার্মিনেটে থাকে চর অ্যারে, এবং "গ্রাহকনাম" একটি স্ট্রিং তা জানা সত্যিই এতটা কঠিন নয়!

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

আমি ব্যবহার করি:

  • সদস্যদের জন্য মি
  • ধ্রুবক / পঠনযোগ্যদের জন্য সি
  • পয়েন্টার জন্য পি (এবং পয়েন্টার থেকে পয়েন্টার জন্য পিপি)
  • v অস্থির জন্য
  • স্থির জন্য
  • আমি সূচক এবং পুনরাবৃত্তির জন্য
  • ই ইভেন্টের জন্য

যেখানে আমি প্রকারটি পরিষ্কার করতে চাই সেখানে আমি আদর্শ প্রত্যয় ব্যবহার করি (উদাহরণস্বরূপ তালিকা, কম্বোবক্স, ইত্যাদি)।

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

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

MyClass::MyClass(int numItems)
{
    mNumItems = numItems;
    for (int iItem = 0; iItem < mNumItems; iItem++)
    {
        Item *pItem = new Item();
        itemList[iItem] = pItem;
    }
}

আপনি এখানে দেখতে পারেন:

  • সদস্য এবং পরামিতিগুলির মধ্যে কোনও বিভ্রান্তি নেই
  • সূচক / পুনরাবৃত্তকারী এবং আইটেমগুলির মধ্যে কোনও বিভ্রান্তি নেই
  • "গণনা", "সূচক" এর মতো জেনেরিক (অস্পষ্ট) নামের অনেকগুলি ক্ষতি এড়ানোর জন্য পরিষ্কারভাবে সম্পর্কিত ভেরিয়েবল (আইটেমের তালিকা, পয়েন্টার এবং সূচক) এর একটি সেট ব্যবহার করুন।
  • উপসর্গগুলি "আইটেম ইন্ডেক্স" এবং "আইটেমপিটি" এর মতো বিকল্পের চেয়ে টাইপিং কমিয়ে দেয় (স্বল্প-সমাপ্তির সাথে আরও ভাল কাজ করে)

"আইনেম" পুনরাবৃত্তির আরেকটি দুর্দান্ত পয়েন্ট হ'ল আমি কখনই ভুল সূচকের সাথে একটি অ্যারে সূচী করি না এবং আমি যদি অন্য লুপের ভিতরে একটি লুপ অনুলিপি করি তবে আমাকে লুপ সূচক ভেরিয়েবলগুলির একটিতে রিফ্যাক্টর করতে হবে না।

এই অবাস্তববাদী সহজ উদাহরণটির সাথে তুলনা করুন:

for (int i = 0; i < 100; i++)
    for (int j = 0; j < 5; j++)
        list[i].score += other[j].score;

(যা পড়া শক্ত এবং প্রায়শই "আই" ব্যবহারের দিকে পরিচালিত করে যেখানে "জে" উদ্দেশ্য ছিল)

সঙ্গে:

for (int iCompany = 0; iCompany < numCompanies; iCompany++)
    for (int iUser = 0; iUser < numUsers; iUser++)
       companyList[iCompany].score += userList[iUser].score;

(যা অনেক বেশি পঠনযোগ্য এবং সূচকের তুলনায় সমস্ত বিভ্রান্তি দূর করে modern আধুনিক আইডিইতে স্বতঃপূরণ সহ, এটি টাইপ করাও দ্রুত এবং সহজ)

পরবর্তী সুবিধাটি হ'ল কোড স্নিপেটগুলির কোনও প্রসঙ্গ বোঝার দরকার নেই। আমি একটি ইমেল বা একটি নথিতে দুটি লাইনের কোড অনুলিপি করতে পারি এবং যে স্নিপেটটি পড়তে পারে সে সমস্ত সদস্য, ধ্রুবক, পয়েন্টার, সূচিপত্র ইত্যাদির মধ্যে পার্থক্য বলতে পারে আমাকে "ওহ" যুক্ত করতে হবে না এবং সাবধানতা অবলম্বন করা উচিত কারণ 'ডেটা' একটি পয়েন্টারকে নির্দেশ করে ", কারণ এটি 'পিপিডেটা' বলে called

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

(যদি আপনি মনে করেন না যে আপনি স্টাফ আউট করতে সন্ধানে সময় নষ্ট করছেন, একবছর আগে আপনি লিখেছেন এমন কিছু কোড সন্ধান করুন এবং সেটির দিকে তাকান নি the ফাইলটি খুলুন এবং এটি না পড়ে প্রায় অর্ধেক নীচে লাফিয়ে দেখুন See দেখুন কোনও সদস্য, প্যারামিটার বা স্থানীয় কিনা তা আপনি জানেন না আগে আপনি এখনই এই পয়েন্টটি পড়তে পারেন এখন অন্য এলোমেলো জায়গায় চলে যান ... আমরা যখন অন্য কারও কোডের মাধ্যমে একক পদবিন্যাস করি আমরা সারা দিন এটি করি long বা তাদের ফাংশনটি কীভাবে কল করবেন তা বোঝার চেষ্টা করছেন)

'এম' উপসর্গটি (আইএমএইচও) কুরুচিপূর্ণ এবং কথায় কথায় "এই->" স্বরলিপি এবং যে অসঙ্গতি তার গ্যারান্টি দেয় তা এড়িয়ে যায় (আপনি যদি সতর্ক হন তবে আপনি সাধারণত 'এই-> ডেটা' এর মিশ্রণটি শেষ করেন এবং একই শ্রেণিতে 'ডেটা', কারণ কিছুই নামের ধারাবাহিক বানান প্রয়োগ করে না)।

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

শেষ বড় সুবিধা হ'ল ইন্টেলিজেন্স এবং অটো-সম্পূর্ণকরণ with কোনও ইভেন্ট সন্ধানের জন্য উইন্ডোজ ফর্মটিতে ইন্টেলিজেন্স ব্যবহার করার চেষ্টা করুন - আপনাকে শত শত রহস্যময় বেস শ্রেণির পদ্ধতিতে স্ক্রোল করতে হবে যা আপনাকে ইভেন্টগুলি সন্ধান করার জন্য কখনই কল করতে হবে না। তবে প্রতিটি ইভেন্টের যদি "ই" উপসর্গ থাকে তবে সেগুলি স্বয়ংক্রিয়ভাবে "ই" এর অধীনে একটি গ্রুপে তালিকাভুক্ত হবে। সুতরাং, উপসর্গটি ইন্টেলিজেন্স তালিকার সদস্যগণ, কনসেটস, ইভেন্টস ইত্যাদিকে গ্রুপ করার জন্য কাজ করে, আপনার পছন্দসই নামগুলি খুঁজে পেতে এটি আরও দ্রুত এবং সহজ করে তোলে। (সাধারণত, কোনও পদ্ধতির প্রায় 20-50 মান থাকতে পারে (স্থানীয়, প্যারাম, সদস্য, কনসেটস, ইভেন্ট) যা এর সুযোগে অ্যাক্সেসযোগ্য But .. '), আমি কেবল 2-5 স্বতঃ-সম্পূর্ণ বিকল্পগুলি উপস্থাপন করছি' 'অতিরিক্ত টাইপিং'

আমি একটি অলস প্রোগ্রামার, এবং উপরের সম্মেলনটি আমাকে অনেক কাজ বাঁচায়। আমি দ্রুত কোড করতে পারি এবং আমি অনেক কম ভুল করতে পারি কারণ আমি জানি যে প্রতিটি পরিবর্তনশীল কীভাবে ব্যবহার করা উচিত।


বিরুদ্ধে আর্গুমেন্ট

তো, কনস কি? উপসর্গগুলির বিরুদ্ধে সাধারণ যুক্তিগুলি হ'ল:

  • "উপসর্গের স্কিমগুলি খারাপ / খারাপ" । আমি সম্মত হই যে "m_lpsz" এবং এর সম্প্রদায়গুলি দুর্বলভাবে চিন্তা করা এবং সম্পূর্ণরূপে অকেজো। সে কারণেই আমি আপনার প্রসঙ্গের জন্য অনুপযুক্ত কিছু অনুলিপি না করে আপনার প্রয়োজনীয়তাগুলি সমর্থন করার জন্য ডিজাইন করা একটি ভাল নকশা ব্যবহার করার পরামর্শ দেব। (কাজের জন্য সঠিক টুল ব্যবহার করুন).

  • "আমি যদি কোনও কিছুর ব্যবহার পরিবর্তন করি তবে আমার নাম পরিবর্তন করতে হবে" । হ্যাঁ, অবশ্যই আপনি করছেন, এটিই রিফ্যাক্টরিং সম্পর্কে এবং আইডিইগুলির কাছে এই কাজটি দ্রুত এবং বেদাহীনভাবে করার জন্য রিফ্যাক্টরিংয়ের সরঞ্জাম কেন রয়েছে। এমনকি উপসর্গ ছাড়াই একটি পরিবর্তনশীল ব্যবহার পরিবর্তন প্রায় অবশ্যই মানে তার নাম কর্তব্য পরিবর্তন করা।

  • "উপসর্গগুলি আমাকে কেবল বিভ্রান্ত করে" । আপনি কীভাবে এটি ব্যবহার করতে শিখেন ততক্ষণ প্রতিটি সরঞ্জামের মতো। একবার আপনার মস্তিষ্ক নামকরণের নিদর্শনগুলিতে অভ্যস্ত হয়ে উঠলে, এটি স্বয়ংক্রিয়ভাবে তথ্যগুলি ছাঁটাই করে দেবে এবং আপনি সত্যিই মনে করবেন না যে উপসর্গগুলি আরও কিছু আছে। আপনি সত্যিই "সাবলীল" হওয়ার আগে আপনাকে অবশ্যই এই জাতীয় পরিকল্পনাটি এক বা দু'সপ্তাহ ধরে ব্যবহার করতে হবে। এবং এ কারণেই অনেক লোক পুরানো কোডটি দেখে এবং ভাবতে শুরু করে যে তারা কীভাবে কোনও ভাল উপসর্গ স্কিম ছাড়াই পরিচালনা করে।

  • "এই জিনিসটি কার্যকর করার জন্য আমি কেবল কোডটি দেখতে পারি" । হ্যাঁ, তবে উত্তরটি আপনার চোখের দিকে ইতিমধ্যে কেন্দ্রীভূত হওয়া জায়গাতেই সঠিক সময়ে কোডটিতে অন্য কোথাও দেখার বা তার প্রতিটি ছোট বিবরণ মনে রাখার দরকার নেই।

  • (কিছু কিছু) সেই তথ্যটি কেবলমাত্র আমার ভেরিয়েবলটিতে পপ আপ করার জন্য একটি সরঞ্জামদণ্ডের জন্য অপেক্ষা করে পাওয়া যায় । হ্যাঁ. যেখানে সমর্থিত, কিছু ধরণের উপসর্গের জন্য, যখন আপনার কোড পরিষ্কারভাবে সংকলন করে, একটি অপেক্ষার পরে, আপনি একটি বিবরণের মাধ্যমে পড়তে পারেন এবং উপসর্গটি তাত্ক্ষণিকভাবে জানানো তথ্যগুলি পেতে পারেন। আমি অনুভব করি যে উপসর্গটি একটি সহজ, আরও নির্ভরযোগ্য এবং আরও দক্ষ পদ্ধতির।

  • "এটি আরও টাইপিং" । সত্যি? আরও একটি পুরো চরিত্র? বা এটি - আইডিই স্বতঃ-সমাপ্তির সরঞ্জামগুলির সাথে এটি প্রায়শই টাইপিং হ্রাস করবে, কারণ প্রতিটি উপসর্গের অক্ষর অনুসন্ধানের স্থানটিকে উল্লেখযোগ্যভাবে সঙ্কুচিত করে। "E" টিপুন এবং আপনার শ্রেণীর তিনটি ইভেন্ট ইন্টেলিজেন্সে পপ আপ করুন। "সি" টিপুন এবং পাঁচটি ধ্রুবক তালিকাভুক্ত করা হয়েছে।

  • "আমি এর this->পরিবর্তে ব্যবহার করতে পারি m" । ভাল, হ্যাঁ, আপনি পারেন। তবে এটি কেবল অনেক কৃপণ এবং আরও ভার্জোজ উপসর্গ! শুধু এটি একটি অনেক বেশি ঝুঁকি (বিশেষ করে দলে) বহন করে কারণ কম্পাইলার এটা ঐচ্ছিক , সেইজন্য এবং ব্যবহারের ঘন ঘন সঙ্গতিহীন। mঅন্যদিকে সংক্ষিপ্ত, স্পষ্ট, সুস্পষ্ট এবং notচ্ছিক নয়, তাই এটি ব্যবহার করে ভুল করা আরও শক্ত।


6
আমি বোঝাতে চেয়েছি যে হাঙ্গেরিয়ান নোটেশনের সমস্যাটি সিমোনির ভুল বোঝাবুঝির ফলেই হয়েছিল। তিনি একটি উপসর্গ লিখেছিলেন এমন একটি ভেরিয়েবলের ধরণের নির্দেশ করতে ব্যবহার করা উচিত যেখানে তিনি "টাইপ" যেমন "ধরণের জিনিস" তে আক্ষরিক ডেটাটাইপ নয়। পরে মাইক্রোসফ্টের প্ল্যাটফর্মের ছেলেরা এটি তুলে নিয়ে এলপিএসপি নিয়ে এসেছিল ... এবং বাকিটি ইতিহাস ...
ভয়েডপয়েন্টার

19
"s স্থির জন্য" শব্দটি আমার কাছে হাঙ্গেরীয়ের "খারাপ" ফর্মের মতো লাগে।
জুলফ

6
@ মেহরদাদ: আমি মনে করি না যে zসি ++ এর মতো ভাষায় খুব বেশি দরকারী যেখানে এই ধরণের নিম্ন স্তরের বাস্তবায়ন বিশদ একটি শ্রেণিতে আবদ্ধ করা উচিত, তবে সিতে (যেখানে শূন্য-সমাপ্তি একটি গুরুত্বপূর্ণ পার্থক্য) আমি আপনার সাথে একমত হই। আইএমও আমরা যে কোনও স্কিম ব্যবহার করি তা আমাদের নিজস্ব প্রয়োজন অনুসারে সর্বোত্তম প্রয়োজন অনুসারে রূপান্তর করা উচিত - সুতরাং, যদি শূন্য-সমাপ্তি আপনার ভেরিয়েবলের ব্যবহারকে প্রভাবিত করে, তবে "জেড" কে একটি উপসর্গ ঘোষণা করার মতো কোনও সমস্যা নেই।
জেসন উইলিয়ামস 19

14
The most important case is "p" for pointer (because the usage changes from var. to var-> and you have to be much more careful with pointers.আমি পুরো আন্তরিকভাবে একমত। যদি আমি কোনও পয়েন্টারটি ভুল ব্যবহার করি তবে এটি কেবল সংকলন করবে না ( void*যদিও ডাবল পয়েন্টারগুলির ক্ষেত্রে এটি ব্যতিক্রম হতে পারে)। এবং পুরো ->ওভারটি .আমাকে জানাতে যথেষ্ট যে এটি পয়েন্টার। এছাড়াও, আপনি যদি স্বতঃপূরণ ব্যবহার করে থাকেন তবে আপনার সম্পাদক সম্ভবত ঘোষণাপত্রের সরঞ্জামদ্বারগুলি রেখে ভেরিয়েবল তথ্যের উপসর্গের প্রয়োজনীয়তা বর্জন করে। নির্বিশেষে, ভাল উত্তর।
থমাস এডিং

5
স্পষ্ট, বিস্তৃত এবং আকর্ষণীয় ব্যাখ্যার জন্য উত্সাহিত, তবে এখানে C ++ YET এ কীভাবে সময় সাশ্রয় হয় সে সম্পর্কে এখানে খুব কমই পরামর্শ দেওয়া হচ্ছে যে অন্য অনেক ভাষায় বৃহত্তর অব্যবহৃত থেকে যায়।

115

আমি সাধারণত সদস্য ভেরিয়েবলের জন্য একটি উপসর্গ ব্যবহার করি না।

আমি ব্যবহার করার জন্য ব্যবহৃত mনা হওয়া পর্যন্ত কেউ নির্দিষ্ট "সি ++ ইতিমধ্যে সদস্য অ্যাক্সেসের জন্য একটি প্রমিত উপসর্গ আছে, উপসর্গ: this->

তাই আমি এখন কি ব্যবহার। এটি হ'ল যখন অস্পষ্টতা থাকে , তখন আমি this->উপসর্গটি যুক্ত করি তবে সাধারণত কোনও অস্পষ্টতা থাকে না এবং আমি কেবল পরিবর্তনশীল নামের সাথে সরাসরি উল্লেখ করতে পারি।

আমার কাছে, এটি উভয় বিশ্বের সেরা। আমার যখন প্রয়োজন হবে তখন আমি ব্যবহার করতে পারি এমন একটি উপসর্গ রয়েছে এবং যখনই সম্ভব আমি এটিকে ছেড়ে দিতে পারি।

অবশ্যই, এর সুস্পষ্ট কাউন্টারটি হ্যাঁ, তবে ভেরিয়েবল শ্রেণীর সদস্য কিনা তা আপনি এক নজরে দেখতে পারবেন না।

আমি যা বলতে চাই "তাই কি? যদি আপনার এটি জানা দরকার তবে আপনার ক্লাসের সম্ভবত খুব বেশি রাজ্য রয়েছে Or অথবা ফাংশনটি খুব বড় এবং জটিল" is

অনুশীলনে, আমি খুঁজে পেয়েছি যে এটি অত্যন্ত কার্যকরভাবে কাজ করে। একটি যুক্ত বোনাস হিসাবে এটি স্থানীয় নাম পরিবর্তন না করে সহজেই কোনও শ্রেণীর সদস্যকে (বা অন্য উপায়ে) স্থানীয় ভেরিয়েবলের প্রচার করতে দেয়।

এবং সর্বোপরি, এটি সামঞ্জস্যপূর্ণ! ধারাবাহিকতা বজায় রাখতে আমাকে বিশেষ কিছু করতে বা কোনও কনভেনশন মনে রাখতে হবে না।


যাইহোক, আপনার ক্লাসের সদস্যদের জন্য নেতৃস্থানীয় আন্ডারস্কোর ব্যবহার করা উচিত নয় । আপনি বাস্তবায়নের দ্বারা সংরক্ষিত নামগুলির কাছে অস্বস্তিকর হয়ে উঠুন।

স্ট্যান্ডার্ডটি মূল নামগুলি ডাবল আন্ডারস্কোর বা আন্ডারস্কোর দিয়ে শুরু করে সমস্ত নাম সংরক্ষণ করে। এটি বিশ্বব্যাপী নেমস্পেসের একক আন্ডারস্কোর দিয়ে শুরু করে সমস্ত নাম সংরক্ষণ করে ।

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

সুতরাং কেবল শীর্ষস্থানীয় আন্ডারস্কোরগুলি এড়ানো সহজ। আপনি যদি ভেরিয়েবলের নামে স্কোপটি এনকোড করতে চান তবে একটি পোস্টফিক্স আন্ডারস্কোর বা একটি m_বা কেবল mউপসর্গ ব্যবহার করুন ।


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

3
@ এমবার্নেট: না, আন্ডারস্কোরের পরে উপরের কেসগুলি কেবলমাত্র বিশ্বব্যাপী নেমস্পেসে নয়, সাধারণভাবে সংরক্ষিত ।
জাল্ফ

9
অবাক করে দিয়েছি যে এই উত্তরের ভোটটি উপসর্গের চেয়ে কম।
মারসন মাও

আমি এই উত্তরের সাথে একমত, this->আপনার যদি এটির সদস্যের পরিবর্তনশীল নির্দিষ্ট করতে হয় তবে এটি ব্যবহার করুন, এটি খুব ভাল।
ডেভিড মর্টন

তদতিরিক্ত, আপনার কোডটি অন্য লোককে দেওয়ার জন্য আপনার কনভেনশনটি নথিভুক্ত করতে হবে না। প্রত্যেকে বুঝতে পারল এর this->অর্থ কী ।
ক্যাডুচন

34

আমি পোস্টফিক্সের আন্ডারস্কোরগুলি পছন্দ করি যেমন:

class Foo
{
   private:
      int bar_;

   public:
      int bar() { return bar_; }
};

আমিও. আমি এক্সেসর / মিউটরদের একই নামটি দিই।
রব

4
মজাদার. প্রথমে কিছুটা কুরুচিপূর্ণ দেখায় তবে কীভাবে এটি উপকারী হতে পারে তা আমি দেখতে পাচ্ছি।
ya23

6
আমি বলব এটি "এমবার" বা "এম_বার" এর চেয়ে অনেক কম কুরুচিপূর্ণ।
sydan

6
তবে আপনার কাছে vector<int> v_;এবং লেখাটি v_.push_back(5)খুব কুৎসিত
21

4
এটি গুগল সি ++ স্টাইল।
জাস্টমে0

20

ইদানীং আমি কোনও প্রিফিক্স না থাকার পরিবর্তে m_ উপসর্গকে পছন্দ করার ঝোঁক করছি, কারণগুলি এত বেশি নয় যে এটি সদস্যের ভেরিয়েবলগুলিকে পতাকাঙ্কিত করা গুরুত্বপূর্ণ, তবে এটি অস্পষ্টতা এড়ায়, বলুন আপনার কোডের মতো কোড রয়েছে:

void set_foo(int foo) { foo = foo; }

যে কারণে কাজ করে না, শুধুমাত্র এক fooঅনুমোদিত। সুতরাং আপনার বিকল্পগুলি হ'ল:

  • this->foo = foo;

    আমি এটি পছন্দ করি না, কারণ এটি প্যারামিটারের ছায়াময় সৃষ্টি করে, আপনি আর g++ -Wshadowসতর্কতা ব্যবহার করতে পারবেন না , এটি টাইপ করার পরে আর দীর্ঘ নয় m_। আপনি এখনও ভেরিয়েবল এবং ফাংশনগুলির মধ্যে নামকরণের দ্বন্দ্বগুলি চালিয়ে যান যখন আপনার int foo;এবং একটি আছে int foo();

  • foo = foo_; অথবা foo = arg_foo;

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

  • m_foo = foo;

    এপিআই ডকুমেন্টেশন পরিষ্কার থাকে, আপনি সদস্য ফাংশন এবং ভেরিয়েবল এবং এরপরে টাইপ করার ক্ষেত্রে এর সংক্ষিপ্ততা পাবেন না this->। কেবল অসুবিধা হ'ল এটি পিওডি স্ট্রাকচারগুলিকে কুৎসিত করে তোলে, তবে পিওডি স্ট্রাকচারগুলি প্রথমে নামের অস্পষ্টতায় ভুগছে না, তাই তাদের সাথে এটি ব্যবহারের প্রয়োজন নেই। একটি অনন্য উপসর্গ থাকা কিছু অনুসন্ধান এবং প্রতিস্থাপনের কাজগুলি আরও সহজ করে তোলে।

  • foo_ = foo;

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

পিএস: m_আপনি পাইথন বা রুবিতে দেখতে না পাওয়ার কারণ হ'ল উভয় ভাষা তাদের নিজস্ব উপসর্গ প্রয়োগ করে, রুবি @সদস্য ভেরিয়েবলগুলির জন্য ব্যবহার করে এবং পাইথনের প্রয়োজনীয়তা রয়েছে self.


1
ন্যায়সঙ্গত হওয়ার জন্য, আপনি কমপক্ষে 2 টি অপশন মিস করেছেন, উদাহরণস্বরূপ (ক) fooকেবলমাত্র সদস্যদের জন্য পুরো নাম ব্যবহার করুন এবং পরিবর্তে প্যারামিটার বা অন্যান্য স্থানীয় / থ্রোওয়েজের জন্য একক-বর্ণ বা সংক্ষিপ্ত নাম ব্যবহার করুন int f; বা (খ) প্যারামিটারগুলি বা অন্য স্থানীয় কিছুকে উপস্থাপন করুন। ভাল পয়েন্ট পুনরায় m_এবং শুঁটি, যদিও; আমি বেশিরভাগ অংশেই এই দুটি নির্দেশিকা অনুসরণ করতে স্বাধীনভাবে অগ্রাধিকারে পৌঁছেছি।
আন্ডারস্কোর_

12

সদস্য ফাংশনের মাধ্যমে পড়ার সময়, চলকটির অর্থ বোঝার জন্য প্রতিটি ভেরিয়েবল "মালিকানাধীন" কে জেনে রাখা একেবারে প্রয়োজনীয়। এর মতো একটি অনুষ্ঠানে:

void Foo::bar( int apples )
{
    int bananas = apples + grapes;
    melons = grapes * bananas;
    spuds += melons;
}

... আপেল এবং কলা কোথা থেকে আসছে তা দেখতে যথেষ্ট সহজ, তবে আঙ্গুর, তরমুজ এবং স্পুডের কী হবে? আমাদের কি বিশ্বব্যাপী নেমস্পেসে নজর দেওয়া উচিত? ক্লাস ঘোষণায়? চলকটি কি এই বস্তুর সদস্য বা এই বস্তুর শ্রেণীর সদস্য? এই প্রশ্নের উত্তর না জেনে আপনি কোডটি বুঝতে পারবেন না। এবং দীর্ঘতর কার্যক্রমে, এমনকি আপেল এবং কলা জাতীয় স্থানীয় ভেরিয়েবলগুলির ঘোষণাগুলি এলোমেলো হয়ে যেতে পারে।

গ্লোবাল, সদস্য ভেরিয়েবল এবং স্ট্যাটিক সদস্য ভেরিয়েবলগুলি (সম্ভবত g_, m_, এবং s_ যথাক্রমে) জন্য তাত্ক্ষণিকভাবে পরিস্থিতি পরিষ্কার করে।

void Foo::bar( int apples )
{
    int bananas = apples + g_grapes;
    m_melons = g_grapes * bananas;
    s_spuds += m_melons;
}

এগুলি প্রথমে কিছুটা অভ্যস্ত হতে পারে - তবে, প্রোগ্রামিংয়ে কী হয় না? এমন একদিন ছিল যখন এমনকি {এবং} আপনাকে অদ্ভুত দেখায়। এবং একবার আপনি তাদের অভ্যস্ত হয়ে ওঠার পরে, তারা আপনাকে কোডটি আরও দ্রুত বুঝতে সহায়তা করে।

(এম_এর স্থানে "এটি->" ব্যবহার করা অর্থবোধ করে, তবে এটি আরও দীর্ঘ-ঘূর্ণিত এবং দৃষ্টিবদ্ধভাবে ব্যাঘাতকৃত member সদস্যের ভেরিয়েবলের সমস্ত ব্যবহার চিহ্নিত করার জন্য আমি এটিকে ভাল বিকল্প হিসাবে দেখছি না))

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

void Foo::bar( int iApples )
{
    int iBananas = iApples + g_fGrapes;
    m_fMelons = g_fGrapes * iBananas;
    s_dSpuds += m_fMelons;
}

হাঙ্গেরিয়ানও করেকোড সম্পর্কে নতুন কিছু বলুন। আমরা এখন বুঝতে পারি যে ফু :: বার () ফাংশনে বেশ কয়েকটি অন্তর্নিহিত ক্যাসেট রয়েছে। কোডটিতে এখন সমস্যাটি হ'ল হাঙ্গেরিয়ান উপসর্গ দ্বারা যুক্ত করা তথ্যের মান ভিজ্যুয়াল ব্যয়ের তুলনায় সামান্য relative টাইপগুলি একসাথে ভালভাবে কাজ করতে বা সংকলক সতর্কতা বা ত্রুটি বাড়ানোর জন্য সি ++ টাইপ সিস্টেমে অনেকগুলি বৈশিষ্ট্য অন্তর্ভুক্ত করে। সংকলক আমাদের প্রকারের সাথে ডিল করতে সহায়তা করে — এটি করার জন্য আমাদের স্বরলিপি দরকার নেই। আমরা সহজেই পর্যাপ্ত পরিমাণে অনুমান করতে পারি যে ফু: বার () এর ভেরিয়েবলগুলি সম্ভবত সংখ্যাসূচক এবং যদি আমরা কেবল এটি জানি তবে ফাংশনটির সাধারণ বোঝার জন্য এটি যথেষ্ট ভাল। সুতরাং প্রতিটি ভেরিয়েবলের সুনির্দিষ্ট ধরণের জানার মান তুলনামূলকভাবে কম। তবুও "s_dSpuds" (বা এমনকি "dSpuds") এর মতো ভেরিয়েবলের কদর্যতা দুর্দান্ত। সুতরাং,


S_ ধারণার জন্য ধন্যবাদ। খুব দরকারী বলে মনে হচ্ছে এবং একরকম আমার কাছে কখনও ঘটেনি।
ক্রিস ওলসেন

10

আমি এটি কতটা প্রশস্তভাবে বলতে পারি তা বলতে পারি না, তবে ব্যক্তিগতভাবে বলতে গেলে আমি সর্বদা (এবং সর্বদা) আমার সদস্য ভেরিয়েবলগুলিকে 'এম' দিয়ে উপস্থাপন করেছি। উদাহরণ:

class Person {
   .... 
   private:
       std::string mName;
};

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


5
M_ (বা _) এর পরিবর্তে মি ব্যবহারের ক্ষেত্রে সমস্যাটি বর্তমানে প্রচলিত ফ্যাশনের সাথে উটের ক্ষেত্রে হয় যা কিছু ভেরিয়েবলের নামগুলি পড়তে অসুবিধা বোধ করে।
মার্টিন বেকেট

1
@ নীল আমি তোমার সাথে আছি @ এমজিবি: '_' দিয়ে শুরু হওয়া নামগুলি আমি ঘৃণা করি ভবিষ্যতে বিষয়গুলি ভুল হওয়ার জন্য এটি কেবল একটি আমন্ত্রণ।
মার্টিন ইয়র্ক

1
@ নীল: আপনি যদি আন্ডারস্কোর ব্যবহার না করে এবং ক্যামেলকেস ব্যবহার না করেন তবে আপনি কোন সম্মেলনটি ব্যবহার করবেন?
জাল্ফ

2
আমার বোধগম্যতা ছিল যে এটি উট কেস যা 'এপডাটা' এর মতো ভেরিয়েবলের জন্য শুধু মি ব্যবহার করে - বিভ্রান্ত করে তোলে - এটি 'এম_প্যাটাটা' না হয়ে 'ম্যাপডেটা' হয়ে যায়। আমি সুরক্ষিত / প্রাইভেট সদস্য ভেরিয়েবলগুলির জন্য _ ক্যামেলকেস ব্যবহার করি কারণ এটির বাইরে রয়েছে
মার্টিন বেকেট

10
@ মার্টিনবেকেট: আপনার aসেই দৃশ্যের মূলধন হওয়া উচিত - আপনি অন্যথায় এটি করছেন না। mApData( mউপসর্গ, তারপরে পরিবর্তনশীল নামটি হয় apData)।
প্ল্যাটিনাম আজুর

8

সদস্য উপসর্গের প্রধান কারণ হ'ল একটি সদস্য ফাংশন স্থানীয় এবং একই নামের সাথে একটি সদস্য ভেরিয়েবলের মধ্যে পার্থক্য করা। যদি আপনি জিনিসটির নাম সহ গেটার ব্যবহার করেন তবে এটি কার্যকর।

বিবেচনা:

class person
{
public:
    person(const std::string& full_name)
        : full_name_(full_name)
    {}

    const std::string& full_name() const { return full_name_; }
private:
    std::string full_name_;
};

এই ক্ষেত্রে সদস্য ভেরিয়েবলকে পূর্ণ নাম বলা যায় না। Get_full_name () পেতে বা সদস্যের পরিবর্তনশীলটি কোনওভাবে সাজানোর জন্য আপনাকে সদস্য ফাংশনটির নতুন নামকরণ করতে হবে।


1
এই কারণেই আমি উপসর্গ করি। আমি মনে করি আমার মতের foo.name()চেয়ে অনেক বেশি পঠনযোগ্য foo.get_name()
Terrabits

6

আমি মনে করি না যে একটি সিনট্যাক্সের অন্যটির চেয়ে বাস্তব মূল্য আছে। আপনার উত্স হিসাবে সমস্ত ফাইলগুলি একত্রে উত্থিত হয়,

আমি যখন এই জাতীয় নিয়মকে আকর্ষণীয় মনে করি কেবল তখনই আমি যখন অভিন্ন নামের 2 টি জিনিস প্রয়োজন, উদাহরণস্বরূপ:

void myFunc(int index){
  this->index = index;
}

void myFunc(int index){
  m_index = index;
}

আমি উভয় পার্থক্য করতে এটি ব্যবহার। এছাড়াও যখন আমি কলগুলি মোড়ানো করি, যেমন উইন্ডোজ Dll এর মতো, ডেল থেকে রেকভ প্যাকেট (...) আমার কোডটিতে রেকভিপ্যাককেটে (...) মোড়ানো হতে পারে । এই নির্দিষ্ট সময়ে "_" এর মতো একটি উপসর্গ ব্যবহার করে দু'জনকে একইরকম দেখাতে পারে, কোনটি কোনটি সনাক্ত করতে সহজ, তবে সংকলকটির জন্য আলাদা


6

কিছু প্রতিক্রিয়া পাঠযোগ্যতার উন্নতির উপায় হিসাবে কনভেনশনগুলির নামকরণের পরিবর্তে রিফ্যাক্টরিংয়ের দিকে মনোনিবেশ করে। আমি মনে করি না যে একজন অন্যটিকে প্রতিস্থাপন করতে পারে।

আমি স্থানীয় প্রোগ্রামারগুলি ব্যবহার করে অস্বস্তি করে এমন প্রোগ্রামারদের জানি; তারা সমস্ত ঘোষণাকে একটি ব্লকের শীর্ষে (সি এর মতো) স্থাপন করতে পছন্দ করে, যাতে তারা কোথায় তা জানতে পারে। আমি খুঁজে পেয়েছি, স্কোপিং এটির জন্য অনুমতি দেয় যেখানে ভেরিয়েবলগুলি যেখানে প্রথম ব্যবহৃত হয় তা ঘোষণার ফলে আমি ঘোষণাগুলি সন্ধানের জন্য পিছনের দিকে ঝলমলে ব্যয় করা সময় কমে যায়। (এটি ছোট ফাংশনগুলির জন্যও আমার পক্ষে সত্য)) এটি আমার পক্ষে কোডটি বোঝা সহজ করে তোলে।

আমি আশা করি এটি সদস্যের নামকরণ কনভেনশনগুলির সাথে কীভাবে সম্পর্কিত clear আমি জানি যে ঘোষণাটি উত্স ফাইলেও পাওয়া যাবে না।

আমি নিশ্চিত যে আমি এই শৈলীর পছন্দ পছন্দ করি না। তবুও সময়ের সাথে সাথে, পরিবেশগুলিতে যেখানে তারা ধারাবাহিকভাবে ব্যবহৃত হত সেখানে কাজ করে, আমি তাদের সদ্ব্যবহারের জন্য আমার চিন্তাভাবনাটি অনুকূল করে তুলেছি। আমি মনে করি যে সামঞ্জস্যপূর্ণ ব্যবহারের ফলে বর্তমানে অনেক লোক যারা তাদের সাথে অস্বস্তি বোধ করে তারাও তাদের পছন্দ করতে পারে।


5

এই সম্মেলনগুলি ঠিক সেটাই। বেশিরভাগ দোকানগুলি কোড পঠনযোগ্যতা সহজ করতে কোড কনভেনশনগুলি ব্যবহার করে যাতে যে কেউ সহজেই কোনও কোডের টুকরোগুলি দেখতে এবং পাবলিক এবং প্রাইভেট সদস্যদের মতো জিনিসের মধ্যে দ্রুত সিদ্ধান্ত গ্রহণ করতে পারে।


"সরকারী এবং বেসরকারী সদস্যের মতো জিনিসের মধ্যে" - এটি কতটা সাধারণ? আমি এটি দেখে মনে করি না, তবে আবার, আমি কোডবেস বা কোনও কিছুর পর্যালোচনা ঘুরে দেখি না।
আন্ডারস্কোর_

আমি এটি আমার নিজস্ব কোডিংয়ে করি না, তবে আমি এমন জায়গায় কাজ করেছি যেখানে তাদের কোড কনভেনশন গাইডের ভিত্তিতে আমাদের এটি করতে হয়েছিল। আমি এটি না করা পছন্দ করি কারণ প্রায় সমস্ত আইডিই ব্যক্তিগত ভেরিয়েবলগুলিকে আলাদা রঙ দেখায়।
মিঃ

হুম, আমার ধারণা এটি আমার থেকে ভিন্ন পরিস্থিতিতে ঘটে situations সাধারণত আমি classযার যার সদস্য private/ তাদের সমস্ত POS ব্যবহার করি protected, বা POD structএর সমস্ত ভেরিয়েবল public(এবং প্রায়শই হয় const)। সুতরাং, আমার কোনও প্রদত্ত সদস্যের অ্যাক্সেস স্তর সম্পর্কে অবাক হওয়ার দরকার নেই।
আন্ডারস্কোর_

5

অন্যরা যখনই সদস্য ভেরিয়েবল ব্যবহার করা হয় তখন এই-> সদস্যটি ব্যবহার করে প্রয়োগ করার চেষ্টা করেন

এটি সাধারণত কোনও উপসর্গ না থাকায় হয় । প্রশ্নটির পরিবর্তনশীলটি সমাধান করার জন্য সংকলকটির পর্যাপ্ত তথ্য প্রয়োজন, এটি উপসর্গের কারণে বা thisকীওয়ার্ডের মাধ্যমে একটি অনন্য নামই হোক ।

সুতরাং, হ্যাঁ, আমি মনে করি উপসর্গগুলি এখনও কার্যকর। আমি একজনের জন্য '_-' টাইপ করে কোনও সদস্যকে অ্যাক্সেস করতে '_-' টাইপ করতে পছন্দ করি।


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

1
যথাযথভাবে। স্থানীয়রা ক্লাসের সদস্যদের লুকিয়ে রাখবে। এই সদস্যদের সেট করে এমন একজন কনস্ট্রাক্টর বিবেচনা করুন। সাধারণত পরামিতিগুলির সদস্যদের মতো নামকরণ করা বোধগম্য হয়।
কেন্ট বুগার্ট

6
কেন একটি কোড গন্ধ হয়? আমি বলবো এটি পুরোপুরি সাধারণ এবং যুক্তিসঙ্গত, বিশেষত যখন এটি নির্মাণকারীদের ক্ষেত্রে আসে।
কেন্ট বুগার্ট

3
কোনও নির্মাণকারীর (সাধারণত) স্থানীয়ভাবে তার সূচনা তালিকায় সেট করা উচিত। এবং সেখানে, প্যারামিটারগুলি ক্ষেত্রের নামগুলি ছায়া দেয় না, তবে উভয়ই অ্যাক্সেসযোগ্য - যাতে আপনি লিখতে পারেনstruct Foo { int x; Foo(int x) : x(x) { ... } };
পাভেল মিনায়েভ

2
আমি মনে করি সমস্যাটি তখনই উপস্থিত হয় যখন আপনি Foo(int x, bool blee) : x(x) { if (blee) x += bleecount; } // oops, forgot this->আমার সদস্য ভেরিয়েবলগুলিকে দরকারী কিছু কল করতে পছন্দ করেন এবং তারপরে সংক্ষিপ্ত নামের সাথে মেলে এমন কনস্ট্রাক্টর প্যারামিটারগুলি দিন:Foo(int f) : foo(f) {...}
স্টিভ জেসপ

4

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

private int privateMember;
public int PublicMember;

public int Function(int parameter)
{
  // StyleCop enforces using this. for class members.
  this.privateMember = parameter;
}

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

উপরের আমার উদাহরণে আপনাকে সদস্য ভেরিয়েবলগুলির জন্য এম-প্রিফিক্সের প্রয়োজন হবে না কারণ এটির সাথে আপনার ব্যবহারের উপসর্গ তৈরি করা হয়। সংকলক প্রয়োগকারী পদ্ধতিতে একই জিনিস নির্দেশ করে।

এর অর্থ এই নয় যে অন্যান্য পদ্ধতিগুলি খারাপ, লোকে কী কাজ করে তা আঁকড়ে থাকে।


3

আপনার যদি কোনও বড় পদ্ধতি বা কোড ব্লক থাকে, আপনি কোনও স্থানীয় ভেরিয়েবল বা সদস্য ব্যবহার করেন কিনা তা অবিলম্বে জানা সুবিধাজনক। এটি ত্রুটিগুলি এড়াতে এবং আরও ভাল পরিষ্কারতার জন্য!


3
আপনার যদি একটি বড় পদ্ধতি থাকে তবে ভাল পরিষ্কারতার জন্য এটিকে ভেঙে দিন।
এসবিআই

4
কিছু বড় পদ্ধতি না ভাঙার অনেক কারণ রয়েছে। উদাহরণস্বরূপ, যদি আপনার পদ্ধতির প্রচুর স্থানীয় অবস্থা রাখা দরকার হয়, আপনাকে হয় নিজের অধীনস্থ পদ্ধতিতে প্রচুর পরিমাণে প্যারামিটারগুলি পাস করতে হবে, এই পদ্ধতির মধ্যে ডেটা পাস করার উদ্দেশ্যে বা রাষ্ট্রীয় ডেটা ঘোষণা করার জন্য একমাত্র বিদ্যমান নতুন ক্লাস তৈরি করতে হবে either অভিভাবক শ্রেণীর সদস্য ডেটা। এইগুলির মধ্যে এমন একটি সমস্যা রয়েছে যা একক দীর্ঘ-ইশ পদ্ধতির তুলনায় পদ্ধতির স্পষ্টতা বা রক্ষণাবেক্ষণকে প্রভাবিত করবে (বিশেষত যার যুক্তিটি সোজা।
স্টিভ ব্রবার্গ 17

3
@ এসবিআই: গাইডলাইনগুলি কেবল এটিই; নির্দেশিকা, নিয়ম না। কখনও কখনও আপনার জন্য এমন বৃহত পদ্ধতিগুলির প্রয়োজন হয় যা যুক্তিযুক্তভাবে নিজেকে আলাদা হয়ে যাওয়ার জন্য ধার দেয় না এবং কখনও কখনও প্যারামিটারের নাম সদস্যদের সাথে সংঘর্ষ হয়।
এড এস

দয়া করে আপনার সদস্য ভেরিয়েবলগুলি সর্বজনীন করবেন না। কেবল অ্যাকসেসর ব্যবহার করুন। প্রথম বন্ধনী পাঠকদের বলতে হবে যে এটি একটি সদস্য পরিবর্তনশীল।
জেকেস

মনে রাখবেন যে নামগুলির সংঘর্ষ সনাক্ত করতে gcc (> = 4.6) এ একটি সতর্কতা রয়েছে:-Wshadow
ক্যাডুচন

3

আইএমও, এটি ব্যক্তিগত। আমি মোটেই কোনও উপসর্গ রাখছি না। যাইহোক, কোডটি যদি জনসাধারণ হিসাবে বোঝানো হয় তবে আমি মনে করি এটির আরও কিছু উপসর্গ থাকা উচিত, তাই এটি আরও পঠনযোগ্য হতে পারে।

প্রায়শই বড় সংস্থাগুলি এর নিজস্ব তথাকথিত 'বিকাশকারী নিয়ম' ব্যবহার করে।
বিটিডব্লিউ, আমি যে মজার মজার তবুও দেখেছি তা হ'ল DRY KISS (নিজেকে পুনরাবৃত্তি করবেন না It এটি সরল রাখুন, বোকা)। :-)


3

যেমন অন্যরা ইতিমধ্যে বলে গেছেন, তাত্পর্যপূর্ণ হওয়া (নাম লেখার শৈলী এবং কনভেনশনগুলি যে কোডটিতে আপনি লিখছেন তাতে মানিয়ে নিতে) এবং সামঞ্জস্যপূর্ণ হওয়া।

কয়েক বছর ধরে আমি একটি বৃহত কোড বেসে কাজ করেছি যা "এই->" কনভেনশন পাশাপাশি সদস্য ভেরিয়েবলগুলির জন্য একটি পোস্টফিক্স আন্ডারস্কোর স্বরলিপি ব্যবহার করে। কয়েক বছর ধরে আমি ছোট ছোট প্রকল্পগুলিতেও কাজ করেছি, যার মধ্যে কয়েকটিতে সদস্য ভেরিয়েবলের নামকরণের জন্য কোনও ধরণের কনভেনশন ছিল না এবং অন্যান্যতে সদস্য ভেরিয়েবলের নামকরণের জন্য পৃথক কনভেনশন ছিল। এই ছোট প্রকল্পগুলির মধ্যে, আমি ধারাবাহিকভাবে এগুলিকে খুঁজে পেয়েছি যার কোন কনভেনশনের অভাব ছিল তাড়াতাড়ি ঝাঁপিয়ে পড়ে বুঝতে difficult

নামকরণের ব্যাপারে আমি খুব বেদনাদায়ক নামটি ক্লাসের সাথে যুক্ত হওয়ার জন্য বা ভেরিয়েবলের কাছে এই পর্যায়ে উত্সাহিত করব যে, আমি যদি "ভাল" বলে মনে করি এমন কিছু কিছু যদি সামনে না আসতে পারি, তবে আমি এর নামহীন কিছু বেছে নেব এবং এটি কী বলেছে তা বর্ণনা করার জন্য একটি মন্তব্য প্রদান করব হয়। এইভাবে, অন্তত নামটির অর্থ হ'ল আমি যা বোঝাতে চাইছি তা হ'ল - এর বেশি কিছুই নয় এবং এর চেয়ে কম কিছুই নয়। এবং প্রায়শই, এটি অল্প সময়ের জন্য ব্যবহার করার পরে, আমি আবিষ্কার করি নামটি আসলে কী হওয়া উচিত এবং ফিরে যেতে এবং যথাযথভাবে সংশোধন বা রিফ্যাক্টর করতে পারি।

আইডিই কাজটি করার বিষয়টির একটি শেষ পয়েন্ট - এটি সর্বোত্তম এবং ভাল, তবে আইডিইগুলি প্রায়শই এমন পরিবেশে উপলভ্য হয় না যেখানে আমি সবচেয়ে জরুরি কাজ সম্পাদন করেছি। কখনও কখনও কেবলমাত্র সেই মুহুর্তে 'ভি' এর অনুলিপি পাওয়া যায়। এছাড়াও, আমি এমন অনেকগুলি ক্ষেত্রে দেখেছি যেখানে আইডিই কোড সমাপ্তি বোকামির প্রচার করেছে যেমন নামে ভুল বানান। সুতরাং, আমি পছন্দ করি কোনও আইডিই ক্র্যাচের উপর নির্ভর করতে হবে না।


3

সি ++ সদস্য ভেরিয়েবলের উপসর্গের জন্য মূল ধারণাটি হ'ল অতিরিক্ত ধরণের তথ্য সংরক্ষণ করা যা সংকলকটি জানেন না। সুতরাং উদাহরণস্বরূপ, আপনার কাছে একটি স্ট্রিং থাকতে পারে যা চরগুলির একটি নির্দিষ্ট দৈর্ঘ্য এবং অন্যটি পরিবর্তনশীল এবং '\ 0' দ্বারা সমাপ্ত হয়। সংকলকটিতে তারা উভয়ই char *, তবে আপনি যদি অন্যের থেকে অনুলিপি করার চেষ্টা করেন তবে আপনি বিশাল সমস্যায় পড়বেন। তো, আমার মাথার উপরের দিক থেকে,

char *aszFred = "Hi I'm a null-terminated string";
char *arrWilma = {'O', 'o', 'p', 's'};

যেখানে "asz" এর অর্থ এই চলকটি হল "ascii স্ট্রিং (শূন্য-সমাপ্ত) এবং" আরার "অর্থ এই ভেরিয়েবলটি একটি অক্ষর অ্যারে।

তারপরে ম্যাজিক হয়। সংকলক এই বিবৃতিতে পুরোপুরি খুশি হবে:

strcpy(arrWilma, aszFred);

তবে আপনি, একজন মানুষ হিসাবে, এটি দেখতে এবং বলতে পারেন "আরে, সেই পরিবর্তনগুলি আসলে একই ধরণের নয়, আমি এটি করতে পারি না"।

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

শেষ অবধি, আমার দুটি বিষয় উল্লেখ করা উচিত:

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

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

দ্রষ্টব্য: অ্যাসফ্রেডের সূচনাটি প্রশ্নবিদ্ধ (আক্ষরিক স্ট্রিংটিতে অ-অ্যাক্সেস অ্যাক্সেসের প্রস্তাব দিচ্ছে), এবং আরারওয়িলমার সূচনাটি এমনকি সংকলন করবে না। (আপনি সম্ভবত পয়েন্টারের পরিবর্তে আর্ট উইলমাকে অ্যারে হিসাবে ঘোষণার ইচ্ছা করেছিলেন!) যদিও আপনি লিখেছেন যে এটি আপনার মাথার উপরের অংশের বাইরে ... :-)
নিলস ডেকার

উফফ, আপনি একেবারে ঠিক বলেছেন। বাচ্চারা, বাড়িতে এটি চেষ্টা করবেন না। এটি করুন: 'কনস্ট চর * aszFred = "হাই আমি নাল-টার্মিনেটেড স্ট্রিং"; চর arrWilma [] = {'ও', 'ও', 'পি', 'এস'}; '
এএল ফ্লানাগন 21

3

আমাদের প্রকল্প সর্বদা সদস্য ডেটার উপসর্গ হিসাবে "এর" এবং স্থানীয়দের জন্য কোনও উপসর্গ ছাড়াই প্যারামিটারগুলির একটি উপসর্গ হিসাবে "এর" ব্যবহার করে আসছে। এটি সামান্য cutesy, কিন্তু এটি আমাদের সিস্টেমের প্রাথমিক বিকাশকারীরা গ্রহণ করেছিলেন কারণ তারা দেখেছিল যে আমরা এটি এমন কয়েকটি বাণিজ্যিক উত্স লাইব্রেরি দ্বারা কনভেনশন হিসাবে ব্যবহার করেছি যা আমরা তখন ব্যবহার করেছি (এক্সভিটি বা রোগওয়েভ - সম্ভবত উভয়ই)। সুতরাং আপনি এই জাতীয় কিছু পেতে চাই:

void
MyClass::SetName(const RWCString &theName)
{
   itsName = theName;
}

উপসর্গের স্কোপিংয়ের বড় কারণটি (এবং অন্য কেউ নয় - আমি হাঙ্গেরিয়ান স্বীকৃতি ঘৃণা করি) এটি হ'ল কোডটি লিখে সমস্যার মধ্যে পড়তে বাধা দেয় যেখানে আপনি ভাবেন যে আপনি একটি ভেরিয়েবলের উল্লেখ করছেন, তবে আপনি সত্যিই অন্য একটি পরিবর্তনশীলকে উল্লেখ করছেন স্থানীয় স্কোপে সংজ্ঞায়িত একই নাম সহ। একই ধারণাটি উপস্থাপন করতে পরিবর্তিত নামগুলি নিয়ে আসা সমস্যাটিকে এড়াতে পারে তবে উপরের উদাহরণের মতো বিভিন্ন স্কোপ সহ। সেক্ষেত্রে আপনাকে "দ্য নেম" প্যারামিটারটির জন্য যাইহোক, কিছু উপসর্গ বা আলাদা নামের সাথে আসতে হবে - কেন না সর্বত্র প্রযোজ্য ধারাবাহিক নিয়ম তৈরি করুন।

কেবল এটি-> ব্যবহার করা আসলেই যথেষ্ট ভাল নয় - আমরা কোডিং ত্রুটিগুলি হ্রাস করার মতো অস্পষ্টতা হ্রাস করতে তেমন আগ্রহী নই এবং স্থানীয়ভাবে স্কোপযুক্ত শনাক্তকারীদের সাথে নামগুলি মাস্ক করা ব্যথা হতে পারে। মঞ্জুর, কিছু সংকলকের ক্ষেত্রে আপনার পক্ষে বৃহত্তর ক্ষেত্রের মধ্যে নামটি মাস্ক করা হয়েছে এমন ক্ষেত্রে সতর্কতা বাড়ানোর বিকল্প থাকতে পারে তবে আপনি যদি তৃতীয় পক্ষের লাইব্রেরিগুলির একটি বড় সেট বেছে নিয়ে কাজ করে থাকেন তবে এই সতর্কতাগুলি উপদ্রব হয়ে উঠতে পারে অব্যবহৃত ভেরিয়েবলের নাম যা মাঝে মাঝে আপনার নিজের সাথে সংঘবদ্ধ হয়।

এর / নিজেই - আমি আধ্যাত্মিকভাবে আন্ডারস্কোরগুলির চেয়ে টাইপ করা সহজ মনে করি (টাচ টাইপ লেখক হিসাবে যখনই সম্ভব আমি আন্ডারস্কোরগুলি এড়িয়ে চলি - বাড়ির সারিগুলি খুব বেশি প্রসারিত করে), এবং আমি এটি রহস্যময় আন্ডারস্কোরের চেয়ে বেশি পঠনযোগ্য বলে মনে করি।


এটি আমি শুনেছি দ্রুততম শেখার কার্ভের সাথে সর্বাধিক স্বজ্ঞাত সমাধান। আমি আশা করি কথা বলার ভাষাগুলি সেগুলি হ্যান্ডেল করার জন্য আরও নমনীয় হত যাতে কোডে অস্পষ্টতাগুলি সমাধান করার জন্য আমাদের নতুন কৌশল নিয়ে আসার কথা ভাবেন না।
গুনে ওজসান

2

আমি এটি ব্যবহার করি কারণ উপাচার্য ++ এর ইন্টেলিসেন্স ক্লাসের বাইরে যাওয়ার সময় কখন ব্যক্তিগত সদস্যদের দেখানো যায় তা বলতে পারে না। ইন্টেলিজেন্স তালিকার মাঠের আইকনে সামান্য "লক" চিহ্নটিই কেবলমাত্র একটি ইঙ্গিত। এটি কেবল ব্যক্তিগত সদস্যদের (ক্ষেত্রগুলি) সনাক্ত করা সহজ করে তোলে। এছাড়াও সি # থেকে একটি অভ্যাস সৎ হতে হবে।

class Person {
   std::string m_Name;
public:
   std::string Name() { return m_Name; }
   void SetName(std::string name) { m_Name = name; }
};

int main() {
  Person *p = new Person();
  p->Name(); // valid
  p->m_Name; // invalid, compiler throws error. but intellisense doesn't know this..
  return 1;
}

2

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

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

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


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


1

মেমরি পরিচালনার কারণে সদস্য ভেরিয়েবল এবং স্থানীয় ভেরিয়েবলের মধ্যে পার্থক্য করা দরকারী। বিস্তৃতভাবে বলতে গেলে, হ্যাপ-বরাদ্দকৃত সদস্য ভেরিয়েবলগুলি ডেস্ট্রাক্টরে নষ্ট করা উচিত, এবং হ্যাপ-বরাদ্দকৃত স্থানীয় ভেরিয়েবলগুলি সেই সুযোগের মধ্যে নষ্ট করা উচিত। সদস্য ভেরিয়েবলগুলিতে নামকরণ কনভেনশন প্রয়োগ করা সঠিক মেমরি পরিচালনার সুবিধার্থে।


তা কিভাবে? অন্যান্য ফাংশনে ঘোষিত স্থানীয় ভেরিয়েবলগুলিতে ডেস্ট্রাক্টরের অ্যাক্সেস নেই, সুতরাং সেখানে বিভ্রান্তির কোনও জায়গা নেই। এছাড়াও, গাদা-বরাদ্দ স্থানীয় ভেরিয়েবলগুলির অস্তিত্ব থাকা উচিত নয় । এবং হিপ-বরাদ্দকৃত সদস্যের ভেরিয়েবলগুলি কেবলমাত্র RAII ক্লাসের মধ্যে থাকা উচিত, বেশ কিছু।
জাল্ফ

"হিপ-বরাদ্দ স্থানীয় ভেরিয়েবলগুলি থাকা উচিত নয়" কিছুটা শক্ত। তবে / আপনি যখন এগুলি ব্যবহার করেন, তা নিশ্চিত হয়ে ওঠার জন্য এটি অত্যন্ত গুরুত্বপূর্ণ যে তারা স্থানীয়ভাবে ভেরিয়েবলের জন্য সদস্যের জন্য একটি শৃঙ্খলাবদ্ধ নামকরণ কনভেনশন এটি নিশ্চিতকরণে অগাধভাবে সহায়তা করে।
ফ্র্যাঙ্কস্টার

1

কোড সম্পূর্ণরূপে সদস্য ভেরিয়েবলের জন্য m_varname এর প্রস্তাব দেয়।

যদিও আমি কখনই মি_ নোটকে দরকারী বলে মনে করি নি, আমি একটি স্ট্যান্ডার্ড তৈরির ক্ষেত্রে ম্যাককনেলের মতামতকে ওজন দেব।


2
তিনি কেন আন্ডারস্কোর ব্যাখ্যা না করে না। আমি তাঁর "র‌্যাপিড ডেভলপমেন্ট" বইয়ের একটি বড় অনুরাগী, যা আমি এখানে বহুবার সুপারিশ করেছি, তবে "কোড কমপ্লিট" এর থেকে অনেক কম (যা আমি স্বীকার করব যে এটি প্রথম প্রকাশের পর থেকে আমি পড়িনি)।

1

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

আমি কেবলমাত্র উপসর্গটি ব্যবহার করার সময় স্বাক্ষর রেখায় থাকি। আমি _ এর সাথে কোনও পদ্ধতিতে পরামিতিগুলি উপস্থাপন করব যাতে আমি তাদের চারপাশে রক্ষণাত্মকভাবে প্রোগ্রাম করতে পারি।


1

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

এটি একটি কার্যকর অ্যানক্রোনিজম যা এখনও খুব বেশি প্রচারিত। আপনার ভেরিয়েবলগুলির উপসর্গ রাখা বন্ধ করুন এবং তাদের যথাযথ নাম দিন যার স্পষ্টতা প্রতিচ্ছবি প্রকাশ করে যে তারা কত দিন ব্যবহার করছেন। 5 টি লাইন পর্যন্ত আপনি এটিকে "i" বলতে পারেন বিভ্রান্তি ছাড়াই; 50 টি লাইনের বাইরে আপনার একটি সুন্দর দীর্ঘ নাম প্রয়োজন।


1

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

color = Red;

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

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

বেশিরভাগ ক্ষেত্রে, আমি কেবল কনস্ট্রাক্টর এবং ইনিশিয়ালাইজারগুলিতে 'এটি' ব্যবহার করি।


0

আমি কেবল ইনটেলিসেন্স এবং সম্পর্কিত IDE- কার্যকারিতার সুবিধা নিতে সদস্য ভেরিয়েবলের জন্য m_ ব্যবহার করি। আমি যখন কোনও ক্লাসের বাস্তবায়ন কোডিং করছি তখন আমি m_ টাইপ করতে এবং সমস্ত এম_ সদস্যের সাথে একত্রে গোষ্ঠীযুক্ত কম্বোবক্স দেখতে পারি।

তবে আমি অবশ্যই সমস্যা ছাড়াই এম_এ ছাড়া বাঁচতে পারতাম। এটি আমার কাজের স্টাইল মাত্র।


আপনি টাইপ করতে পারেনthis->
টোস্ট

0

জয়েন্ট স্ট্রাইক ফাইটার আয়ার ভিচিকল সি ++ কোডিং স্ট্যান্ডার্ডস অনুযায়ী (ডিসেম্বর 2005):

এভি বিধি 67

পাবলিক এবং সুরক্ষিত ডেটা কেবল স্ট্রাইকগুলিতে ব্যবহার করা উচিত - ক্লাসগুলিতে নয়। যুক্তি: একটি শ্রেণি তার ডেটাতে অ্যাক্সেস নিয়ন্ত্রণ করে তার আক্রমণকারী বজায় রাখতে সক্ষম হয়। তবে কোনও শ্রেণি তার সদস্যদের অ্যাক্সেস নিয়ন্ত্রণ করতে পারে না যদি সেই সদস্যগুলি বেসরকারী হয়। সুতরাং একটি শ্রেণীর সমস্ত ডেটা ব্যক্তিগত হওয়া উচিত।

সুতরাং, সমস্ত ডেটা ব্যক্তিগত হওয়া উচিত বলে "মি" উপসর্গটি ব্যবহারহীন হয়ে পড়ে।

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


0

এই সম্মেলনগুলির বেশিরভাগই অত্যাধুনিক সম্পাদক ছাড়া একটি সময় থেকে। আমি একটি উপযুক্ত আইডিই ব্যবহার করার পরামর্শ দেব যা আপনাকে প্রতিটি ধরণের পরিবর্তনশীল রঙিন করতে দেয়। রঙটি যে কোনও উপসর্গের চেয়ে স্পট করা সহজ।

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

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