স্কালার অপারেটরটি কী "ওপরে লোড" ভাল করে তোলে, তবে সি ++ এর "খারাপ"?


155

সি ++ এ অপারেটর ওভারলোডিংকে অনেকে A Bad Thing (tm) বলে মনে করেন, এবং নতুন ভাষায় পুনরাবৃত্তি না করা একটি ভুল। অবশ্যই জাভা ডিজাইনের সময় এটির একটি বৈশিষ্ট্য বিশেষত বাদ পড়েছিল।

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

সুতরাং আমার প্রশ্নটি স্ক্যালায় "+" সংজ্ঞায়নের ধারণাটি সি ++ এর চেয়ে আরও ভাল ধারণা করে তোলে?


27
সি ++ নয় স্কাল উভয়ই প্রোগ্রামারদের মধ্যে সর্বজনীন sensকমত্য দ্বারা সংজ্ঞায়িত হয়নি। আমি মনে করি না যে কিছু লোক সি ++ সম্বন্ধে ধারণা দেয় এবং কিছু লোক স্কালাকে নিয়ে জোর করে না তার মধ্যে কোনও বিরোধ নেই।
স্টিভ জেসোপ

16
সি ++ এ অপারেটর ওভারলোডিং সম্পর্কে খারাপ কিছু নেই।
কুকুরছানা

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

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

উত্তর:


242

সি ++ সি থেকে সত্যিকারের নীল অপারেটরদের উত্তরাধিকার সূত্রে আমার অর্থ এই যে 6 + 4-এ "+" খুব বিশেষ। উদাহরণস্বরূপ, আপনি এটি + ফাংশনে একটি পয়েন্টার পেতে পারেন না।

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

আপনি যেটিকে কল করতে চান না কেন, অপারেটর ওভারলোডিং সহজাতভাবে খারাপ নয়, এমনকি সি ++ তেও নয়। সমস্যাটি যখন খারাপ প্রোগ্রামাররা এটি ব্যবহার করে। তবে প্রকৃতপক্ষে আমি এই মতামত নিয়েছি যে অপারেটর ওভারলোডিং অপব্যবহারের জন্য প্রোগ্রামারদের ক্ষমতা হরণ করা প্রোগ্রামাররা যে সমস্ত জিনিস অপব্যবহার করতে পারে সেগুলি ঠিক করার বালতিতে একটি ড্রপ রাখে না। আসল উত্তর হ'ল মেন্টরিং। http://james-iry.blogspot.com/2009/03/operator-overloading-ad-absurdum.html

কোনটিই নয়, সি ++ এর অপারেটর ওভারলোডিং এবং স্কালার নমনীয় পদ্ধতির নামকরণের মধ্যে পার্থক্য রয়েছে যা আইএমএইচও, স্কালাকে কম আপত্তিজনক এবং আরও আপত্তিজনক করে তোলে।

সি ++ তে ইন-ফিক্স স্বরলিপি পাওয়ার একমাত্র উপায় হ'ল অপারেটরগুলি। অন্যথায় আপনাকে অবজেক্ট.মেসেজ (আর্গুমেন্ট) বা পয়েন্টার-> মেসেজ (আর্গুমেন্ট) বা ফাংশন (আর্গুমেন্ট 1, আর্গুমেন্ট 2) ব্যবহার করতে হবে। সুতরাং আপনি যদি আপনার কোডটিতে একটি নির্দিষ্ট ডিএসলিশ শৈলী চান তবে অপারেটরগুলি ব্যবহার করার চাপ রয়েছে।

স্কেলে আপনি কোনও বার্তা প্রেরণের সাথে ইনফিক্স নোটেশন পেতে পারেন। "অবজেক্ট মেসেজ আর্গুমেন্ট" পুরোপুরি ঠিক আছে, যার অর্থ আপনাকে কেবল ইনফিক্স নোটেশন পেতে অ-শব্দের চিহ্ন ব্যবহার করার দরকার নেই।

সি ++ অপারেটর ওভারলোডিং মূলত সি অপারেটরগুলির মধ্যে সীমাবদ্ধ। এই সীমাবদ্ধতার সাথে একত্রিত হয়ে যে কেবল অপারেটরগুলি ইনফিক্স ব্যবহার করা যেতে পারে যা "+" এবং ">>" এর মতো তুলনামূলকভাবে কয়েকটি চিহ্নের উপর বিস্তৃত সম্পর্কহীন ধারণাগুলির মানচিত্র তৈরি করার জন্য লোকদের উপর চাপ সৃষ্টি করে people

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

