.Cpp ফাইলে সি ++ নামস্থান পদ্ধতিগুলি সংজ্ঞায়নের সঠিক উপায়


108

সম্ভবত একটি সদৃশ, তবে এটি সন্ধানের জন্য সহজ কোনও নয় ...

একটি শিরোনাম দেওয়া হয়েছে:

namespace ns1
{
 class MyClass
 {
  void method();
 };
}

আমি method().cpp ফাইলে বিভিন্ন উপায়ে সংজ্ঞায়িত দেখেছি :

সংস্করণ 1:

namespace ns1
{
 void MyClass::method()
 {
  ...
 }
}

সংস্করণ 2:

using namespace ns1;

void MyClass::method()
{
 ...
}

সংস্করণ 3:

void ns1::MyClass::method()
{
 ...
}

এটি করার কোনও 'সঠিক' উপায় আছে? এগুলির মধ্যে কোনওটিই 'ভুল' যার অর্থ তারা সবাই একই জিনিস বোঝায় না?


বেশিরভাগ কোডগুলিতে আমি সাধারণত তৃতীয় সংস্করণ দেখতে পাই (তবে আমি তা কেন করি না: ডি), দ্বিতীয় সংস্করণটি আমার অনুমানের কারণেই স্পেসিফিকেশন কেন প্রবর্তন করা হয় তার বিপরীত।
মিঃ আনুবিস

1
আকর্ষণীয় সত্য হিসাবে, ভিজ্যুয়াল অ্যাসিস্ট রিফ্যাক্টরিং সরঞ্জামগুলি # 1 বা # 3 ব্যবহার করে কোড উত্পন্ন করতে খুশি, টার্গেট ফাইলে ইতিমধ্যে কোন স্টাইলটি ব্যবহার করছে তা নির্ভর করে।
মিঃ বয়

উত্তর:


51

সংস্করণ 2 অস্পষ্ট এবং বুঝতে সহজ নয় কারণ আপনি জানেন না যে কোন নেমস্পেসটি অন্তর্ভুক্ত MyClassএবং এটি কেবল অযৌক্তিক (ক্লাস ফাংশন একই নামস্থানে নয়?)

সংস্করণ 1 সঠিক কারণ এটি দেখায় যে নেমস্পেসে আপনি ফাংশনটি সংজ্ঞায়িত করছেন।

সংস্করণ 3 সঠিক কারণ আপনি ::স্কোপ রেজোলিউশন অপারেটরটি উল্লেখ করেMyClass::method () নামের জায়গাতে ব্যবহার করেছেন ns1। আমি সংস্করণ 3 পছন্দ করি।

দেখুন নামস্থান (C ++) গুলির । এটি করার সেরা উপায় এটি।


22
# 2 কে "ভুল" বলা একটি বিশাল বাড়াবাড়ি। এই যুক্তি অনুসারে, সমস্ত প্রতীক নামগুলি "ভুল" কারণ তারা সম্ভাব্যভাবে অন্যান্য চিহ্নগুলির মধ্যে অন্যান্য চিহ্নের নামগুলি গোপন করতে পারে।
দশমুর

এটা অযৌক্তিক। এটি সূক্ষ্ম সংকলন করবে (দুঃখিত, উত্তরে যেটি ব্যাখ্যা করা হয়েছে), তবে কেন আপনি এর নামস্থানটির বাইরে কোনও ফাংশন সংজ্ঞায়িত করবেন? এটি পাঠককে বিভ্রান্ত করে। এছাড়াও, যখন অনেক নেমস্পেস ব্যবহার করা হয়, এটি মাইক্লাস কোন নেমস্পেসের সাথে সম্পর্কিত তা তা দেখায় না। সংস্করণ 1 এবং 3 এই সমস্যার সমাধান করে। উপসংহারে, এটি ভুল নয়, তবে কেবল অস্পষ্ট এবং বিভ্রান্তিকর।
গিলগেমস

