c++ - কেন "নামস্থান স্টেডিয়াম ব্যবহার করে" খারাপ অভ্যাস বিবেচনা করা হয়?




namespaces std (20)

বিশ্বব্যাপী এটি ব্যবহার করবেন না

বিশ্বব্যাপী ব্যবহৃত যখন এটি "খারাপ" শুধুমাত্র বিবেচনা করা হয় । কারণ:

  • আপনি যে নামস্পেসে প্রোগ্রামিং করছেন সেটি হ্রাস করুন।
  • যখন আপনি using namespace xyz ব্যবহার করে অনেকগুলি using namespace xyz তখন কোনও নির্দিষ্ট শনাক্তকারী কোথা থেকে আসে তা পাঠকদের অসুবিধা হবে।
  • আপনার সোর্স কোডের অন্যান্য পাঠকদের জন্য যা কিছু সত্য তা সবচেয়ে বেশি পাঠকের জন্য আরও সত্য: নিজেকে। একটি বা দুই বছর ফিরে আসা এবং একটি চেহারা নিতে ...
  • আপনি যদি কেবলমাত্র using namespace std সম্পর্কে কথা বলেন তবে আপনি যে সমস্ত জিনিসগুলি using namespace std সে সম্পর্কে সচেতন থাকবেন না - এবং যখন আপনি অন্য কোনও যুক্ত করবেন #include বা একটি নতুন সি ++ পুনর্বিবেচনে যান তখন আপনাকে using namespace std দ্বন্দ্ব হতে পারে যা আপনি অবগত ছিলেন না।

আপনি স্থানীয়ভাবে এটি ব্যবহার করতে পারেন

এগিয়ে যান এবং স্থানীয়ভাবে (প্রায়) অবাধে ব্যবহার করুন। এটি অবশ্যই, std:: পুনরাবৃত্তি থেকে আপনাকে আটকায় - এবং পুনরাবৃত্তিটিও খারাপ।

স্থানীয়ভাবে এটি ব্যবহার করার জন্য একটি idiom

C ++ 03 এ একটি idiom - boilerplate কোড ছিল - আপনার ক্লাসগুলির জন্য একটি swap ফাংশন বাস্তবায়ন করার জন্য। এটি প্রস্তাব করা হয়েছে যে আপনি প্রকৃতপক্ষে using namespace std স্থানীয় using namespace std - অথবা অন্তত using std::swap :

class Thing {
    int    value_;
    Child  child_;
public:
    // ...
    friend void swap(Thing &a, Thing &b);
};
void swap(Thing &a, Thing &b) {
    using namespace std;      // make `std::swap` available
    // swap all members
    swap(a.value_, b.value_); // `std::stwap(int, int)`
    swap(a.child_, b.child_); // `swap(Child&,Child&)` or `std::swap(...)`
}

এই নিম্নলিখিত জাদু না

  • কম্পাইলার value_ std::swap value_ জন্য নির্বাচন করবে, value_ void std::swap(int, int)
  • যদি আপনার একটি ওভারলোড void swap(Child&, Child&) প্রয়োগ করা হয় তবে কম্পাইলার এটি চয়ন করবে।
  • যদি আপনার ওভারলোড না থাকে তবে কম্পাইলারটি void std::swap(Child&,Child&) ব্যবহার করবে এবং এর সর্বোত্তম swapping চেষ্টা করবে।

সি ++ 11 এর সাথে আর এই প্যাটার্ন ব্যবহার করার কোন কারণ নেই। std::swap প্রয়োগের ফলে সম্ভাব্য ওভারলোড সনাক্ত করা হয়েছে এবং এটি নির্বাচন করা হয়েছে।

আমি অন্যদের দ্বারা বলা হয়েছে যে কোডে using namespace std লেখা ভুল, এবং আমি সরাসরি পরিবর্তে std::cout এবং std::cin ব্যবহার করা উচিত।

