ইউভাল এবং ডেভিডের উত্তরগুলি মূলত সঠিক; সাতরে যাও:
- কোনও অ-নিযুক্ত স্থানীয় ভেরিয়েবলের ব্যবহার সম্ভবত সম্ভাব্য বাগ এবং এটি কম দামে সংকলক দ্বারা সনাক্ত করা যায়।
- কোনও অ-নিরক্ষিত ক্ষেত্র বা অ্যারের উপাদান ব্যবহার করার ফলে বাগ কম হওয়ার সম্ভাবনা কম এবং সংকলকটিতে শর্তটি সনাক্ত করা আরও শক্ত। অতএব সংকলক ক্ষেত্রগুলির জন্য একটি অবিচ্ছিন্ন ভেরিয়েবলের ব্যবহার সনাক্ত করার জন্য কোনও প্রচেষ্টা করে না, এবং পরিবর্তে প্রোগ্রামটি আচরণকে নির্বিচারে করার জন্য ডিফল্ট মানটিতে আরম্ভের উপর নির্ভর করে।
ডেভিডের উত্তরের একজন মন্তব্যকারী জিজ্ঞাসা করেছেন যে স্থির বিশ্লেষণের মাধ্যমে কোনও নিরীক্ষিত ক্ষেত্রের ব্যবহার সনাক্ত করা কেন অসম্ভব; এই উত্তরটি আমি এটিকেই প্রসারিত করতে চাই।
প্রথমে, কোনও চলক, স্থানীয় বা অন্যথায়, কোনও ভেরিয়েবল বরাদ্দ করা হয় বা নিযুক্ত করা হয় না তা সঠিকভাবে নির্ধারণ করা অসম্ভব । বিবেচনা:
bool x;
if (M()) x = true;
Console.WriteLine(x);
প্রশ্ন "এক্স বরাদ্দ করা হয়?" "এম () সত্য ফিরে আসে কি?" এর সমান? এখন, ধরুন এম () যদি ফেরামাতের শেষ উপপাদ্য একাদশ গাজিলিয়নের চেয়ে কম পূর্ণসংখ্যার জন্য সত্য হয় এবং অন্যথায় মিথ্যা হয়। এক্স অবশ্যই স্পষ্টভাবে নির্ধারিত হয়েছে কিনা তা নির্ধারণের জন্য, সংকলকটি অবশ্যই ফার্মের শেষ উপপাদ্যের একটি প্রমাণ তৈরি করতে হবে। সংকলকটি তেমন স্মার্ট নয়।
তাই কি কম্পাইলার স্থানীয়দের জন্য এর পরিবর্তে আছে কার্যকরী একটি আলগোরিদিম যা হয় দ্রুত , এবং overestimates যখন একটি স্থানীয় স্পষ্টভাবে নির্ধারিত করা হয় না। এটি হ'ল এর কিছু ভ্রান্ত ইতিবাচকতা রয়েছে, যেখানে এটি আপনি এবং আমি জানি যদিও এটি "আমি প্রমাণ করতে পারি না যে এই স্থানীয় নিয়োগ করা হয়েছে"। উদাহরণ স্বরূপ:
bool x;
if (N() * 0 == 0) x = true;
Console.WriteLine(x);
ধরুন এন () কোনও পূর্ণসংখ্যা ফেরত দেয়। আপনি এবং আমি জানি যে এন () * 0 হবে 0, তবে সংকলক তা জানে না। (দ্রষ্টব্য: সি # 2.0 সংকলক এটি জানত তবে স্পেসিফিকেশনটি বলে না বলে আমি সেই অপটিমাইজেশনটি সরিয়েছি কম্পাইলার যে জানে যে।)
ঠিক আছে, তো আমরা এতক্ষণ কী জানি? স্থানীয়দের কাছে সঠিক উত্তর পাওয়া অবাস্তব, তবে আমরা ন্যূন-নির্ধারিত-নেসকে সস্তার চেয়ে বেশি মূল্যায়ন করতে পারি এবং একটি দুর্দান্ত ফলাফল পেতে পারি যে "আপনাকে আপনার অস্পষ্ট প্রোগ্রামটি ঠিক করতে" তৈরির পক্ষ থেকে ভুল হয়েছে। এটা ভালো. ক্ষেত্রের জন্য একই জিনিস না কেন? অর্থাত্, একটি সুনির্দিষ্ট অ্যাসাইনমেন্ট চেকার তৈরি করুন যা সস্তা ব্যয়ে সবচেয়ে বেশি?
আচ্ছা, কোনও স্থানীয়কে আরম্ভ করার জন্য কতগুলি উপায় আছে? এটি পদ্ধতির পাঠ্যের মধ্যে নির্ধারিত হতে পারে। পদ্ধতির পাঠ্যে এটি ল্যাম্বডায় অন্তর্ভুক্ত করা যেতে পারে; যে ল্যাম্বডা কখনই না চাওয়া হতে পারে, সুতরাং এই কাজগুলি প্রাসঙ্গিক নয়। অথবা এথোথ পদ্ধতিতে এটি "আউট" হিসাবে উত্তীর্ণ হতে পারে, যখন পদ্ধতিটি স্বাভাবিকভাবে ফিরে আসে তখন আমরা এটি নির্ধারিত অনুমান করতে পারি। সেগুলি খুব স্পষ্ট পয়েন্ট যেখানে স্থানীয় নির্ধারিত হয় এবং স্থানীয় ঠিক সেই পদ্ধতিতে তারা ঠিক সেখানে থাকে । স্থানীয়দের জন্য নির্দিষ্ট দায়িত্ব নির্ধারণের জন্য কেবল স্থানীয় বিশ্লেষণ প্রয়োজন । পদ্ধতিগুলি সংক্ষিপ্ত হতে থাকে - কোনও পদ্ধতিতে কোডের মিলিয়ন লাইনের চেয়ে অনেক কম - এবং তাই পুরো পদ্ধতিটি বিশ্লেষণ করা খুব দ্রুত।
এখন ক্ষেত্র সম্পর্কে কি? ক্ষেত্রগুলি অবশ্যই কোনও কনস্ট্রাক্টরে প্রাথমিকভাবে করা যেতে পারে। অথবা একটি ফিল্ড ইনিশিয়ালাইজার। অথবা কনস্ট্রাক্টর ক্ষেত্রগুলির সূচনা করার জন্য একটি ইনস্ট্যান্স পদ্ধতিতে কল করতে পারে। অথবা কনস্ট্রাক্টর একটি ভার্চুয়াল পদ্ধতিতে কল করতে পারে যা ক্ষেত্রগুলির সূচনা করে। অথবা কনস্ট্রাক্টর অন্য ক্লাসে একটি পদ্ধতি কল করতে পারে, যা কোনও গ্রন্থাগারে থাকতে পারে, যা ক্ষেত্রগুলিকে আরম্ভ করে। স্ট্যাটিক ফিল্ডগুলি স্ট্যাটিক কনস্ট্রাক্টরগুলিতে আরম্ভ করা যায়। স্ট্যাটিক ক্ষেত্রগুলি অন্যান্য স্ট্যাটিক কনস্ট্রাক্টর দ্বারা সূচনা করা যেতে পারে ।
মূলত কোনও ক্ষেত্রের প্রারম্ভকালীন সমগ্র ভার্চুয়াল পদ্ধতি সহ যে কোনও গ্রন্থাগারগুলিতে এখনও ঘোষিত হয়নি যা ঘোষণা করা হবে সহ পুরো প্রোগ্রামের যে কোনও জায়গায় থাকতে পারে :
// Library written by BarCorp
public abstract class Bar
{
// Derived class is responsible for initializing x.
protected int x;
protected abstract void InitializeX();
public void M()
{
InitializeX();
Console.WriteLine(x);
}
}
এই লাইব্রেরিটি সংকলন করার জন্য এটি একটি ত্রুটি? যদি হ্যাঁ, বারকর্পটি কীভাবে বাগটি ঠিক করার কথা? এক্সকে ডিফল্ট মান নির্ধারণ করে? কিন্তু সংকলকটি ইতিমধ্যে এটি করে।
মনে করুন এই গ্রন্থাগারটি আইনী। যদি FooCorp লিখে
public class Foo : Bar
{
protected override void InitializeX() { }
}
হয় যে একটি ত্রুটি? সংকলকটি কীভাবে এটি অনুমান করার কথা? একমাত্র উপায় একটি করতে হয় পুরো প্রোগ্রাম বিশ্লেষণ যে আরম্ভের স্ট্যাটিক ট্র্যাক করে যে ক্ষেত্র উপর প্রোগ্রামের মাধ্যমে প্রতি সম্ভব পাথ , পাথ যে জড়িত সহ রানটাইম এ ভার্চুয়াল পদ্ধতির পছন্দ । এই সমস্যাটি নির্বিচারে শক্ত হতে পারে ; এটি লক্ষ লক্ষ নিয়ন্ত্রণ পাথের সিমুলেটেড কার্যকরকরণের সাথে জড়িত থাকতে পারে। স্থানীয় নিয়ন্ত্রণ প্রবাহ বিশ্লেষণ করতে মাইক্রোসেকেন্ড লাগে এবং পদ্ধতির আকারের উপর নির্ভর করে। বৈশ্বিক নিয়ন্ত্রণ প্রবাহ বিশ্লেষণ করতে সময় নিতে পারে কারণ এটি প্রোগ্রামের প্রতিটি পদ্ধতির জটিলতা এবং সমস্ত গ্রন্থাগারগুলির উপর নির্ভর করে ।
তাহলে কেন একটি সস্তা বিশ্লেষণ যা পুরো প্রোগ্রামটিকে বিশ্লেষণ করতে হবে না, এবং কেবলমাত্র আরও তীব্রতার চেয়ে বেশি মূল্যায়ন করবে না? ভাল, একটি অ্যালগরিদম প্রস্তাব করুন যা কাজ করে যা সত্যিকারের সংকলন করে এমন একটি সঠিক প্রোগ্রাম লিখতে খুব বেশি কষ্ট দেয় না এবং নকশা দল এটি বিবেচনা করতে পারে। আমি এ জাতীয় কোনও অ্যালগরিদম জানি না।
এখন, মন্তব্যকারী পরামর্শ দেয় "একজন কন্সট্রাক্টর সমস্ত ক্ষেত্র আরম্ভ করার প্রয়োজন"। এটি কোনও খারাপ ধারণা নয়। আসলে, এটি এমন একটি খারাপ-ধারণা নয় যে স্ট্রাক্টগুলির জন্য সি # এর ইতিমধ্যে বৈশিষ্ট্য রয়েছে । একটি কাঠামো নির্মাতাকে কর্টর স্বাভাবিকভাবে ফেরার সময়টির মধ্যে অবশ্যই সমস্ত ক্ষেত্রকে স্পষ্টভাবে বরাদ্দ করা প্রয়োজন; ডিফল্ট কনস্ট্রাক্টর সমস্ত ক্ষেত্রকে তাদের ডিফল্ট মানগুলিতে আরম্ভ করে।
ক্লাস সম্পর্কে কি? ঠিক আছে, আপনি কীভাবে জানবেন যে কোনও নির্মাণকারী একটি ক্ষেত্রের সূচনা করেছে ? Ctor একটি ভার্চুয়াল পদ্ধতিতে কল করতে পারে ক্ষেত্রগুলি আরম্ভ করার জন্য এবং এখন আমরা আগের অবস্থানে ফিরে এসেছি। স্ট্রাইকগুলির ক্লাস নেই; ক্লাস পারে। একটি বিমূর্ত শ্রেণি সহ একটি গ্রন্থাগারের কি এমন কোনও কনস্ট্রাক্টর রয়েছে যা তার সমস্ত ক্ষেত্রকে সূচনা করে? অ্যাবস্ট্রাক্ট শ্রেণি কীভাবে জানবে যে ক্ষেত্রগুলিকে আরম্ভ করা উচিত?
জন ক্ষেত্রগুলির সূচনা করার আগে কেবল কোনও ctor এ কল করার পদ্ধতিগুলি নিষিদ্ধ করার পরামর্শ দেয়। সুতরাং, সংক্ষেপে, আমাদের বিকল্পগুলি হ'ল:
- সাধারণ, নিরাপদ, প্রায়শই ব্যবহৃত প্রোগ্রামিং আইডিয়ামগুলি অবৈধ করুন।
- একটি ব্যয়বহুল পুরো-প্রোগ্রাম বিশ্লেষণ করুন যা সংকলনটি সম্ভবত সেখানে নেই এমন বাগগুলি সন্ধান করতে কয়েক ঘন্টা সময় নেয়।
- ডিফল্ট মানগুলিতে স্বয়ংক্রিয় সূচনার উপর নির্ভর করুন।
ডিজাইন দলটি তৃতীয় বিকল্পটি বেছে নিয়েছিল।