এটি কি প্রতীকী ধ্রুবক ওভারকিলের ব্যবহার?


34

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

for (int i = 0; i < 8; i++){
    for (int j = 0; j < 8; j++){

তিনি জোর দিয়েছিলেন যে এটি পরিবর্তে হওয়া উচিত

for (int i = 0; i < CHESS_CONST; i++){
    for (int j = 0; j < CHESS_CONST; j++){

কিছু ভাল প্রতীক নামের সাথে এখনই আমাকে ভাবতে বিরক্ত করা যাবে না।

এখন অবশ্যই আমি জাদু সংখ্যা ব্যবহার করা এড়াতে জানি, তবে আমার তখন থেকেই মনে হচ্ছে

  1. এই সংখ্যা কখনও পরিবর্তন হবে না;
  2. নামটি কোডটিতে এতগুলি জায়গায় ব্যবহৃত হওয়ায় নামটি বর্ণনামূলক হতে পারে না; এবং
  3. দাবা প্রোগ্রামের জন্য যে কেউ সোর্স কোডের মধ্য দিয়ে যাচ্ছেন তাদের দাবা সম্পর্কে যথেষ্ট পরিমাণে জানা উচিত 8 টি কীসের জন্য তা জানা উচিত,

প্রতীকী ধ্রুবকের আসলেই দরকার নেই।

তাই আপনাকে বলছি কি মনে করেন? এটি কি ওভারকিল, নাকি আমার কেবল কনভেনশন নিয়ে গিয়ে একটি প্রতীক ব্যবহার করা উচিত?


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

43
ব্যক্তিগতভাবে, আমি যাদু সংখ্যার চেয়ে আরও বেশি ঝাঁকুনি খুঁজে পাই সেগুলির নাম iএবং jলুপ ভেরিয়েবল। কোনটি র‌্যাঙ্কের প্রতিনিধিত্ব করে এবং কোনটি ফাইল উপস্থাপন করে বলে মনে করা হচ্ছে তা আমার জীবনের জন্য আমি বুঝতে পারি না। র‌্যাঙ্কগুলি ১.৮ থেকে এবং ফাইলগুলি a..h থেকে বিস্তৃত হয় তবে আপনার ক্ষেত্রে উভয়ই iএবং j0-7 থেকে বিস্তৃত হয়, তবে এটি কোনটি আমাকে তা দেখতে সাহায্য করে না। কিছু আন্তর্জাতিক চিঠি ঘাটতি সঙ্কট আমি জানি না, বা কি তাদের পুনঃনামকরনের কি ভুল আছে rankএবং file?
Jörg ডব্লু মিটাগ

4
এক সেকেন্ডের জন্য শয়তানের উকিল খেলুন; কারও দাবা কোডটি পড়ার কল্পনা করুন যেখানে তারা একটি ম্যাজিক নম্বর ব্যবহার করেছেন ৮. আপনি কী ধরে নিতে পারেন এটি কী ব্যবহার করেছে? আপনি কিভাবে 100% নিশ্চিত হতে পারেন? এটির অন্য কিছু বোঝার কোনও সম্ভাবনা আছে কি? আপনি যদি অনুমান করতে না পারতেন তবে এটি কি কিছুটা ভালই হত না? আপনার অনুমানটি সঠিক কিনা তা বের করার জন্য আপনি কোডের মাধ্যমে ট্রেসিংয়ে কত সময় ব্যয় করতে পারেন? পরিবর্তে কোনও অর্থবোধক, অন্তর্দৃষ্টিপূর্ণ নাম ব্যবহার করে কোডটি যদি আরও স্ব-ডকুমেন্টিং করত তবে আপনি কি কম সময় ব্যয় করবেন?
বেন কট্রেল

16
@ জ্যাককসবি: সত্যই। এখানে 8 টি র‌্যাঙ্ক, 8 টি ফাইল, 8 পাউন্ড রয়েছে। কিছু দাবা ইঞ্জিন একটি পয়েন্ট সিস্টেম ব্যবহার করে যেখানে নির্দিষ্ট টুকরা, নির্দিষ্ট ক্ষেত্র এবং নির্দিষ্ট চলনগুলির সাথে তাদের সাথে পয়েন্ট যুক্ত থাকে এবং ইঞ্জিনটি সর্বোচ্চ স্কোর সহ চলনটি বেছে নেয়। 8 যেমন একটি স্কোর হতে পারে। 8 ডিফল্ট অনুসন্ধানের গভীরতা হতে পারে। এটি বেশ কিছু হতে পারে।
Jörg ডব্লু মিটাগ

9
আমি একটি foreach লুপ ব্যবহার বিবেচনা করব, যেমন foreach(var rank in Ranks)। আমি উভয় লুপকে একের সাথে একত্রে বিবেচনা করব যেখানে প্রতিটি উপাদান একটি (র‌্যাঙ্ক, ফাইল) টিপল।
কোডসইনচাউস

উত্তর:


101

আপনার বন্ধুটি প্রতীকী নামটি ব্যবহার করার ক্ষেত্রে সঠিক, যদিও আমি মনে করি নামটি অবশ্যই আরও বর্ণনামূলক হওয়া উচিত ( BOARD_WIDTHপরিবর্তে এর মতো CHESS_CONST)।

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

কীভাবে সংখ্যার জন্য নাম বাছবেন (বা কীভাবে করবেন না) এই আলোচনার জন্য এই প্রাক্তন SE.SE পোস্টটিও দেখুন ।

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


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

32
@ স্টিভবার্নস: আমি এ জাতীয় যুক্তি এড়াতে চেষ্টা করি, যেহেতু এটি খুব সহজেই একটি বিবর্তিত যুক্তির দিকে নিয়ে যায় "আমি মনে করি যে এই প্রোগ্রামটিকে অন্য ধরণের খেলায় পরিণত করা চূড়ান্ত নয়, তাই আমি ৮ নম্বর ম্যাজিকটি যেখানে রেখে দিতে পারি। "
ডক ব্রাউন

4
@ ইলিউসিভ ব্রায়ান এটি দুটি কারণে ক্লাসিক "স্ট্র ম্যান" যুক্তি: (১) কেবল একটি ধ্রুবককে সংজ্ঞায়িত করার অর্থ এই নয় যে প্রোগ্রামার এখনও "8" টাইপ করতে পারে না (দুর্ঘটনা, নকশা বা বিদ্বেষের দ্বারা!) এবং (২) কেবলমাত্র সেখানে একটি ধ্রুবক BOARD_WIDTH = 8 প্রোগ্রামের কোনও নির্দিষ্ট স্থানে BOARD_WIDTH কে সঠিক ধ্রুবক হিসাবে ব্যবহার করে না।
আলেফজেরো

3
@ ব্লারফ্লায় ... বা কোডটিকে ওভাররিঞ্জাইনিংয়ের দিকে নিয়ে যাবে। ভবিষ্যতে কী পরিবর্তন করতে পারে তা অনুধাবন করার বিকাশকারীর দায়িত্ব এবং তদনুসারে কোডটি। প্রয়োজনীয়তার মতো কোডিং সমস্যার কারণ হিসাবে পরিবর্তিত হবে না, তবে অন্য চূড়ান্ত এর চেয়ে ভাল আর নয়।
ম্যালকম 15

4
@ করসিকা যখন লুপের ভেরিয়েবলগুলি শারীরিক অক্ষের সাথে মিলে যায়, তাদের x, y বা সারি, করল বা, দাবা, ফাইল, র‌্যাঙ্কের জন্য নামকরণ করা উচিত।
user949300

11

ঠিক আছে, আমি এখানে কিছু মন্তব্য আছে:

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

for (int i = 0; i < ChessBoard.SIZE; i++){
  for (int j = 0; j < ChessBoard.SIZE; j++){

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

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


8
এই নিছক পুনরাবৃত্তি পয়েন্ট ইতিমধ্যে তৈরি এবং শীর্ষ উত্তর ব্যাখ্যা বলে মনে হয়
মশা

-7

আপনি যা চান তা হ'ল ধ্রুবকগুলির বিজ্ঞাপন নাক্সাম রেফারেন্সগুলি মুছে ফেলা , তাদের নাম দেওয়া হোক বা খালি হোক:

for_each_chess_square (row, col) {
  /*...*/
}

যদি আপনি আসলে এই ধরণের লুপগুলি এবং হোয়াট নোটগুলি পুনরাবৃত্তি করে ধ্রুবককে প্রসারিত করতে যাচ্ছেন তবে এটির সাথে আঁকানো ভাল 8

8স্ব-বর্ণনাকারী; এটি এমন কোনও ম্যাক্রো নয় যা অন্য কোনও কিছুর জন্য দাঁড়ায়।

আপনি কখনই করতে পারবেন না (টিএম) এটিকে 9x9 দাবা প্রোগ্রামে পরিণত করুন এবং আপনি যদি কখনও করেন তবে 8 এর বিস্তারটি সবচেয়ে বড় অসুবিধা হবে না।

টোকেন 8 এর জন্য আমরা 150,000 লাইন কোড বেসটি অনুসন্ধান করতে পারি এবং সেকেন্ডে কী ঘটবে তার অর্থ শ্রেণিবদ্ধকরণ করতে পারে।

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

এই 8 ধ্রুবকটি আপনার প্রোগ্রামে যখন উত্তেজনার উত্স হয়ে ওঠে, আপনি খুব সহজেই সেই সময়ে এটি ঠিক করতে পারেন। এখন ঘটে যাওয়া আসল সমস্যাগুলি ঠিক করুন। আপনি যদি মনে করেন না যে আপনি সেই বিশেষ 8 দ্বারা বাধা পেয়েছেন তবে সেই প্রবৃত্তির সাথে যান।

মনে করুন ভবিষ্যতে আপনি বিকল্প বোর্ডের মাত্রা সমর্থন করতে চান। 8সেক্ষেত্রে , এই লুপগুলি নামকরণ করা ধ্রুবক ব্যবহার করবে কিনা তা পরিবর্তন করতে হবে, কারণ মাত্রা board.widthএবং এর মতো কিছু এক্সপ্রেশন দ্বারা পুনরুদ্ধার করা হবে board.heightBOARD_SIZEপরিবর্তে আপনার যদি থাকে তবে 8এই স্থানগুলি সন্ধান করা আরও সহজ হবে। সুতরাং যে চেষ্টা কম। যাইহোক, আপনি প্রতিস্থাপন প্রচেষ্টা সম্পর্কে ভুলবেন না 8দিয়ে BOARD_SIZEপ্রথম স্থানে। সামগ্রিক প্রচেষ্টা কম নয়। কোডটি পরিবর্তনের 8জন্য একটি পাস করা BOARD_SIZEএবং তারপরে বিকল্প মাত্রাকে সমর্থন করার জন্য আরেকটি করা, কেবলমাত্র 8বিকল্প মাত্রা সমর্থন থেকে যাওয়ার চেয়ে সস্তা নয় ।

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

উদাহরণস্বরূপ, আপনি যদি আরও কোড যুক্ত করার দিন থেকে দূরে থাকেন যা এই ধ্রুবকগুলিকে আরও প্রসারিত করে, আপনি সেগুলি সরিয়ে ফেলতে চাইতে পারেন। যদি কনস্ট্যান্টগুলির সেই দৃষ্টান্তগুলি যদি প্রায় সমস্ত দৃষ্টান্তই উপস্থিত থাকে তবে এর পরে কেন বিরক্ত হবে।

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


13
8এটি স্ব-বর্ণনামূলক নয়, এটি এমন একটি সংখ্যা যা কিছু বোঝাতে পারে। এবং তারা একটি 9x9 দাবা খেলা করতে চান, কেন না? আপনার যদি কোডের ১৫,০০,০০০ লাইন থাকে, আপনি কোডটির প্রতিটি 8অর্থ কী তা মুখস্ত করতে সক্ষম হবেন এমন কোনও উপায় নেই এবং এমনকি আপনি যদি পারতেন তবে কেন আপনি করবেন? এটি কেবল অতিরিক্ত ঝামেলা। যতদূর সংশোধন করা যায়, তেমন 8কিছু দিয়ে প্রতিস্থাপনের NUM_RANKSফলে মডুলারিটি ক্ষতিগ্রস্থ হয় না, বাস্তবে, এটি সহায়তা করে কারণ এটি কোডটির সাথে টিঙ্কারকে আরও সহজ করে তোলে।
জেরফভ 2

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

1
"যাইহোক, আপনি প্রতিস্থাপন প্রচেষ্টা সম্পর্কে ভুলবেন না 8দিয়ে BOARD_SIZEপ্রথম স্থানে" সময় আপনি চিত্রে প্রতিটি বের করার চেষ্টা আপনার কোড ওভার তদন্ত অতিবাহিত থাকব - 8এখন থেকে আপনার প্রোগ্রাম মাসের মধ্যে আছে সম্ভবত অতিক্রম সময় প্রতিস্থাপন অতিবাহিত হবে 8সঙ্গে একটি অর্থবহ মডিউল স্তরের ধ্রুবক।
খ্রিস্টান ডিন

1
@Doppelganger এই দৃশ্যটি ইতিমধ্যে এখানে। আমি বলছি না, একটি দাবা প্রোগ্রাম নিন যা ধ্রুবক ব্যবহার করে, এবং সেগুলি 8 দিয়ে প্রতিস্থাপন করুন বা আমিও বলছি না, "একটি এখনও-না-লিখিত দাবা প্রোগ্রামে
কাজ

1
@ কাজ আপনি কেন নিজেকে 8 এর আশেপাশের সমস্ত কোডটি পড়তে চান এবং কখনও কখনও প্রসঙ্গটি ভুল হয়ে যায় যখন আপনি অর্থবোধক নাম দিয়ে অতিরিক্ত 3 সেকেন্ড ব্যয় করতে পারেন? ধ্রুবকের প্রকৃত মান জানার ক্ষেত্রে
কোডটিতে
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.