কেন using namespace std একটি খারাপ অভ্যাস বিবেচনা করা হয়? এটি কি অকার্যকর বা দ্বিধান্বিত ভেরিয়েবল ঘোষণা করতে ঝুঁকিপূর্ণ ( std নামস্থানতে ফাংশন হিসাবে একই নাম ভাগ করে এমন ভেরিয়েবল)? এটা কর্মক্ষমতা প্রভাবিত করে?


  1. আপনি আপনার চেয়ে বিভিন্ন শৈলী এবং ভাল অনুশীলন মতামত আছে যারা লেখা কোড পড়তে সক্ষম হতে হবে।

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


আপনার ক্লাসের হেডার ফাইলগুলিতে using namespace সমস্যা হচ্ছে যে এটি যে কেউ আপনার ক্লাসগুলি (আপনার শিরোনাম ফাইলগুলি সহ) ব্যবহার করতে চায় সেগুলিকে অন্যান্য ব্যবহারকারীর নামগুলি ব্যবহার করে 'ব্যবহার করা' (অর্থাত্ সবকিছু দেখতে)।

যাইহোক, আপনি আপনার (ব্যক্তিগত) *। সিপিপি ফাইলগুলির মধ্যে একটি ব্যবহার বিবৃতি মুক্ত করতে পারেন।

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

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

প্রায়শই জিজ্ঞাসিত প্রশ্নাবলী দুটি বিকল্প প্রস্তাব করে:

  • একটি ব্যবহার-ঘোষণা:

    using std::cout; // a using-declaration lets you use cout without qualification
    cout << "Values:";
    
  • শুধু টাইড টাইপ ::

    std::cout << "Values:";
    

আপনি সঠিক শিরোনাম ফাইলগুলি আমদানি করলে হঠাৎ hex , left , plus বা আপনার বিশ্বব্যাপী সুযোগের মতো নামগুলি hexstd:: এই নামগুলি ধারণ করে আপনি যদি সচেতন না হন তবে এটি std:: হতে পারে। আপনি যদি স্থানীয়ভাবে এই নামগুলি ব্যবহার করার চেষ্টা করেন তবে এটি বেশ কিছু বিভ্রান্তির কারণ হতে পারে।

যদি সমস্ত মান স্টাফ নিজস্ব নামস্থান হয় তবে আপনাকে আপনার কোড বা অন্যান্য লাইব্রেরিগুলির সাথে নাম সংঘর্ষের বিষয়ে চিন্তা করতে হবে না।


আমি সম্প্রতি Visual Studio 2010 একটি অভিযোগে দৌড়েছি। এটি পরিণত হয়েছে যে বেশিরভাগ উৎস ফাইলগুলিতে এই দুটি লাইন রয়েছে:

using namespace std;
using namespace boost;

অনেকগুলি Boost বৈশিষ্ট্যগুলি সি ++ 0x মানের মধ্যে যাচ্ছে এবং ভিজ্যুয়াল স্টুডিও ২010 এর অনেকগুলি সি ++ 0x বৈশিষ্ট্য রয়েছে, তাই হঠাৎ এই প্রোগ্রামগুলি কম্পাইল হচ্ছে না।

অতএব, using namespace X; এড়িয়ে using namespace X; ভবিষ্যতে-প্রমাণীকরণের একটি ফর্ম, লাইব্রেরি এবং / অথবা শিরোনাম ফাইলগুলিতে কোনও পরিবর্তন একটি প্রোগ্রাম ভাঙ্গতে যাচ্ছে না তা নিশ্চিত করার একটি উপায়।


আমি সম্মত হচ্ছি যে এটি বিশ্বব্যাপী ব্যবহার করা উচিত নয়, তবে এটি একটি স্থানীয় স্থান হিসাবে স্থানীয়ভাবে ব্যবহার করা খুব খারাপ নয়। এখানে "সি ++ প্রোগ্রামিং ভাষা" থেকে একটি উদাহরণ দেওয়া হয়েছে:

namespace My_lib {

    using namespace His_lib; // everything from His_lib
    using namespace Her_lib; // everything from Her_lib

    using His_lib::String; // resolve potential clash in favor of His_lib
    using Her_lib::Vector; // resolve potential clash in favor of Her_lib

}

