অপারেটর ওভারলোডিংয়ের বিরুদ্ধে যুক্তিগুলি বুঝতে পারি না [বন্ধ]


82

আমি কেবল জোএলের একটি নিবন্ধ পড়েছি যেখানে তিনি বলেছেন:

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

i = j * 5;

… সি তে আপনি জানেন, কমপক্ষে, সেই জে পাঁচটি দ্বারা গুণিত হচ্ছে এবং ফলাফলগুলি আইতে সঞ্চিত রয়েছে।

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

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

এবং অপরটি ওভারলোডিং সমর্থন করে না এমন ভাষায় আপনাকে কী লিখতে হতে পারে তার j * 5থেকে কীভাবে আলাদা j.multiply(5)? আবার, আপনাকে পদ্ধতির jঅভ্যন্তরে প্রকার এবং উঁকি দেওয়ার ধরণটি খুঁজে বের করতে হবে multiply, কারণ লো এবং দেখুন, jএমন একটি ধরণের হতে পারে যা একটি multiplyপদ্ধতিতে ভয়ঙ্করভাবে কিছু করতে পারে।

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

কোনও পদ্ধতি কী করে তা যদি আপনি জানতে চান তবে আপনি ডকুমেন্টেশনটি এক নজরে দেখতে পারেন বা বাস্তবায়নের অভ্যন্তরে উঁকি দিতে পারেন। অপারেটর ওভারলোডিং কেবল সিনট্যাকটিক চিনি এবং এটি কীভাবে খেলাটিকে একেবারে পরিবর্তন করে তা আমি দেখতে পাই না।

আমাকে আলোকিত করুন।


20
+1: ভাল লিখিত, ভাল যুক্তিযুক্ত, আকর্ষণীয় বিষয় এবং অত্যন্ত বিতর্কিত। পি.এস. প্রশ্নের একটি উজ্জ্বল উদাহরণ।
অ্যালন গুরালেনেক

19
+1: লোকেরা জোয়েল স্পলস্কির কথা শুনে কারণ সে ভাল লেখেন এবং সুপরিচিত। কিন্তু এটি তাকে সঠিক সময়ের 100% করতে পারে না। আমি আপনার যুক্তির সাথে একমত যদি আমরা সকলেই এখানে জোয়েলের যুক্তি অনুসরণ করি তবে আমরা কখনই কোথাও পেতাম না।
কেউ নেই

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

5
+1, তবে জোলের নিবন্ধের সেরা অংশটি ভুলে যাবেন না: সঠিক উত্তরের দিকে ম্যারাথন দৌড়ানোর পরে, কোনও আপাত কারণ ছাড়াই সে তার থেকে 50 ফুট কম থামায়। ভুল কোডটি কেবল ভুল দেখতে হবে না; এটি সংকলন করা উচিত নয়।
ল্যারি কোলেম্যান

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

উত্তর:


32

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

আমি এমন কিছু করতে দেখছি না যা গেট_সোম_ডেটা নামক ফাংশন যা ডেটা মুছে দেয় তার চেয়ে গুণটির সাথে ঘনিষ্ঠভাবে আর কোনও মিল দেয় না।


13
+1 'আমি দেখতে পাচ্ছি না' বিটের জন্য। ভাষার বৈশিষ্ট্যগুলি ব্যবহারের জন্য রয়েছে, অপব্যবহারের জন্য নয়।
মাইকেল কে

5
তবুও আমাদের কাছে একটি <<অপারেটর স্ট্রিমগুলিতে সংজ্ঞায়িত রয়েছে যার বিটওয়াইফ শিফটটির সাথে কিছুই নেই, ডান সি সি ++ এর লাইব্রেরিতে।
ম্যালকম

'বিটওয়াইফ শিফট' অপারেটরটিকে কেবল historicalতিহাসিক কারণে বলা হয়। স্ট্যান্ডার্ড টাইপের ক্ষেত্রে প্রয়োগ করা হলে, এটি কিছুটা বদলে যায় (সংখ্যার ধরণের ক্ষেত্রে + অপারেটর একসাথে সংখ্যার যোগ করে) তবে কোনও জটিল টাইপের ক্ষেত্রে প্রয়োগ করার পরে, এটি যতটা পছন্দ করে তা করতে পারে এই ধরণের জন্য জ্ঞান।
gbjbaanb