female('jane)!         // jane is female
parent('jane,'john)!   // jane is john's parent
parent('jane, 'wendy)! // jane is wendy's parent

mother('Mother, 'Child) :- parent('Mother, 'Child) & female('Mother) //'// a mother of a child is the child's parent and is female

mother('X, 'john)?  // find john's mother
mother('jane, 'X)?  // find's all of jane's children

: -,!,?, এবং & চিহ্নগুলি সাধারণ পদ্ধতি হিসাবে সংজ্ঞায়িত করা হয়। কেবলমাত্র সি ++ তে এবং বৈধ হবে তাই এই ডিএসএলকে সি ++ এ ম্যাপ করার চেষ্টা করার জন্য এমন কিছু চিহ্নের প্রয়োজন হবে যা ইতিমধ্যে খুব আলাদা ধারণা ধারণ করে।

অবশ্যই, এটি অন্য ধরণের অপব্যবহারের জন্য স্কালাকেও উন্মুক্ত করে। স্কালায় আপনি একটি পদ্ধতির নাম রাখতে পারেন you! & ^% যদি আপনি চান

অন্যান্য ভাষার জন্য, স্কালার মতো, শব্দহীন ফাংশন ব্যবহারের ক্ষেত্রে নমনীয় এবং পদ্ধতির নামগুলি স্মার্টটাক দেখতে পায় যেখানে স্কালার মতো প্রতিটি "অপারেটর" হ'ল অন্য একটি পদ্ধতি এবং হাস্কেল যা প্রোগ্রামারকে নমনীয়ভাবে নামকরণের অগ্রাধিকার এবং স্থিরতা নির্ধারণ করতে দেয় ফাংশন।


সর্বশেষে আমি চেক করেছি, ৩.৪৪ জন + (৫) কাজ করেছেন আমি সত্যিই অবাক হয়েছি যে & (3.operator +) তা করে না।
জোশুয়া

আপনি উদাহরণস্বরূপ সি (+) (মহিলা ("জেন")) করতে পারেন। এটি মোটেও বিভ্রান্তিকর হবে না - জেমস-আইরি পোস্টে ফিরে যেতে হবে, এটি অপারেটর না হওয়া সম্পর্কে একটি খারাপ বিষয়, তবে বোকা প্রোগ্রামাররা।
pm100

1
@ জোশুয়ার int main() {return (3).operator+(5);}ফলাফলerror: request for member ‘operator+’ in ‘3’, which is of non-class type ‘int’
zildjohn01

এটি অহঙ্কারী বাজে কথা: "অপারেটর ওভারলোডিং অন্তর্নিহিতভাবে খারাপ হয় না, এমনকি সি ++ তেও। সমস্যা যখন খারাপ প্রোগ্রামাররা এটিকে অপব্যবহার করে।" যদি কোনও কিছু এটির ব্যবহার থেকে মোটামুটি সামান্য উপকারের সাথে সহজেই আপত্তিজনক হয় তবে সামগ্রিক ফলাফলটি হ'ল আপনার কোডটি বজায় রাখার পরবর্তী লোকটি আপনার কোডের অযৌক্তিক অংশগুলি বোঝার ক্ষেত্রে উত্পাদনশীলতা হারাবে। অন্যথায়: খুব তথ্যপূর্ণ এবং ভাল লিখিত উত্তর।
জুক্কা দহলবম

@ জুলকাডাহলবম স্মার্ট পয়েন্টারগুলির অস্তিত্ব নিজেরাই সুবিধাকে আরও বিশাল করে তুলেছে। এবং তারপরে আপনার ল্যাম্বডাস, ব্যবহারকারীর সংজ্ঞায়িত নম্বর প্রকারের, অন্তরালের ধরণের রয়েছে ...
আলেক্সি রোমানভ

66

সি ++ এ অপারেটর ওভারলোডিংকে অনেকে একটি খারাপ জিনিস (টিএম) বলে মনে করেন

কেবল অজ্ঞদের দ্বারা। এটি সি ++ এর মতো ভাষায় একেবারেই প্রয়োজন এবং এটি লক্ষণীয় যে অন্যান্য ভাষাও "পিউরিস্ট" দৃষ্টিভঙ্গি শুরু করেছিল, তাদের ডিজাইনাররা এটি প্রয়োজনীয়ভাবে জানতে পেরে এটি যুক্ত করে দিয়েছিলেন।


30
আমি আসলে নীলের সাথে একমত অপারেটর ওভারলোডিং অপরিহার্য যদি আপনি ভেরিয়েবল / কনস্ট্যান্ট / অবজেক্ট / দৃষ্টান্তগুলি বীজগণিত সত্তা হিসাবে উপস্থাপন করতে চান ... এবং লোকেরা তাদের গাণিতিক ফ্যাশনে তাদের ইন্টারঅ্যাকশন বুঝতে পারেন - যা আইএমএইচও প্রোগ্রামিং কীভাবে কাজ করে তা হওয়া উচিত।
ম্যাসা

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

7
@ ক্রিস্টো কারণ সি ++ এমন মানগুলি ব্যবহার করে যা অবশ্যই নির্ধারিত এবং অনুলিপি করা উচিত। এটির উপর নিয়ন্ত্রণ রাখা প্রয়োজন, সুতরাং আপনাকে অবশ্যই একটি ন্যূনতম সময়ে একটি নির্দিষ্ট ধরণের জন্য অ্যাসাইনমেন্ট অপারেটরটি নির্দিষ্ট করতে সক্ষম হতে হবে।

7
@ ক্রিস্টো: কারণ সি ++ এর একটি উদ্দেশ্য হ'ল ব্যবহারকারী-সংজ্ঞায়িত প্রকারগুলি বিল্টিন টাইপের যা কিছু করে তা করার অনুমতি দেয় (তবে তারা কিছু বিষয় যেমন প্রকৃত রূপান্তরগুলির সাথে আলাদাভাবে আচরণ করা হয়)। আপনি যদি 27-বিট পূর্ণসংখ্যার বাস্তবায়ন করতে চান, তবে আপনি এটি করতে পারেন এবং এটি ব্যবহার করা ঠিক ইনট ব্যবহারের মতো হবে। অপারেটর ওভারলোডিং ব্যতীত বিল্টিন টাইপের মতো একই সিনট্যাক্স সহ ইউডিটি ব্যবহার করা সম্ভব হবে না এবং ফলস্বরূপ ভাষাটি এই অর্থে "সি ++" এর মতো হবে না।
স্টিভ জেসোপ

8
"এইভাবে পাগলামি মিথ্যা" - আরও খারাপ, সেই পথটি std :: ভেক্টর <বিউল>!
স্টিভ জেসোপ

42

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

স্কালায় অপারেটর ওভারলোডিংয়ের সুবিধা এবং অসুবিধাগুলি সি ++ এর মতোই - আপনি যদি অপারেটরকে ওভারলোডিং যথাযথভাবে ব্যবহার করেন তবে আপনি আরও প্রাকৃতিক কোড লিখতে পারেন - এবং যদি না করেন তবে আরও ক্রিপ্টিক, অবলম্বন কোড।

এফওয়াইআই: অপারেটরগুলিকে সি ++ তে বিশেষ ফাংশন হিসাবে সংজ্ঞায়িত করা হয় না, তারা অন্য যে কোনও ফাংশনের মতোই আচরণ করে - যদিও নাম অনুসন্ধানে কিছুটা পার্থক্য রয়েছে, তাদের সদস্য ফাংশন হওয়া দরকার কিনা এবং এই সত্য যে তাদের দুটি উপায়ে ডাকা যেতে পারে: 1 ) অপারেটর সিনট্যাক্স এবং 2) অপারেটর-ফাংশন-আইডি সিনট্যাক্স।


