ব্যবহারকারী-সংজ্ঞায়িত অপারেটররা কেন বেশি সাধারণ হয় না?


94

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

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

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

যেহেতু এই বৈশিষ্ট্যটি প্রয়োগ করা বেশ তুচ্ছ, তাই কেন এটি বেশি সাধারণ নয়?

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

আসল ব্যবহারের কেস:

  • অনুপস্থিত অপারেটরগুলি প্রয়োগ করুন (যেমন লুয়ায় বিটওয়াইস অপারেটর নেই)
  • মিমিক ডি এর ~(অ্যারে কনটেন্টেশন)
  • DSLs
  • |ইউনিক্স পাইপ-স্টাইল সিনট্যাক্স চিনির হিসাবে ব্যবহার করুন (করোটিন / জেনারেটর ব্যবহার করে)

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


4
এই প্রশ্নটি নিয়ে একটি রেডডিট আলোচনা চলছে।
ডায়নামিক

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

4
অন্য বিকল্প আছে, লিস্পের অপারেটর এবং ফাংশনগুলির মধ্যে আসলে কোনও পার্থক্য নেই।
দাড়িওয়ালা

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

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

উত্তর:


134

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

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


23
দুটি চিন্তাভাবনার স্কুলটিতে , ভাষা ডিজাইনাররা কেন অন্য বনামকে বেছে নিয়েছেন এই প্রশ্নের সর্বাধিক প্রত্যক্ষ (এবং সম্ভবত সবচেয়ে সত্য) উত্তর থাকার জন্যও +1+ .com / 110981030061712822816 / posts / KaSKeg4vQtz এছাড়াও +1 করেছেন । আমি আপনার থিসিসের ভিত্তিতে এটিও বলব যে আপনি কম ভাষাগুলি এটির অনুমতি দিতে পারেন কারণ বিকাশকারীদের একটি ছোট অংশ অন্যথায় তুলনায় অত্যন্ত দক্ষ (কোনও কিছুর শীর্ষ শতাংশ সর্বদা সংজ্ঞা দ্বারা সংখ্যালঘু হয়ে থাকবে)
জিমি হোফা

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

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

আমি কীভাবে সেই স্টিভ রেন্ট মিস করেছি? ওহ মানুষ, বুকমার্কড
জর্জ মাউয়ার

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

83

~ বা "myArray.Concat (সেকেন্ডআরে)" এর সাথে কনটেনটেটিং অ্যারেগুলির মধ্যে একটি পছন্দ দেওয়া হয়েছে, আমি সম্ভবত পরবর্তীটি পছন্দ করব। কেন? কারণ ~ একটি সম্পূর্ণ অর্থহীন চরিত্র যা কেবল তার অর্থ - অ্যারে কনটেন্টেশন - এটি নির্দিষ্ট প্রকল্পে যেখানে লেখা হয়েছিল।

মূলত, যেমনটি আপনি বলেছিলেন, অপারেটরগুলি পদ্ধতি থেকে আলাদা নয়। তবে পদ্ধতিগুলিকে পাঠযোগ্য, বোধগম্য নাম দেওয়া যেতে পারে যা কোড প্রবাহের বোঝার সাথে যুক্ত করে, অপারেটরগুলি অস্বচ্ছ এবং পরিস্থিতিগত হয়।

এ কারণেই আমি পিএইচপি-র .অপারেটর (স্ট্রিং কনকেনটেশন) বা হাস্কেল বা ওসিএএমএল-এর বেশিরভাগ অপারেটর পছন্দ করি না , যদিও এই ক্ষেত্রে কিছু বিশ্বব্যাপী স্বীকৃত মান ক্রিয়ামূলক ভাষার জন্য উদ্ভূত হচ্ছে।


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

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

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

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

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

71

যেহেতু এই বৈশিষ্ট্যটি প্রয়োগ করা বেশ তুচ্ছ, তাই কেন এটি বেশি সাধারণ নয়?