3
আমি @ ফিনিকা ম্যাসিয়ার সাথে একমত, ব্যবহারের কৌশলটি ভয়াবহ এবং বিভ্রান্তির কারণ হতে পারে। একটি বর্গ যে কার্যকরী একটি বিনামূল্যে ফাংশন হিসাবে একটি অপারেটর, হেডারের মধ্যে আপনি করতেন বিবেচনা namespace N {struct X { void f(); }; X operator==( X const &, X const & ); }সঙ্গে CPP ফাইলে, এখন ব্যবহার এ বক্তব্যে আপনি কি হিসাবে সদস্য ফাংশন নির্ধারণ করতে পারবেন void X::f() {}, কিন্তু যদি আপনি সংজ্ঞায়িত X operator==(X const&, X const&)আপনি এক থেকে একটি আলাদা অপারেটর সংজ্ঞা হতে হবে শিরোনামে সংজ্ঞায়িত করা হয়েছে (সেখানে ফ্রি ফাংশনের জন্য আপনাকে 1 বা 3 ব্যবহার করতে হবে)।
ডেভিড রদ্রিগেজ -

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

1
3 এর মধ্যে আমি বলব 1) সেরা তবে বেশিরভাগ আইডিইয়ে সেই নামস্থান ঘোষণার অভ্যন্তরে সমস্ত কিছু इंडেন্ট করার পরিবর্তে বিরক্তিকর অভ্যাস রয়েছে এবং এটি কিছুটা বিভ্রান্তি যুক্ত করে।
লোককা

28

5 বছর পরে এবং আমি ভেবেছিলাম আমি এটি উল্লেখ করব, যা উভয়ই দেখতে সুন্দর এবং মন্দ নয়

using ns1::MyClass;

void MyClass::method()
{
  // ...
}

3
এটি সেরা উত্তর। এটি সবচেয়ে পরিষ্কার দেখায় এবং ওপি'র ভার্সন 1 এর সাথে সম্পর্কিত বিষয়গুলি এড়িয়ে যায়, যা জিনিসগুলি অনিচ্ছাকৃতভাবে নামস্থানে নিয়ে আসতে পারে এবং 2, যা অজান্তেই বিশ্বব্যাপী স্থানগুলিতে জিনিস আনতে পারে।
ayane_m

হ্যাঁ, এটি 3 এর চেয়ে কম টাইপিংয়ের একটি দুর্দান্ত সংমিশ্রণ, যদিও এখনও স্পষ্টভাবে উদ্দিষ্ট ঘোষণা করছে।
জেবি

14

আমি সংস্করণ 4 (নীচে) ব্যবহার করছি কারণ এটি সংস্করণ 1 এর বেশিরভাগ সুবিধার (রিসোেক্টিভ সংজ্ঞাটির সংক্ষিপ্তকরণ) এবং সংস্করণ 3 (সর্বাধিক স্পষ্টত হওয়া) একত্রিত করে। মূল অসুবিধাটি হ'ল লোকেরা এটি ব্যবহার করে না তবে যেহেতু আমি এটিকে প্রযুক্তিগত দিক থেকে অপশনগুলি পছন্দ করি না তার চেয়ে উচ্চতর হিসাবে বিবেচনা করি।

সংস্করণ 4: নেমস্পেস এলিয়াসগুলি ব্যবহার করে সম্পূর্ণ যোগ্যতা ব্যবহার করুন:

#include "my-header.hpp"
namespace OI = outer::inner;
void OI::Obj::method() {
    ...
}

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


1
যদিও আমি মনে করি "এটা ভালো তাই আমি পরোয়া করি না যদি এটা মানুষের বিভ্রান্ত" যুক্তিবিজ্ঞান ত্রুটিপূর্ণ হয়, আমি সম্মত এই আছে হয় নেস্টেড নামব্যবধান একটি ভাল পদক্ষেপ।
মিঃ বয়

1
দুর্দান্ত "কেন-আমি ভাবছি না" এর জন্য +1! (যেমন "লোকেরা [নতুন প্রযুক্তিগতভাবে উন্নত জিনিসগুলির জন্য অভ্যস্ত হয় না")) তবে আরও লোকেরা এটি ব্যবহার করলে তারা অভ্যস্ত হয়ে যাবে। "
wjl

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

4

সংস্করণ 3 ক্লাস এবং নেমস্পেসের মধ্যে সংযোগকে আরও টাইপিংয়ের ব্যয়ে খুব স্পষ্ট করে তোলে। সংস্করণ 1 এটি এড়ায় তবে একটি ব্লকের সাথে সংযোগটি ক্যাপচার করে। সংস্করণ 2 এটি লুকিয়ে রাখে যাতে আমি এটি এড়াতে পারি।



