هل تفضل مساحات الأسماء الصريحة أو "استخدام" في C ++؟

StackOverflow https://stackoverflow.com/questions/214927

  •  03-07-2019
  •  | 
  •  

سؤال

عند استخدام مساحات أسماء C ++ ، هل تفضل تسميةها بشكل صريح ، مثل هذا:

std::cout << "Hello, world!\n";

أو هل تفضل using namespace:

using namespace std;
cout << "Hello, world!\n";

وإذا كنت تفضل هذا الأخير ، فهل تعلن استخدامك في الملف أو نطاق الوظيفة؟

أنا شخصياً أفضل تسميتها بشكل صريح - إنها تكتب أكثر ولكن عند استخدام مزيج من مساحات الأسماء (على سبيل المثال std و boost) أجدها أكثر قابلية للقراءة.

هل كانت مفيدة؟

المحلول

أنا دائما أستخدم using namespace ل std و boost. كل شيء آخر أميل إلى استخدام مساحة اسم صريحة ما لم يتم استخدامه لدرجة أنه سيشكل الرمز.

في الرؤوس ، أنا لا أستخدم أبدًا using namespace لتجنب تلويث مساحة الاسم العالمية للمصدر #including.

نصائح أخرى

الكتابة الإضافية ليست هي المشكلة هنا. المشكلة مع الأسماء المؤهلة بشكل صريح هي الفوضى المرئية. دعونا نواجه الأمر ، بناء الجملة C ++ غير مرغوب فيه. لا حاجة لجعل هذا سوءًا عن طريق جعل الأسماء أطول دون داع ورش الكود بسخاء مع ::س.

أنا مع جيف أتوود: أفضل رمز لا يوجد رمز على الإطلاق. هذا صحيح جدا.

تعتبر واردات مساحة الاسم وسيلة رائعة لتقليل الفوضى دون أي عيب: طالما يتم تقليل نطاق مساحات الأسماء المفتوحة إلى وحدة تجميع واحدة1, ، تعارضات الاسم ، في حالة ظهورها ، يمكن حلها بسهولة.

لماذا يجب أن تكون الأسماء الصريحة (بشكل عام) أكثر قابلية للقراءة ، لطالما كان لغزًا بالنسبة لي. يجب أن يعرف القراء عمومًا الرمز الجيد بما يكفي ليكونوا قادرين على استنتاج الدلالات. إذا لم تكن كذلك ، فإن الكود يحتاج إلى إصلاح على أي حال.


1) النتيجة الطبيعية: لا using في الرؤوس!

أستخدمها دائمًا صريحة. إن كتابة الأمراض المنقولة جنسيا لا تؤذيني وأرى بوضوح من أين. من المفيد عندما يكون لديك مشروع قديم للعناية بـ "الأوتار" الخاصة به ، و "المتجهات" ، إلخ. كلما زادت المعلومات التي يحملها الرمز معها ، كان ذلك أفضل.

تستخدم القاعدتي العامة دائمًا مساحة الاسم في الرؤوس ، وعادة ما تستخدم استخدام الكود. السبب في السابق هو توضيح الأمر صراحة في كل جزء من التعريف الذي يتم استخدامه ، والسبب في أن الأخير هو أنه يجعل من السهل استخدام بدائل من مساحة اسم أخرى إذا أصبح ذلك ضروريًا. أي إذا أردنا البدء في استخدام FOO :: String بدلاً من Std :: String ، نحتاج فقط إلى تحديث الرأس وبيان استخدام بدلاً من استبدال كل مثيل من Std :: String باستخدام Foo :: String في الكود.

بالطبع ، هذا أقل فائدة للدروس الموجودة في مساحة الاسم STD :: ، لأنه حتى لو استبدلت فئة واحدة ، فلا يزال من المحتمل أن تستخدم الآخرين في الأمراض المنقولة جنسياً ، وقد تواجه مشكلات غموض ، لكن ذلك كان مجرد مثال.

using و using namespace هي مفيدة للغاية لجعل الكود أكثر قابلية للقراءة - إزالة الفوضى.

لكن في أي حال يجعل من الصعب معرفة من أين يأتي رمز ، أرفض استيراد مساحة الاسم الكاملة.

أحاول أن أحصر نطاق مساحات الأسماء المستوردة:

void bar() {

   // do stuff without vector

   { using std::vector;
      // do stuff with vector
   }

   // do stuff without vector
}

للمكتبات "المعروفة بشكل عام" ، مثل std, ، أود أن أجرؤ على استخدام using namespace std. هناك سبب للاعتقاد بأن كل من يقرأ هذا الرمز يعرف هذه الرموز.

باعتباره جانبيًا ، using يتم استخدام الكلمة الرئيسية أيضًا للإشارة إلى أن الفئة المشتقة تقوم أيضًا بتصدير الأعضاء المحملين من فئة الفئة الفائقة.

class A {
  void f( A  );
  void f( bool );
};

class B : public A {
  using A::f; // without this, we get a compilation error in foo()
  void f(bool);
};

void foo() {
  B b;
  b.f( A() ); // here's a compilation error when no `using` is used in B
}

أنا فقط استخدم مساحات الأسماء الصريحة عندما يكون هناك بعض الغموض. إنها أكثر قابلية للقراءة ، لكن الكتابة الإضافية مملة للغاية ، وعليك أن تفترض أن المطورين الآخرين لديهم مستوى أساسي من الألفة مع المكتبات القياسية.

الأوقات الأخرى الوحيدة التي أتوضيح فيها مساحة الاسم هي عندما أستخدمها مرة أو مرتين فقط ، مثل إضافة بيان تصحيح سريع ، أو إذا كنت أستخدم بعض المكتبة غير القياسية.

عادةً ما أعلنت مساحة الاسم في نطاق الملف ، ولكن إذا كنت تخلط مساحات الأسماء ، فقد يكون من المنطقي أن تضع الإعلان أقرب إلى النقطة التي يتم استخدامها ، في نطاق الوظيفة.

using في نطاق الوظيفة ، أو إذا كانت الوظيفة صغيرة جدًا (غالبًا ما تكون) ، فقط مساحة اسم صريحة

أميل إلى استيراد الأسماء التي أحتاجها بشكل صريح في الجزء العلوي من ملف .cpp ، لذلك ...

باستخدام std :: cout ؛ باستخدام std :: endl ؛

إلخ...

وبهذه الطريقة ، أتحكم في الأسماء التي أستخدمها ومن السهل معرفة من أين أتت ولا تشوش الرمز عند نقطة الاستخدام.

في الحالات النادرة التي أستخدم فيها اسمينًا من مساحات أسماء مختلفة ، أقوم بتأهيلهما تمامًا عند نقطة الاستخدام.

أستخدم دائمًا أسماء مؤهلة بالكامل في الرؤوس وأستخدم "استخدام مساحة الاسم X" في أي مكان ...

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top