এই উদাহরণে, আমরা সম্ভাব্য নাম সংঘর্ষ এবং তাদের রচনা থেকে উদ্ভূত ambiguities সমাধান।

নামগুলি স্পষ্টভাবে ঘোষণা করা হয়েছে (সহ-ঘোষণাগুলি সহ ঘোষিত নামগুলি সহ His_lib::String ) নামগুলি ব্যবহার করে একটি নির্দেশ-নির্দেশনা ( using namespace Her_lib ) using namespace Her_lib


এই কর্মক্ষমতা সম্পর্কিত সব নয়। কিন্তু এটি বিবেচনা করুন: আপনি ফু এবং বার নামে দুটি লাইব্রেরি ব্যবহার করছেন:

using namespace foo;
using namespace bar;

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

যদি আপনি foo::Blah() এবং bar::Quux() তবে foo::Quux() প্রবর্তনটি একটি অ-ইভেন্ট হতে পারে।


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

template <typename FloatType> inline
FloatType compute_something(FloatType x)
{
    using namespace std; //no problem since scope is limited
    return exp(x) * (sin(x) - cos(x * 2) + sin(x * 3) - cos(x * 4));
}

এটি সুস্পষ্ট যোগ্যতা ( std::sin , std::cos ...) এর চাইতেও ভাল কারণ এটি সংক্ষিপ্ত এবং ব্যবহারকারীর সংজ্ঞায়িত ভাসমান বিন্দু প্রকারের (আর্গুমেন্ট নির্ভরশীল সন্ধানের মাধ্যমে) কাজ করার ক্ষমতা আছে।


এটা জটিলতা ব্যবস্থাপনা সম্পর্কে সব। নামস্থান ব্যবহার করে এমন জিনিসগুলি টেনে আনবে যা আপনি চান না এবং এইভাবে সম্ভবত এটি ডিবাগ করা কঠিন (আমি সম্ভবত বলি)। Std :: ব্যবহার করে সব জায়গাতেই পড়তে কঠিন হয় (আরো লেখা এবং সবগুলি)।

কোর্সের জন্য ঘোড়া - আপনার জটিলতাকে পরিচালনা করুন যা আপনি সর্বোত্তম এবং সক্ষম বোধ করতে পারেন।


কোডটি দেখতে সুন্দর এবং এটি কী করে তা জানা। যদি আমি std::cout দেখি তবে আমি জানি যে এটি std লাইব্রেরির cout stream। যদি আমি cout দেখতে তারপর আমি জানি না। এটি std লাইব্রেরি cout প্রবাহ হতে পারে। অথবা একটি int cout = 0; হতে পারে int cout = 0; একই ফাংশন উচ্চ দশ লাইন। অথবা একটি static পরিবর্তনশীল যে ফাইল cout নামে। এটা কিছু হতে পারে।

এখন লক্ষ লক্ষ লাইন কোড বেস নিন যা বিশেষত বড় নয় এবং আপনি একটি বাগ অনুসন্ধান করছেন, যার মানে আপনি জানেন যে এই এক মিলিয়ন লাইনগুলির মধ্যে একটি লাইন রয়েছে যা এটি করতে অনুমিত হয় না। cout << 1; cout নামক একটি static int পড়তে পারে, বাম দিকে এক বিট সরানো, এবং ফলাফল দূরে নিক্ষেপ। একটি বাগ খুঁজছেন, আমি যে চেক করতে হবে। std::cout দেখতে সত্যিই আমি কীভাবে পছন্দ std::cout ?

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


গ্রেগের লেখা সবকিছু নিয়ে আমি একমত, কিন্তু আমি যোগ করতে চাই: গ্রেগের চেয়েও খারাপ হতে পারে!

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

মনে রাখবেন যে std নামস্থানটিতে টন শনাক্তকারী রয়েছে, এর মধ্যে বেশিরভাগই খুব সাধারণ (চিন্তা list , sort , string , iterator ইত্যাদি) যা অন্যান্য iterator খুব সম্ভবত উপস্থিত হওয়ার সম্ভাবনা রয়েছে।

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

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

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

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


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