আপনার ভিত্তি ভুল। এটা না "প্রশংসনীয় বাস্তবায়ন তুচ্ছ"। আসলে, এটি সমস্যার একটি ব্যাগ নিয়ে আসে।

আসুন পোস্টে প্রস্তাবিত "সমাধানগুলি" একবার দেখুন:

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

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


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

14
এই সমস্যাগুলির মধ্যে একটিও 20 বছর ধরে বিদ্যমান ভাষাগুলিতে সমাধান করা হয়েছে ...
ফিলিপ জেএফ

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

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

6
হাস্কেলে, পার্সিং "সহজ" (বেশিরভাগ ভাষার তুলনায়)। অগ্রাধিকার প্রসঙ্গ স্বাধীন। যে অংশটি আপনাকে হার্ড ত্রুটির বার্তা দেয় তা টাইপক্লাস এবং অ্যাডভান্সড টাইপ সিস্টেম বৈশিষ্ট্যের সাথে সম্পর্কিত, ব্যবহারকারী সংজ্ঞায়িত অপারেটরগুলির সাথে নয়। এটি ওভারলোডিং, ব্যবহারকারীর সংজ্ঞা নয়, এটিই সমস্যা।
ফিলিপ জেএফ

25

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

ইনফিক্স অপারেটরগুলির সাধারণ অগ্রাধিকার বিধিগুলির চেয়ে বেশি সমস্যা রয়েছে (যদিও আপনি যে লিঙ্কটি উল্লেখ করেছেন সেটি সেই নকশার সিদ্ধান্তের প্রভাবকে তুচ্ছ করে তোলে)। একটি হ'ল বিরোধের সমাধান: আপনি যখন সংজ্ঞা দেন a.operator+(b)এবং কি হয় b.operator+(a)? একে অপরের উপরে অগ্রাহ্য করা অপারেটরের প্রত্যাশিত পরিবহন সম্পত্তি ভঙ্গ করে। একটি ত্রুটি নিক্ষেপ করার ফলে মডিউলগুলি হতে পারে যা অন্যথায় কাজ একবারে একসাথে ভেঙে যায়। আপনি মিশ্রণে উদ্ভূত প্রকারগুলি নিক্ষেপ করা শুরু করলে কী হবে?

বিষয়টির সত্যটি হ'ল অপারেটরগুলি কেবল ফাংশন নয়। ফাংশনগুলি হয় একা দাঁড়িয়ে থাকে বা তাদের শ্রেণীর মালিকানাধীন থাকে, যা কোন পরামিতিটির (যদি কোনও থাকে) পলিমারফিক প্রেরণের মালিকানা থাকে তার একটি স্পষ্ট অগ্রাধিকার সরবরাহ করে।

এবং এটি অপারেটরদের থেকে উদ্ভূত বিভিন্ন প্যাকেজিং এবং রেজোলিউশন সমস্যাগুলিকে উপেক্ষা করে। ভাষা ডিজাইনারদের (এবং বৃহত্তর) সীমা ইনফিক্স অপারেটরের সংজ্ঞা কারণ এটি বিতর্কযোগ্য সুবিধা প্রদানের সময় ভাষার জন্য সমস্যার স্তুপ তৈরি করে।

এবং প্রকৃতপক্ষে, কারণ তারা বাস্তবায়নের জন্য তুচ্ছ নয়


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

