মোড়করা যখন একই বস্তুটি আবৃত করে তখন == অপারেটর ব্যবহার করে সমান হিসাবে তুলনা করা উচিত?


19

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

আমি নিম্নলিখিত বাস্তবায়ন বিবেচনা করছি (এই উদাহরণের জন্য সরলীকৃত) যা ==অপারেটরের জন্য একটি ওভারলোড অন্তর্ভুক্ত করে ।

class XmlWrapper
{
    protected readonly XElement _element;

    public XmlWrapper(XElement element)
    {
        _element = element;
    }

    public string NameAttribute
    {
        get
        {
            //Get the value of the name attribute
        }
        set
        {
            //Set the value of the name attribute
        }
    }

    public override bool Equals(object other)
    {
        var o = other as XmlWrapper;
        if (o == null) return false;
        return _element.Equals(o._element);
    }

    public override int GetHashCode()
    {
        return _element.GetHashCode();
    }

    static public bool operator == (XmlWrapper lhs, XmlWrapper rhs)
    {
        if (ReferenceEquals(lhs, null) && ReferenceEquals(rhs, null)) return true;
        if (ReferenceEquals(lhs, null) || ReferenceEquals(rhs, null)) return false;

        return lhs._element == rhs._element;
    }

    static public bool operator != (XmlWrapper lhs, XmlWrapper rhs)
    {
        return !(lhs == rhs);
    }
}

আমি যেমন আইডোমেটিক সি # বুঝতে পারি, ==অপারেটরটি রেফারেন্স সমতার জন্য এবং Equals()পদ্ধতিটি মান সমতার জন্য। তবে এই ক্ষেত্রে, "মান" হ'ল বস্তুর মোড়কে দেওয়া কেবল একটি রেফারেন্স। সুতরাং আমি সি # এর জন্য প্রচলিত বা মূর্তিমান কি তা পরিষ্কার নয়।

উদাহরণস্বরূপ, এই কোডে ...

var underlyingElement = new XElement("Foo");
var a = new XmlWrapper(underlyingElement);
var b = new XmlWrapper(underlyingElement);

a.NameAttribute = "Hello";
b.NameAttribute = "World";

if (a == b)
{
    Console.WriteLine("The wrappers a and b are the same.");
}

.... প্রোগ্রামের আউটপুটটি "র‌্যাপার্স এ এবং বি একই রকম" হওয়া উচিত? বা এটি কি বিজোড়, অর্থাত্ কমপক্ষে বিস্ময়ের মূল লঙ্ঘন করবে ?


সমস্ত সময় আমি ওভাররড করে Equalsআমি কখনই ওভাররড করি না ==(তবে অন্যভাবে কখনও নয়) never অলস কি অহংকারী? যদি আমি কোনও স্পষ্ট কাস্ট ব্যতীত অন্যরকম আচরণ পাই যা কমপক্ষে অবাক করে তোলে vio
রাডারবারব

এর উত্তর নেমএট্রিবিউট কী করে তার উপর নির্ভর করে - অন্তর্নিহিত উপাদানটিকে সংশোধন করে? ডেটা অতিরিক্ত টুকরা হয়? যে উপর নির্ভর করে উদাহরণ কোডের অর্থ (এবং তা সমান বিবেচনা করা উচিত) পাল্টাবে, তাই আমি আপনি এটি আপনার মধ্যে পূরণ করতে মনে করি।
Errorsatz

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

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

2
"আমি যেমন আইডোমেটিক সি # বুঝতে পেরেছি, == অপারেটর রেফারেন্স সমতার জন্য এবং সমান () পদ্ধতিটি মান সমতার জন্য।" এটা যদিও? বেশিরভাগ সময় আমি == ওভারলোড দেখেছি মান সমতার জন্য। সর্বাধিক গুরুত্বপূর্ণ উদাহরণ হচ্ছে সিস্টেম.স্ট্রিং।
আর্টুরো টরেস সানচেজ

উত্তর:


17

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

ক্লায়েন্ট কোড প্রায় সবসময় যৌক্তিক সাম্য সম্পর্কে যত্নশীল (যা পূর্বনির্ধারিতভাবে, রেফারেন্স ধরণের জন্য রেফারেন্স সমতা ব্যবহার করে প্রয়োগ করা হয়)। স্তূপের দুটি উদাহরণ রয়েছে তা বাস্তবায়নের বিশদ যা ক্লায়েন্টদের যত্ন নেওয়া উচিত নয় (এবং যাঁরা Object.ReferenceEqualsসরাসরি ব্যবহার করবেন )।


9

আপনি যদি মনে করেন এটি সর্বাধিক বোধ করে

প্রশ্নোত্তর বিকাশকারী প্রত্যাশার বিষয় , এটি প্রযুক্তিগত প্রয়োজন নয়।