1
* ডিফেরেন্সিংয়ের জন্যও ব্যবহৃত হয় (যেমন স্মার্ট পয়েন্টার এবং পুনরাবৃত্তিকারী দ্বারা করা হয়); ভাল-খারাপ ওভারলোডিংয়ের মধ্যে সীমানা কোথায় রাখবেন তা স্পষ্ট নয়
মার্টিনকুনেভ

এটি ঠিক কোথাও হবে না, এটি জে টাইপের সংজ্ঞাতে হবে।
অ্যান্ডি

19

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

উদাহরণস্বরূপ, এটি জমিদার নিখুঁত জ্ঞান করে তোলে +বা *জন্য অপারেটর class Matrixবা class Complex। প্রত্যেকে তাত্ক্ষণিকভাবে জানবে এর অর্থ কী। অন্যদিকে, আমার কাছে এই +সত্যটির অর্থ দাঁড়ায় যে স্ট্রিংগুলিকে বোঝানো মোটেই সুস্পষ্ট নয়, যদিও জাভা ভাষার অংশ হিসাবে এটি করে এবং এসটিএল std::stringঅপারেটর ওভারলোডিং ব্যবহারের জন্য করে using

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

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


1
আপনার শেষ দুটি বাক্য অপারেটর ওভারলোডিংয়ের আপত্তিটির কেন্দ্রবিন্দুতে পৌঁছেছে: সমস্ত কোডের জন্য তাত্ক্ষণিকভাবে স্পষ্ট হওয়ার ইচ্ছা।
ল্যারি কোলেম্যান

2
এম * এন এর অর্থ কী, যেখানে এম এবং এন ম্যাট্রিক্স টাইপের?
ডিমা

2
@ ফ্রেড: না ম্যাট্রিক্সের এক ধরণের গুণ রয়েছে। আপনি একটি এনএক্সকে ম্যাট্রিক্স দ্বারা একটি এমএক্সএন ম্যাট্রিক্সকে গুণতে এবং এমএক্সকে ম্যাট্রিক্স পেতে পারেন।
ডিমা

1
@ ফ্রেড ওভারফ্লো: ত্রি-মাত্রিক ভেক্টরকে গুণানোর বিভিন্ন উপায় রয়েছে, সেগুলি আপনাকে একটি স্কেলার দেয় এবং একটি আপনাকে আরও একটি ত্রিমাত্রিক ভেক্টর দেয়, এবং *সেগুলির জন্য ওভারলোডিং বিভ্রান্তির কারণ হতে পারে। যুক্তিযুক্তভাবে আপনি operator*()ডট পণ্য এবং operator%()ক্রস পণ্যটির জন্য ব্যবহার করতে পারেন , তবে আমি এটি সাধারণ-ব্যবহারের লাইব্রেরির জন্য করব না।
ডেভিড থর্নলি

2
@ মার্টিন বেকেট: নং সি ++ A-Bকে B-Aউভয়ই পুনরায় অর্ডার করার অনুমতি নেই এবং সমস্ত অপারেটররা সেই প্যাটার্নটি অনুসরণ করে। যদিও সর্বদা একটি ব্যতিক্রম থাকে: সংকলক যখন প্রমাণ করতে পারে তবে এটি কোনও বিষয় নয়, এটিকে সবকিছু পুনরায় সাজানোর অনুমতি দেওয়া হয়েছে।
সোজায়ার্ড

9

হাস্কেল "+", "-", "*", "/" ইত্যাদিতে কেবল (ইনফিক্স) ফাংশন রয়েছে।

আপনার "ইনফিক্স ফাংশন" "প্লাস 2" হিসাবে "4 প্লাস 2" নামকরণ করা উচিত? কেন নয়, যদি যুক্ত হয় যা আপনার ফাংশনটি করে। আপনার "প্লাস" ফাংশনটির নামকরণ করা উচিত "+"? কেন না.

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

সম্পাদনা: আমার বিষয়টি আরও স্পষ্ট করে তুলেছে