1
@ টেজেমসন - হ্যাঁ, ভাষাগুলিতে গণিতের জন্য প্রাধান্যের সুস্পষ্ট নিয়ম রয়েছে । অপারেটরদের পছন্দ মতো জিনিসের জন্য অতিরিক্ত বোঝা চালানো হলে গণিত ক্রিয়াকলাপগুলির অগ্রাধিকার সংক্রান্ত বিধিগুলি সম্ভবত সত্যিই প্রযোজ্য হবে না boost::spirit। যত তাড়াতাড়ি আপনি ব্যবহারকারী সংজ্ঞায়িত অপারেটরদের মঞ্জুরি দেয় তা আরও খারাপ হয় কারণ গণিতের পক্ষে অগ্রাধিকারের ভাল-সংজ্ঞা দেওয়ার কোনও ভাল উপায় নেই। আমি লিখেছি সামান্য একটি ভাষা বিশেষভাবে ইচ্ছামত সংজ্ঞায়িত অপারেটরদের সঙ্গে বিষয়ু দেখায় প্রেক্ষাপটে নিজেকে যে বিষয়ে।
তেলস্তিন

22
আমি বুলশিট বলি, স্যার। ওও-यहूदीের বাইরের জীবন রয়েছে, এবং সেখানে ফাংশনগুলি অগত্যা কোনও বস্তুর অন্তর্ভুক্ত নয়, সুতরাং সঠিক ফাংশন সন্ধান করা ঠিক সঠিক অপারেটর সন্ধান করার মতোই।
ম্যাথিউ এম।

1
@matthieuM। - নিশ্চয়ই. মালিকানা এবং প্রেরণের বিধিগুলি সেই ভাষাগুলিতে আরও অভিন্ন যা সদস্য ফাংশন সমর্থন করে না। যদিও এই মুহুর্তে, মূল প্রশ্নটি 'ও-ও-ভাষাগুলি বেশি সাধারণ হয় না কেন?' যা সম্পূর্ণ অন্য একটি বলগেম।
টেলাস্টিন

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

19

আমার মনে হয় আপনি বিস্মিত কত ঘন ঘন হতে চাই অপারেটর overloads হয় বাস্তবায়িত কোন না কোনভাবে। তবে এগুলি সাধারণত প্রচুর সম্প্রদায়গুলিতে ব্যবহৃত হয় না।

একটি অ্যারের সাথে সংলগ্ন করতে use কেন ব্যবহার করবেন? << রুবীর মতো << ব্যবহার করবেন না কেন ? কারণ আপনি যে প্রোগ্রামারগুলির সাথে কাজ করেন তা সম্ভবত রুবি প্রোগ্রামার নয়। বা ডি প্রোগ্রামাররা। সুতরাং তারা যখন আপনার কোড জুড়ে আসে তখন তারা কী করবে? তাদের যেতে হবে এবং প্রতীকটির অর্থ কী তা দেখতে হবে।

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

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

অন্যদিকে, আমি আনন্দের সাথে ব্যবহার করবে অপারেটর C # এর কারণ আমি অন্য C # এর ডেভেলপারদের আশা জানেন যে কি এটা, কিন্তু আমি এটা একটি ভাষা এটি ডিফল্ট ভাবে সমর্থন দেয়নি মধ্যে জমিদার না।??


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

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

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

7
@ জিমিহোফা এটি একটি পুনরাবৃত্তি ব্যয়। প্রতিটি নতুন বিকাশকারীদের জন্য অগ্রিম অর্থ প্রদান করা এবং বিদ্যমান বিকাশকারীদের প্রভাবিত করে কারণ তাদের এটি সমর্থন করতে হবে। পাশাপাশি একটি ডকুমেন্টেশন ব্যয় এবং ঝুঁকির একটি উপাদান রয়েছে - এটি আজ যথেষ্ট নিরাপদ বোধ করে তবে 30 বছরের নিচে, সবাই এগিয়ে যাবে, ভাষা এবং অ্যাপ্লিকেশনটি এখন "লিগ্যাসি", ডকুমেন্টেশনটি একটি বিশাল স্টিমিং গাদা এবং কিছু দুর্বল স্তন্যপায়ী প্রোগ্রামারদের উজ্জ্বলতায় তার চুল ছিঁড়ে যাবে যারা ".কনক্যাট ()" টাইপ করতে খুব অলস ছিল। প্রত্যাশিত মানটি কি ব্যয়গুলি অফসেট করার জন্য যথেষ্ট?
সিলভারড্রাগ