"যে কোনও উপায়ে আরও ভার্বোজ ফাংশন কল দিয়ে সিমুলেট করা যেতে পারে, সেহেতু একটি ভাষায় অপারেটর ওভারলোডিংয়ের সত্যিই প্রয়োজন হয় না।" এমনকি এই যুক্তির অধীনে একজনকে প্রকৃতপক্ষে অপারেটরগুলির দরকার নেই । শুধু ব্যবহার add(2, multiply(5, 3))করবেন না কেন ?
জো জেড।

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

19

এই নিবন্ধ - " ইতিবাচক উত্তরাধিকার সি ++ এবং জাভা " - আপনার প্রশ্নের সরাসরি উত্তর দেয়।

"সি ++ এর স্ট্যাক বরাদ্দ এবং হিপ বরাদ্দ উভয়ই রয়েছে এবং সমস্ত পরিস্থিতি পরিচালনা করতে এবং মেমরি ফাঁস না ঘটানোর জন্য আপনার অপারেটরদের ওভারলোড করতে হবে indeed সত্যই জটিল Java ..

জাভা ভুল করে (লেখকের মতে) অপারেটর ওভারলোডিং বাদ দিয়েছে কারণ এটি সি ++ তে জটিল ছিল, তবে কেন ভুলে গেছেন (বা বুঝতে পারেন নি যে এটি জাভাতে প্রযোজ্য নয়)।