3

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

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

সংখ্যা 2 এটি খুব ভঙ্গুর, বিশেষত বৃহত কোডবেজে - শিরোনাম এবং নির্ভরতা স্থানান্তর হিসাবে, আপনার প্রোগ্রামটি সংকলন করতে ব্যর্থ হবে।

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


3

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


2

সমস্ত উপায় সঠিক, এবং প্রত্যেকের এর সুবিধা এবং অসুবিধা রয়েছে।

সংস্করণ 1-এ, প্রতিটি ফাংশনের সামনে নেমস্পেস না লেখার সুবিধা রয়েছে। অসুবিধাটি হ'ল আপনি বিরক্তিকর পরিচয় পাবেন, বিশেষত যদি আপনার একাধিক স্তরের নেমস্পেস থাকে।

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

সংস্করণ 3-এ, আপনাকে আরও টাইপ করতে হবে এবং আপনার ফাংশন লাইনগুলি স্ক্রিনের চেয়ে বড় হতে পারে, যা নকশার প্রভাবগুলির জন্য খারাপ।

কিছু লোক এটি ব্যবহার করার অন্য উপায়ও রয়েছে। এটি প্রথম সংস্করণের মতো, তবে সনাক্তকরণের সমস্যা ছাড়াই।

এটি এর মতো:

#define OPEN_NS1 namespace ns1 { 
#define CLOSE_NS1 }

OPEN_NS1

void MyClass::method()
{
...
}

CLOSE_NS1

প্রতিটি পরিস্থিতির জন্য কোনটি ভাল তা চয়ন করা আপনার পক্ষে নির্ভরযোগ্য =]


14
আমি এখানে ম্যাক্রো ব্যবহারের কোনও কারণ দেখতে পাচ্ছি না। আপনি যদি ইনডেন্ট করতে না চান তবে কেবল ইনডেন্ট করবেন না। ম্যাক্রো ব্যবহার করে কোডটি কম স্পষ্ট হয়।
দশফোড়

1
আমার মনে হয় আপনি যে সর্বশেষ সংস্করণটির উল্লেখ করেছেন তা কার্যকর যখনই আপনি পুরানো সংকলকগুলির সাথে কোড সংকলন করতে চান যা নামের স্থানগুলি সমর্থন করে না (হ্যাঁ, কিছু ডাইনোসর এখনও রয়েছে)। সেক্ষেত্রে আপনি একটি #ifdefধারাটির মধ্যে ম্যাক্রো রাখতে পারেন ।
লুকা মার্টিনি

আপনি না চাইলে আপনাকে সনাক্ত করতে হবে না, তবে আপনি যদি ম্যাক্রো ব্যবহার না করেন তবে কিছু আইডিই আপনার জন্য এটি করার চেষ্টা করবে। উদাহরণস্বরূপ, ভিজ্যুয়াল স্টুডিওতে আপনি পুরো কোডটি নির্বাচন করতে এবং স্বতঃ-পরিচয় হিসাবে ALT + F8 টিপতে পারেন। আপনি যদি সংজ্ঞাগুলি ব্যবহার না করেন তবে আপনি সেই কার্যকারিতাটি হারাবেন। এছাড়াও, আমি মনে করি না যে আপনার কোডিং স্ট্যান্ডার্ডটিতে যদি ওপেন_ (নেমস্পেস) এবং সিএলএলএল (নেমস্পেস) কম স্পষ্ট হয়। @ লুকামার্টিনি যে কারণটি দিয়েছে তাও আকর্ষণীয়।
রেনান গ্রিনার্ট

যদি এটি জেনেরিক তৈরি করা হয় তবে #define OPEN_NS(X)আমি মনে করি এটি সামান্য কার্যকর, তবে সত্যিই নয় ... আমি ম্যাক্রোগুলিকে আপত্তি করি না তবে এটি কিছুটা ওটিটি বলে মনে হয়। আমি মনে করি ডায়েস্টমার কাহলের দৃষ্টিভঙ্গি নেস্টেড নেমস্পেসের জন্য ভাল।
মিঃ বয়
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.