c++ - অনামী/বেনামী namespaces বনাম স্ট্যাটিক ফাংশন




(7)

C ++ এর একটি বৈশিষ্ট্য নামহীন (বেনামে) নামস্থান তৈরি করার ক্ষমতা, যেমন:

namespace {
    int cannotAccessOutsideThisFile() { ... }
} // namespace

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

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


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

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


আপনার প্রশ্ন পড়ার সময় শুধু এই বৈশিষ্ট্যটি শিখেছি, আমি কেবল অনুমান করতে পারি। এটি একটি ফাইল স্তরের স্ট্যাটিক পরিবর্তনশীল উপর বিভিন্ন সুবিধা প্রদান বলে মনে হচ্ছে:

  • বেনামী নামস্থানগুলি একে অপরের মধ্যে নিস্তেজ করা যেতে পারে, সুরক্ষাগুলির একাধিক স্তর সরবরাহ করে যা থেকে প্রতীকগুলি পালাতে পারে না।
  • একই ফাইলের মধ্যে বিভিন্ন স্ট্যাটিক স্তরের স্কোপগুলি তৈরি করতে একই বেনামী নামস্থান একই উত্স ফাইলটিতে স্থাপন করা যেতে পারে।

যদি কেউ বাস্তব কোডে বেনামী নামস্থান ব্যবহার করে থাকে তবে আমি শিখতে আগ্রহী।


উপরন্তু যদি এই উদাহরণের মত একটি পরিবর্তনশীল স্ট্যাটিক কীওয়ার্ড ব্যবহার করে:

namespace {
   static int flag;
}

এটা ম্যাপিং ফাইল দেখা হবে না


একটি বেনামী নেমস্পেসে পদ্ধতিগুলি প্রয়োগ করা আপনাকে এক ডেফিনিশন রুলের দুর্ঘটনাক্রমে লঙ্ঘন করতে বাধা দেয় যা আপনাকে আপনার সাহায্যকারী পদ্ধতিগুলিকে নামকরণের অন্য কোন পদ্ধতির মতো নামকরণ করার বিষয়ে চিন্তা করতে দেয় না।

এবং, লুক দ্বারা নির্দেশিত হিসাবে, বেনামী namespaces স্ট্যাটিক সদস্যদের উপর মান দ্বারা পছন্দ করা হয়।


ব্যক্তিগতভাবে আমি নিম্নলিখিত কারণগুলির জন্য নামহীন নামস্থানগুলিতে স্ট্যাটিক ফাংশন পছন্দ করি:

  • এটি কেবলমাত্র ফাংশন সংজ্ঞা থেকে স্পষ্ট এবং স্পষ্ট যে এটি অনুবাদ করা যেখানে অনুবাদ ইউনিট ব্যক্তিগত। নামহীন নামস্থান দিয়ে আপনাকে স্ক্রোল এবং একটি ফাংশন একটি নামস্থান দেখতে হয় কিনা তা অনুসন্ধান করতে হতে পারে।

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

  • স্ট্যাটিক ফাংশন সি বা সি ++ তে খুব অনুরূপ আচরণ করে, যদিও নামহীন নামস্থানগুলি সম্ভবত সি ++ হয়। indentation এবং আমি চাই না যে নামহীন namespaces এছাড়াও অতিরিক্ত স্তর যোগ :)

তাই, আমি দেখে খুশি যে ফাংশনগুলির জন্য স্ট্যাটিক ব্যবহার ref


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


সি ++ স্ট্যান্ডার্ড অধ্যায় 7.3.1.1 মধ্যে পড়তে নামহীন নামস্থান, অনুচ্ছেদ 2:

নামস্থান স্পেসে বস্তুগুলি ঘোষণা করার সময় স্ট্যাটিক কীওয়ার্ডটি অব্যবহৃত হয়, নামহীন-নামস্থানটি একটি উন্নততর বিকল্প সরবরাহ করে।

স্ট্যাটিক শুধুমাত্র বস্তু, ফাংশন এবং বেনামী ইউনিয়নগুলির নামগুলিতে ঘোষণা করে, ঘোষণাগুলি টাইপ করতে নয়।

সম্পাদনা:

স্ট্যাটিক কীওয়ার্ডের এই ব্যবহারকে বাতিল করার সিদ্ধান্ত (অনুবাদ ইউনিটে একটি পরিবর্তনশীল ঘোষণার দৃশ্যমানতা প্রভাবিত করে) উল্টানো হয়েছে ( ref )। এই ক্ষেত্রে একটি স্ট্যাটিক বা একটি নামহীন নামস্থান ব্যবহার করে অবশ্যই একই জিনিসটি করার দুটি মূল উপায় রয়েছে। আরো আলোচনার জন্য this এসও প্রশ্ন দেখুন।

অনামী-স্থানীয়-স্থানীয় প্রকারগুলি সংজ্ঞায়িত করার অনুমতি দেওয়ার জন্য এখনও অনামী নামস্থানগুলির সুবিধা রয়েছে। আরো বিস্তারিত জানার জন্য this SO প্রশ্নটি দেখুন।

ক্রেডিট আমার মনোযোগ এই আনয়ন জন্য মাইক পার্সি যায়।





namespaces