যাদু স্ট্রিং / সংখ্যা ব্যবহার [বন্ধ]


31

এটি কিছুটা বিতর্কিত বিষয়, এবং আমি অনুমান করি প্রোগ্রামাররা যতটা মতামত রয়েছে। তবে এর স্বার্থে, আমি জানতে চাই যে ব্যবসায় (বা আপনার কাজের জায়গাগুলিতে) সাধারণ প্রচলিত পদ্ধতিগুলি কী।

আমার কাজের জায়গায় আমাদের একটি কঠোর কোডিং গাইডলাইন রয়েছে। এর একটি বিভাগ যাদু স্ট্রিং / সংখ্যার জন্য উত্সর্গীকৃত। এতে বলা হয়েছে (সি # এর জন্য):

প্রতীকী ধ্রুবকগুলি সংজ্ঞায়িত করার পরিবর্তে আপনার কোডে সংখ্যাসূচক বা স্ট্রিংগুলিতে আক্ষরিক মানগুলি ব্যবহার করবেন না। ধ্রুবকগুলি সংজ্ঞায়িত করতে নিম্নলিখিত প্যাটার্নটি ব্যবহার করুন:

public class Whatever  
{  
   public static readonly Color PapayaWhip = new Color(0xFFEFD5);  
   public const int MaxNumberOfWheels = 18;  
}

ব্যতিক্রম রয়েছে: 0, 1 এবং নাল মানগুলি প্রায় সর্বদা নিরাপদে ব্যবহার করা যায়। খুব প্রায়ই 2 এবং -1 মানগুলি ঠিক থাকে। লগিং বা ট্রেসিংয়ের জন্য স্ট্রিংগুলি এই নিয়ম থেকে অব্যাহতিপ্রাপ্ত। সাহিত্যের অনুমতি দেওয়া হয় যখন তাদের অর্থ প্রাসঙ্গিক থেকে পরিষ্কার হয় এবং ভবিষ্যতে পরিবর্তনের সাপেক্ষে না।

mean = (a + b) / 2; // okay  
WaitMilliseconds(waitTimeInSeconds * 1000); // clear enough

একটি আদর্শ পরিস্থিতি হ'ল কিছু সরকারী গবেষণা পত্র যা কোডের পঠনযোগ্যতা / রক্ষণাবেক্ষণের উপর প্রভাব প্রদর্শন করে:

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

আমার এক কলেজের সাথে তর্ক করার সময় আমি কিছু বৈজ্ঞানিক ভিত্তিক যুক্তি রাখতে এই কাজটি করতে চাই, যিনি এই ধরণের ধ্রুবকগুলি ঘোষণার মত স্থানে চলেছেন:

private const char SemiColon = ';';
private const char Space = ' ';
private const int NumberTen = 10;

আর একটি উদাহরণ হবে (এবং এটি একটি জাভাস্ক্রিপ্টে রয়েছে):

var someNumericDisplay = new NumericDisplay("#Div_ID_Here");

যদি আপনার আইডিটি কেবল 1 জায়গায় ব্যবহার করা হয় তবে আপনি কি জাভাস্ক্রিপ্ট ফাইলের শীর্ষে ডোম আইডি আটকে রাখছেন?

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

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


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

23
NumberTen = 10এটি অর্থহীন কারণ 10 নম্বরটি পুনরায় সংজ্ঞায়িত হবে না। MaxRetryCount = 10এটির একটি বিন্দু রয়েছে যা আমরা সর্বাধিক পুনরায় চেষ্টা করার সংখ্যাটি পরিবর্তন করতে চাই। private const char SemiColon = ';'; মূক। private const char LineTerminator = ';'; স্মার্ট।
মাইক

1
আসল প্রশ্নটি পরিষ্কার নয়।
তুলিনাস কর্ডোভা

উত্তর:


89

... আমার কলেজের সাথে যখন কারও সাথে তর্ক চলছিল তখন কে এই ধরণের ধ্রুবকগুলি ঘোষণা করার জায়গায় চলেছে:

private const char SemiColon = ';';
private const char Space = ' ';
private const int NumberTen = 10;

আপনার সহকর্মীর সাথে আপনার যে যুক্তিটি তৈরি করা উচিত তা আক্ষরিক স্থানের নামকরণের বিষয়ে নয় Spaceতবে তার ধ্রুবকগুলির জন্য তাঁর নামটি পছন্দ করা ভাল।

ধরা যাক আপনার কোডের কাজটি রেকর্ডগুলির একটি প্রবাহকে পার্স করা যা সেমিকোলন ( a;b;c) দ্বারা পৃথক ক্ষেত্রগুলি অন্তর্ভুক্ত করে এবং সেগুলি স্পেস ( a;b;c d;e;f) দ্বারা পৃথক হয় । যদি কেউ আপনার অনুমান লিখেছেন তবে এখন থেকে এক মাস আপনাকে কল করে এবং বলে, "আমরা ভুল করেছিলাম, রেকর্ডের ক্ষেত্রগুলি পাইপের চিহ্ন দ্বারা পৃথক করা হয়েছে ( a|b|c d|e|f)," আপনি কী করেন?

আপনার সহকর্মী পছন্দ হিসাবে মান হিসাবে স্কিমের অধীনে, আপনাকে আক্ষরিক ( SemiColon = '|') এর মান পরিবর্তন করতে হবে SemiColonএবং এমন কোডের সাথে বাঁচতে হবে যা এমন কোনও কিছুর জন্য ব্যবহার অব্যাহত রাখে যা সত্যিকার অর্ধকোলন নয়। এটি কোড পর্যালোচনাগুলিতে নেতিবাচক মন্তব্যের দিকে পরিচালিত করবে । এটি হ্রাস করার জন্য, আপনি আক্ষরিকের নামটি পরিবর্তন করতে PipeSymbolএবং এর মধ্য দিয়ে যেতে এবং প্রতিটি ঘটনাকে পরিবর্তন SemiColonকরতে পারেন PipeSymbol। এই হারে আপনি প্রথমে কেবল একটি আক্ষরিক অর্ধপরিমাণ ( ';') ব্যবহার করেছেন , কারণ আপনাকে এটির প্রতিটি ব্যবহারের স্বতন্ত্র মূল্যায়ন করতে হবে এবং আপনি একই সংখ্যক পরিবর্তন করতে পারবেন be

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

private const char FieldSeparator = ';';    // Will become '|' a month from now
private const char RecordSeparator = ' ';
private const int MaxFieldsPerRecord = 10;

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


আমি সম্পূর্ণভাবে রাজী. কয়েক দশক আগে আমি এমন একটি প্রকল্পে কাজ করেছি যেখানে বিভাগগুলিতে বার্তা প্রেরণ করা হত, প্রত্যেকে 8 টি সাধারণ রেজিস্টার ব্যবহার করে। কেউ ঘোষণা করেছিলেন #define one 1 #define two 2 (বা সমতুল্য যেটি ইউকে পোস্ট অফিস কোরালে, তত্কালীন পছন্দ ভাষা) of শব্দটি উচ্চ থেকে এসেছে যে ভবিষ্যতে দৈর্ঘ্যের ক্ষেত্রটি বাইটের সংখ্যা হবে, সেগমেন্টগুলি নয়, তাই স্পষ্টতই কোডটি #define one 8 #define two 16 ইত্যাদিতে পরিবর্তন করা হয়েছিল
মওগ

3
সেমিকোলন বা পাইপসিম্বলের মতো নামগুলির মতো নির্লজ্জ মনে হয়, স্ক্রিপ্ট ব্যবহার করে একে অপরের সাথে পরিবর্তন করা আক্রান্ত প্রতিটি পরিবর্তনের চেয়ে অনেক সহজ ;হবে |
ব্র্যান্ডিন

যে ক্ষেত্রে স্ট্রিং আক্ষরিক কোনও ফাইলটিতে বহুবার ব্যবহৃত হয়, তবে এর মান ব্যতীত এর কোনও অর্থ নেই? উদাহরণস্বরূপ, আপনি যদি পরীক্ষা করে নিচ্ছেন যে আপনি 20 মানচিত্রের একটি মানচিত্রে একটি নির্দিষ্ট কী পেতে পারেন তবে আমার কি এমন ধ্রুবক সংজ্ঞা দেওয়া উচিত?: public static final String MY_KEY_NAME = "MyKeyName"
জর্ডান ম্যাকউউইন

1
@ জর্ডান এমকিউইউন খালি লিটারাল ব্যবহার করার জন্য একটি কেস তৈরি করতে হবে (যদি কেবলমাত্র) প্রত্যেকে একবার ব্যবহার করা হয় এবং অন্য কোথাও প্রয়োজন হয় না। যদি একে দৃশ্যকল্প হচ্ছে কোডের মত এমন কিছু বিষয় যা একটি ভিন্ন ফাইল ফরম্যাট প্রক্রিয়া, প্রতিটি বিন্যাস নিজস্ব ধ্রুবক (যেমন, সংজ্ঞায়িত করা উচিত CSV_RECORD_SEPARATOR, TSV_RECORD_SEPARATORইত্যাদি)।
blrfl

8

সেমিকোলনকে একটি ধ্রুবক হিসাবে সংজ্ঞায়িত করা অপ্রয়োজনীয়, কারণ সেমিকোলন ইতিমধ্যে নিজে থেকেই ধ্রুবক । এটি কখনও পরিবর্তন হবে না।

এটা তোলে ঘোষণা করব একদিন কারো মত না "পরিভাষা পরিবর্তন, + + নতুন সেমিকোলন এখন", এবং আপনার সহকর্মী সুখে শুধু ধ্রুবক আপডেট করতে নলখাগড়া হবে (তারা আমাকে নিয়ে হাসাহাসি - এখন তাদের তাকান)।

ধারাবাহিকতার বিষয়টিও রয়েছে। আমি গ্যারান্টি দিচ্ছি যে তার NumberTenধ্রুবকটি প্রত্যেকের দ্বারা ব্যবহৃত হবে না (বেশিরভাগ কোডার তাদের মনের বাইরে নয়), সুতরাং এটি যেভাবেই প্রত্যাশিত হয়েছিল তা কার্যকর করবে না। যখন সর্বনাশ আসে এবং "দশ" বিশ্বব্যাপী 9 এ পুনরুদ্ধার হয়, ধ্রুবকটি আপডেট করা কৌশলটি করবে না, কারণ এটি আপনাকে এখনও আপনার কোডগুলিতে আক্ষরিক aগলে ফেলে রাখবে 10, সুতরাং এখন সিস্টেমটি সুযোগের মধ্যেও সম্পূর্ণ অপ্রত্যাশিত হয়ে উঠবে becomes একটি বিপ্লবী ধারণা যে "দশ" এর অর্থ "9"।

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

এই ধরণের ব্যবহারের কোন উদাহরণ আমরা এতক্ষণে জড়ো করেছি? লাইন টার্মিনেটর ... সর্বাধিক পুনরায় চেষ্টা করুন ... চক্রের সর্বাধিক সংখ্যা ... আমরা ইতিবাচক কি এগুলি কখনই বদলাবে না?

ব্যয়টি হ'ল ডিফল্ট সেটিংস পরিবর্তন করার জন্য একটি অ্যাপ্লিকেশনটি পুনরায় সংশোধন করা প্রয়োজন এবং কিছু ক্ষেত্রে এমনকি এর নির্ভরতা (সংখ্যাসূচক সংখ্যার মান হিসাবে সংকলনের সময় হার্ড-কোডিং হতে পারে)।

পরীক্ষার এবং উপহাসের দিকটিও রয়েছে। আপনি সংযোগের স্ট্রিংটিকে কনস্ট হিসাবে সংজ্ঞায়িত করেছেন তবে এখন উফ! আপনি আপনার ইউনিট পরীক্ষায় ডাটাবেস অ্যাক্সেস (একটি নকল সংযোগ স্থাপন করুন) উপহাস করতে পারবেন না।


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

@ টাগুআম ভাল, আপনার উদাহরণটি DecimalPointধ্রুবক থাকার পক্ষে যুক্তিযুক্ত - তবে না Commaবা Periodধ্রুবক। এটি বেশ পার্থক্য: প্রাক্তন একটি ফাংশন , ভূমিকা বা মানটির উদ্দেশ্য বোঝায় । "সেমিকোলন" বা "কমা" সেই বিভাগের আওতায় পড়ে না।
কনরাড মোরাউস্কি

দশমিক পয়েন্ট উদাহরণ হিসাবে এটি সত্য। তবে অ্যাডাস্ট্রোফের উদাহরণটি কমা (বা আধা-কোলন) হিসাবে একই (বা অভিন্ন) বিভাগ হিসাবে মনে হচ্ছে।
তোগাম

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

5
private const char SemiColon = ';';
private const char Space = ' ';
private const int NumberTen = 10;

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

private const char StatementTerminator = ';';
private const char Delimiter = ' ';
private const int  BalanceInquiryCode = 10;

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

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


3

এটি নিয়ে বিতর্কিত কিছু হওয়া উচিত নয়। পয়েন্টটি ম্যাজিক নম্বরগুলি ব্যবহার করার জন্য বা তার সম্পর্কে নয়, পয়েন্টটি পঠনযোগ্য কোড থাকতে হবে।
এর মধ্যে পার্থক্যটি বিবেচনা করুন: if(request.StatusCode == 1)এবং if(request.HasSucceeded)। এই ক্ষেত্রে, আমি যুক্তি দেব যে পরবর্তীটি আরও বেশি পঠনযোগ্য, তবে এর অর্থ এই নয় যে আপনার মতো কোড কখনও থাকতে পারে না int MaxNumberOfWheels = 18

PS: এ কারণেই আমি কোডিংয়ের দিকনির্দেশগুলি একেবারে ঘৃণা করি। বিকাশকারীদের পক্ষে এই মত রায় দেওয়ার পক্ষে সক্ষম হতে যথেষ্ট পরিপক্ক হওয়া উচিত; itশ্বরের দ্বারা রচিত পাঠ্যের একটি অংশে তাদের ছেড়ে দেওয়া উচিত নয় কে জানে।


13
ড্রাইভাররা যে রাস্তায় গাড়ি চালাচ্ছে তার কোন দিকে রায় দিতে সক্ষম হওয়ার পক্ষে যথেষ্ট পরিপক্ক হতে হবে;)
কনরাড মোরাওস্কি

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

1
আমি জোর দিয়ে বলব না যে তাদের আনুষ্ঠানিক, স্ট্যাম্পড ইত্যাদি হতে হবে, তারা অনানুষ্ঠানিক হতে পারে তবে তাদের সাথে একমত হওয়া উচিত, এবং এটি ইতিমধ্যে নিজের বিচারের পৃথক পরিপক্কতার ব্যবহারের বাইরেও goes তবে আপনি এখন আপনার মন্তব্য মুছে দিয়েছেন স্টিফান :)
ফেলেছেন

1
@ স্টেফানবিলিয়েট - মোটেও নয়। আমার বক্তব্যটি হচ্ছে ধারাবাহিকতার মাধ্যমে পাঠযোগ্যতা উন্নত হয়। এখানে সমস্যাটি কোডিং গাইডলাইন নিজেই নয়, ভুল বোঝাবুঝির মাধ্যমে চরমপন্থায় নেওয়া একটি গাইডলাইন।
মাইক পার্টরিজ

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