যদি আপনি কোনও মোড়কটিকে কোনও পরিচয় না বলে বিবেচনা করেন এবং এর বিষয়বস্তু দ্বারা এটি বিশুদ্ধরূপে সংজ্ঞায়িত করা হয় তবে আপনার প্রশ্নের উত্তর হ্যাঁ।

তবে এটি একটি পুনরাবৃত্তি সমস্যা। দুইটি মোড়কগুলি যখন আলাদা আলাদা বস্তু মোড়ক করে তবে উভয় বস্তুর সাথে একই বিষয়বস্তু সমেত থাকে তবে তাদের সাম্য প্রদর্শন করা উচিত?

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

এটি সমস্ত ভাবে কচ্ছপ


সাধারণ টিপ

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


আমি যেমন আইডোমেটিক সি # বুঝতে পারি, ==অপারেটরটি রেফারেন্স সমতার জন্য এবং Equals()পদ্ধতিটি মান সমতার জন্য।

এটি এর ডিফল্ট আচরণ, তবে এটি কোনও অস্থাবর নিয়ম নয়। এটি কনভেনশনের বিষয়, তবে যেখানে যুক্তিযুক্ত সেখানে সম্মেলনগুলি পরিবর্তন করা যেতে পারে ।

string হিসাবে এখানে একটি দুর্দান্ত উদাহরণ == একটি মান সমতা চেক (এমনকি কোনও স্ট্রিং ইন্টার্নিং নেই এমন কি!)। কেন? সোজা কথায়: কারণ স্ট্রিংগুলি মান অবজেক্টের মতো আচরণ করে বেশিরভাগ বিকাশকারীদের কাছে আরও স্বজ্ঞাত মনে হয়।

আপনার কোডারগুলি (বা আপনার বিকাশকারীদের জীবন) বোর্ডের ওপরে আপনার মোড়কের মান সমতা প্রদর্শন করার মাধ্যমে যদি উল্লেখযোগ্যভাবে সহজ করা যায় তবে এটির জন্য যান (তবে এটি নথি করুন) )।

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


আমি আগ্রহী কেন আপনি আশা করেন যে রেফারেন্স ধরণের সামগ্রী সামগ্রীর সাম্যতা সংজ্ঞায়িত করবে না। বেশিরভাগ ধরণের ক্ষেত্রে সাম্যকে সংজ্ঞায়িত করা হয় না কারণ এটি তাদের ডোমেনের জন্য প্রয়োজনীয় নয়, কারণ তারা রেফারেন্স সাম্যতা চায় না ।
ক্যাসাব্ল্যাঙ্কা

3
@ ক্যাসাব্ল্যাঙ্কা: আমি মনে করি আপনি "প্রত্যাশা" (যেমন প্রয়োজন বনাম অনুমানের) একটি আলাদা সংজ্ঞা ব্যাখ্যা করছেন। ডকুমেন্টেশন ছাড়াই, আমি প্রত্যাশা করি (অর্থাত্ অনুমান) যা ==রেফারেন্সের সমতার জন্য পরীক্ষা করে কারণ এটি ডিফল্ট আচরণ। তবে, যদি ==প্রকৃতপক্ষে মান সমতার জন্য পরীক্ষা করে থাকে তবে আমি প্রত্যাশা করি (অর্থাত্) এটি স্পষ্টভাবে নথিভুক্ত করা হয়েছে। I'm curious why you expect that reference types won't define content equality.তারা এটি ডিফল্টরূপে সংজ্ঞায়িত করে না, তবে এর অর্থ এটি করা যায় না। আমি কখনও বলিনি যে এটি করা যায় না (বা করা উচিত নয়), আমি কেবল এটি ডিফল্টরূপে প্রত্যাশা করি না (অর্থাত্ ধরে নেওয়া)।
ফ্ল্যাটার

আপনার বক্তব্যটি আমি কী বোঝাতে চাই তা স্পষ্ট করার জন্য ধন্যবাদ।
ক্যাসাব্ল্যাঙ্কা

2

আপনি মূলত স্ট্রিংগুলির সাথে তুলনা করছেন তাই আমি যদি বিস্মিত হতাম যদি একই এক্সএমএল বিষয়বস্তুযুক্ত দুটি মোড়কে সমান বিবেচনা না করা হয় তবে এটি সমান বা == ব্যবহার করে পরীক্ষা করা হোক।

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

আপনার র্যাপার পোস্টফিক্স যদিও বিভ্রান্তি যোগ করে। এটি মূলত "একটি এক্সএমএল উপাদান নয়" বলে। সুতরাং আমি কি সর্বোপরি এটিকে একটি রেফারেন্স টাইপ হিসাবে বিবেচনা করব? শব্দার্থগতভাবে এটি বোঝা যায় না। ক্লাসটির নাম যদি এক্সএমএল কনটেন্ট করা হয় তবে আমি কম বিভ্রান্ত হব। এটি ইঙ্গিত দেবে যে আমরা বিষয়বস্তুর বিষয়ে যত্ন করি, প্রযুক্তিগত প্রয়োগের বিশদ নয়।


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

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