ম্যাজিক স্ট্রিংগুলিতে কী ভুল?


164

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

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

সেগুলি এড়ানোর কী উদ্দেশ্যমূলক কারণ রয়েছে? তারা কি সমস্যা সৃষ্টি করে?


38
ম্যাজিক স্ট্রিং কি? ম্যাজিক সংখ্যা হিসাবে একই জিনিস ?
লাইভ

14
@ লাইভ: এগুলি ম্যাজিক সংখ্যার মতো, হ্যাঁ, আমি ডেফিক / ম্যাজিক-স্ট্রিংয়ের সংজ্ঞাটির মতো : "ম্যাজিক স্ট্রিংগুলি স্ট্রিং মানগুলি যা অ্যাপ্লিকেশনটির আচরণের উপর প্রভাব ফেলে সরাসরি অ্যাপ্লিকেশন কোডের মধ্যে নির্দিষ্ট করা হয়" " (এ সংজ্ঞা en.wikipedia.org/wiki/Magic_string কি আমি এ সব মনে আছে নয়)
Kramii

17
এটি মজার বিষয় আমি ঘৃণা করতে শিখেছি ... পরে আমার জুনিয়রকে বোঝানোর জন্য আমি কী যুক্তি ব্যবহার করতে পারি ... কখনই গল্প শেষ হয় না :-)। আমি "বোঝানোর" চেষ্টা করব না আমি বরং তাদের নিজেরাই শিখতে চাই। আপনার নিজের অভিজ্ঞতায় পৌঁছে যাওয়া পাঠ / ধারণা ছাড়া আর কিছুই শেষ হয় না। আপনি যা করতে চেষ্টা করছেন তা হ'ল ইনডিক্ট্রিনেট । আপনি লেমিংসের একটি দল না চাইলে এটি করবেন না।
লাইভ

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

6
@ ডেভিড আর্নো, এই প্রশ্নটি জিজ্ঞাসা করে তিনি ঠিক সেটাই করছেন।
ব্যবহারকারী 576834

উত্তর:


212
  1. সংকলন করা ভাষায়, একটি যাদু স্ট্রিংয়ের মান সংকলনের সময় পরীক্ষা করা হয় না । যদি স্ট্রিংটি অবশ্যই কোনও নির্দিষ্ট প্যাটার্নের সাথে মেলে তবে আপনাকে সেই প্রোগ্রামটি চালানোর গ্যারান্টি দিতে প্রোগ্রাম চালাতে হবে। আপনি যদি এনামের মতো কিছু ব্যবহার করেন তবে কমপাইল-সময়ে মানটি কমপক্ষে বৈধ হয়, যদিও এটি ভুল মান হতে পারে।

  2. যদি কোনও ম্যাজিক স্ট্রিং একাধিক জায়গায় রচনা করা হয় তবে আপনাকে কোনও সুরক্ষা ছাড়াই এগুলি সমস্ত পরিবর্তন করতে হবে (যেমন সংকলন-সময় ত্রুটি)। যদিও এটি কেবলমাত্র এক জায়গায় ঘোষণা করে এবং পরিবর্তনশীলটিকে পুনরায় ব্যবহারের মাধ্যমে মোকাবিলা করা যেতে পারে।

  3. টাইপগুলি গুরুতর বাগ হতে পারে। আপনার যদি কোনও ফাংশন থাকে:

    func(string foo) {
        if (foo == "bar") {
            // do something
        }
    }
    

    এবং কেউ দুর্ঘটনাক্রমে টাইপ করে:

    func("barr");
    

    স্ট্রিংটি এটি বিরল বা আরও জটিল, বিশেষত যদি আপনার কাছে প্রোগ্রামার থাকে যা প্রকল্পের মাতৃভাষার সাথে অপরিচিত।

  4. যাদু স্ট্রিং খুব কমই স্ব-ডকুমেন্টিং হয়। যদি আপনি একটি স্ট্রিং দেখেন, তবে স্ট্রিংটি কী হতে পারে / কী হতে পারে সে সম্পর্কে আপনাকে কিছুই জানায় না। আপনি সঠিক স্ট্রিংটি বেছে নিয়েছেন তা নিশ্চিত হওয়ার জন্য আপনাকে সম্ভবত বাস্তবায়নটি সন্ধান করতে হবে।

    এই ধরণের বাস্তবায়ন খুব ফাঁস , যা লিখতে হবে তা বোঝার জন্য বাহ্যিক ডকুমেন্টেশন বা কোডটিতে অ্যাক্সেসের প্রয়োজন, বিশেষত যেহেতু এটি চরিত্র-নিখুঁত হতে হবে (পয়েন্ট 3 হিসাবে)।

  5. আইডিইগুলিতে "ফাইন্ড স্ট্রিং" ফাংশনগুলির সংক্ষিপ্ততা, খুব অল্প সংখ্যক সরঞ্জাম রয়েছে যা প্যাটার্নটিকে সমর্থন করে।

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


