সমস্ত নকশা প্রক্রিয়া পারস্পরিক বেমানান লক্ষ্যগুলির মধ্যে সমঝোতার ফলে। দুর্ভাগ্যক্রমে, &&
সি ++ এ ওভারলোডেড অপারেটরের জন্য নকশা প্রক্রিয়াটি একটি বিভ্রান্তিমূলক পরিণতি তৈরি করেছে: আপনি যে বৈশিষ্ট্যটি চান তা &&
- এর সংক্ষিপ্ত-সার্কিট আচরণ - বাদ দেওয়া হয়েছে।
এই দুর্ভাগ্যজনক জায়গায় সেই নকশা প্রক্রিয়াটি কীভাবে শেষ হয়েছিল তার বিশদ, আমি যাদের জানি না। পরবর্তী ডিজাইন প্রক্রিয়া কীভাবে এই অপ্রীতিকর ফলাফলটিকে বিবেচনায় নিয়েছিল তা দেখার জন্য এটি প্রাসঙ্গিক। C #, ওভারলোড &&
অপারেটর হয় সংক্ষিপ্ত circuiting। সি # এর ডিজাইনাররা কীভাবে এটি অর্জন করলেন?
অন্য উত্তরগুলির মধ্যে একটিতে "ল্যাম্বদা উত্তোলন" পরামর্শ দেয়। এটাই:
A && B
নৈতিকভাবে এর সমতুল্য কিছু হিসাবে উপলব্ধি করা যেতে পারে:
operator_&& ( A, ()=> B )
যেখানে দ্বিতীয় যুক্তি অলস মূল্যায়নের জন্য কিছু ব্যবস্থা ব্যবহার করে যাতে মূল্যায়ন করা হলে, অভিব্যক্তির পার্শ্ব প্রতিক্রিয়া এবং মান উত্পন্ন হয়। অতিরিক্ত লোড অপারেটরের বাস্তবায়ন যখন প্রয়োজন হবে তখনই অলস মূল্যায়ন করবে।
সি # ডিজাইন টিম এটি করেছিল না। (একপাশে: যদিও ল্যামডা উত্তোলন হয় যখন এটা করতে সময় এসে আমি কি অভিব্যক্তি গাছ উপস্থাপনা এর ??
।। অপারেটর, যা নির্দিষ্ট রূপান্তর অপারেশন প্রয়োজন বলে বর্ণনা করে বিস্তারিতভাবে তবে একটি প্রধান অবান্তরতা হবে প্রখর রৌদ্রে সঞ্চালিত হবে যথেষ্ট: ল্যামডা উত্তোলন কাজ করে তবে পর্যাপ্ত পরিমাণে ভারী ওজন যা আমরা এড়াতে চাইতাম))
বরং, সি # সমাধানটি সমস্যার দুটি পৃথক সমস্যার মধ্যে ভেঙে দেয়:
- আমাদের কি ডান হাতের ক্রম মূল্যায়ন করা উচিত?
- যদি উপরের উত্তরটি "হ্যাঁ" হয়, তবে আমরা কীভাবে দুটি অপারেশন একত্রিত করব?
সুতরাং &&
সরাসরি ওভারলোডকে অবৈধ করে সমস্যার সমাধান করা হয়েছে। বরং, সি # তে আপনাকে অবশ্যই দুটি অপারেটরকে ওভারলোড করতে হবে , যার প্রতিটিই এই দুটি প্রশ্নের একটির উত্তর দেয়।
class C
{
// Is this thing "false-ish"? If yes, we can skip computing the right
// hand size of an &&
public static bool operator false (C c) { whatever }
// If we didn't skip the RHS, how do we combine them?
public static C operator & (C left, C right) { whatever }
...
(একদিকে: প্রকৃতপক্ষে, তিন। সি # এর প্রয়োজনে যদি অপারেটর false
সরবরাহ করা হয় তবে অপারেটরটিও সরবরাহ true
করতে হবে, যা প্রশ্নের উত্তর দেয়: এই জিনিসটি কি "সত্য-ইশ?" উভয় প্রয়োজন।)
ফর্মের একটি বিবৃতি বিবেচনা করুন:
C cresult = cleft && cright;
সংকলক এর জন্য কোড তৈরি করে আপনি ভেবেছিলেন যে আপনি এই সিডো-সি লিখেছেন: #
C cresult;
C tempLeft = cleft;
cresult = C.false(tempLeft) ? tempLeft : C.&(tempLeft, cright);
আপনি দেখতে পাচ্ছেন, বাম দিকটি সর্বদা মূল্যায়ন করা হয়। যদি এটি "মিথ্যা-ইশ" হতে দৃ determined়প্রতিজ্ঞ হয় তবে ফলাফল এটি। অন্যথায়, ডান হাতটি মূল্যায়ন করা হয়, এবং উত্সাহী ব্যবহারকারী-সংজ্ঞায়িত অপারেটরকে অনুরোধ &
করা হয়।
||
অপারেটর অপারেটর একজন আবাহন সত্য এবং উৎসুক হিসাবে, অনুরূপ ভাবে সংজ্ঞায়িত করা হয় |
অপারেটর:
cresult = C.true(tempLeft) ? tempLeft : C.|(tempLeft , cright);
চারটি অপারেটর সংজ্ঞা দ্বারা - true
, false
, &
এবং |
- C # এর আপনি না শুধুমাত্র বলতে পারবেন cleft && cright
কিন্তু অ শর্ট-সার্কিট cleft & cright
, এবং এছাড়াও if (cleft) if (cright) ...
, এবং c ? consequence : alternative
এবং while(c)
, ইত্যাদি।
এখন, আমি বলেছি যে সমস্ত নকশা প্রক্রিয়া সমঝোতার ফলাফল। এখানে সি # ভাষা ডিজাইনাররা সংক্ষিপ্ত-সংক্রমণ &&
এবং ||
ডান পেতে সক্ষম হয়েছে , তবে এটি করার জন্য দু'টির পরিবর্তে চারটি অপারেটরকে ওভারলোড করা দরকার যা কিছু লোক বিভ্রান্তিকর বলে মনে হয়। অপারেটর ট্রু / ভুয়া বৈশিষ্ট্যটি সি # এর মধ্যে স্বল্পতম বোঝা বৈশিষ্ট্যগুলির মধ্যে একটি। সি ++ ব্যবহারকারীদের কাছে পরিচিত একটি বুদ্ধিমান এবং সহজবোধ্য ভাষা থাকার লক্ষ্যটি সংক্ষিপ্ত সার্কিট করার ইচ্ছা এবং ল্যাম্বডা উত্তোলন বা অলস মূল্যায়নের অন্যান্য ধরণের প্রয়োগ না করার আকাঙ্ক্ষার দ্বারা বিরোধিত হয়েছিল। আমি মনে করি যে একটি যুক্তিসঙ্গত আপস অবস্থান ছিল, কিন্তু এটা উপলব্ধি করা যে গুরুত্বপূর্ণ হল সমঝোতার অবস্থান। শুধু একটি বিভিন্ন সি ++ এর ডিজাইনারদের চেয়ে সমঝোতার অবস্থান।
যদি এই জাতীয় অপারেটরগুলির জন্য ভাষা নকশার বিষয় আপনার আগ্রহী হয়, তবে সি # কেন অপারেটর বুলিয়ানগুলিতে এই অপারেটরগুলি সংজ্ঞায়িত করে না তা নিয়ে আমার সিরিজটি পড়ার বিষয়টি বিবেচনা করুন:
http://ericlippert.com/2012/03/26/null-is-not-false-part-one/
operator&&(const Foo& lhs, const Foo& rhs) : (lhs.bars == 0)