3
এছাড়াও, "প্রতিটি নতুন বিকাশকারী এই পরিভাষা দ্বারা বিভ্রান্ত হওয়ার নিয়ত ছিল the আমাদের নতুন ডোমেন শিখতে আমাদের কি যথেষ্ট সমস্যা নেই?" 80 এর দশকে ফিরে ওওপি-তে প্রয়োগ করা যেতে পারে, তার আগে কাঠামোগত প্রোগ্রামিং বা আইওসি 10 বছর আগে। এই মিথ্যা যুক্তি ব্যবহার বন্ধ করার সময় এসেছে।
মৌরিসিও শেফার

11

আমি কয়েকটি কারণ সম্পর্কে ভাবতে পারি:

  • তারা বাস্তবায়নের ক্ষেত্রে তুচ্ছ নয় - স্বেচ্ছাসেবী কাস্টম অপারেটরগুলি আপনার সংকলকটিকে আরও জটিল করে তুলতে পারে, বিশেষত যদি আপনি ব্যবহারকারী-সংজ্ঞায়িত অগ্রাধিকার, স্থিরতা এবং আধ্যাত্মিক নিয়মগুলিকে মঞ্জুরি দেন। যদি সরলতা কোনও পুণ্য হয় তবে অপারেটর ওভারলোডিং আপনাকে ভাল ভাষার নকশা থেকে দূরে নিয়ে চলেছে।
  • তারা নির্যাতিত পেতে - বেশিরভাগই পরিকল্পনাটি যারা মনে করি এটা "কুল" হয় অপারেটার পুনরায় সংজ্ঞায়িত এবং তাদের নিজস্ব শ্রেণীর সব বিশৃঙ্খলভাবে জন্য redefining শুরু করার দ্বারা। খুব শীঘ্রই, আপনার কোডটি এমন অনেকগুলি কাস্টমাইজড প্রতীক নিয়ে আবদ্ধ হয় যা অন্য কেউ পড়তে বা বুঝতে পারে না কারণ অপারেটররা প্রচলিত সু-বোঝা নিয়মগুলি অনুসরণ করে না। আপনার ডিএসএল গণিতের উপসেট হিসাবে না ঘটলে আমি "ডিএসএল" যুক্তিটি কিনব না :-)
  • তারা পাঠযোগ্যতা এবং রক্ষণাবেক্ষণের ক্ষতি করে - যদি অপারেটরগুলি নিয়মিত ওভাররাইড করা হয় তবে এই সুবিধাটি ব্যবহার করা হচ্ছে তা স্পষ্ট করা শক্ত হয়ে উঠবে এবং কোডাররা নিজেকে অপারেটর কী করছে তা ক্রমাগত নিজেকে জিজ্ঞাসা করতে বাধ্য করা হয়। অর্থপূর্ণ ফাংশন নাম দেওয়া আরও ভাল। কয়েকটি অতিরিক্ত চরিত্র টাইপ করা সস্তা, দীর্ঘমেয়াদী রক্ষণাবেক্ষণের সমস্যাগুলি ব্যয়বহুল।
  • তারা অন্তর্নিহিত কর্মক্ষমতা প্রত্যাশা ভঙ্গ করতে পারে । উদাহরণস্বরূপ, আমি সাধারণত একটি অ্যারের উপাদানগুলির সন্ধানের আশা করতাম O(1)। অপারেটর ওভারলোডিংয়ের সাথে, ইনডেক্সিং অপারেটরের প্রয়োগের উপর নির্ভর করে someobject[i]সহজেই একটি O(n)অপারেশন হতে পারে ।

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