আমি সাধারণত আমার ক্লাস ঘোষণায় এটি ব্যবহার করি কারণ ক্লাসে পদ্ধতিগুলি অনুরূপ ডেটা ধরনের (সদস্যদের) সাথে মোকাবিলা করতে থাকে এবং টাইপডফ ক্লাসের প্রসঙ্গে অর্থপূর্ণ এমন একটি নাম বরাদ্দ করার একটি সুযোগ। এটি আসলে ক্লাস পদ্ধতিগুলির সংজ্ঞাগুলিতে পাঠযোগ্যতা সহায়তা করে।

//header
class File
{
   typedef std::vector<std::string> Lines;
   Lines ReadLines();
}

এবং বাস্তবায়ন:

//cpp
Lines File::ReadLines()
{
    Lines lines;
    //get them...
    return lines;
}

উল্টোদিকে:

//cpp
vector<string> File::ReadLines()
{
    vector<string> lines;
    //get them...
    return lines;
}

বা:

//cpp
std::vector<std::string> File::ReadLines()
{
    std::vector<std::string> lines;
    //get them...
    return lines;
}

বিবেচনা

// myHeader.h
#include <sstream>
using namespace std;


// someoneElses.cpp/h
#include "myHeader.h"

class stringstream {  // uh oh
};

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

এটি ভয়ঙ্কর নয় তবে আপনি শিরোনাম ফাইলগুলিতে বা গ্লোবাল নেমস্পেসে এটি ব্যবহার না করে নিজের মাথা ব্যাথা পাবেন। খুব সীমিত স্কোপগুলিতে এটি করা ঠিক আছে তবে আমার ফাংশনগুলি কোথা থেকে আসছে তা স্পষ্ট করার জন্য অতিরিক্ত 5 টি অক্ষর টাইপ করার সময় আমার কোন সমস্যা হয়নি।


অযোগ্য প্রমাণিত আইডেন্টিফায়ারগুলির সাথে আপনি কোথায় সনাক্তকারী ঘোষণা করা হয় তা খুঁজে বের করার জন্য grep এর মতো বাহ্যিক অনুসন্ধান সরঞ্জামগুলির প্রয়োজন । এই প্রোগ্রাম সঠিকতা সম্পর্কে যুক্তি তোলে কঠিন।


আমার অভিজ্ঞতা থেকে, যদি আপনার কাছে একাধিক লাইব্রেরি থাকে যা ব্যবহার করে বলে cout, তবে অন্য কোনও উদ্দেশ্যে আপনি ভুল ব্যবহার করতে পারেন cout

উদাহরণস্বরূপ, যদি আমি টাইপ করি, using namespace std;এবং (অথবা using namespace otherlib;উভয় ক্ষেত্রেই) টাইপ করি , তবে আপনি ভুলটি ব্যবহার করতে পারেন এবং ত্রুটিগুলি পেতে পারেন, এটি ব্যবহার করা আরও কার্যকর এবং কার্যকরী ।std::cout'otherlib::cout'std::cout


আমি অন্যদের সাথে একমত - এটি নাম সংঘর্ষের জন্য জিজ্ঞাসা করা হয়, ambiguities এবং তারপর সত্য কম স্পষ্ট। আমি ব্যবহার দেখতে পারেন using, আমার ব্যক্তিগত পছন্দ এটি সীমাবদ্ধ করা হয়। আমি দৃঢ়ভাবে কিছু অন্যদের ইঙ্গিত কি বিবেচনা করবে:

যদি আপনি কোনও ফাংশন নামটি খুঁজে পেতে চান যা মোটামুটি সাধারণ নাম হতে পারে তবে আপনি এটি কেবলমাত্র stdনামস্থান (অথবা বিপরীত - আপনি নাম্বার std, নামস্থান X, ... তে থাকা সকল কল পরিবর্তন করতে চান না ) তাহলে কিভাবে আপনি এই কাজ করার প্রস্তাব? আপনি এটি করতে একটি প্রোগ্রাম লিখতে পারেন তবে আপনার প্রকল্পের বজায় রাখার জন্য একটি প্রোগ্রাম লেখার পরিবর্তে আপনার প্রকল্পে সময় ব্যয় করা ভাল হবে না?

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

