هل تفضل مساحات الأسماء الصريحة أو "استخدام" في C ++؟
-
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" في أي مكان ...