`M_` পরিবর্তনশীল উপসর্গটির অর্থ কী?


154

আমি প্রায়শই টিউটোরিয়াল, উদাহরণ এবং গেম বিকাশের সাথে সম্পর্কিত অন্যান্য m_কোডগুলিতে ভেরিয়েবলের ( m_World,, m_Sprites...) জন্য ব্যবহৃত উপসর্গ দেখতে পাই ।

লোকেরা কেন m_ভেরিয়েবলগুলিতে উপসর্গ যুক্ত করে?



18
হাদীস শিরোনামের সাথে নিরবচ্ছিন্নভাবে মামলা অনুসরণ করার আগে, দয়া করে কিছু ইতিহাস পরীক্ষা করে দেখুন যে হাঙ্গেরিয়ান স্বীকৃতি আসলে কী। কারণ কোন আইটেমেন্টারের নামকরণ করা অর্থহীন। তবে একটি পূর্ব x নামকরণ পস এবং yAnnotationPos নামকরণ যুক্তিসঙ্গত। সিমেন্টিক সংস্করণ ব্যবহার করুন।
আকসেলকে

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

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

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

উত্তর:


108

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


51
নামকরণের কনভেনশনের জন্য সবচেয়ে খারাপ যুক্তি, আপনি সহজেই ইন্টেলিসেন্সের জন্য ctrl + স্পেস টিপতে পারেন।
orlp

11
@ নাইটক্র্যাকার ইভেন্টটি যদিও আমি উপসর্গটি পছন্দ করি না, তার অর্থ হ'ল আপনি যখন এম_ টাইপ করেন এবং তারপরে "সিটিআরএল + স্পেস" (এটি স্বয়ংক্রিয় না থাকে) আপনি কেবলমাত্র আপনার সদস্যদের সমন্বিত একটি তালিকা পান। ঠিক কোনও ভাল কারণ নয় তবে এটি একটি প্লাস।
সিডার

13
উল্লেখযোগ্য যে একই জিনিসটি করার জন্য আরও অনেক বেশি বা কম মানক উপায় রয়েছে; "এম_ভেরিয়েবল", "এম_ভেরিয়েবল", "এম ভেরিয়েবল", "_ভেরিয়েবল", "_ ভেরিয়েবল" ... কোন উপায়ে 'সেরা' বা 'ডান' (বা আদৌ এটি করা উচিত কিনা) তত বিতর্কিত ও ফলহীন একটি যুক্তি ফাঁকা বনাম ট্যাব '। :)
ট্রেভর পাওয়েল

49
আমি কেবল "এটি->" ব্যবহার করতে পছন্দ করি - কিন্ডা "এম_" অপ্রয়োজনীয় করে তোলে এবং সংকলক দ্বারা প্রয়োগ করা হিসাবে আরও ভাল (তাত্ত্বিকভাবে আপনি কোনও পরিবর্তনশীল টাইপের "এম_" পপ করতে পারেন; "এটি-> দিয়ে এটি করতে পারবেন না) ")। আমার অংশটি চায় যে সি ++ "" এটি-> "বাধ্যতামূলক করার ক্ষেত্রে কেবলমাত্র মানকেই মানিয়ে দেবে। তবে এটি একটি উত্তর হওয়ার চেয়ে আলোচনার জগতে চলে যাচ্ছে।

3
@ লরেন্টকৌভিদৌ, আপনি সত্যই প্রয়োগ করতে পারবেন না যে ডেভস সদস্যের সাথে ভেরিয়েবলগুলি পূর্বরূপ তৈরি m_করে।
সামারউইটস সংরক্ষিত

94

ইন ক্লিন কোড: এজাইল সফটওয়্যার কারিগরি একটি হ্যান্ডবুক এই উপসর্গ ব্যবহার বিরুদ্ধে একটি সুনির্দিষ্ট সুপারিশ হল:

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