এটি অন্য একটি বিষয় যদিও এটি কিছুটা সম্পর্কিত এবং অন্যরা কীভাবে ইঙ্গিত দেয়। যদিও এটি খারাপ অনুশীলন হতে পারে তবে আমি মাঝে মাঝে std::nameস্ট্যান্ডার্ড লাইব্রেরির সংস্করণ এবং প্রোগ্রাম-নির্দিষ্ট বাস্তবায়নের জন্য সংরক্ষিত । হ্যাঁ, প্রকৃতপক্ষে এটি আপনাকে কামড়ায় এবং শক্ত করে কামড়ায় তবে এটি সবই নীচে আসে যে আমি এই প্রকল্পটি স্ক্র্যাচ থেকে শুরু করেছি এবং আমি এটির জন্য একমাত্র প্রোগ্রামার। উদাহরণ: আমি ওভারলোড std::stringএবং এটি কল string। আমি সহায়ক সংযোজন আছে। নিম্ন-ক্ষেত্রে নামগুলির দিকে আমার সি এবং ইউনিক্স (+ লিনাক্স) প্রবণতার কারণে আমি এটির অংশটি করেছি।

এছাড়া, আপনি নামস্থান alias থাকতে পারে। এখানে এটি এমন একটি উদাহরণ যেখানে এটি উল্লেখযোগ্য বলে উল্লেখ করা হয়েছে। আমি C ++ 11 মান এবং বিশেষ করে libstdc ++ দিয়ে ব্যবহার করি। আচ্ছা, এটা সম্পূর্ণ std::regexসমর্থন নেই। এটা কম্পাইল করা কিন্তু প্রোগ্রামার এর শেষে এটি একটি ত্রুটি হচ্ছে লাইন বরাবর একটি ব্যতিক্রম ছোঁড়ে। কিন্তু এটি বাস্তবায়ন অভাব। তাই এখানে আমি কিভাবে এটি সমাধান। বুস্টের রেজেক্স ইনস্টল করুন, এটিকে লিঙ্ক করুন। তারপরে, আমি নিম্নলিখিতটি করি যাতে যখন libstdc ++ সম্পূর্ণভাবে বাস্তবায়িত হয়, আমার কেবল এই ব্লকটি সরানো দরকার এবং কোড একই থাকে:

namespace std
{
    using boost::regex;
    using boost::regex_error;
    using boost::regex_replace;
    using boost::regex_search;
    using boost::regex_match;
    using boost::smatch;
    namespace regex_constants = boost::regex_constants;  
}

আমি যে একটি খারাপ ধারণা কিনা না বা তর্ক করা হবে না। তবে আমি বলব যে এটি আমার প্রকল্পের জন্য এটি পরিষ্কার রাখে এবং একই সাথে এটি নির্দিষ্ট করে তোলে: সত্যই আমাকে বুস্ট ব্যবহার করতে হবে তবে আমি এটি ব্যবহার করব যেমন libstdc ++ এর অবশেষে এটি থাকবে। হ্যাঁ, আপনার নিজের প্রকল্পটি শুরু করুন এবং শুরুতে (...) শুরু থেকেই প্রজেক্ট, উন্নয়ন এবং প্রকল্পের সাথে জড়িত সবকিছু নিয়ে খুব দীর্ঘ পথ চলে!