34
প্রথম যুক্তি সম্পর্কিত: টাইপস্ক্রিপ্ট একটি সংকলিত ভাষা যা স্ট্রিং লিটারেলগুলি টাইপচেক করতে পারে। এটি দুই থেকে চারটি যুক্তিকেও অকার্যকর করে দেয়। সুতরাং, স্ট্রিং নিজেই সমস্যা নয়, তবে এমন একটি ধরণ ব্যবহার করে যা অনেকগুলি মানকে অনুমতি দেয়। গণনার জন্য যাদু পূর্ণসংখ্যার ব্যবহারের ক্ষেত্রে একই যুক্তি প্রয়োগ করা যেতে পারে।
যোগু

11
যেহেতু আমার কাছে টাইপস্ক্রিপ্টের কোনও অভিজ্ঞতা নেই তাই আমি সেখানে আপনার রায় মুলতুবি করব। আমি তখন যা বলব, তা কি চেক না করা স্ট্রিংগুলি (যেমন আমি ব্যবহার করেছি সমস্ত ভাষার ক্ষেত্রে) সমস্যা।
এরদরিক আয়রনরোজ

23
আপনি যদি প্রত্যাশা করছেন স্ট্যাটিক স্ট্রিং আক্ষরিক প্রকারটি পরিবর্তন করেন তবে যোগোগ টাইপস্ক্রিপ্ট আপনার জন্য সমস্ত স্ট্রিংয়ের নাম পরিবর্তন করবে না। আপনি সমস্তটি খুঁজে পেতে আপনাকে সংকলনের সময় ত্রুটিগুলি পেয়ে যাবেন তবে এটি কেবল ২ এ আংশিক উন্নতি হবে না এটি একেবারে আশ্চর্যজনকর চেয়ে কম কিছু বলে না (কারণ এটি এটিই, এবং আমি বৈশিষ্ট্যটি ভালবাসি) তবে এটি অবশ্যই না সরাসরি enums সুবিধা বর্জন। আমাদের প্রকল্পে, কখন এনাম ব্যবহার করা যায় এবং কখন এক ধরণের মুক্ত শৈলীর প্রশ্ন থেকে যায় না যা সম্পর্কে আমরা নিশ্চিত নই; উভয় পদ্ধতির বিরক্তি এবং সুবিধা রয়েছে।
কেআরয়ান

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

35
@ যোগু আমি আরও যুক্তি দিয়ে বলব যে যদি সংকলনের সময় যদি কোনও স্ট্রিংয়ের আক্ষরিক মান পরীক্ষা করা হয় তবে এটি যাদু স্ট্রিং হিসাবে বন্ধ হয়ে যায় । এই মুহূর্তে এটি একটি সাধারণ কনস্ট / এনাম মান যা মজার উপায়ে লেখা যায় happens সেই দৃষ্টিভঙ্গি দেওয়া, আমি আসলে তর্ক করব যে আপনার মন্তব্য আসলে এরদিকের পয়েন্টগুলিকে খণ্ডন করার পরিবর্তে সমর্থন করে।
গ্র্যান্ডঅপনার

89