এরম, সি, সি ++ (এবং ফ্রেডের বিষয়ে যা জিজ্ঞাসা করেছিল) থেকে উত্তরাধিকার সূত্রে প্রাপ্ত কিছু বাদে বেশ কিছু একই কাজ করে। এখন এটি ভাল বা খারাপ কিনা তা আপনি গ্রহণ করছেন?
sbi

@sbi আমি অপারেটর ওভারলোডিং ভালবাসেন ... বাস্তবিক এমনকি সি ওভারলোড হয়েছে অপারেটার ... আপনি তাদের জন্য ব্যবহার করতে পারেন int, float, long longএবং যাই হোক না কেন। তাহলে এসব কি?
FUZxxl

@FUZxxl: বিল্ট- ইনগুলি ওভারলোডিংয়ের জন্য ব্যবহারকারী-সংজ্ঞায়িত অপারেটরগুলি সম্পর্কে এটিই ।
এসবিআই

1
@sbi Haskell, মধ্যে কোন পার্থক্য আছে builtin এবং ব্যবহারকারী-সংজ্ঞায়িত । সমস্ত অপারেটর সমান। এমনকি আপনি এটিতে কিছু এক্সটেনশান ঘুরিয়ে দিতে পারেন যা সমস্ত পূর্বনির্ধারিত জিনিসগুলি সরিয়ে দেয় এবং কোনও অপারেটর সহ আপনাকে স্ক্র্যাচ থেকে কিছু লিখতে দেয়।
FUZxxl

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

7

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

এটি দুটি কারণে মর্মান্তিক:

  1. এর যৌক্তিক উপসংহারে পৌঁছেছে, কোডটি তাত্ক্ষণিকভাবে সুস্পষ্ট হওয়া উচিত এমন নীতিটি আমাদের সকলকে এখনও সিওবিএল-এ কোড করে রাখা উচিত।
  2. আপনি কোড থেকে শিখেন না যা তাৎক্ষণিকভাবে সুস্পষ্ট। আপনি কোডটি শিখেন যা একবারে আপনি কীভাবে এটি কাজ করে তা ভেবে কিছুটা সময় নেওয়ার পরে বোঝা যায়।

কোড থেকে শিক্ষা নেওয়া যদিও সর্বদা প্রাথমিক উদ্দেশ্য নয়। "ফিচার এক্স গ্লাইচিং করা হচ্ছে, এমন একটি ক্ষেত্রে যিনি এটি লিখেছেন সে ব্যক্তি সংস্থা ছেড়ে চলে গিয়েছিল এবং আপনাকে এটি ASAP ঠিক করতে হবে", আমার তত্ক্ষণাত স্পষ্ট কোড রয়েছে have
এরারস্যাটজ

5

আমি কিছুটা রাজি।

আপনি লিখতে পারেন multiply(j,5), jএকটি স্কেলার বা ম্যাট্রিক্স ধরনের হতে পারে উপার্জন multiply(), বেশী বা কম জটিল কি উপর নির্ভর করে jহয়। যাইহোক, যদি আপনি পুরাপুরি ওভারলোডিং এর ধারণা পরিত্যাগ, তারপর ফাংশন নামে করতে হবে multiply_scalar()বা multiply_matrix()যা কি নীচে ঘটছে এটা সুস্পষ্ট করতে হবে।

এমন একটি কোড রয়েছে যেখানে আমাদের মধ্যে অনেকে এটি এক উপায়ে পছন্দ করে এবং এমন কোড রয়েছে যেখানে আমাদের বেশিরভাগই এটি অন্য উপায়ে পছন্দ করবে। কোডটির বেশিরভাগটি অবশ্য এই দুটি চরমের মধ্যে মধ্যবর্তী স্থলটিতে পড়ে। আপনি সেখানে যা পছন্দ করেন তা আপনার ব্যাকগ্রাউন্ড এবং ব্যক্তিগত পছন্দগুলির উপর নির্ভর করে।


ভাল যুক্তি. তবে ওভারলোডিং পুরোপুরি ছেড়ে দেওয়া জেনেরিক প্রোগ্রামিংয়ের সাথে খুব ভাল খেলছে না ...
ফ্রেডওভারফ্লো