ধন্যবাদ, স্কালার মতো উচ্চ স্তরের ভাষাগুলি বিকাশকারীদের বিকল্প দেয়, যখন এখনও একই জেভিএম চলছে।


14
এক্কেল একমাত্র উত্স যা আমি এই ধারণার জন্য দেখেছি যে সি +++ এর জটিলতার কারণে অপারেটর ওভারলোডিং জাভা থেকে আলাদা করা হয়েছিল এবং তিনি তার উত্স কী তা বলেন না। আমি এটি ছাড় হবে। অন্যান্য সমস্ত উত্স আমি বলেছি এটি সম্ভাব্য অপব্যবহারের কারণে খনন করা হয়েছিল। দেখুন gotw.ca/publications/c_family_interview.htm এবং newt.com/wohler/articles/james-gosling-ramblings-1.html । "অপারেটর ওভারলোডিং" এর জন্য কেবল পৃষ্ঠা তাদের অনুসন্ধান করুন।
জেমস আইরি

9

অপারেটর ওভারলোডিংয়ে কোনও সমস্যা নেই। আসলে, সংখ্যার ধরণের জন্য অপারেটর ওভারলোডিং না করায় কিছু সমস্যা আছে । (কিছু জাভা কোড দেখুন যা বিগইন্টিজার এবং বিগডিসিমাল ব্যবহার করে))

যদিও সি ++ এর বৈশিষ্ট্যটি আপত্তিজনকভাবে চালানোর একটি traditionতিহ্য রয়েছে। একটি প্রায়শই উদ্ধৃত উদাহরণ হ'ল বিটশিফ্ট অপারেটরগুলি I / O করতে ওভারলোড হয়।


<< এবং >> অপারেটরগুলি চাক্ষুষভাবে স্থানান্তরের পথ নির্দেশ করে, তারা I / O করাকে বোঝায় , এটি অপব্যবহার নয়, এটি স্ট্যান্ডার্ড লাইব্রেরি এবং ব্যবহারিক জিনিস থেকে। শুধু "সিন >> কিছু" দেখুন, কোথায় যায়? সিন থেকে, কিছুতে, স্পষ্টতই।
চিনাবাদাম

7
@ পেণুট: তবে তাদের আসল ব্যবহারটি ছিল বিট-শিফটিং। "স্ট্যান্ডার্ড লাইব্রেরি" অপারেটরটিকে এমনভাবে ব্যবহার করে যা সম্পূর্ণ সংজ্ঞাটি দিয়ে যায় with
জো জেড।

1
আমি নিশ্চিত যে আমি কোথাও পড়েছি যে সিজনিয়াল স্ট্রস্ট্রাপ (সি ++ এর স্রষ্টা) সি ++ এর =পরিবর্তে <<এবং >>প্রথম দিনগুলিতে ব্যবহারের জন্য পরীক্ষা-নিরীক্ষা করেছিলেন তবে সঠিক অপারেটরের নজির না থাকায় সমস্যার মধ্যে পড়েছেন ( যেমন এটি কি সন্ধান করে? প্রথমে বাম বা ডানদিকে যুক্তি)। তাই তিনি কী ব্যবহার করতে পারবেন সে সম্পর্কে তাঁর হাত কিছুটা বাঁধা ছিল।
ফিল রাইট

