পাবলিক কনস্ট্যান্টগুলি কি "খারাপ" আছে?


38

এটি কি:

public MyClass
{
    public const string SomeString = "SomeValue";
}

এর চেয়েও খারাপ:

public MyClass
{
    public static string SomeString { get{ return "SomeValue";}}
}

উভয়ই একইভাবে উল্লেখ করা যেতে পারে:

if (someString == MyClass.SomeString)
     ...

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

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

কোন ধারনা?


1
এইভাবে ব্যবহৃত পাবলিক কনস্ট্যান্টগুলি ঠিক আছে fine এইভাবে বৈশিষ্ট্য ব্যবহার করা ওভারকিল।
বার্নার্ড

2
আপনি কি কেবল পঠনযোগ্য কীওয়ার্ডটি ব্যবহার করে বিবেচনা করেছেন ? ReadOnly আপনাকে পোস্টের অনেকটিতে উল্লিখিত সমস্যা ছাড়াই কনস্টের ক্লিনার সিনট্যাক্স দেয়।
ম্যাট রাফেল

এছাড়াও করতে পারে ... পাবলিক স্ট্যাটিক পঠনযোগ্য টাইপ করুন ধ্রুব নাম = 0;
স্নুপ

উত্তর:


56

সি # তে এই থ্রেডে উল্লিখিত কোনও কারণে এটি খুব খারাপ।

সি # তে পাবলিক কনস্ট্যান্টরা রেফারেন্সিং অ্যাসেমব্লিতে বেকড হয়। অর্থ, আপনার যদি মাইক্লাসে সামার স্ট্রিংকে রেফারিং করে আলাদা আলাদা অ্যাসেমব্লিতে সামোথারক্লাস থাকে তবে সামোথারক্লাসের জন্য উত্পন্ন সিআইএল একটি হার্ডকোডযুক্ত "সামোরভ্যালু" স্ট্রিং ধারণ করবে।

আপনি যদি মাইক্র্লাসযুক্ত ডেলটিতে পুনরায় প্রচার করতে যান তবে সামোথারক্লাস নয় এবং কনট পরিবর্তন করেন তবে সামোরথার্লাসে আপনি যা ভাবেন তা ধারণ করবে না - এতে আসল মান থাকবে।

আপনি যদি 100% ইতিবাচক হন তবে এটি পাই এর মতো সর্বজনীন ধ্রুবক, উন্মাদ হয়ে যান; অন্যথায় সাবধানে পদক্ষেপ।

এখানে আরও ভাল ব্যাখ্যা: https://stackoverflow.com/questions/55984/ what-is-the-differences-between-const- and- readonly


3
@ ওডড, তবে একই পার্থক্যটি কেবল constএবং কেবল পঠনযোগ্য সম্পত্তিগুলির মধ্যে। constকলিং অ্যাসেমব্লিকে বেকড করা হয়, কেবল পঠিত সম্পত্তি নয়।
সোভিক

1
এটি এমন কিছু যা আমি জানতাম না। এটি আরও প্রমাণ যে পাবলিক ফিল্ডগুলি খারাপ। আমি মনে করি পাই এর "নিরাপদ" উদাহরণটিও একটি খারাপ ধারণা (যখন কোনও বিকাশকারী পাই সম্পর্কে কম-বেশি সংখ্যক নির্ভুলতার চান তবে কী হবে? এবং এই সমস্যাটি না জেনে সমাবেশে পরিবর্তন আনতে হবে)) আমার 40+ অ্যাসেমব্লি রয়েছে আমার সমাধান এবং আমি যদি আমাদের যত্নবান না হই তবে এটি সত্যই আমাদের কামড় দিতে দেখেছে।
ভ্যাকানো

2
এই "অনুলিপি" কি সি # এর অন্য কোনও অংশে ঘটে? (অর্থাত্
এনামস

2
হ্যাঁ, অনুলিপিটি ঘটে। এটি সাধারণত কোনও সমস্যা হয় না তবে আপনার কোড যদি এনামের সংখ্যাসূচক মানটি ব্যবহার করে এবং এটি এই প্রশ্নের বর্ণিত পদ্ধতিতে পরিবর্তিত হয় তবে তা সমস্যার কারণ হতে পারে।
ভ্যাকানো

1
এটি constসি # তে বোবা হওয়ার অন্যতম প্রধান কারণ । অপরিবর্তনযোগ্যদের জন্য আমাদের আরও উন্নত সহায়তা প্রয়োজন ...
কেচালাক্স

22

একটি জমিতে একটি জমিতে পরিবর্তন করা একটি ব্রেকিং পরিবর্তন। আপনি বাইনারি, উত্স এবং প্রতিবিম্বের সামঞ্জস্য হারাবেন।

এছাড়াও:

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

http://csharpindepth.com/articles/chapter8/propertiesmatter.aspx

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


11

সর্বজনীন ক্ষেত্রগুলির বিপদগুলি সত্য যে তারা পরিবর্তনীয় এবং তাদের অন্তর্নিহিত বাস্তবায়ন পরিবর্তন সাপেক্ষে।

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


1

একটি ধ্রুবক হ'ল ডেটা। বৈশিষ্ট্যগুলি আচরণের সম্ভাবনা বোঝায় যখন আপনি এতটা মানের দিকে "চেহারা" হন।

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

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

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

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

সত্যিকারের ধ্রুবক ডেটার প্রয়োজন হয় না বা এনক্যাপসুলেশন চায়।

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