@ ফ্রেডো: অবশ্যই না। তবে জেনেরিক প্রোগ্রামিং হ'ল খুব ভিন্ন ধরণের জন্য একই অ্যালগরিদম ব্যবহার সম্পর্কে, তাই যারা পছন্দ করেন তারা multiply_matrix()জেনেরিক প্রোগ্রামিং পছন্দ করেন না।
এসবিআই

2
আপনি নামগুলি সম্পর্কে আশাবাদী না? আমি যে কয়েকটি স্থানে কাজ করেছি তার উপর ভিত্তি করে, আমি 'গুণাঙ্ক' () 'এবং' গুণক () 'বা সম্ভবত real_multiply()বা এর মতো নামগুলি আশা করব । বিকাশকারীরা প্রায়শই নামের সাথে ভাল হয় না এবং operator*()অন্তত সামঞ্জস্যপূর্ণ হতে চলেছে।
ডেভিড থর্নলি

@ ডেভিড: হ্যাঁ, আমি নামগুলি খারাপ হতে পারে এই বিষয়টি বাদ দিয়েছি। তবে তারপরে আমরা ঠিক ধরেই নিতে পারি যে operator*()বোকা কিছু করতে পারে, jএটি হ'ল ম্যাক্রো হ'ল পাঁচটি ফাংশন কল, এবং হোয়াট নোট সম্পর্কিত অভিব্যক্তিগুলির মূল্যায়ন। তারপরে আপনি তখন দুটি পদ্ধতির তুলনা করতে পারবেন না। তবে, হ্যাঁ, জিনিসগুলির নামকরণ ভাল, যদিও এটি যত সময় নেয় তার পক্ষে মূল্যবান।
sbi

5
@ ডেভিড: এবং যেহেতু জিনিসগুলির নামকরণ করা শক্ত, তাই প্রোগ্রামিং ভাষা থেকে নামগুলি বাতিল করা উচিত, তাই না? এগুলি ভুল করা খুব সহজ! ;-)
ফ্রেডওভারফ্লো

4

অপারেটর ওভারলোডিং নিয়ে দুটি সমস্যা দেখছি।

  1. ওভারলোডিং অপারেটরের শব্দার্থক পরিবর্তন করে, এমনকি যদি এটি প্রোগ্রামার দ্বারা উদ্দিষ্ট না হয়। উদাহরণস্বরূপ, যখন আপনি ওভারলোড করেন &&, ||বা ,, আপনি এই অপারেটরগুলির অন্তর্নির্মিত রূপগুলি (পাশাপাশি লজিকাল অপারেটরগুলির সংক্ষিপ্ত-সার্কিট আচরণ) দ্বারা অন্তর্নিহিত সিকোয়েন্স পয়েন্টগুলি হারাবেন। এই কারণে, ভাষা যদি এটি দেয় তবে এই অপারেটরগুলিকে ওভারলোড না করাই ভাল।
  2. কিছু লোক অপারেটরকে ওভারলোডিংকে এমন একটি দুর্দান্ত বৈশিষ্ট্য হিসাবে দেখেন, এটি উপযুক্ত সমাধান না হলেও তারা সর্বত্র এটি ব্যবহার শুরু করে। এটি অন্যান্য লোককে অন্য দিকে অতিরিক্ত প্রতিক্রিয়া দেখা দেয় এবং অপারেটর ওভারলোডিং ব্যবহারের বিরুদ্ধে সতর্ক করে দেয়। আমি কোনও গ্রুপের সাথে একমত নই, তবে মাঝের জমিটি গ্রহণ করব: অপারেটর ওভারলোডিং অল্প পরিমাণে এবং কেবল তখনই ব্যবহার করা উচিত
    • ওভারলোডেড অপারেটরের ডোমেন বিশেষজ্ঞ এবং সফ্টওয়্যার বিশেষজ্ঞ উভয়েরই স্বাভাবিক অর্থ রয়েছে। যদি এই দুটি গোষ্ঠী অপারেটরের প্রাকৃতিক অর্থের সাথে একমত না হয় তবে এটি ওভারলোড করবেন না।
    • জড়িত ধরণের জন্য (অপারেটর) অপারেটর এবং তাত্ক্ষণিক প্রসঙ্গের (প্রাকৃতিকভাবে একই অভিব্যক্তি, তবে কয়েকটি লাইনের চেয়ে বেশি) কোনও প্রাকৃতিক অর্থ নেই এবং সর্বদা এটি পরিষ্কার করে দেয় যে অপারেটরের অর্থ কী। এই বিভাগের একটি উদাহরণ operator<<স্রোতের জন্য হবে ।

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

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

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