কিছু আকর্ষণীয় বিষয় বিবেচনা করুন:

  • লিসপস : সাধারণভাবে অপারেটর এবং ফাংশনগুলির মধ্যে কোনও পার্থক্য করবেন না - +এটি কেবল একটি নিয়মিত কাজ। +অপারেটরগুলি সহ আপনি নিজের পছন্দ মতো ফাংশনগুলি সংজ্ঞায়িত করতে পারেন (সাধারণত বিল্ট-ইনগুলির সাথে দ্বন্দ্ব এড়ানোর জন্য পৃথক নেমস্পেসে এগুলি সংজ্ঞায়নের একটি উপায় রয়েছে )। অর্থপূর্ণ ফাংশন নাম ব্যবহার করার জন্য একটি সাংস্কৃতিক প্রবণতা রয়েছে, সুতরাং এটি খুব বেশি আপত্তিজনক হয় না। এছাড়াও, লিস্প উপসর্গ সংকেতটিতে একচেটিয়াভাবে ব্যবহার করা যায়, তাই অপারেটর ওভারলোডগুলি সরবরাহ করে এমন "সিনট্যাকটিকাল চিনি" তে কম মান নেই value
  • জাভা - অপারেটর ওভারলোডিং নিষিদ্ধ করে। এটি মাঝেমধ্যে বিরক্তিকর (কমপ্লেক্স নম্বর মামলার মতো স্টাফের জন্য) তবে জাভা জন্য এটি সম্ভবত সঠিক নকশার সিদ্ধান্ত যা সাধারণ, সাধারণ-উদ্দেশ্য ওওপি ল্যাঙ্গেজ হিসাবে উদ্দিষ্ট। জাভা কোড কম / মাঝারি দক্ষ বিকাশকারীদের পক্ষে এই সরলতার ফলস্বরূপ বজায় রাখা বেশ সহজ।
  • সি ++ এর অত্যন্ত পরিশীলিত অপারেটর ওভারলোডিং রয়েছে। কখনও কখনও এটি আপত্তিজনক হয় ( cout << "Hello World!"যে কেউ?) তবে পদ্ধতির মাধ্যমে সি ++ এর একটি জটিল ভাষা হিসাবে অবস্থানকে বোঝা যায় যা উচ্চ স্তরের প্রোগ্রামিংকে সক্ষম করে যখন আপনাকে পারফরম্যান্সের জন্য ধাতুর খুব কাছাকাছি যেতে দেয়, সুতরাং আপনি উদাহরণস্বরূপ একটি জটিল নম্বর শ্রেণি লিখতে পারেন যা আচরণ করে পারফরম্যান্সের সাথে আপোস না করে ঠিক যেমন আপনি চান। বোঝা যাচ্ছে যে আপনি যদি নিজেকে পায়ে গুলি করেন তবে এটি আপনার নিজের দায়িত্ব।

8

যেহেতু এই বৈশিষ্ট্যটি প্রয়োগ করা বেশ তুচ্ছ, তাই কেন এটি বেশি সাধারণ নয়?

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

এটি বলেছিল, আমি এটি তিনটি ভাষা নিয়ে ভাবতে পারি যা এটি করে এবং তারা এটি বিভিন্ন উপায়ে করে:

  • র‌্যাকেট, একটি স্কিম, যখন এটি সমস্ত এস-এক্সপ্রেশন-ওয়াই হয় না এবং আপনাকে প্রসারিত করতে চান এমন কোনও সিনট্যাক্সের জন্য পার্সারের পরিমাণ কী লিখতে দেয় এবং এটি প্রত্যাশা করে (এবং এই ট্র্যাকটেবলটি তৈরি করতে দরকারী হুক সরবরাহ করে)।
  • খাঁটি ফাংশন প্রোগ্রামিং ল্যাঙ্গুয়েজ হ্যাসেল কোনও একক অপারেটরকে সংজ্ঞা দিতে দেয় যা সম্পূর্ণ বিরামচিহ্ন নিয়ে থাকে এবং আপনাকে স্থিরতা স্তর (10 উপলব্ধ) এবং একটি সাহচর্য সরবরাহ করতে দেয় provide টার্নারি ইত্যাদি অপারেটরগুলি বাইনারি অপারেটর এবং উচ্চতর ক্রমের বাইরে তৈরি করা যেতে পারে।
  • একটি নির্ভরশীল টাইপড প্রোগ্রামিং ভাষা আগদা অপারেটরগুলির সাথে অত্যন্ত নমনীয় ( এখানে কাগজ ) তবে যদি একই প্রোগ্রামে অপারেটর হিসাবে সংজ্ঞায়িত করা হয় তবে অন্যটির লেসার, পার্সার এবং মূল্যায়নকারী উভয়ই দৃ strongly়ভাবে মিলিত ফলস্বরূপ