8

সাধারণভাবে এটি কোনও খারাপ জিনিস নয়।
সি # এর মতো নতুন ভাষায় অপারেটর ওভারলোডিংও রয়েছে।

এটি অপারেটর ওভারলোডিং এর অপব্যবহার যা খারাপ জিনিস।

তবে সি ++ এ সংজ্ঞায়িত হিসাবে অপারেটর ওভারলোডিং নিয়েও সমস্যা রয়েছে। কারণ ওভারলোডেড অপারেটররা পদ্ধতি কলগুলির জন্য কেবল সিনট্যাকটিক চিনি এবং তারা যেমন পদ্ধতির মতো আচরণ করে। অন্যদিকে সাধারণ অন্তর্নির্মিত অপারেটররা পদ্ধতির মতো আচরণ করে না। এই অসঙ্গতি সমস্যার কারণ হতে পারে।

আমার হেড অপারেটরদের শীর্ষ বন্ধ ||এবং &&
এর সংস্করণগুলিতে নির্মিত হ'ল শর্ট-কাট অপারেটর। এটি অতিরিক্ত লোড সংস্করণগুলির জন্য সত্য নয় এবং কিছু সমস্যা তৈরি করেছে।

এই সত্য যে + - * / সমস্ত তারা চালিত একই ধরণের (অপারেটর প্রচারের পরে)
ওভারলোডেড সংস্করণগুলি যে কোনও কিছু ফিরিয়ে দিতে পারে (এটিই অপব্যবহার সেট করে, যদি আপনার অপারেটররা কিছু সালিসি টাইপ করতে শুরু করে তবে ব্যবহারকারী প্রত্যাশা করে না জিনিস পাহাড়ের নিচে যেতে হবে)।


8

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

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


6

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

একই সাথে, এই আলোচনাটি প্রচুর মৌলিক গবেষণাকে অনুপ্রাণিত করেছিল, সম্ভবত স্কালাসহ - এটি সেই সমস্ত গবেষণাপত্রগুলির মধ্যে একটি যা প্রত্যেকেই ক্ষেত্রের কাজ করার জন্য পড়া উচিত।

মূল বিষয়বস্তুতে, তার উদাহরণগুলি বেশিরভাগ সংখ্যাসমূহের ক্লাস সম্পর্কে (যেমন বিগইন্টিজার এবং কয়েকটি ওয়েডার স্টাফ), তবে এটি অপরিহার্য নয়।

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


4

আমি বিশ্বাস করি যে প্রতিটি উত্তর এটি মিস করেছে। সি ++ এ আপনি অপারেটরগুলিকে আপনার পছন্দ অনুযায়ী সমস্ত ওভারলোড করতে পারেন, তবে তারা যে নজিরটি মূল্যায়ন করেছেন তার সাথে আপনি প্রভাব ফেলতে পারবেন না। আইআইআরসি, স্কালায় এই সমস্যা নেই।

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


1
স্কালায় অপারেটরের অগ্রাধিকারও ঠিক আছে, তাই না?
স্কাফম্যান

আমি বিশ্বাস করি সেখানে আছে, তবে এটি অনেক চাটুকার। আরও উল্লেখযোগ্য বিষয় হল, স্কালার অপারেটরের সময়কাল কম। +, -, * হল পদ্ধতিগুলি, অপারেটর নয়, আইআইআরসি। যে কারণে 2 + 3 * 2, এটি 8 নয়, এটি 10
সায়েম

7
চিহ্নটির প্রথম অক্ষরের উপর ভিত্তি করে স্কালায় একটি প্রাধান্য সিস্টেম রয়েছে। স্কেল> 2 + 3 * 2 রেস0: ইনট = 8
জেমস আইরি

3

অপারেটর ওভারলোডিং কোনও সি ++ আবিষ্কার ছিল না - এটি আলগোল আইআইআরসি থেকে এসেছে এবং এমনকি গোসলিং দাবি করেন না যে এটি সাধারণভাবে একটি খারাপ ধারণা।


অবশ্যই, তবে এটি এর সি ++ অবতারে এটি অসম্পূর্ণতার সাধারণ বায়ু অর্জন করেছিল।
স্কাফম্যান