সম্পাদনা:
এখন আমি সময় আছে, শুধু কিছু ব্যাখ্যা। আমি আসলে কোনও শ্রেণী / কোনও এসটিএলের ইচ্ছাকৃতভাবে এবং বিশেষ করে বিশেষ করে কোনও নাম ব্যবহার করার জন্য এটি ভাল ধারণা মনে করি না। 'স্ট্রিং' ধারণাটি পছন্দ না করার কারণে স্ট্রিং ব্যতিক্রমটি (প্রথম, উপরে, বা দ্বিতীয় এখানে, আপনি যদি পাগল হন তবে তা উপেক্ষা করুন)। যেহেতু, আমি এখনও সি প্রতি খুব পক্ষপাতী এবং সি ++ বিরুদ্ধে পক্ষপাতী। বিস্তারিত বর্ণনা করা, আমি যে কাজ করি তার বেশিরভাগই সি আরও ফিট করে (কিন্তু এটি একটি ভাল ব্যায়াম এবং নিজেকে তৈরি করার একটি ভাল উপায় ছিল। অন্য ভাষা শিখতে এবং খ। বস্তু / ক্লাস / ইত্যাদির বিরুদ্ধে পক্ষপাতমূলক না হওয়ার চেষ্টা করুন যা হয়তো আরো ভালো বলে উল্লেখ করা হয়েছে কম বন্ধ মনস্থ, কম দাম্ভিক, আরো গ্রহণযোগ্য।)। কিন্তু কিছু কি দরকারী তা ইতিমধ্যেই প্রস্তাবিত: আমি আসলেই তালিকা ব্যবহার করি (এটি মোটামুটি সাধারণ, তাই না?),সাজানোর (একই জিনিস) দুটি নাম দিতে হবে যা নাম্বার সংঘটিত হতে পারেusing namespace std;এবং তাই শেষ পর্যন্ত আমি নির্দিষ্ট, নিয়ন্ত্রণে এবং বুদ্ধিমান হতে পছন্দ করি যে যদি আমি এটি স্ট্যান্ডার্ড ব্যবহারের জন্য মনস্থ করি তবে আমাকে এটি নির্দিষ্ট করতে হবে। সহজভাবে রাখুন: কোন অভিপ্রায় অনুমোদিত।

এবং বুস্ট এর regex অংশ তৈরীর জন্য std। আমি ভবিষ্যতের একীকরণের জন্য তা করি এবং আবার, আমি পুরোপুরি এই পক্ষপাত স্বীকার করি - আমি মনে করি না যে এটা কুৎসিত boost::regex:: ...যে প্রকৃতপক্ষে আমার জন্য এটি অন্য জিনিস। সি ++ তে অনেকগুলি জিনিস রয়েছে যা আমি এখনো দেখিনি এবং পদ্ধতিগুলিতে পুরোপুরি গ্রহণ করতে এসেছি (অন্য উদাহরণ: ভেরিয়েড টেমপ্লেটগুলি বনাম ওয়ার আর্গস [যদিও আমি ভেরিয়েডিক টেমপ্লেটগুলিকে খুব দরকারী বলে স্বীকার করছি!])। এমনকী যেগুলি আমি স্বীকার করি তাও কঠিন ছিল এবং আমার এখনও তাদের সাথে সমস্যা রয়েছে।


উদ্বেগ ব্যাখ্যা করতে একটি কংক্রিট উদাহরণ। কল্পনা করুন আপনার কাছে একটি পরিস্থিতি আছে যেখানে আপনার 2 লাইব্রেরি, foo এবং bar, প্রতিটি নিজস্ব নামস্থান রয়েছে:

namespace foo {
    void a(float) { /* does something */ }
}

namespace bar {
    ...
}

এখন আপনি আপনার নিজের প্রোগ্রামে একসঙ্গে foo এবং বার ব্যবহার করে বলুন:

using namespace foo;
using namespace bar;

void main() {
    a(42);
}

এই সময়ে সবকিছু জরিমানা। যখন আপনি আপনার প্রোগ্রাম চালান এটি 'কিছু করে'। কিন্তু পরে আপনি বারটি আপডেট করুন এবং বলে দিন এটির মতো পরিবর্তিত হয়েছে:

namespace bar {
    void a(float) { /* does something completely different */ }
}

এই মুহুর্তে আপনি একটি কম্পাইলার ত্রুটি পাবেন:

using namespace foo;
using namespace bar;

void main() {
    a(42);  // error: call to 'a' is ambiguous, should be foo::a(42)
}