4
আপনি বলেছেন যে এটি "তুচ্ছ নয়" এবং তাত্ক্ষণিকভাবে কয়েকটি ভাষাকে তুচ্ছ প্রয়োগের বৈশিষ্ট্যযুক্ত তিনটি ভাষা তালিকাভুক্ত করেছে। সুতরাং, এটি সর্বোপরি তুচ্ছ, তাই না?
এসকে-যুক্তি

7

কাস্টম অপারেটরদের নিরুৎসাহিত করার অন্যতম প্রধান কারণ হ'ল যে কোনও অপারেটর বলতে পারে বা কিছু করতে পারে।

উদাহরণস্বরূপ cstreamবাম শিফট ওভারলোডের অনেক সমালোচিত।

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

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


6
অপারেটর ওভারলোডিংয়ের অংশগুলি সম্পূর্ণ নতুন অপারেটরগুলির সংজ্ঞায়নের ক্ষেত্রে কীভাবে প্রযোজ্য তা আমি দেখতে পাই না।

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

3
এবং এটি কীভাবে পদ্ধতি ওভারলোডিং থেকে আলাদা?
জার্গ ডব্লু মিটাগ

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

1
@ আর্টচেতফ্রাক: ঠিক আছে। +দুটি জিনিস যুক্ত -করুন, তাদের বিয়োগ করুন, *তাদেরকে গুণিত করুন। আমার অনুভূতি হ'ল নুন প্রোগ্রামারকে ফাংশন / পদ্ধতিতে addআসলে কিছু যুক্ত করতে বাধ্য করে এবং doNothingনিউকস চালু করতে পারে। এবং a.plus(b.minus(c.times(d)).times(e)তখন খুব কম পঠনযোগ্য a + (b - c * d) * e(যুক্ত বোনাস - যেখানে প্রথম স্টিংয়ে প্রতিলিপিতে ত্রুটি রয়েছে)। আমি দেখতে পাচ্ছি না যে প্রথমটি আরও অর্থবহ কীভাবে হয় ...
ম্যাকিয়েজ পাইচোটকা

4

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

সুতরাং আপনি যে অপারেটরগুলিকে প্রোগ্রামিং ভাষার ব্যবহার করতে দেখেন সেগুলি হ'ল আমাদের স্কুলে (গাণিতিক) শেখানো হয়েছে বা প্রোগ্রামিং সম্প্রদায়গুলিতে প্রতিষ্ঠিত হয়েছে, যেমন বলিয়ান অপারেটরগুলি বলে।


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

1
আপনি কত "স্কুল" গণনা করেন? উদাহরণস্বরূপ, আমি মনে করি ∈ কারণ elemএকটি দুর্দান্ত ধারণা এবং অবশ্যই একজন অপারেটর প্রত্যেকেরই বোঝা উচিত, তবে অন্যরা তাতে দ্বিমত পোষণ করছে বলে মনে হয়।
টিখন জেলভিস

1
এটি প্রতীক নিয়ে সমস্যা নয়। এটি কীবোর্ড নিয়ে সমস্যা। আমি উদাহরণস্বরূপ ইউনিকোড বিউটিফায়ার সক্ষম সহ ইম্যাক্স হ্যাশেল-মোড ব্যবহার করি। এবং এটি স্বয়ংক্রিয়ভাবে ascii অপারেটরগুলি ইউনিকোড প্রতীকগুলিতে রূপান্তর করে। তবে আসকি সমতুল্য না হলে আমি এটি টাইপ করতে সক্ষম হব না।
ভগিফ ভার্দি

