প্রথমত, কিছু পরিভাষা:
- ব্যবহার-ঘোষণা :
using std::vector;
- ব্যবহার-নির্দেশিকা :
using namespace std;
আমি মনে করি যে ব্যবহার -নির্দেশাবলী ব্যবহার করা ঠিক আছে, যতক্ষণ না তারা শিরোনাম ফাইলে বৈশ্বিক সুযোগে ব্যবহার না করে। তাই হচ্ছে
using namespace std;
আপনার .cpp ফাইলটিতে আসলেই কোনও সমস্যা নয় এবং এটি যদি পরিণত হয় তবে এটি সম্পূর্ণরূপে আপনার নিয়ন্ত্রণে রয়েছে (এবং এটি যদি ইচ্ছা হয় তবে নির্দিষ্ট ব্লকেও স্কোপ করা যেতে পারে)। আমি বেশ কয়েকজন বাছাইপর্বের সাথে কোডটি বিশৃঙ্খলা করার কোনও বিশদ কারণ দেখছি না std::
- এটি কেবল ভিজ্যুয়াল শোরগোল হয়ে যায়। তবে, আপনি যদি std
নিজের কোডের নামস্থান থেকে পুরো গোছাটি নাম ব্যবহার না করে থাকেন তবে আমিও নির্দেশটি রেখে যেতে কোনও সমস্যা দেখছি না। এটি একটি টোটোলজি - যদি নির্দেশের প্রয়োজন না হয় তবে এটি ব্যবহার করার দরকার নেই।
একইভাবে, আপনি যদি নেমস্পেসে স্পিফিক ধরণের জন্য কয়েকটি ব্যবহার- বিবরণী ( নির্দেশ-নির্দেশের পরিবর্তে ) দিয়ে পেতে পারেন, তবে আপনার std
বর্তমান নামের জায়গাগুলিতে কেবল এই স্পেফিসিফিক নামগুলি না রাখার কোনও কারণ নেই। একই টোকেন দ্বারা, আমি মনে করি এটি পাগল হবে এবং বুককিপিংয়ের ঝামেলা 25 বা 30 ব্যবহারের-ঘোষণা থাকতে হবে যখন কোনও একক ব্যবহারের নির্দেশিকাও ঠিক সেই কৌশলটি করতে পারে।
এটা মনে রাখাও বেশ ভাল যে আপনি যখন কোনও সময় -ব্যবহার-বিবৃতি ব্যবহার করতেই পারেন তখনও । স্কট মেয়ার্সের "আইটেম 25: এফেক্টিভ সি ++, তৃতীয় সংস্করণ থেকে নিক্ষেপকারী অদলবদল করার জন্য সমর্থন বিবেচনা করুন" দেখুন। প্যারামিটারাইজড টাইপের জন্য জেনেরিক, টেম্পলেটড ফাংশনটি 'বেস্ট' অদলবদল পদ্ধতিটি ব্যবহার করার জন্য, আপনাকে একটি ঘোষণাপত্র এবং যুক্তি নির্ভর নির্ভরতা (ওরফে এডিএল বা কোনিগ লুকআপ) ব্যবহার করতে হবে:
template< typename T >
void foo( T& x, T& y)
{
using std::swap; // makes std::swap available in this function
// do stuff...
swap( x, y); // will use a T-specific swap() if it exists,
// otherwise will use std::swap<T>()
// ...
}
আমি মনে করি আমাদের বিভিন্ন ভাষাগুলির জন্য সাধারণ আইডিয়াগুলিতে নজর দেওয়া উচিত যা নেমস্পেসগুলির উল্লেখযোগ্য ব্যবহার করে। উদাহরণস্বরূপ, জাভা এবং সি # বেশিরভাগ ক্ষেত্রে নেমস্পেস ব্যবহার করে (যুক্তিযুক্তভাবে C ++ এর চেয়ে বেশি)। নামের জায়গাগুলির মধ্যে সর্বাধিক সাধারণ যে নামগুলি সেই ভাষাগুলিতে ব্যবহৃত হয় তা হ'ল ব্যবহারের দিকনির্দেশকের সমতুল্য ম্যাসেজকে বর্তমান স্কোপে আনা। এটি বিস্তৃত সমস্যা সৃষ্টি করে না, এবং কয়েকবার সমস্যা হ'ল সম্পূর্ণ ব্যতীত নামগুলির মাধ্যমে প্রশ্নের সাথে নামগুলি নিয়ে বা আলিয়াসিংয়ের মাধ্যমে 'ব্যতিক্রম' ভিত্তিতে পরিচালনা করা হয় - ঠিক যেমন সি ++ তেও করা যেতে পারে।
ভেষজ সুটার এবং আন্দ্রে আলেকজান্ড্রেসকুকে "আইটেম 59: - এ হেডারের ফাইলে বা তাদের বই, সি ++ কোডিং স্ট্যান্ডার্ডস: 101 টি নিয়ম, গাইডলাইন এবং সেরা অনুশীলনগুলির একটি # অন্তর্ভুক্ত" এর আগে নেমস্পেস ইউজিং লিখবেন না:
সংক্ষেপে: আপনি নির্দেশাবলীর পরে আপনার প্রয়োগকারী ফাইলগুলিতে উদারভাবে ঘোষণা এবং নির্দেশাবলী ব্যবহার করে নেমস্পেস ব্যবহার করতে পারেন এবং #include
এটি সম্পর্কে ভাল অনুভব করতে পারেন। এর বিপরীতে বারবার দাবি করা সত্ত্বেও, ঘোষণা এবং নির্দেশাবলী ব্যবহার করে নেমস্পেস খারাপ নয় এবং তারা নেমস্পেসের উদ্দেশ্যকে পরাভূত করে না। বরং, তারা হ'ল নেমস্পেসকে ব্যবহারযোগ্য করে তোলে।
"দ্য সি ++ প্রোগ্রামিং ল্যাঙ্গুয়েজ, তৃতীয় সংস্করণ" তে স্ট্রুপস্ট্রাপকে প্রায়শই বলা হয়, "গ্লোবাল নেমস্পেস দূষিত করবেন না"। তিনি আসলে এটি বলেছিলেন (সি .১৪ [১৫]), কিন্তু সি.১০.১ অধ্যায়টি উল্লেখ করেছেন যেখানে তিনি বলেছেন:
একটি ব্যবহার-বিবৃতি একটি স্থানীয় সুযোগে একটি নাম যুক্ত করে। একটি ব্যবহার-নির্দেশনা দেয় না; এটি কেবলমাত্র যে ক্ষেত্রগুলিতে ঘোষিত হয়েছিল সেগুলিতে নামগুলিকে অ্যাক্সেসযোগ্য রেন্ডার করে। উদাহরণ স্বরূপ:
namespaceX {
int i , j , k ;
}
int k ;
void f1()
{
int i = 0 ;
using namespaceX ; // make names from X accessible
i++; // local i
j++; // X::j
k++; // error: X::k or global k ?
::k ++; // the global k
X::k ++; // X’s k
}
void f2()
{
int i = 0 ;
using X::i ; // error: i declared twice in f2()
using X::j ;
using X::k ; // hides global k
i++;
j++; // X::j
k++; // X::k
}
স্থানীয়ভাবে ঘোষিত নাম (কোনও সাধারণ ঘোষণার মাধ্যমে বা কোনও ঘোষণার মাধ্যমে ঘোষিত) একই নামের অলৌকিক ঘোষণাকে আড়াল করে, এবং নামের কোনও অবৈধ ওভারলোডিং ঘোষণার স্থানে সনাক্ত করা হয়।
k++
ইন
জন্য অস্পষ্টতা ত্রুটি নোট করুন f1()
। বিশ্বব্যাপী সুযোগগুলিকে অ্যাক্সেসযোগ্য করে দেওয়া নাম স্থানগুলির নামগুলির চেয়ে বিশ্বব্যাপী নামগুলিকে অগ্রাধিকার দেওয়া হয় না। এটি দুর্ঘটনাজনিত নাম সংঘর্ষের বিরুদ্ধে উল্লেখযোগ্য সুরক্ষা সরবরাহ করে এবং - গুরুত্বপূর্ণভাবে - তা নিশ্চিত করে যে বিশ্বব্যাপী নেমস্পেসকে দূষিত করার কোনও সুবিধা নেই।
নির্দেশাবলী ব্যবহারের মাধ্যমে অনেক নাম ঘোষণাকারী লাইব্রেরিগুলি অ্যাক্সেসযোগ্য হয়ে ওঠে, অব্যবহৃত নামগুলির সংঘর্ষকে ত্রুটি হিসাবে বিবেচনা করা হয় না এটি একটি গুরুত্বপূর্ণ সুবিধা।
...
আমি আশা করি traditionalতিহ্যবাহী সি এবং সি ++ প্রোগ্রামের তুলনায় নতুন জায়গাগুলিতে নেমস্পেস ব্যবহার করে বিশ্বব্যাপী নাম ব্যবহারের ক্ষেত্রে আমূল কমেছে see যে কেউ বিশ্বব্যাপী সুযোগকে দূষিত না করার বিষয়ে যত্ন নেয় সে সম্পর্কে বিশ্বব্যাপী নামের '' অলস '' ব্যবহারকারীর কোনও সুবিধা না দেওয়ার জন্য বিশেষ করে নাম স্থানগুলির নিয়মগুলি রচনা করা হয়েছিল।
এবং 'গ্লোবাল নামগুলির অলস ব্যবহারকারী' এর মতো একই সুবিধা কীভাবে পাওয়া যায়? ব্যবহারের দিকনির্দেশনার সুযোগ নিয়ে, যা নিরাপদে একটি নামস্থানে নামগুলি বর্তমান স্কোপে উপলব্ধ করে।
মনে রাখবেন যে এর মধ্যে একটি পার্থক্য রয়েছে - std
ব্যবহারের নির্দেশের সঠিক ব্যবহারের সাথে (নির্দেশের পরে নির্দেশ রেখে #includes
) নামের জায়গাগুলির নামগুলি বিশ্বব্যাপী নেমস্পেসকে দূষিত করে না । এটি কেবল এই নামগুলি সহজেই উপলব্ধ করে তুলেছে এবং সংঘর্ষের বিরুদ্ধে অবিচ্ছিন্ন সুরক্ষা দিয়ে।