5
"অসম্পূর্ণতার সাধারণ বায়ু" বলতে কী বোঝ? আমি জানি বেশিরভাগ লোকেরা এমন ভাষা ব্যবহার করেন যা অপারেটর ওভারলোডিংকে সমর্থন করে (সি ++, সি #) এবং আমি কোনও অভিযোগ কখনও শুনিনি।
নেমানজা ত্রিফুনোভিচ

আমি প্রাক-এএনএসআই সি ++ এর সাথে আমার দীর্ঘ অতীতের অভিজ্ঞতা থেকে বলছি এবং আমি অবশ্যই এগুলির একটি সাধারণ অপছন্দকে স্মরণ করি। সম্ভবত এএনএসআই সি ++ এর সাথে পরিস্থিতির উন্নতি হয়েছে, বা লোকেরা কীভাবে এটির অপব্যবহার করবেন না তা শিখেছেন।
স্কাফম্যান

1
সিফ্রন্টের দিনগুলি (৮০ এর দশকের মাঝামাঝি) থেকে সি ++ ব্যবহার করা এমন কেউ হিসাবে কথা বললে আমি আপনাকে নিশ্চয়তা দিতে পারি যে আইএসও স্ট্যান্ডার্ডের প্রবর্তনটি অপারেটর ওভারলোডিং সম্পর্কিত লোকদের কুসংস্কারগুলিতে কোনও প্রভাব ফেলেনি।

3

সি ++ এ কেবলমাত্র ভুলটি জানা যা হ'ল পৃথক অপারেটর হিসাবে ওভারলোড করার ক্ষমতা [] = এর অভাব। এটি সম্ভবত একটি সুস্পষ্ট কারণ নয় তবে এর পক্ষে যথেষ্ট পরিমাণের জন্য C ++ সংকলকটিতে কার্যকর করা কঠিন হতে পারে।


2

অন্যান্য উত্তরগুলি যেমন উল্লেখ করেছে; অপারেটর ওভারলোডিং নিজেই অগত্যা খারাপ নয়। এতে খারাপ কী হয় যখন এটি এমনভাবে ব্যবহার করা হয় যার ফলে ফলাফলটি কোডটি স্পষ্ট করে না। সাধারণত এগুলি ব্যবহার করার সময় আপনাকে তাদের সর্বনিম্ন বিস্ময়কর কাজটি করাতে হবে (অপারেটর + করণ বিভাগ যুক্তিযুক্ত শ্রেণীর ব্যবহারের জন্য সমস্যার কারণ হতে পারে) বা যেমন স্কট মায়ার্স বলেছেন:

ক্লায়েন্টরা ইতিমধ্যে জেনে থাকে যে কীভাবে ইনট আচরণ করা হয় তার মতো ধরণের আচরণ, সুতরাং যখনই আপনার যুক্তি যুক্তিযুক্ত হয় তেমনভাবে আচরণ করার চেষ্টা করা উচিত ... যখন সন্দেহ হয়, অন্তরগুলি যেমন করে তেমনই করুন । (কার্যকর সি ++ তৃতীয় সংস্করণ আইটেম 18 থেকে)

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


আমি এখানে অপারেটর ওভারলোডিংয়ের পক্ষে বা বিপক্ষে বিতর্ক করছি না, আমি লোকদের ন্যায্যতা প্রমাণ করতে চাইছি না।
স্কেফম্যান

স্প্রিন্টটি আমার কাছে আসা সবচেয়ে খারাপ উদাহরণটির কাছে কোথাও আসে না - রোগওয়েভ ডাটাবেস লাইব্রেরিটি কী দেখতে পাবে তা আপনার দেখা উচিত!

আমি সম্মত হই যে স্পিরিটি অপারেটরদের অপব্যবহার করে, তবে আমি এটি করার আরও ভাল উপায় সম্পর্কে সত্যিই ভাবতে পারি না।
জিফ্রে

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

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

2

আমি কখনও কোনও নিবন্ধ দেখিনি যে দাবি করে যে সি ++ এর অপারেটর ওভারলোডিং খারাপ।

ব্যবহারকারী-সংজ্ঞাযোগ্য অপারেটররা ভাষার ব্যবহারকারীদের জন্য উচ্চতর স্তরের প্রকাশ এবং ব্যবহারযোগ্যতার অনুমতি দেয়।


1

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

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

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.