আমি কখন সি # এর অন্তর্নিহিত ধরণের রূপান্তর অপারেটর ব্যবহার করব?


14

সি # তে, আমরা এর মতো অন্তর্নিহিত রূপান্তর অপারেটরটিকে ওভারলোড করতে পারি ( এমএসডিএন থেকে উদাহরণ ):

struct Digit
{
    /* ... */
    public static implicit operator byte(Digit d)  // implicit digit to byte conversion operator
    {
        /* ... */
    }
}

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

আমার কোডটি বিভ্রান্তিতে পড়তে এমন কাউকে ছেড়ে যেতে আমি পছন্দ করি না। আমি মনে করি না অনেক লোক তা করে।

প্রশ্নটি হল, অন্তর্নিহিত ধরণের রূপান্তরকরণ অপারেটরের ব্যবহারগুলি কী কী যা আমার কোডটি বোঝার পক্ষে আরও বেশি জটিল করে দেয় না?


1
কি দারুন. আমি আসলে এই অস্তিত্ব জানি না। এটি ব্যবহার করার জন্য অগত্যা একটি ভাল জিনিস নয় যে; আমি জানি লোকেরা C ++ এ এই জাতীয় কার্যকারিতা-লুকিয়ে রেখে সত্যিই বিরক্ত হয়েছিল।
কাতানা 314

@ কটানা ৩১৪: লোকেরা এতে বিরক্ত হয়ে ওঠেনি, তবে অবাক করা আচরণের সাথে কেউ ওভারলোড (এটি অপারেটর, রূপান্তর-ফাংশন, কনস্ট্রাক্টর, ফ্রি ফাংশন বা সদস্য-ফাংশন) যুক্ত করার বিষয়ে অগ্রাধিকারত অবাক করে দিয়েছিলেন।
Deduplicator

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

উত্তর:


18

আমি কেবলমাত্র সেই ধরণের মধ্যে অন্তর্নিহিত রূপান্তরগুলির সুপারিশ করব যা প্রায় একই উপায়ে বিভিন্ন উপায়ে উপস্থাপন করে। এই ক্ষেত্রে:

  • বিভিন্ন রঙ ধরনের পছন্দ RGB, HSL, HSVএবংCMYK
  • একই শারীরিক পরিমাণের জন্য বিভিন্ন ইউনিট ( Meterবনাম)Inch )।
  • বিভিন্ন সমন্বয় ব্যবস্থা (মেরু বনাম কার্টেসিয়ান)।

যাইহোক, কিছু শক্তিশালী নির্দেশিকা রয়েছে যা ইঙ্গিত করে যে কোনও অন্তর্নিহিত রূপান্তর সংজ্ঞায়িত করা যখন উপযুক্ত না হয়:

  • যদি রূপান্তরটি নির্ভুলতা বা পরিসীমাটির উল্লেখযোগ্য ক্ষতির কারণ হয়ে থাকে, তবে তা অন্তর্ভুক্ত হওয়া উচিত নয় (যেমন: ফ্লোট 64 থেকে ফ্লোট 32 থেকে দীর্ঘ পর্যন্ত অবধি)।
  • যদি রূপান্তরটি একটি নিক্ষেপ করতে পারে (InvalidCast ) ব্যতিক্রম পারে তবে তা অন্তর্ভুক্ত হওয়া উচিত নয়।
  • যদি রূপান্তরটি প্রতিবার সঞ্চালিত হয় তখন গাদা বরাদ্দ সৃষ্টি করে, তবে তা অন্তর্নিহিত হওয়া উচিত নয়।
  • যদি রূপান্তরটি কোনও O(1)অপারেশন না হয় তবে তা অন্তর্ভুক্ত হওয়া উচিত নয়।
  • যদি উত্স প্রকার বা লক্ষ্য প্রকারটি পরিবর্তনীয় হয় তবে রূপান্তর অন্তর্ভুক্ত হওয়া উচিত নয়।
  • যদি রূপান্তরটি কোনও প্রকারের প্রসঙ্গে (ডাটাবেস, সংস্কৃতি সেটিংস, কনফিগারেশন, ফাইল সিস্টেম ইত্যাদি) উপর নির্ভরশীল হয় তবে এটি অন্তর্ভুক্ত হওয়া উচিত নয় (আমি এই ক্ষেত্রে একটি স্পষ্ট রূপান্তর অপারেটরকে নিরুৎসাহিত করব)।

এখন বলুন যে আপনার রূপান্তর অপারেটর f: T1 -> T2উপরের কোনও বিধি লঙ্ঘন করে না, তবে নিম্নলিখিত আচরণটি দৃ strongly়ভাবে নির্দেশ করে যে রূপান্তর অন্তর্ভুক্ত হতে পারে:

  • তাহলে a == bতারপর f(a) == f(b)
  • তাহলে a != bতারপর f(a) != f(b)
  • তাহলে a.ToString() == b.ToString()তারপর f(a).ToString() == f(b).ToString()
  • ইত্যাদি অন্যান্য ক্রিয়াকলাপের জন্য T1এবং উভয়ই সংজ্ঞায়িত T2

