সংক্ষিপ্ত উত্তর: ধারাবাহিকতা
আপনার প্রশ্নের যথাযথ উত্তর দিতে, তবে আমি প্রস্তাব দিচ্ছি যে আমরা একটি পদক্ষেপ পিছনে নিয়েছি এবং প্রোগ্রামিং ভাষায় সমতা কী বোঝায় তার ইস্যুটি সন্ধান করব । কমপক্ষে তিনটি পৃথক সম্ভাবনা রয়েছে, যা বিভিন্ন ভাষায় ব্যবহৃত হয়:
- রেফারেন্স সমতা : এর অর্থ হ'ল a = b সত্য হয় যদি a এবং b একই বস্তুর উল্লেখ করে। A এবং b বিভিন্ন অবজেক্টকে রেফার করে নিলে এটি সত্য হবে না, এমনকি ক এবং খ এর সমস্ত বৈশিষ্ট্য একই ছিল।
- অগভীর সমতা : এর অর্থ হ'ল a = b সত্য হয় যদি ক এবং খ উল্লেখ করা হয় এমন বস্তুর সমস্ত বৈশিষ্ট্য অভিন্ন হয়। অগভীর সাম্যতা সহজেই দুটি বস্তুর প্রতিনিধিত্বকারী মেমরি স্পেসের বিটওয়াস তুলনা করে প্রয়োগ করা যেতে পারে। দয়া করে নোট করুন যে রেফারেন্স সাম্যতা অগভীর সাম্য বোঝায়
- গভীর সমতা : এর অর্থ হ'ল a = b সত্য হয় যদি a এবং b এর প্রতিটি বৈশিষ্ট্য হয় অভিন্ন বা গভীর সমান হয়। দয়া করে নোট করুন যে গভীর সাম্যতা উভয়ই রেফারেন্স সাম্যতা এবং অগভীর সাম্যতা দ্বারা অন্তর্ভুক্ত। এই অর্থে, গভীর সমতা সাম্যতার দুর্বলতম রূপ এবং রেফারেন্স সাম্যতা সবচেয়ে শক্তিশালী।
এই তিন ধরণের সাম্য প্রায়শই ব্যবহৃত হয় কারণ এগুলি প্রয়োগ করা সুবিধাজনক: তিনটি সমতা চেক সহজেই একটি সংকলক তৈরি করতে পারে (গভীর সমতার ক্ষেত্রে, সংকলকটি যদি অসীম লুপগুলি প্রতিরোধ করতে ট্যাগ বিট ব্যবহার করতে পারে তবে কোনও কাঠামো যদি তুলনা করা বিজ্ঞপ্তি রেফারেন্স আছে)। তবে আরও একটি সমস্যা রয়েছে: এগুলির কোনওটিই উপযুক্ত নাও হতে পারে।
অ-তুচ্ছ সিস্টেমগুলিতে, অবজেক্টের সাম্যতা প্রায়শই গভীর এবং রেফারেন্স সাম্যের মধ্যে কিছু হিসাবে সংজ্ঞায়িত হয়। আমরা একটি নির্দিষ্ট প্রসঙ্গে দুটি বস্তুকে সমান হিসাবে বিবেচনা করতে চাই কিনা তা যাচাই করার জন্য, আমাদের কিছু গুণাবলীর সাথে তুলনা করার প্রয়োজন হতে পারে যেখানে এটি স্মৃতিতে দাঁড়িয়ে রয়েছে এবং অন্যরা গভীর সাম্যতার সাথে দাঁড়িয়ে আছে, আবার কিছু বৈশিষ্ট্যগুলি সম্পূর্ণ আলাদা কিছু হতে পারে। আমরা সত্যিই যা চাই তা হ'ল একটি "সামনের ধরণের সাম্য", সত্যিই খুব সুন্দর, প্রায়শই বলা হয় সাহিত্যে শব্দার্থক সাম্য । আমাদের ডোমেনে জিনিসগুলি সমান হলে সেগুলি সমান। =)
সুতরাং আমরা আপনার প্রশ্নে ফিরে আসতে পারি:
এটিকে ডিফল্ট করার কিছু বড় সুবিধা রয়েছে যে আমি কেবল অনুপস্থিত, বা এটি কি যুক্তিসঙ্গত বলে মনে হয় যে ডিফল্ট আচরণটি যৌক্তিক সাম্য হওয়া উচিত, এবং যদি শ্রেণীর জন্য যৌক্তিক সাম্য না থাকে তবে রেফারেন্স সমতার দিকে ফিরে যেতে হবে?
আমরা যখন কোনও ভাষায় 'a == খ' লিখি তখন আমাদের অর্থ কী? আদর্শভাবে, এটি সর্বদা এক হওয়া উচিত: অর্থপূর্ণ সমতা। তবে এটা সম্ভব নয়।
মূল বিবেচনার মধ্যে একটি হ'ল, সংখ্যার মতো সাধারণ ধরণের জন্য আমরা কমপক্ষে একই মান নির্ধারণের পরে দুটি ভেরিয়েবল সমান হবে বলে আশা করি। নিচে দেখ:
var a = 1;
var b = a;
if (a == b){
...
}
a = 3;
b = 3;
if (a == b) {
...
}
এই ক্ষেত্রে, আমরা উভয় বিবৃতিতে 'সমান বি' আশা করি। অন্য যে কোনও কিছু পাগল হবে। বেশিরভাগ (সমস্ত না থাকলে) ভাষা এই সম্মেলনটি অনুসরণ করে। সুতরাং, সহজ প্রকারের (ওরফে মানগুলি) সহ আমরা কীভাবে শব্দার্থক সাম্য অর্জন করতে জানি know বস্তুগুলির সাথে, এটি সম্পূর্ণ আলাদা কিছু হতে পারে। নিচে দেখ:
var a = new Something(1);
var b = a;
if (a == b){
...
}
b = new Something(1);
a.DoSomething();
b.DoSomething();
if (a == b) {
...
}
আমরা আশা করি যে প্রথম 'যদি' সর্বদা সত্য হয় will তবে দ্বিতীয় 'যদি' তে আপনি কী আশা করবেন? এটা সত্যিই নির্ভর করে। 'ডসোমিংথিং' ক এবং বিয়ের (শব্দার্থক) সমতা পরিবর্তন করতে পারে?
শব্দার্থক সমতা নিয়ে সমস্যা হ'ল এটি বস্তুর জন্য সংকলক দ্বারা স্বয়ংক্রিয়ভাবে উত্পন্ন করা যায় না, বা এটি কার্যপরিবর্তনগুলি থেকেও সুস্পষ্ট । শব্দার্থক সাম্য সংজ্ঞা দেওয়ার জন্য ব্যবহারকারীকে অবশ্যই একটি ব্যবস্থা সরবরাহ করতে হবে। বস্তু-কেন্দ্রিক ভাষায়, সেই ব্যবস্থাটি উত্তরাধিকার সূত্রে প্রাপ্ত পদ্ধতি: সমান । ওও কোডটির একটি অংশ পড়ে, আমরা আশা করি না যে কোনও পদ্ধতিতে সমস্ত শ্রেণিতে একই রকম বাস্তবায়ন হবে। আমরা উত্তরাধিকার এবং ওভারলোডিংয়ের জন্য অভ্যস্ত।
অপারেটরগুলির সাথে, আমরা একই আচরণ আশা করি। আপনি যখন 'এ == বি' দেখেন তখন আপনার সকল পরিস্থিতিতে একই ধরণের সমতা (উপরের ৪ টি থেকে) আশা করা উচিত। সুতরাং, ধারাবাহিকতার লক্ষ্যে ভাষা ডিজাইনাররা সমস্ত ধরণের রেফারেন্স সমতা ব্যবহার করেছিলেন। এটি কোনও প্রোগ্রামার কোনও পদ্ধতিকে ওভাররাইড করেছে কিনা তার উপর নির্ভর করবে না।
PS: ভাষা ডি জাভা এবং সি # থেকে কিছুটা আলাদা: সমান অপারেটরের অর্থ সাধারণ প্রকারের জন্য অগভীর সমতা এবং ব্যবহারকারী-সংজ্ঞায়িত শ্রেণির জন্য শব্দার্থ সমতা (ব্যবহারকারীর সাথে থাকা = ক্রিয়াকলাপটি বাস্তবায়নের জন্য দায়িত্ব - কোনও ডিফল্ট সরবরাহ করা হয় না)। যেমন সরল প্রকারের জন্য অগভীর সাম্যতা সর্বদা অভিজাত সমতা, ভাষাটি সামঞ্জস্যপূর্ণ। এটির দামটি যদিও প্রদান করে তা হ'ল সমান অপারেটরটি ডিফল্টরূপে ব্যবহারকারী-সংজ্ঞায়িত প্রকারের জন্য অপরিজ্ঞাত। আপনি এটি বাস্তবায়ন করতে হবে। এবং, কখনও কখনও, এটি কেবল বিরক্তিকর।