এর একটি উদাহরণ (সি # কোড )ও রয়েছে:

খারাপ অভ্যাস:

public class Part
{
    private String m_dsc; // The textual description

    void SetName(string name)
    {
        m_dsc = name;
    }
}

ভালো অনুশীলন:

public class Part
{
    private String description;

    void SetDescription(string description)
    {
        this.description = description;
    }
}

আমরা ভাষা নির্মান সঙ্গে গণনা স্পষ্টভাবে অস্পষ্টতা (ক্ষেত্রে সদস্য ভেরিয়েবল উল্লেখ করতে অর্থাত , descriptionসদস্য ও descriptionপ্যারামিটার): this



আমি খুব খুশি যে কেউ এটি লিখেছিলেন
দিমিত্রেইগ

আর একটি কারণ হ'ল জাভা গেটর / সেটারটি getName / setName হিসাবে ধরে নেওয়া হয়, সুতরাং getM__Name খারাপ এবং আপনার একে একে একে পরিচালনা করতে হবে।
লিওন

এই লেখার জন্য ধন্যবাদ। আমি কেবল ইঙ্গিত করতে চেয়েছিলাম যে আপনি উদ্ধৃত বইটি আগস্ট ২০০৮ সাল থেকে প্রকাশিত হয়েছে - এবং আমি আজও নতুন কোডটিতে এই খারাপ অনুশীলনটি খুঁজে পাই।
আলেক্স্লোম্বা ৮

20

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

class Person
{
   public:
      std::string name() const;

   private:
      std::string name; // This would lead to a compilation error.
      std::string m_name; // OK.
};

main.cpp:9:19: error: duplicate member 'name'
      std::string name;
                  ^
main.cpp:6:19: note: previous declaration is here
      std::string name() const;
                  ^
1 error generated.

http://coliru.stacked-crooked.com/a/f38e7dbb047687ad

"এম_" "সদস্য" এর জন্য উল্লেখ করে। উপসর্গ "_" এছাড়াও সাধারণ।

আপনার প্রোগ্রামিং ভাষায় এটি ব্যবহার করা উচিত নয় যা বিভিন্ন কনভেনশন / ব্যাকরণ ব্যবহার করে এই সমস্যাটি সমাধান করে।


11

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

int m_something

public int Something => this.m_something; 

ব্যাকিং ভেরিয়েবলগুলির জন্য একটি নিয়মিত নামকরণ কনভেনশন রাখতে সহায়তা করতে পারে এবং m_উপসর্গটি এটি করার একটি উপায় case যেটি ক্ষেত্রে-সংবেদনশীল ভাষায় কাজ করে।

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


5
this.আপনার নিজের ভাষায় যদি লিখতে হয় তবে m_সত্যই অকেজো।
রুসলান

@ রুসলান m_হ'ল এটি যে সম্পত্তি সমর্থন করে তার থেকে এটি পৃথক করা - সুতরাং this.Somethingসম্পদ বনাম this.m_somethingব্যাকিং সদস্যের পক্ষে for এটি কোনও সম্মেলন নয় যা আমি নিজেকে পছন্দ করি তবে আমি বেশিরভাগ ক্ষেত্রেই এটি সংবেদনশীল ভাষাগুলিতে (ভিবি এর মতো) ব্যবহার করতে দেখেছি।
কিথ

1
this.Somethingসম্পত্তি এবং this.somethingব্যাকিংয়ের জন্য কেন নয় ? বা this._somethingসমর্থন জন্য? this.m_somethingঅপ্রয়োজনীয়। আমি _somethingএমনটি ব্যবহার করি যাতে আমি টাইপ করতে গিয়ে দুর্ঘটনাক্রমে এটি টাইপ Somethingনা করি, সদস্যতার সাথে কিছুই করার বা না করার জন্য
অস্টিনডাব্লুব্রায়ান

@ অস্টিন ডাব্লু ব্রায়ান কেস-সংবেদনশীল ভাষা সম্পর্কে আমার আগের মন্তব্যটি দেখুন comment হ্যাঁ, _এটির নিজের একটি উপসর্গ কাজটি করবে তবে m_এটি কনভেনশন। এটি ব্যক্তিগতভাবে আমি ব্যবহার করব না তবে আপনি যদি কোডটিতে দেখতে পান তবে এটিই ছিল লেখকের অভিপ্রায়।
কিথ

7

অন্যান্য উত্তরে বর্ণিত হিসাবে, m_উপসর্গটি চিহ্নিত করা যায় যে ভেরিয়েবল একটি শ্রেণীর সদস্য। এটি হাঙ্গেরীয় স্বরলিপি থেকে আলাদা কারণ এটি ভেরিয়েবলের প্রকারটি নয় তবে এর প্রসঙ্গটি নির্দেশ করে।

আমি m_সি ++ তে ব্যবহার করি তবে অন্য কয়েকটি ভাষায় নয় যেখানে 'এটি' বা 'স্ব' বাধ্যতামূলক। আমি সি ++ এর সাথে ব্যবহৃত 'এটি->' দেখতে পছন্দ করি না কারণ এটি কোডটিকে বিশৃঙ্খলা করে।

আর একটি উত্তর বলে m_dscযে "খারাপ অভ্যাস" এবং 'বিবরণ;' "ভাল অনুশীলন" তবে এটি একটি লাল রঙের হেরিং কারণ সমস্যাটি সংক্ষেপণ হিসাবে রয়েছে।

আরেকটি উত্তর বলছে টাইপিং thisইন্টেলিজেন্স পপ আপ করে তবে যে কোনও ভাল আইডিইতে বর্তমান শ্রেণীর সদস্যদের জন্য ইন্টেলিজেন্স পপআপ করার জন্য হটকি থাকবে।


"তবে এটি একটি রেড হেরিং" - ভাল কথা। একটি ন্যায্য তুলনা m_descriptionবনাম হতে হবে description
যুদ্ধ

3

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

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

আপনি কোন টিউটোরিয়ালটি উল্লেখ করছেন তা আমি জানি না, তবে আমি অনুমান করব যে তারা দুটি কারণের একটির কারণে সম্মেলনটি ব্যবহার করছে:

  • সেগুলি হ'ল সি ++ টিউটোরিয়াল, যা এম_ কনভেনশনতে ব্যবহৃত লোকেরা লিখেছিল এবং এবং / অথবা ...
  • তারা সিনট্যাক্স হাইলাইট না করে প্লেইন (মনসপাসড) পাঠ্যে কোড লেখেন, সুতরাং উদাহরণগুলি পরিষ্কার করার জন্য এম_ কনভেনশন দরকারী।

একটি উদাহরণ এটি হতে পারে: wiki.qt.io/How_to_Use_QSettings যেহেতু Qt স্রষ্টা হাইলাইট ব্যবহার করছে, তাই প্রথম অনুমানটি উপস্থিত হতে পারে। ক্লাসের প্রাইভেট অবজেক্টের জন্য _ওবজেক্ট () ব্যবহার করে অন্য একটি কনভেনশন হতে পারে এবং এটি যদি পয়েন্টার হয় তবে যেহেতু আমার জানা হিসাবে উভয়কেই হাইলাইট করা হয়নি এবং মনে হয় এটি ব্যবহার করার জন্য আমার কাছে বোধ হয়।
ইভানভিক

3

লকহিড মার্টিন একটি 3-উপসর্গের নামকরণের স্কিম ব্যবহার করে যা কাজ করার জন্য দুর্দান্ত ছিল, বিশেষত যখন অন্যদের কোড পড়ার সময়।

   Scope          Reference Type(*Case-by-Case)   Type

   member   m     pointer p                       integer n
   argument a     reference r                     short   n
   local    l                                     float   f
                                                  double  f
                                                  boolean b

তাই ...

int A::methodCall(float af_Argument1, int* apn_Arg2)
{
    lpn_Temp = apn_Arg2;
    mpf_Oops = lpn_Temp;  // Here I can see I made a mistake, I should not assign an int* to a float*
}

এটি মূল্যবান জন্য এটি নিতে।


অসাধারণ. "উদাহরণ" জন্য ধন্যবাদ। আপনি 200,000 কোডের লাইন সম্পাদনা করার সময় এটি সত্যিই কার্যকর হয়।
jiveturkey

1
ডিফেন্সিভ হওয়ার দরকার নেই। আমি আপনার উত্তরটিতে কোনও ভুল আছে তা দেখিয়ে সত্যই আপনাকে সাহায্য করার চেষ্টা করছি। তারপরে আমাকে আরও পরিষ্কার করে দেওয়া যাক: আপনার 5 বা 200000 লাইনের কোড রয়েছে কিনা তা বিবেচ্য নয়: সংকলক আপনাকে বেমানান পয়েন্টার প্রকারের সাথে একটি অ্যাসাইনমেন্ট করতে দিবে না। সুতরাং মন্তব্যে করা পয়েন্টটি মোট।
ক্যাসিও রেনান

আত্মরক্ষামূলক হিসাবে আসা মানে না। দুঃখিত।
jiveturkey

এটি হাঙ্গেরীয় স্বরলিপিটির একটি ভিন্নতা, যা আধুনিক ভাষাগুলিতে বোঝায় না ...
ডক

2

বর্তমান উত্তরগুলি সম্পূর্ণ করতে এবং প্রশ্নটি ভাষা নির্দিষ্ট না হওয়ায় কিছু সি-প্রকল্প প্রাইস ব্যবহার করে m_একটি ফাইলের সাথে সুনির্দিষ্ট গ্লোবাল ভেরিয়েবলগুলি সংজ্ঞায়িত করতে - এবং g_গ্লোবাল ভেরিয়েবলগুলির জন্য যা তাদের সংজ্ঞায়িত ফাইলের চেয়ে বড় স্কোপযুক্ত have
এই ক্ষেত্রে উপসর্গ দিয়ে সংজ্ঞায়িত গ্লোবাল ভেরিয়েবলগুলি m_ হিসাবে সংজ্ঞায়িত করা উচিত static

এই সম্মেলনটি ব্যবহার করে প্রকল্পের উদাহরণের জন্য EDK2 (একটি ইউইএফআই ওপেন-সোর্স বাস্তবায়ন) কোডিং কনভেনশন দেখুন See


1

একটি যুক্তি যা আমি এখনও দেখিনি যে হ'ল 'ড ম্যাক্রো'র m_সাথে নাম সংঘর্ষ রোধ করতে একটি উপসর্গ ব্যবহার করা যেতে পারে #define

অনুসন্ধান Regex #define [a-z][A-Za-z0-9_]*[^(]মধ্যে /usr/include/term.hঅভিশাপ / ncurses থেকে।

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