2
প্রাকৃতিক ভাষাগুলি কেবলমাত্র "ব্যবহারকারী দ্বারা সংজ্ঞায়িত শব্দ" এবং অন্য কিছুই নয়। এবং কিছু ভাষা আসলে কাস্টম শব্দ গঠনে উত্সাহ দেয়।
এসকে-যুক্তি

4

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


4

একটি জিনিস যা এখনও উল্লেখ করা হয়নি তা হ'ল স্মলটকের ক্ষেত্রে, যেখানে সমস্ত কিছুই (অপারেটর সহ) একটি বার্তা প্রেরণ। "অপারেটরগুলি" পছন্দ করে +, |এবং এগুলি আসলে অবিরাম পদ্ধতি ary

সমস্ত পদ্ধতি ওভাররাইড করা যেতে পারে, সুতরাং এর a + bঅর্থ হল পূর্ণসংখ্যা সংযোজন যদি হয় aএবং bউভয়ই পূর্ণসংখ্যা হয় এবং এর অর্থ তারা উভয়ই হয়ে থাকলে ভেক্টর সংযোজন OrderedCollection

কোনও নজিরবিধি নেই, যেহেতু এগুলি কেবল পদ্ধতি কল। এটি স্ট্যান্ডার্ড গাণিতিক স্বরলিপি জন্য একটি গুরুত্বপূর্ণ জড়িত আছে: 3 + 4 * 5মানে (3 + 4) * 5, না 3 + (4 * 5)