অন্যান্য উত্তরগুলি কী আঁকড়ে ধরেছিল তার শীর্ষে, "যাদু মান" খারাপ নয়, তবে তাদের হওয়া উচিত:

  1. ধ্রুবক হিসাবে স্বীকৃত হিসাবে সংজ্ঞায়িত;
  2. তাদের ব্যবহারের সম্পূর্ণ ডোমেনের মধ্যে কেবল একবার সংজ্ঞা দেওয়া হয়েছে (যদি স্থাপত্যিকভাবে সম্ভব হয়);
  3. তারা একরকম সম্পর্কিত যে ধ্রুবক একটি সেট গঠন যদি একত্রে সংজ্ঞায়িত;
  4. যে অ্যাপ্লিকেশনটিতে তারা ব্যবহৃত হয় তাদের যথাযথ পর্যায়ে সাধারণতার সংজ্ঞা দেওয়া হয়; এবং
  5. অনুপযুক্ত প্রসঙ্গে তাদের ব্যবহার সীমাবদ্ধ করার জন্য এমনভাবে সংজ্ঞায়িত করা হয়েছে (উদাহরণস্বরূপ চেকিং টাইপ করতে সক্ষম)।

"যাদু মান" থেকে সাধারণত গ্রহণযোগ্য "ধ্রুবকগুলি" কে আলাদা করে তা হ'ল এই নিয়মের এক বা একাধিক লঙ্ঘন।

ভাল ব্যবহৃত, ধ্রুবকগুলি কেবল আমাদের কোডের নির্দিষ্ট অক্ষগুলি প্রকাশ করার অনুমতি দেয়।

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

উচ্চ-স্তরের ভাষাগুলিতে নিম্ন স্তরের ভাষাগুলিতে নিদর্শনগুলির জন্য নির্মাণ রয়েছে যা ধ্রুবকদের নিয়োগ করতে হবে। একই ধাঁচগুলি উচ্চ-স্তরের ভাষায়ও ব্যবহার করা যেতে পারে, তবে হওয়া উচিত নয়।

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

সম্পাদনা: একটি সম্পাদনা গ্রহণ করে, অন্যটিকে প্রত্যাখ্যান করে, এবং এখন আমার নিজের সম্পাদনা সম্পাদন করে, আমি এখন আমার নিয়মের তালিকাটির বিন্যাস এবং বিরামচিহ্ন শৈলীর বিষয়টি একবার এবং সমস্ত হাওয়ের জন্য নিষ্পত্তি হতে পারি!


2
আমি এই উত্তরটি পছন্দ করি। সর্বোপরি "স্ট্রাক্ট" (এবং প্রতিটি অন্যান্য সংরক্ষিত শব্দ) সি সংকলকটির জন্য একটি যাদু স্ট্রিং। তাদের জন্য কোডিং করার ভাল এবং খারাপ উপায় রয়েছে।
আলফ্রেড আর্মস্ট্রং

6
উদাহরণস্বরূপ, যদি কেউ আপনার কোডটিতে "X: = 898755167 * Z" দেখেন, তারা সম্ভবত এটির অর্থ কী তা জানেন না এবং এটি ভুল তাও জানেন না। তবে যদি তারা “স্পিড_ফ_লাইট: ধ্রুবক পূর্ণসংখ্যা: = 299792456” দেখেন তবে কেউ এটিকে সন্ধান করবে এবং সঠিক মানটি (এবং সম্ভবত আরও ভাল ডেটা টাইপ) প্রস্তাব করবে।
ডাব্লুগ্রোলাউ

26
কিছু লোক বিন্দুটি পুরোপুরি মিস করে এবং COMMA = "," SEPARATOR = "," এর পরিবর্তে লিখেন। পূর্ববর্তীটি আরও কিছু পরিষ্কার করে না, তবে পরবর্তীকালে উদ্দেশ্যটি ব্যবহারের কথা উল্লেখ করে এবং আপনাকে পরে একক জায়গায় পৃথককারী পরিবর্তন করতে দেয়।
মার্কাস