সুতরাং আপনাকে বোঝানোর জন্য কিছু রক্ষণাবেক্ষণ করতে হবে যা 'a' বোঝানো হয়েছে (অর্থাত্ foo::a)। সম্ভবত এটি অযৌক্তিক, কিন্তু সৌভাগ্যবশত এটি বেশ সহজ (কেবলমাত্র কম্পাইলারটি অস্পষ্ট হিসাবে চিহ্নিত করা foo::সমস্ত কলগুলির সামনে যুক্ত করুন a)।

কিন্তু বিকল্প পরিবর্তনের কল্পনা করুন যেখানে বদলে পরিবর্তিত বার পরিবর্তিত হয়েছে:

namespace bar {
    void a(int) { /* does something completely different */ }
}

এই মুহুর্তে a(42)হঠাৎ করে আপনার কলটি bar::aপরিবর্তে পরিবর্তিত হয় foo::aএবং 'কিছু' করার পরিবর্তে এটি 'সম্পূর্ণ ভিন্ন কিছু' করে। কোন কম্পাইলার সতর্কতা বা কিছু। আপনার প্রোগ্রাম শুধু নীরবভাবে আগের তুলনায় সম্পূর্ণ ভিন্ন কিছু কাজ শুরু।

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

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


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

namespace Mylib{
    template<class T> class Stack{ /* ... */ };
    / / ...
}
namespace Yourlib{
    class Stack{ /* ... */ };
    / / ...
}
void f(int max) {
    Mylib: :Stack<int> s1(max) ; / / use my stack
    Yourlib: :Stack s2(max) ; / / use your stack
    / / ...
}

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

void f(int max) {
    using namespace Mylib; / / make names from Mylib accessible
    Stack<int> s1(max) ; / / use my stack
    Yourlib: :Stack s2(max) ; / / use your stack
    / / ...
}

নামস্থান বিভিন্ন লাইব্রেরী এবং কোডের বিভিন্ন সংস্করণগুলির পরিচালনা করার জন্য একটি শক্তিশালী সরঞ্জাম সরবরাহ করে। বিশেষ করে, তারা একটি স্বতন্ত্র নামের একটি রেফারেন্স করতে স্পষ্ট কিভাবে প্রোগ্রামার বিকল্প প্রস্তাব।

উত্স: বিজ্নে স্ট্রাউস্ট্রপ দ্বারা সি ++ প্রোগ্রামিং ভাষাটির সংক্ষিপ্তসার


এটি আপনার সফটওয়্যার বা প্রকল্প কর্মক্ষমতা খারাপ করে না, আপনার উত্স কোডের শুরুতে নামস্থান অন্তর্ভুক্ত করা খারাপ নয়। using namespace stdনির্দেশ অন্তর্ভুক্তি আপনার প্রয়োজন অনুযায়ী এবং সফ্টওয়্যার বা প্রকল্পটি বিকাশের উপায় অনুসারে পরিবর্তিত হয়।

namespace stdC ++ স্ট্যান্ডার্ডের ফাংশন এবং ভেরিয়েবল রয়েছে। আপনি যখন প্রায়ই C ++ স্ট্যান্ডার্ড ফাংশনগুলি ব্যবহার করবেন তখন এই নামস্থানটি কার্যকর।

হিসাবে এই page উল্লিখিত হয় :

নামস্থান std ব্যবহার করে বিবৃতি সাধারণত খারাপ অভ্যাস বলে মনে করা হয়। এই বিবৃতিটির বিকল্প হল নামস্পেসটি নির্দিষ্ট করা যা সনাক্তকারীটি স্কোপ অপারেটর (:) :) ব্যবহার করে প্রতিটি সময় আমরা একটি টাইপ ঘোষণা করি।

এবং এই মতামত দেখুন :

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

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

হিসাবে এই page উল্লিখিত হয় :

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

...

এখন উন্নয়নের পরবর্তী পর্যায়ে, আমরা cout এর অন্য একটি সংস্করণ ব্যবহার করতে চাই যা কাস্টম প্রথাগত "লাই" নামে পরিচিত কিছু লাইব্রেরি (উদাহরণস্বরূপ)

...

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


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





c++-faq