(এটি স্মলটাক নবীনীদের একটি বড় বাধা।


3

আপনি এখানে দুটি জিনিসের বিরুদ্ধে লড়াই করছেন:

  1. অপারেটররা কেন প্রথমে ভাষায় উপস্থিত থাকে?
  2. ফাংশন / পদ্ধতিতে অপারেটরদের পুণ্য কী?

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

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

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

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


1

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

কখনও কখনও আপনি এমনকি প্রত্যাশার চেয়ে অনুধাবন করা অনেক কঠিন। একসময়, একটি বৃহত ক্রস-প্ল্যাটফর্ম সি ++ প্রকল্পে আমি সিদ্ধান্ত নিয়েছিলাম যে কোনও FilePathবস্তু তৈরির মাধ্যমে পাথ যেভাবে তৈরি হয়েছিল তা স্বাভাবিক করা ভাল হবে (জাভা-এর Fileবস্তুর অনুরূপ ), এতে অপারেটর থাকবে / অন্যটিকে সংযুক্ত করার জন্য ব্যবহৃত হত এটির অংশ অংশ (যাতে আপনি এর মতো কিছু করতে পারেন File::getHomeDir()/"foo"/"bar"এবং এটি আমাদের সমর্থিত প্ল্যাটফর্মগুলির সমস্ত ক্ষেত্রে সঠিক কাজ করবে)। যাঁরা এটি দেখেছেন তারা মূলত বলবে, "কী? এই স্ট্রিং বিভাগ? ... ওহ, এটি সুন্দর, তবে আমি সঠিক কাজটি করার জন্য এটি বিশ্বাস করি না।"

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


0

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

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

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

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


"চারপাশে যা আছে তার উপর নির্ভর করে পর্দার একই প্রতীকটির বিভিন্ন অর্থ হতে পারে" - বেশিরভাগ ভাষায় অনেক অপারেটরের ক্ষেত্রে এটি ইতিমধ্যে ঘটনা।
rkj

-1

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

অপারেটরগুলি সাধারণত সংক্ষিপ্ত যৌক্তিক নির্মাণ যা মূল ভাষায় ভালভাবে সংজ্ঞায়িত এবং ডকুমেন্টেড হয় (তুলনা করুন, বরাদ্দ করুন ..)। ডকুমেন্টেশন ছাড়াই এগুলি সাধারণত বোঝা শক্ত ( উদাহরণের a^bসাথে তুলনা করুন xor(a,b))। অপারেটরগুলির একটি বরং সীমিত সংখ্যক রয়েছে যা স্বাভাবিক প্রোগ্রামিংয়ে (>, <, =, + ইত্যাদি ..) বোধগম্য হতে পারে।

আমার ধারণাটি হ'ল কোনও ভাষায় ভাল সংজ্ঞায়িত অপারেটরদের সেটকে আঁকানো ভাল - তবে সেই অপারেটরগুলির অপারেটরকে ওভারলোডিংয়ের অনুমতি দিন (অপারেটররা একই জিনিসটি করা উচিত, তবে একটি কাস্টম ডেটা টাইপের সাহায্যে) recommend

আপনার ব্যবহার ক্ষেত্রেই ~এবং |আসলে সহজ অপারেটর ওভারলোডিং (সি #, সি ++, ইত্যাদি) দিয়ে সম্ভব হবে। ডিএসএল একটি বৈধ ব্যবহারের ক্ষেত্র, তবে সম্ভবত একমাত্র বৈধ ক্ষেত্রগুলির মধ্যে একটি (আমার দৃষ্টিকোণ থেকে)। তবে আমি মনে করি যে এর মধ্যে নতুন ভাষা তৈরির জন্য আরও ভাল সরঞ্জাম রয়েছে। অন্য কোনও ভাষার মধ্যে একটি সত্য ডিএসএল ভাষা কার্যকর করা those সংকলক-সংকলকগুলির যে কোনও একটি সরঞ্জাম ব্যবহার করে এতটা কঠিন নয়। একই "প্রসারিত LUA যুক্তি" এর পক্ষে যায়। কোনও ভাষা সম্ভবত নির্দিষ্ট উপায়ে সমস্যাগুলি সমাধান করার জন্য সংজ্ঞা দেওয়া হয়, উপ-ভাষার ভিত্তি না হয়ে (ব্যতিক্রমগুলি বিদ্যমান)।


-1

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

অবশ্যই, আপনি সংজ্ঞায়িত করতে পারেন যে একটি শিপিংএড্রেস ক্লাসে একটি স্ট্রিং যুক্ত করা মানে "ঠিকানায় 1 লাইন প্রতিস্থাপন করুন" ("সেটলাইন 1" ফাংশনের পরিবর্তে) এর মতো একটি কাস্টম অপারেশন এবং একটি সংখ্যা যুক্ত করা "পিন কোড রিপ্লেস" ("সেটজাইপকোড" এর পরিবর্তে) , তবে তারপরে কোডটি খুব পঠনযোগ্য এবং বিভ্রান্তিকর নয়। আমরা সাধারণত মনে করি যে অপারেটরটি মৌলিক প্রকার / শ্রেণিতে ব্যবহৃত হয়, কারণ তাদের আচরণটি স্বজ্ঞাত, স্পষ্ট এবং সামঞ্জস্যপূর্ণ (একবার আপনি ভাষাটির সাথে পরিচিত হলে, কমপক্ষে)। পূর্ণসংখ্যা, স্ট্রিং, কমপ্লেক্স নাম্বার ইত্যাদির মতো চিন্তা করুন

সুতরাং, নির্দিষ্ট কিছু ক্ষেত্রে অপারেটরদের সংজ্ঞায়িত করা খুব কার্যকর হতে পারে, তবে তাদের বাস্তব-বিশ্ব বাস্তবায়ন বেশ সীমাবদ্ধ, যেহেতু 99% ক্ষেত্রেই এটি পরিষ্কার জয় হবে যেটি ইতিমধ্যে বেসিক ভাষা প্যাকেজে প্রয়োগ করা হয়েছে।

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