অবশ্যই, এটি কমা অপারেটরকে ওভারলোড করার অনুমতি দেওয়ার মতো বিচিত্র নয়। উল্লেখ্য, এক ওভারলোডিং পর জিনিস আমি সত্যিই দেখা যায় না করেছি, কিন্তু, টাইট-বাঁধাই সদস্য এক্সেস একটি উপায় হবে চাই, মত একটি অভিব্যক্তি যার ফলে foo.bar[3].Xদ্বারা পরিচালিত করা fooবরং প্রয়োজন পরিবর্তে, এর বর্গ fooসদস্য এক্সপোজ যা সাবস্ক্রিপশন সমর্থন করতে পারে এবং তারপরে কোনও সদস্যকে প্রকাশ করতে পারে X। যদি কেউ প্রকৃত সদস্য অ্যাক্সেসের মাধ্যমে মূল্যায়নকে বাধ্য করতে চায়, তবে একজন লিখবেন ((foo.bar)[3]).X
সুপারক্যাট

3

আমার ব্যক্তিগত অভিজ্ঞতার ভিত্তিতে, একাধিক পদ্ধতির অনুমতি দেওয়ার জাভা উপায়, তবে ওভারলোডিং অপারেটর নয়, এর অর্থ হ'ল আপনি যখনই কোনও অপারেটরকে দেখেন তখন ঠিক কী ঘটে তা জানেন।

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

অন্য কথায়, অপারেটর ওভারলোড নিষিদ্ধ করা পাঠকের পক্ষে উপকারী , লেখক নয় এবং তাই প্রোগ্রামগুলি বজায় রাখা সহজ করে তোলে!


+1, একটি সতর্কতার সাথে: সি ++ আপনাকে নিজের স্তব্ধ করতে যথেষ্ট দড়ি দেয়। তবে আমি যদি সি ++ তে একটি লিঙ্কযুক্ত তালিকাটি বাস্তবায়ন করতে চাই তবে আমি নবম উপাদানটি অ্যাক্সেস করতে [] ব্যবহারের দক্ষতা চাই। অপারেটরগুলির ডেটা (গাণিতিক ভাষায়) যেগুলির জন্য তারা বৈধ for
মাইকেল কে

@ মিশেল, আপনি list.get(n)সিনট্যাক্স নিয়ে বাঁচতে পারবেন না ?

@ থরবজর্ন: এটিও বেশ ভাল, সম্ভবত একটি দুর্বল উদাহরণ। সময় আরও ভাল হতে পারে - ওভারলোডিং +, - সময়.অ্যাড (আরেকটি টাইম) এর চেয়ে অর্থযুক্ত হবে।
মাইকেল কে

4
@ মিশেল: লিঙ্কযুক্ত তালিকাগুলি সম্পর্কে, std::listওভারলোড হয় না operator[](বা তালিকার সাথে সূচকের কোনও অন্য উপায় দেয় না ), কারণ এই জাতীয় ক্রিয়াকলাপটি হ'ল (এন) হবে এবং যদি আপনি দক্ষতার বিষয়ে যত্নবান হন তবে একটি তালিকা ইন্টারফেসের এ জাতীয় ক্রিয়াকলাপটি প্রকাশ করা উচিত নয়। ক্লায়েন্টদের সূচীগুলির সাথে লিঙ্কযুক্ত তালিকাগুলির উপর পুনরাবৃত্তি করতে প্ররোচিত হতে পারে, O (n) অ্যালগরিদমগুলি অপ্রয়োজনীয়ভাবে O (n ^ 2) তৈরি করে। আপনি জাভা কোডে প্রায়শই দেখতে পান, বিশেষত যদি লোকেরা Listইন্টারফেসের সাথে কাজ করে যা উদ্দেশ্য সম্পূর্ণরূপে বিমূর্ত জটিলতার লক্ষ্য করে।
ফ্রেডওভারফ্লো

