সমসাময়িক ভাষার জন্য, এটি কেবল সিনট্যাকটিক চিনি; সম্পূর্ণ ভাষা-অজ্ঞাতসৃষ্টিক পদ্ধতিতে এটি এর চেয়ে বেশি।
পূর্বে এই উত্তরটি সহজভাবে বলেছিল যে এটি সিনট্যাকটিক চিনির চেয়ে বেশি, তবে আপনি যদি মন্তব্যগুলিতে দেখেন, ফ্যালকো এই বিষয়টির উত্থাপন করেছিলেন যে ধাঁধাটির একটি অংশ রয়েছে যা সমসাময়িক ভাষাগুলি সমস্ত অনুপস্থিত বলে মনে হয়; একই ধাপে কোন ফাংশনটি কল করতে হবে তার গতিশীল সংকল্পের সাথে তারা পদ্ধতিটির ওভারলোডিংকে মিশ্রিত করে না। এটি পরে স্পষ্ট করা হবে।
এটি কেন বেশি হওয়া উচিত তা এখানে।
এমন একটি ভাষা বিবেচনা করুন যা উভয় পদ্ধতির ওভারলোডিং এবং টাইপযুক্ত ভেরিয়েবলগুলিকে সমর্থন করে। আপনি নিম্নলিখিত পদ্ধতি প্রোটোটাইপ থাকতে পারে:
bool someFunction(int arg);
bool someFunction(string arg);
কিছু ভাষায়, সংকলনের সময় আপনি সম্ভবত কোডটির একটি রেখার দ্বারা কোনটিকে ডাকা হবে তা জানার জন্য পদত্যাগ করা হবে। তবে কিছু ভাষায়, সমস্ত ভেরিয়েবল টাইপ করা হয় না (বা এগুলি সমস্ত স্পষ্টভাবে টাইপ করা হয় Object
বা যাই হোক না কেন), সুতরাং এমন একটি অভিধান তৈরির কল্পনা করুন যার কীগুলি বিভিন্ন ধরণের মানগুলির মানচিত্র:
dict roomNumber; // some hotels use numbers, some use letters, and some use
// alphanumerical strings. In some languages, built-in dictionary
// types automatically use untyped values for their keys to map to,
// so it makes more sense then to allow for both ints and strings in
// your code.
এখন, আপনি যদি someFunction
সেই রুম নম্বরগুলির মধ্যে একটিতে আবেদন করতে চান? আপনি এটি কল:
someFunction(roomNumber[someSortOfKey]);
হয় someFunction(int)
বলা হয়, অথবা যখন someFunction(string)
বলা হয়? এখানে আপনি একটি উদাহরণ দেখুন যেখানে এগুলি সম্পূর্ণরূপে অर्थোগোনাল পদ্ধতি নয়, বিশেষত উচ্চ-স্তরের ভাষাগুলিতে। ভাষাটি খুঁজে বের করতে হবে - রানটাইমের সময় - এর মধ্যে কোনটি কল করা উচিত তাই এখনও এগুলিকে অন্তত কিছুটা একই পদ্ধতি হিসাবে বিবেচনা করতে হবে।
কেন কেবল টেমপ্লেট ব্যবহার করবেন না? কেন কেবল একটি টাইপযুক্ত যুক্তি ব্যবহার করবেন না?
নমনীয়তা এবং সূক্ষ্ম-দানাদার নিয়ন্ত্রণ। কখনও কখনও টেমপ্লেট ব্যবহার / টাইপযুক্ত আর্গুমেন্ট একটি ভাল পদ্ধতির হয়, কিন্তু কখনও কখনও তারা না।
উদাহরণস্বরূপ, আপনার দুটি পদ্ধতির স্বাক্ষর থাকতে পারে যেগুলি প্রত্যেকে একটি int
এবং একটি string
আর্গুমেন্ট হিসাবে গ্রহণ করে তবে আপনি যেখানে প্রতিটি স্বাক্ষরে আলাদা আলাদা is এটি করার জন্য আপনার খুব ভাল কারণ থাকতে পারে, কারণ প্রতিটি স্বাক্ষরের বাস্তবায়ন মূলত একই জিনিসটি করতে পারে তবে কেবল কিছুটা ভিন্ন মোড় দিয়ে; উদাহরণস্বরূপ লগিং আলাদা হতে পারে। অথবা তারা একই সঠিক কাজটি করেও, আপনি যুক্তিগুলি নির্দিষ্ট করা হয়েছে এমন ক্রম থেকে স্বয়ংক্রিয়ভাবে নির্দিষ্ট তথ্য সংগ্রহ করতে সক্ষম হতে পারেন। প্রযুক্তিগতভাবে আপনি কেবলমাত্র সিউডো-স্যুইচ স্টেটমেন্ট ব্যবহার করতে পারবেন প্রতিটি আর্গুমেন্টের প্রকারটি নির্ধারণ করতে, তবে এটি অগোছালো হয়ে যায়।
তাহলে কি এই পরবর্তী উদাহরণটি খারাপ প্রোগ্রামিং অনুশীলন?
bool stringIsTrue(int arg)
{
if (arg.toString() == "0")
{
return false;
}
else
{
return true;
}
}
bool stringIsTrue(Object arg)
{
if (arg.toString() == "0")
{
return false;
}
else
{
return true;
}
}
bool stringIsTrue(string arg)
{
if (arg == "0")
{
return false;
}
else
{
return true;
}
}
হ্যাঁ, দ্বারা এবং বড়। এই বিশেষ উদাহরণে এটি কাউকে নির্দিষ্ট আদিম ধরণের ক্ষেত্রে প্রয়োগ করার চেষ্টা করা এবং অপ্রত্যাশিত আচরণ ফিরে পেতে (যেটি ভাল জিনিস হতে পারে) থেকে বিরত রাখতে পারে; তবে আসুন আমরা কেবল ধরে নিই যে আমি উপরের কোডটি সংক্ষেপে জানিয়েছি, এবং আসলে, আপনি সমস্ত আদিম ধরণের, পাশাপাশি এসগুলির জন্য ওভারলোড করেছেন Object
। তারপরে কোডটির এই পরবর্তী বিটটি আরও উপযুক্ত:
bool stringIsTrue(untyped arg)
{
if (arg.toString() == "0")
{
return false;
}
else
{
return true;
}
}
তবে যদি আপনার কেবলমাত্র int
এস এবং string
এসগুলির জন্য এটি ব্যবহারের প্রয়োজন হয় এবং আপনি যদি সেই অনুসারে সহজ বা আরও জটিল অবস্থার উপর ভিত্তি করে সত্যটি ফিরে আসতে চান তবে কি হবে? তারপরে আপনার ওভারলোডিং ব্যবহারের ভাল কারণ রয়েছে:
bool appearsToBeFirstFloor(int arg)
{
if (arg.digitAt(0) == 1)
{
return true;
}
else
{
return false;
}
}
bool appearsToBeFirstFloor(string arg)
{
string firstCharacter = arg.characterAt(0);
if (firstCharacter.isDigit())
{
return appearsToBeFirstFloor(int(firstCharacter));
}
else if (firstCharacter.toUpper() == "A")
{
return true;
}
else
{
return false;
}
}
তবে আরে, কেন এই ফাংশনগুলিকে কেবল দুটি ভিন্ন নাম দেওয়া যায় না? আপনার এখনও একই পরিমাণে সূক্ষ্ম নিয়ন্ত্রণ রয়েছে, তাই না?
কারণ, যেমন আগেই বলা হয়েছে, কিছু হোটেল সংখ্যা ব্যবহার করে, কিছু ব্যবহার করে চিঠি এবং কিছু সংখ্যক এবং বর্ণের মিশ্রণ ব্যবহার করে:
appearsToBeFirstFloor(roomNumber[someSortOfKey]);
// will treat ints and strings differently, without you having to write extra code
// every single spot where the function is being called
এটি এখনও বাস্তব জীবনে আমি যে সঠিক কোডটি ব্যবহার করব ঠিক তেমনটি নয় তবে এটি যে পয়েন্টটি ঠিক ঠিক করছি তা তুলে ধরা উচিত।
তবে ... এটি কেন সমসাময়িক ভাষাগুলিতে সিনট্যাকটিক চিনির চেয়ে বেশি নয়।
ফ্যালকো মন্তব্যগুলিতে এই বক্তব্যটি উত্থাপন করেছিলেন যে বর্তমান ভাষা মূলত একই পদক্ষেপের মধ্যে পদ্ধতি ওভারলোডিং এবং গতিশীল ফাংশন নির্বাচনকে মেশায় না। আমি কিছু ভাষা নির্দিষ্টভাবে কাজ করার জন্য যেভাবে বুঝেছিলাম তা হ'ল আপনি appearsToBeFirstFloor
উপরের উদাহরণে ওভারলোড করতে পারবেন এবং তারপরে ভাষাটি টাইপ করা চলকটির রানটাইম মানের উপর নির্ভর করে ফাংশনের কোন সংস্করণটি ডাকা হবে তা রানটাইম সময়ে নির্ধারণ করবে। এই বিভ্রান্তিটি অ্যাকশনস্ক্রিপ্ট ৩.০ এর মতো ইসিএমএ-প্রকারের ভাষাগুলির সাথে কাজ করে আংশিকভাবে উদ্ভূত হয়েছিল, যার ফলে আপনি সহজেই এলোমেলো করতে পারবেন কোন ফাংশনটি রানটাইমের সময় কোডের একটি নির্দিষ্ট লাইনে ডাকা হয়।
আপনি জানেন যে, অ্যাকশনস্ক্রিপ্ট 3 পদ্ধতি ওভারলোডিং সমর্থন করে না। ভিবি.এনইটি হিসাবে, আপনি কোনও প্রকার স্পষ্টভাবে বরাদ্দ না করে ভেরিয়েবলগুলি ডিক্লেয়ার এবং সেট করতে পারেন, তবে আপনি যখন ওভারলোডেড পদ্ধতিতে এই ভেরিয়েবলগুলি আর্গুমেন্ট হিসাবে পাস করার চেষ্টা করেন, তখনও কোন পদ্ধতিটি কল করতে হবে তা নির্ধারণ করার জন্য এটি রানটাইম মানটি পড়তে চায় না; পরিবর্তে এটি টাইপ Object
বা কোনও প্রকারের বা অন্য কোনও জাতীয় আর্গুমেন্ট সহ একটি পদ্ধতি খুঁজে পেতে চায় । সুতরাং উপরের int
বনাম string
উদাহরণটি সেই ভাষাতেও কাজ করবে না। সি ++ এর মতোই সমস্যা রয়েছে, আপনি যখন কোনও শূন্য পয়েন্টার বা অন্য কোনও প্রক্রিয়া জাতীয় কিছু ব্যবহার করেন, তখনো আপনাকে সঙ্কলন করার সময় টাইপটি ম্যানুয়ালি বিচ্ছিন্ন করা প্রয়োজন।
প্রথম শিরোনামটি যেমন বলে ...
সমসাময়িক ভাষার জন্য, এটি কেবল সিনট্যাকটিক চিনি; সম্পূর্ণ ভাষা-অজ্ঞাতসৃষ্টিক পদ্ধতিতে এটি এর চেয়ে বেশি। পদ্ধতির ওভারলোডিংকে আরও দরকারী এবং প্রাসঙ্গিক তৈরি করা, যেমন উপরের উদাহরণের মতো, একটি বিদ্যমান ভাষার সাথে যুক্ত করার জন্য প্রকৃতপক্ষে একটি ভাল বৈশিষ্ট্য হতে পারে (যেমন AS3 এর জন্য বিস্তৃতভাবে অনুরোধ করা হয়েছে), বা এটি বিভিন্ন বিভিন্ন মৌলিক স্তম্ভগুলির মধ্যে একটি হিসাবে কাজ করতে পারে একটি নতুন পদ্ধতিগত / অবজেক্ট-ভিত্তিক ভাষা তৈরি করা।