আপনার সমস্ত উদাহরণ সম্ভবত ক্ষতিগ্রস্থ। সেগুলি যাইহোক পর্যাপ্ত পরিমাণে হোক, ...
প্রতিলিপি

হ্যাঁ আমি বুঝতে পেরেছি :-)। আমি "ক্ষতিগ্রস্থ" এর জন্য আরও ভাল শব্দটির কথা ভাবতে পারি না। আমি "ক্ষতিকারক" বলতে যা বোঝায় তা হ'ল রূপান্তরগুলি যেখানে পরিসীমা বা নির্ভুলতা যথেষ্ট পরিমাণে হ্রাস পেয়েছে। উদাহরণস্বরূপ ফ্লোট 64 থেকে ফ্লোট 32 বা দীর্ঘ থেকে ইনট পর্যন্ত from
এলিয়ান এবিং 20'15

আমি মনে করি a! = B => f (a)! = F (b), সম্ভবত প্রয়োগ করা উচিত নয়। প্রচুর ফাংশন রয়েছে যা বিভিন্ন ইনপুট, মেঝে () এবং সিল () উদাহরণস্বরূপ গণিতের দিকের জন্য একই মানটি ফিরিয়ে দিতে পারে
সিডকেমুস

@ সিডিকেমূস আপনি অবশ্যই ঠিক বলেছেন, আর এ কারণেই আমি এই বৈশিষ্ট্যগুলিকে নিয়ম না করে "বোনাস পয়েন্ট" হিসাবে বেশি দেখি। দ্বিতীয় সম্পত্তিটির সহজ অর্থ হ'ল রূপান্তর ফাংশনটি ইনজেকশনযুক্ত। এটি প্রায়শই ঘটে যখন আপনি এমন ধরণের রূপান্তর করেন যা কঠোরভাবে বৃহত্তর পরিসীমাযুক্ত থাকে, যেমন int32 থেকে int64 এ।
এলিয়ান এবিং 20'15

@ সিডিকেমূস অন্যদিকে, প্রথম সম্পত্তিটি ঠিক বলেছে যে একই সমতুল্য শ্রেণীর মধ্যে দুটি মান T1( ==সম্পর্কের দ্বারা বোঝানো T1) সর্বদা একই সমতুল্য শ্রেণীর মধ্যে দুটি মানকে মানচিত্র করে T2। এখন যেহেতু আমি এটি সম্পর্কে চিন্তা করি, আমি অনুমান করি যে প্রথম সম্পত্তিটি প্রকৃতপক্ষে রূপান্তরিত করার জন্য প্রয়োজন।
এলিয়ান এবিং 20'15

6

প্রশ্নটি হল, অন্তর্নিহিত ধরণের রূপান্তরকরণ অপারেটরের ব্যবহারগুলি কী কী যা আমার কোডটি বোঝার পক্ষে আরও বেশি জটিল করে দেয় না?

যখন ধরনের নয় (প্রোগ্রামারদের জন্য) সম্পর্কহীন। (দুষ্প্রাপ্য) পরিস্থিতি রয়েছে যেখানে আপনার দুটি প্রাসঙ্গিক প্রকার রয়েছে (কোড সম্পর্কিত যতদূর), যা আসলে সম্পর্কিত (ডোমেন বা যুক্তিসঙ্গত প্রোগ্রামার হিসাবে) সম্পর্কিত।

উদাহরণস্বরূপ, স্ট্রিং ম্যাচিংয়ের জন্য কিছু কোড। একটি সাধারণ দৃশ্য হ'ল একটি স্ট্রিং আক্ষরিক সাথে মেলে। কল করার পরিবর্তে IsMatch(input, new Literal("some string")), একটি অন্তর্নিহিত রূপান্তর আপনাকে সেই অনুষ্ঠানটি থেকে মুক্তি দিতে দেয় - কোডের আওয়াজ - এবং স্ট্রিংকে আক্ষরিক দিকে ফোকাস দেয়।

বেশিরভাগ যে কোনও প্রোগ্রামার দেখতে পাচ্ছে IsMatch(input, "some string")এবং কী চলছে তা দ্রুত আবিষ্কার করবে । এটি কল সাইটে আপনার কোড পরিষ্কার করে। সংক্ষেপে বলতে গেলে, এটা একটি বিট বুঝতে সহজ করে তোলে কি , চলছে সামান্য খরচে কিভাবে যে যাচ্ছে।

এখন, আপনি তর্ক করতে পারেন যে একই জিনিসটি করার জন্য একটি সাধারণ ফাংশন ওভারলোড আরও ভাল। এবং এটা করা হয়. তবে যদি এই ধরণের জিনিসটি সর্বব্যাপী হয়, তবে ফাংশন ওভারলোডের গাদা করার চেয়ে এক ধরণের রূপান্তর হ'ল ক্লিনার (কম কোড, বর্ধিত ধারাবাহিকতা) is

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


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