5
@ থোর: "তবে নিশ্চিত হওয়ার জন্য আপনাকে অবশ্যই পরীক্ষা করতে হবে :)" ... আবার এটি অপারেটর ওভারলোডিংয়ের সাথে আবদ্ধ নয় । যদি আপনি দেখতে time.add(anotherTime)পান তবে গ্রন্থাগার প্রোগ্রামার অ্যাড অপারেশনটি "সঠিকভাবে" প্রয়োগ করেছে কিনা (তার অর্থ যা বোঝায়) তাও পরীক্ষা করে দেখতে হবে।
ফ্রেডওভারফ্লো

3

ওভারলোডিং a * bএবং কলিংয়ের মধ্যে একটি পার্থক্য multiply(a,b)হ'ল দ্বিতীয়টি সহজেই গ্রেপ করা যায়। যদি multiplyফাংশন বিভিন্ন ধরনের জন্য ওভারলোড করা হয় না তারপর আপনি খুঁজে বের করতে পারেন ঠিক কি ফাংশন করতে যাচ্ছে ধরনের মাধ্যমে ট্র্যাক করতে ছাড়াই aএবং b

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


লিনাক্স কার্নেলটি কি খাঁটি সি তে বিকশিত হয় না? এই প্রসঙ্গে কেন মোটেই ওভারলোডিং (অপারেটর) আলোচনা করবেন?
ফ্রেডওভারফ্লো

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

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

2
@ স্কট: সি-তে প্রোগ্রামযুক্ত প্রকল্পগুলির বিষয়ে ওভারলোডিংয়ের "দুষ্টতা" নিয়ে আলোচনা করার কোনও অর্থ নেই, কারণ সি এর ওভারলোডের কার্যকারিতা করার ক্ষমতা নেই।
ফ্রেডওভারফ্লো

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

2

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

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


অতিরিক্ত লোড অপারেটরদের কখনই "বিজোড় কিছু" করা উচিত নয়। এটি অবশ্যই জটিল কিছু করে তবে তা ঠিক। তবে কেবল ওভারলোডের যখন এর এক, স্পষ্ট অর্থ হয়।
সুজেয়ার্ড

2

আমি মনে করি যে ওভারলোডিং ম্যাথ অপারেটরগুলি সি ++ এ অপারেটর ওভারলোডিংয়ের সাথে আসল সমস্যা নয়। আমি মনে করি ওভারলোডিং অপারেটরগুলি যে অভিব্যক্তির প্রসঙ্গে (অর্থাত্ টাইপ) নির্ভর করা উচিত নয় এটি "অশুভ"। উদাহরণস্বরূপ ওভারলোডিং , [ ] ( ) -> ->* new deleteবা এমনকি ইউনারি *। সেই অপারেটরদের কাছ থেকে আপনার প্রত্যাশার একটি নির্দিষ্ট সেট রয়েছে যা কখনই পরিবর্তিত হয় না।


+1 [] কে ++ এর সমতুল্য করবেন না।
মাইকেল কে

3
আপনি কি এই বলে আমরা অপারেটার আপনাকে উল্লেখ করেছে জমিদার করতে সক্ষম হওয়া উচিত নয় এ সব ? বা আপনি কি বলছেন যে আমাদের কেবল বুদ্ধিমান উদ্দেশ্যে তাদের ওভারলোড করা উচিত? কারণ আমি পাত্রে ছাড়া কন্টেনারগুলি ছাড়া operator[], ফান্ট্যাক্টর ছাড়া operator(), স্মার্ট পয়েন্টারগুলি ছাড়া আরও operator->দেখতে পছন্দ করব না ।
ফ্রেডওভারফ্লো

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

2

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

এখানে যেটি ব্যাথা দেয় তা হ'ল আপনার কোডের পঠনযোগ্যতা। বাস্তব জীবনের ক্ষেত্রে ম্যাট্রিক্স গুণনের একাডেমিক উদাহরণে নয়। বিশেষত যদি আপনার ভাষা সেই অপারেটরগুলি সংজ্ঞায়িত করতে দেয় যা উদাহরণস্বরূপ ভাষা কোরে প্রাথমিকভাবে উপস্থিত না হয় =:=। এই সময়ে প্রচুর অতিরিক্ত প্রশ্ন দেখা দেয়। এই অভিশাপ অপারেটর সম্পর্কে কি? মানে mean জিনিসের নজির কী? সাহচর্য কী? কোন আদেশে a =:= b =:= cসত্যই কার্যকর করা হয়?

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

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

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


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

