আমি দেখতে পাচ্ছি যে ইতিমধ্যে ইতিমধ্যে বেশ কয়েকটি উত্তম উত্তর রয়েছে। যার মধ্যে আমি পুনরাবৃত্তি করব তবে কখনও কখনও আপনি কেবল নিজের কথায় জিনিস রাখতে চান। আমি সি ++ এর কয়েকটি উদাহরণের সাথে মন্তব্য করব কারণ এটি সেই ভাষা যার সাথে আমার সর্বাধিক পরিচিতি রয়েছে।
যা প্রয়োজন তা কখনই বোকামি না। অন্যান্য ভাষার বৈশিষ্ট্যগুলিকে ব্যবহারিক করে তোলার জন্য প্রকার অনুকরণ প্রয়োজনীয় necessary সি ++ তে অপরিবর্তনীয় ধরণের হওয়া সম্ভব।
struct {
double x, y;
} p0 = { 0.0, 0.0 };
// there is no name for the type of p0
auto p1 = p0;
সি ++ 11 যুক্ত ল্যাম্বডাস যা অযোগ্যও নয়।
auto sq = [](int x) {
return x * x;
};
// there is no name for the type of sq
টাইপ অনুমান এছাড়াও টেমপ্লেট আন্ডারপাইন।
template <class x_t>
auto sq(x_t const& x)
{
return x * x;
}
// x_t is not known until it is inferred from an expression
sq(2); // x_t is int
sq(2.0); // x_t is double
তবে আপনার প্রশ্নগুলি ছিল "প্রোগ্রামার আমি কেন কোডটি পড়তে চাইলে আমার ভেরিয়েবলের ধরণটি নির্ধারণ করতে চাই? কোন ধরণের কী আছে তা ভাবার চেয়ে কেবল টাইপটি পড়া কি আরও দ্রুত হয় না?"
প্রকারের অনুমানটি অপ্রয়োজনীয়তা দূর করে। কোড পড়ার ক্ষেত্রে যখনই কোডটিতে অপ্রয়োজনীয় তথ্য থাকা কখনও কখনও দ্রুত এবং সহজতর হতে পারে তবে অতিরিক্ত তথ্য দরকারী তথ্যকে ছাপিয়ে যেতে পারে । উদাহরণ স্বরূপ:
std::vector<int> v;
std::vector<int>::iterator i = v.begin();
সি ++ প্রোগ্রামার সনাক্ত করতে আমি যে একজন পুনরুক্তিকারী i = v.begin()
তাই স্পষ্টত প্রকারের ঘোষণাটি সীমিত মানের জন্য এটি স্ট্যান্ডার্ড লাইব্রেরির সাথে খুব বেশি পরিচিতি লাভ করে না । এর উপস্থিতি দ্বারা এটি বিশদগুলিকে অস্পষ্ট করে যা আরও গুরুত্বপূর্ণ (যেমন i
ভেক্টরের শুরুর দিকে নির্দেশ করে)। @ ইমনের উত্তম উত্তরটি গুরুত্বপূর্ণ বিবরণকে ছাপিয়ে ভার্বোসটির আরও ভাল উদাহরণ সরবরাহ করে। বিপরীতে টাইপ ইনফারেন্স ব্যবহার করে গুরুত্বপূর্ণ বিশদটিকে আরও বেশি গুরুত্ব দেওয়া হয়।
std::vector<int> v;
auto i = v.begin();
পঠন কোডটি গুরুত্বপূর্ণ, যদিও এটি পর্যাপ্ত নয়, এক পর্যায়ে আপনাকে পড়া বন্ধ করতে হবে এবং নতুন কোড লেখা শুরু করতে হবে। কোডে অপ্রয়োজনীয় কোড সংশোধনকারীকে ধীর এবং শক্ত করে তোলে। উদাহরণস্বরূপ, বলুন যে আমার কাছে কোডের নিম্নাংশ রয়েছে:
std::vector<int> v;
std::vector<int>::iterator i = v.begin();
কোডটি দ্বিগুণ করার জন্য আমাকে ভেক্টরের মান ধরণের পরিবর্তন করতে হবে:
std::vector<double> v;
std::vector<double>::iterator i = v.begin();
এই ক্ষেত্রে আমাকে কোডটি দুটি জায়গায় সংশোধন করতে হবে। মূল কোডটি যেখানে প্রকারের অনুক্রমের সাথে বিপরীতে:
std::vector<int> v;
auto i = v.begin();
এবং সংশোধিত কোড:
std::vector<double> v;
auto i = v.begin();
নোট করুন যে আমাকে এখন কেবল কোডের একটি লাইন পরিবর্তন করতে হবে। এটি একটি বৃহত প্রোগ্রামে এক্সট্রপোলেট করুন এবং টাইপ ইনফারেন্স এডিটরের চেয়ে আপনি যত দ্রুত করতে পারেন প্রকারভেদে পরিবর্তনগুলি প্রচার করতে পারে।
কোডে অপ্রয়োজনীয়তা বাগের সম্ভাবনা তৈরি করে। যে কোনও সময় আপনার কোড দুটি টুকরো তথ্যের সমতুল্য রাখার উপর নির্ভর করে ভুল হওয়ার সম্ভাবনা রয়েছে। উদাহরণস্বরূপ, এই বিবৃতিতে দুটি ধরণের মধ্যে একটি অসঙ্গতি রয়েছে যা সম্ভবত উদ্দেশ্যযুক্ত নয়:
int pi = 3.14159;
অপ্রয়োজনীয় বিষয়গুলি বোঝা শক্ত করে তোলে। কিছু ক্ষেত্রে টাইপ অনুক্রমটি পড়া এবং বোঝা সহজ হতে পারে কারণ এটি স্পষ্টত ধরণের স্পেসিফিকেশনের চেয়ে সহজ। কোডের খণ্ডটি বিবেচনা করুন:
int y = sq(x);
যদি যে sq(x)
আয় একটি int
, তাই নয় সুস্পষ্ট কিনা y
একটি হল int
, কারণ এটি ফেরত ধরনের sq(x)
বা কারণ এটি মামলা বিবৃতি ব্যবহারের y
। যদি আমি অন্য কোডগুলি পরিবর্তন করি যে sq(x)
আর আর ফিরে আসে না int
, তবে line লাইনটি থেকে একাই অনিশ্চিত হয় যে প্রকারটি y
আপডেট করা উচিত। একই কোডের সাথে বৈসাদৃশ্য করুন তবে টাইপ অনুমান ব্যবহার করুন:
auto y = sq(x);
এতে উদ্দেশ্যটি পরিষ্কার, y
অবশ্যই ফিরে আসা একই ধরণের হতে হবে sq(x)
। কোড যখন রিটার্নের ধরণ পরিবর্তন করে sq(x)
, y
পরিবর্তনের ধরণটি স্বয়ংক্রিয়ভাবে মেলে।
সি ++ তে দ্বিতীয় কারণ রয়েছে যে উপরের উদাহরণটি টাইপ অনুক্রমের সাথে সহজ, টাইপ ইনফারেন্স অন্তর্ভুক্ত প্রকারের রূপান্তরটি প্রবর্তন করতে পারে না। যদি রিটার্নের ধরণটি sq(x)
না হয় int
তবে সংকলকটি নিঃশব্দে এতে অন্তর্ভুক্ত রূপান্তর conversোকান int
। যদি রিটার্ন টাইপ sq(x)
কোনও ধরণের জটিল ধরণ যা সংজ্ঞায়িত করে তবে operator int()
এই লুকানো ফাংশন কলটি নির্বিচারে জটিল হতে পারে।