1
@ মার্কাস, সত্যিই! ইন-জায়গা সহজ আক্ষরিক মান ব্যবহার করার জন্য একটি মামলা অবশ্যই নেই - উদাহরণস্বরূপ, একটি পদ্ধতি দুই একটি মান ভাগ হলে, এটি পরিষ্কার এবং সহজ হতে পারে কেবল লিখতে value / 2বদলে value / VALUE_DIVISORআধুনিক হিসাবে সংজ্ঞায়িত সঙ্গে 2অন্যত্র। যদি আপনি সিএসভিগুলি পরিচালনা করে এমন কোনও পদ্ধতি সাধারণ করার ইচ্ছা করেন, আপনি সম্ভবত বিভাজকটিকে পরামিতি হিসাবে উত্তীর্ণ করতে চান এবং ধ্রুবক হিসাবে মোটেই সংজ্ঞায়িত করেননি। তবে এটি সমস্ত প্রসঙ্গে বিচারের প্রশ্ন - @ WGrolau এর উদাহরণ SPEED_OF_LIGHTহ'ল এমন একটি বিষয় যা আপনি স্পষ্টভাবে নাম রাখতে চান তবে প্রতিটি আক্ষরিকের এটির প্রয়োজন হয় না।
স্টিভ

4
এই জবাবটির চেয়ে শীর্ষের উত্তরটি ভাল, যদি জেনে রাখা যে ম্যাজিক স্ট্রিংগুলি একটি "খারাপ জিনিস" need এই উত্তরটি যদি আপনি জানেন এবং স্বীকার করেন যে তারা একটি "খারাপ জিনিস" এবং এগুলি রক্ষণাবেক্ষণযোগ্য উপায়ে পরিবেশন করা প্রয়োজনগুলি পূরণ করার জন্য সর্বোত্তম উপায় খুঁজে পাওয়া দরকার তবে এটি উত্তম।
কর্সিকা

34
  • তারা ট্র্যাক করা কঠিন।
  • সমস্ত পরিবর্তন করার জন্য সম্ভবত একাধিক প্রকল্পে একাধিক ফাইল পরিবর্তন করা প্রয়োজন (বজায় রাখা শক্ত)।
  • কখনও কখনও কেবল তাদের মান দেখে তাদের উদ্দেশ্য কী তা বলা শক্ত।
  • কোন পুনঃব্যবহার।

4
"পুনঃব্যবহার" এর অর্থ কী?
বিদায়

7
একটি পরিবর্তনশীল / ধ্রুবক ইত্যাদি তৈরির পরিবর্তে এবং আপনার সমস্ত প্রকল্প / কোড জুড়ে এটি পুনরায় ব্যবহার করুন আপনি প্রতিটিটিতে একটি নতুন স্ট্রিং তৈরি করছেন যা একটি অপ্রয়োজনীয় নকল সৃষ্টি করে।
জেসন

সুতরাং 2 এবং 4 পয়েন্ট একই?
টমাস

4
@ থমাস মুরস না, আপনি যখনই ইতিমধ্যে বিদ্যমান যাদু স্ট্রিংটি ব্যবহার করতে চান প্রতিবার নতুন স্ট্রিংটি যেভাবে তৈরি করতে হবে সে সম্পর্কে তিনি কথা বলছেন , পয়েন্ট ২ স্ট্রিংটি নিজেই পরিবর্তন করার বিষয়ে রয়েছে
পিয়ের আরলাড

25

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

Field nameField = myEntity.GetField("ProductName");

(ম্যাজিক স্ট্রিং "পণ্য নাম" নোট করুন)

এর ফলে বেশ কয়েকটি সমস্যা দেখা দিতে পারে:

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

সুতরাং এর জন্য আমার সমাধানটি হ'ল সত্তার ধরণের দ্বারা সংগঠিত এই নামেরগুলির জন্য ধ্রুবক তৈরি করা। সুতরাং এখন আমি ব্যবহার করতে পারেন:

Field nameField = myEntity.GetField(Model.Product.ProductName);