1

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

গ্রহনযোগ্য / উৎসাহিত করেছিলেন:

class Complex
{
public:
    double r;
    double i;

    Complex operator*(const Compex& rhs)
    {
        Complex result;
        result.r = (r * rhs.r) - (i * rhs.i);
        result.i = (r * rhs.i) + (i * rhs.r);
        return result;
    }
};

গ্রহণযোগ্য নয়:

class Employee
{
public:
    std::string name;
    std::string address;
    std::string phone_number;

    Employee operator* (const Employee& e)
    {
        // what the hell do I do here??
    }
};

1
গুণের কর্মীরা? অবশ্যই এটি একটি বরখাস্ত অপরাধ, যদি তারা বোর্ডরুমের টেবিলে এটি করে তবে তা।
gbjbaanb

1

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

সি ++ নিজেই এই জাতীয় মামলার দুর্দান্ত উদাহরণ দেয়। কীভাবে stream << 1পড়ার কথা? 1 দ্বারা বামে স্থানান্তরিত? আপনি স্পষ্টভাবে জানতে না পারলে << সি ++ এও স্ট্রিমটিতে লেখেন না তবে এগুলি একেবারেই সুস্পষ্ট নয়। তবে, এই অপারেশনটি যদি কোনও পদ্ধতি হিসাবে প্রয়োগ করা হয়, তবে কোনও বুদ্ধিমান বিকাশকারী লিখবেন না o.leftShift(1), এটি এমন কিছু হবে o.write(1)

তল লাইনটি হ'ল অপারেটরকে ওভারলোডিং অনুপলব্ধ করে, ভাষা প্রোগ্রামারদের অপারেশনগুলির নাম সম্পর্কে ভাবতে বাধ্য করে। এমনকি নির্বাচিত নামটি নিখুঁত না হলেও, চিহ্নের চেয়ে কোনও নামের ভুল ব্যাখ্যা করা এখনও শক্ত।


1

বানানযুক্ত পদ্ধতির তুলনায় অপারেটরগুলি সংক্ষিপ্ত, তবে তাদের প্রথম বন্ধনী প্রয়োজন হয় না। প্যারেন্টিসগুলি টাইপ করতে তুলনামূলকভাবে অসুবিধে হয়। এবং আপনি অবশ্যই তাদের ভারসাম্য বজায় রাখা উচিত। মোট, কোনও পদ্ধতির কল অপারেটরের তুলনায় তিনটি অক্ষরের সরল শব্দ প্রয়োজন। এটি অপারেটরগুলি খুব, খুব লোভনীয় ব্যবহার করে তোলে।
কেন যে কেউ এই করতে চাইবেন: cout << "Hello world"?

ওভারলোডিংয়ের সমস্যাটি হ'ল, বেশিরভাগ প্রোগ্রামার অবিশ্বাস্যভাবে অলস হয় এবং বেশিরভাগ প্রোগ্রামার এটির সামর্থ্য রাখে না।

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


বা, সি # তে, কোনও প্রতিনিধিকে ইভেন্ট বাঁধতে + = ব্যবহার করার জন্য। আমি মনে করি না যে প্রোগ্রামার বোকামির জন্য ভাষার বৈশিষ্ট্যগুলিকে দোষারোপ করা একটি গঠনমূলক উপায়।
gbjbaanb

0

অপারেটর ওভারলোডিং ভয়ঙ্কর হওয়ার কারণটি হ'ল কারণ এখানে প্রচুর সংখ্যক প্রোগ্রামার রয়েছে যা কখনও ভাবেন *না যার অর্থ কেবল "গুণ" নয়, অন্যদিকে একটি পদ্ধতি foo.multiply(bar)অন্তত তাত্ক্ষণিকভাবে সেই প্রোগ্রামারকে নির্দেশ করে যে কেউ একটি কাস্টম মাল্টিপল পদ্ধতি লিখেছিল someone । কোন পর্যায়ে তারা আশ্চর্য হবে কেন এবং তদন্তে যাবে।

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

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

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

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