এটি এখনও একটি স্ট্রিং ধ্রুবক এবং সঠিক একই বাইনারি সংকলন করে তবে এর বেশ কয়েকটি সুবিধা রয়েছে:

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

আমার তালিকার পরবর্তী: জোরালোভাবে টাইপ করা ক্লাসগুলির পিছনে এই ধ্রুবকগুলি লুকান - তারপরে ডেটাটাইপও সুরক্ষিত হয়।


+1 আপনি কোড স্ট্রাকচারের মধ্যে সীমাবদ্ধ না রেখে অনেকগুলি ভাল পয়েন্ট
এনেছেন

যদি আপনার সত্তার ধরণের কিছু অংশ স্থিতিশীল থাকে তবে এটির জন্য একটি ধ্রুবক নামটির প্রকৃতপক্ষে সংজ্ঞা দেওয়া সার্থক হয় তবে আমি মনে করি এটির জন্য একটি সঠিক ডেটা মডেল সংজ্ঞায়িত করা আরও উপযুক্ত হবে যাতে আপনি কেবল এটি করতে পারেন nameField = myEntity.ProductName;
মিথ্যা রায়ান

@ লাইআরয়ান - সরল ধ্রুবক তৈরি করা এবং বিদ্যমান প্রকল্পগুলি ব্যবহারের জন্য এটি আপগ্রেড করা অনেক সহজ ছিল। এটি বলেছিল, আমি স্ট্যাটিক ধরণের উত্স তৈরির জন্য কাজ করছি যাতে আমি স্পষ্টভাবে এটি করতে পারি
হ্যানস কে st ই

9

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

কিছু নির্দিষ্ট ক্ষেত্রে, যাদু স্ট্রিংগুলি এড়ানো উচিত:

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

তবে কিছু ক্ষেত্রে "ম্যাজিক স্ট্রিং" ঠিক আছে। বলুন আপনার কাছে একটি সাধারণ পার্সার রয়েছে:

switch (token.Text) {
  case "+":
    return a + b;
  case "-":
    return a - b;
  //etc.
}

এখানে সত্যিই কোনও যাদু নেই এবং উপরের বর্ণিত সমস্যার কোনওটিই প্রয়োগ করে না। আইএমএইচও string Plus="+"ইত্যাদির সংজ্ঞা দিতে কোনও সুবিধা হবে না এটিকে সহজ রাখুন।


7
আমি মনে করি আপনার "ম্যাজিক স্ট্রিং" এর সংজ্ঞাটি অপর্যাপ্ত, এর লুকানোর / অস্পষ্টতা / তৈরির-রহস্যময় কিছু ধারণা থাকা দরকার। আমি "জাদু" হিসাবে যে পাল্টা উদাহরণে "+" এবং "-" উল্লেখ করব না, আমি শূন্যকে যাদু হিসাবে উল্লেখ করেছি তার চেয়ে বেশি কিছু না if (dx != 0) { grad = dy/dx; }
রবি

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

7
আপনার উদাহরণ রেফারেন্স, আমি সুইচ বিবৃতি যা প্রতিস্থাপিত দেখেছি "+"এবং "-"সঙ্গে TOKEN_PLUSএবং TOKEN_MINUS। যতবার আমি এটি পড়ি তখন আমার মনে হয়েছিল যে এটি পড়ার কারণে এটি ডিবাগ করা আরও শক্ত! অবশ্যই এমন একটি জায়গা যেখানে আমি সম্মত হই যে সরল স্ট্রিংগুলি ব্যবহার করা আরও ভাল।
কর্ন অ্যাম্মন

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

2
আমি জানি না এখানে "ম্যাজিক" কী। এগুলি আমার কাছে মৌলিক স্ট্রিংয়ের আক্ষরিক মত দেখাচ্ছে।
tchrist

6

বিদ্যমান উত্তর যুক্ত করতে:

আন্তর্জাতিককরণ (i18n)

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

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

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


3

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

তবে আবার, এটি বিকাশকারীদের খুব বেশি যত্ন নেয় না।

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