مساحة الاسم
في مجال الحوسبة ، تُعرَّف مساحة الاسم بأنها مجموعة من الرموز ( الأسماء ) التي تُستخدم لتحديد الكائنات من مختلف الأنواع والإشارة إليها. وتضمن مساحة الاسم أن يكون لكل كائن من مجموعة معينة اسم فريد، مما يسهل التعرف عليه .
تُبنى مساحات الأسماء عادةً على شكل تسلسلات هرمية للسماح بإعادة استخدام الأسماء في سياقات مختلفة. على سبيل المثال، لنفترض نظامًا لتسمية الأشخاص حيث يمتلك كل شخص اسمًا شخصيًا، بالإضافة إلى اسم عائلة مشترك مع أقاربه. إذا كانت الأسماء الأولى لأفراد العائلة فريدة داخل كل عائلة فقط، فيمكن تحديد هوية كل شخص بشكل فريد من خلال الجمع بين الاسم الأول واسم العائلة؛ فلا يوجد سوى جين دو واحدة، على الرغم من أنه قد يكون هناك العديد من جين. ضمن مساحة اسم عائلة دو، يكفي استخدام كلمة "جين" فقط لتحديد هذه الشخصية بشكل لا لبس فيه، بينما ضمن مساحة الاسم "العامة" لجميع الأشخاص، يجب استخدام الاسم الكامل.
من الأمثلة البارزة على مساحات الأسماء أنظمة الملفات ، التي تُخصص أسماءً للملفات. [ 1 ] تُنظم بعض لغات البرمجة متغيراتها وإجراءاتها الفرعية في مساحات أسماء. [ 2 ] [ 3 ] [ 4 ] تُخصص شبكات الحاسوب والأنظمة الموزعة أسماءً للموارد، مثل أجهزة الحاسوب والطابعات ومواقع الويب والملفات البعيدة. يمكن لأنظمة التشغيل تقسيم موارد النواة باستخدام مساحات أسماء معزولة لدعم حاويات المحاكاة الافتراضية على مستوى نظام التشغيل .
وبالمثل، تنظم أنظمة الملفات الهرمية الملفات في مجلدات. كل مجلد هو مساحة اسم منفصلة، بحيث يمكن أن يحتوي كل من المجلدين "letters" و "invoices" على ملف "to_jane".
في برمجة الحاسوب ، تُستخدم مساحات الأسماء عادةً لتجميع الرموز والمعرفات حول مهمة معينة ولتجنب تضارب الأسماء بين المعرفات المتعددة التي تشترك في نفس الاسم.
في مجال شبكات الحاسوب ، يقوم نظام أسماء النطاقات بتنظيم مواقع الويب (وغيرها من الموارد) في مساحات أسماء هرمية .
تعارضات الأسماء
يُحدد المطور أسماء العناصر. وهذا غالباً ما يؤدي إلى تعارض عند محاولة دمج مستندات XML من تطبيقات XML مختلفة.
يحتوي ملف XML هذا على معلومات جدول HTML :
<table> <tr> <td> جيد </td> <td> سيئ </td> </tr> </table>يحتوي ملف XML هذا على معلومات حول طاولة (أي قطعة أثاث):
<table> <name> طاولة قهوة من خشب الماهوجني </name> <width> 30 </width> <length> 120 </length> </table>إذا تم جمع أجزاء XML هذه معًا، فسيحدث تعارض في الأسماء. فكلاهما يحتوي على عنصر، لكن العناصر لها محتوى ومعنى مختلفان.<table>...</table>
لن يعرف محلل XML كيفية التعامل مع هذه الاختلافات.
الحل عبر البادئة
يمكن تجنب تعارضات الأسماء في XML بسهولة باستخدام بادئة الاسم.
يُميز ملف XML التالي بين المعلومات المتعلقة بجدول HTML والأثاث عن طريق إضافة البادئة "h" و "f" في بداية العناصر.
<h:table> <h:tr> <h:td> جيد </h:td> <h:td> سيئ </h:td> </h:tr> </h:table><f:table> <f:name> طاولة قهوة من خشب الماهوجني </f:name> <f:width> 30 </f:width> <f:length> 120 </f:length> </f:table>نظام التسمية
يتكون الاسم في نطاق الأسماء من اسم نطاق الأسماء واسم محلي. [ 5 ] [ 6 ] عادةً ما يُضاف اسم نطاق الأسماء كبادئة للاسم المحلي.
الاسم = < اسم مساحة الاسم > فاصل < الاسم المحلي > عند استخدام الأسماء المحلية بمفردها، يتم استخدام حل الأسماء لتحديد أي اسم معين (إن وجد) يتم الإشارة إليه بواسطة اسم محلي معين.
أمثلة
| سياق | اسم | اسم نطاق الاسم | الاسم المحلي |
|---|---|---|---|
| اسم النطاق | www.example.com | example.com (اسم النطاق) | www (اسم النطاق الفرعي) |
| ويكيبيديا | نقاش: الموناليزا | يتحدث | الموناليزا |
| المسار ( يونكس ) | /home/admin/Documents/readme.txt | /home/admin/Documents (دليل) | readme.txt (اسم الملف) |
| المسار ( ويندوز ) | C:\Users\Admin\Documents\readme.txt | C:\Users\Admin\Documents (دليل) | readme.txt (اسم الملف) |
| مساحة اسم المكتبة القياسية للغة C++ | std::chrono::system_clock | std::chrono(مساحة اسم C++) | system_clock(فصل) |
| مساحة اسم C++ | Poco::Net::HTTPClientSession | Poco::Net(مساحة اسم C++) | HTTPClientSession(فصل) |
| مساحة اسم C# | System.Collections.Generic.Dictionary | System.Collections.Generic(مساحة اسم C#) | Dictionary(فصل) |
| حزمة مكتبة جافا القياسية | java.util.Date | java.util(حزمة جافا) | Date(فصل) |
| حزمة جافا | org.apache.commons.math3.special.Gamma | org.apache.commons.math3.special(حزمة جافا) | Gamma(فصل) |
| رمز الأمم المتحدة/الموقع | مدينة نيويورك، الولايات المتحدة | الولايات المتحدة (دولة أو إقليم) | مدينة نيويورك (موقع محلي) |
| XML | xmlns:xhtml="http://www.w3.org/1999/xhtml"<xhtml:body> | xhtml(مساحة اسم XML المعلنة سابقًا )xhtml="http://www.w3.org/1999/xhtml" | body(عنصر) |
| بيرل | $DBI::errstr | $DBI(وحدة بيرل) | errstr(عامل) |
| اسم المورد الموحد (URN) | urn:nbn:fi-fe19991055 | urn:nbn (أرقام الببليوغرافيا الوطنية) | fi-fe19991055 |
| أنظمة المقابض | 10.1000/182 | 10 (التعامل مع سلطة التسمية) | 1000/182 (معالجة الاسم المحلي) |
| معرّف الكائن الرقمي | 10.1000/182 | 10.1000 (الناشر) | 182 (منشور) |
| عنوان MAC | 01-23-45-67-89-ab | 01-23-45 ( معرف فريد خاص بالمنظمة ) | 67-89-ab (خاص بـ NIC) |
| معرف PCI | 1234 abcd | 1234 (معرف البائع) | abcd (معرف الجهاز) |
| معرف فيديو/معرف منتج USB | 2341 003f [ 7 ] | 2341 (معرف البائع) | 003f (معرف المنتج) |
| SPARQL | dbr:Sydney | dbr(علم الوجود المعلن عنه مسبقًا، على سبيل المثال عن طريق التحديد @prefix dbr: <http://dbpedia.org/resource/>) | Sydney |
وفد
يُعدّ تفويض المسؤوليات بين الأطراف أمرًا بالغ الأهمية في التطبيقات العملية، مثل بنية شبكة الإنترنت العالمية. تسمح مساحات الأسماء بتفويض عملية تخصيص المعرّفات إلى جهات إصدار أسماء متعددة مع الحفاظ على التفرّد العالمي. [ 8 ] تقوم جهة تسجيل مركزية بتسجيل أسماء مساحات الأسماء المخصصة . يُخصّص كل اسم مساحة اسم لجهة مسؤولة بدورها عن تخصيص الأسماء في مساحة الاسم المخصصة لها. قد تكون هذه الجهة جهة إصدار أسماء تقوم بتخصيص الأسماء بنفسها، أو جهة تسجيل أخرى تُفوّض بدورها أجزاءً من مساحة اسمها إلى جهات مختلفة.
تَسَلسُل
نظام التسمية الذي يسمح بتفويض مساحات الأسماء إلى أطراف ثالثة هو مساحة اسم هرمية .
تكون التسلسلات الهرمية متكررة إذا كانت صيغة أسماء النطاقات متطابقة في كل تفويض فرعي. ومن أمثلة التسلسلات الهرمية المتكررة نظام أسماء النطاقات (DNA) .
ومن الأمثلة على التسلسل الهرمي غير المتكرر اسم الموارد الموحد الذي يمثل رقم هيئة الأرقام المخصصة للإنترنت (IANA).
| السجل | المسجل | مثال على المعرف | اسم نطاق الاسم | مساحة الاسم |
|---|---|---|---|---|
| اسم المورد الموحد (URN) | هيئة الأرقام المخصصة للإنترنت | urn:isbn:978-3-16-148410-0 | جرة | مساحة اسم URN الرسمية |
| مساحة اسم URN الرسمية | هيئة الأرقام المخصصة للإنترنت | urn:isbn:978-3-16-148410-0 | رقم الكتاب المعياري الدولي (ISBN) | أرقام الكتب المعيارية الدولية كأسماء موارد موحدة |
| رقم المادة الدولي (EAN) | GS1 | 978-3-16-148410-0 | 978 | بوكلاند |
| رقم الكتاب المعياري الدولي (ISBN) | وكالة ISBN الدولية | 3-16-148410-X | 3 | الدول الناطقة بالألمانية |
| رمز الناشر الألماني | وكيل Für Buchmarktstandards | 3-16-148410-X | 16 | موهر سيبك |
مساحة الاسم مقابل النطاق
قد يُوفّر اسم النطاق سياقًا ( نطاقًا في علوم الحاسوب) للاسم، ويُستخدم المصطلحان أحيانًا بشكلٍ مُتبادل. مع ذلك، قد يُوفّر سياق الاسم أيضًا عوامل أخرى، مثل الموقع الذي يظهر فيه أو بنية الاسم.
| بدون مساحة اسم | مع مساحة اسم | |
|---|---|---|
| النطاق المحلي | لوحة تسجيل المركبة | معيار التسلسل الهرمي لنظام الملفات |
| نطاق عالمي | معرّف فريد عالميًا | نظام أسماء النطاقات |
في لغات البرمجة
في العديد من لغات البرمجة، يمثل نطاق الأسماء سياقًا لمعرفاتها . في نظام التشغيل، يُعد الدليل مثالًا على نطاق الأسماء. كل اسم في الدليل يُعرّف ملفًا واحدًا أو دليلًا فرعيًا واحدًا بشكل فريد. [ 9 ]
كقاعدة عامة، لا يمكن أن يحمل الاسم الواحد في نطاق اسمي أكثر من معنى واحد؛ أي لا يمكن أن يحمل الاسم نفسه معاني مختلفة في النطاق نفسه. يُطلق على النطاق الاسمي أيضًا اسم " سياق" ، لأن الاسم نفسه في نطاقات اسمية مختلفة قد يحمل معاني مختلفة، كل منها مناسب لنطاقه.
فيما يلي خصائص أخرى لمساحات الأسماء:
- يمكن أن تمثل الأسماء في مساحة الاسم كائنات بالإضافة إلى مفاهيم ، سواء كانت مساحة الاسم لغة طبيعية أو عرقية ، أو لغة مصطنعة ، أو المصطلحات التقنية لمهنة ما، أو لهجة ، أو لغة اجتماعية ، أو لغة اصطناعية (مثل لغة برمجة ).
- في لغة برمجة جافا ، تحتوي المعرفات التي تظهر في مساحات الأسماء على اسم قصير (محلي) واسم طويل "مؤهل" فريد للاستخدام خارج مساحة الاسم.
- تقوم بعض المترجمات (لغات مثل C++ ) بدمج مساحات الأسماء والأسماء للاستخدام الداخلي في المترجم في عملية تسمى تشويه الأسماء .
إلى جانب استخدامها التقني في اللغات المجردة كما هو موضح أعلاه، تحتوي بعض اللغات على كلمة مفتاحية محددة تُستخدم للتحكم الصريح في مساحات الأسماء، من بين استخدامات أخرى. فيما يلي مثال على مساحة اسم في لغة C++:
استيراد std ؛// هذه هي الطريقة التي يتم بها إدخال اسم إلى النطاق الحالي. في هذه الحالة، يتم إدخاله إلى النطاق العام. باستخدام std :: println ;namespace box1 { constexpr int BOX_SIDE = 4 ; }namespace box2 { constexpr int BOX_SIDE = 12 ; }int main () { constexpr int BOX_SIDE = 42 ; println ( "{}" , box1 :: BOX_SIDE ); // الناتج 4. println ( "{}" , box2 :: BOX_SIDE ); // الناتج 12. println ( "{}" , BOX_SIDE ); // الناتج 42. }اعتبارات علوم الحاسوب
مساحة الاسم في علوم الحاسوب (وتُسمى أحيانًا نطاق الاسم ) هي حاوية أو بيئة مجردة تُنشأ لحفظ مجموعة منطقية من المعرفات أو الرموز الفريدة (أي الأسماء). يرتبط المعرف المُعرَّف في مساحة اسم ما بتلك المساحة فقط. يمكن تعريف المعرف نفسه بشكل مستقل في مساحات أسماء متعددة. أي أن المعرف المُعرَّف في مساحة اسم ما قد يحمل نفس المعنى أو لا يحمل نفس المعنى الذي يحمله المعرف نفسه في مساحة اسم أخرى. تحدد اللغات التي تدعم مساحات الأسماء القواعد التي تُحدد مساحة الاسم التي ينتمي إليها المعرف (وليس تعريفه). [ 10 ]
يمكن توضيح هذا المفهوم بمثال. تخيل شركتين، س و ص، تُخصص كل منهما أرقام تعريفية لموظفيها. لا ينبغي أن يكون لدى س موظفان يحملان نفس رقم التعريف، وكذلك الأمر بالنسبة لـ ص؛ ولكن لا مشكلة في استخدام نفس رقم التعريف في الشركتين. على سبيل المثال، إذا كان بيل يعمل في الشركة س وجين تعمل في الشركة ص، فلا مشكلة في أن يكون كل منهما الموظف رقم ١٢٣. في هذا المثال، يُمثل رقم التعريف المُعرّف، وتُمثل الشركة نطاق العمل. ولا يُسبب استخدام نفس المُعرّف لتحديد شخص مختلف في كل نطاق عمل أي مشكلة.
في البرامج الحاسوبية أو المستندات الكبيرة ، من الشائع وجود مئات أو آلاف المعرّفات. توفر مساحات الأسماء (أو تقنية مشابهة، انظر محاكاة مساحات الأسماء ) آلية لإخفاء المعرّفات المحلية. كما توفر وسيلة لتجميع المعرّفات ذات الصلة المنطقية في مساحات أسماء متطابقة، مما يجعل النظام أكثر نمطية .
تدعم أجهزة تخزين البيانات والعديد من لغات البرمجة الحديثة مساحات الأسماء. تستخدم أجهزة التخزين الدلائل (أو المجلدات) كمساحات أسماء. يسمح هذا بتخزين ملفين بنفس الاسم على الجهاز طالما تم تخزينهما في دلائل مختلفة. في بعض لغات البرمجة (مثل C++ و Python )، ترتبط مُعرّفات مساحات الأسماء نفسها بمساحة اسم مُحيطة. وبالتالي، في هذه اللغات، يمكن أن تتداخل مساحات الأسماء، مُشكّلةً شجرة مساحات أسماء . في جذر هذه الشجرة توجد مساحة الاسم العامة غير المُسماة .
الاستخدام في اللغات الشائعة
ج
في لغة C ، على الرغم من أن اللغة لا تحتوي رسميًا على مساحات أسماء (مع أنها تُحاكى بشكل متكرر ) ، يمكن اعتبار المعرفات وكأنها تنتمي إلى مساحات أسماء مختلفة؛ وهي المعرفات العادية، والوسوم ( struct// union) ، وأسماء الأعضاء، والتسميات. على سبيل المثال، يمكن إعادة استخدام enumالاسم في هذه السياقات الأربعة:Foo
#include <stdio.h>// في مساحة اسم الوسم struct Foo { int Foo ; // في مساحة اسم العضو };// اسم الدالة ومعاملاتها (معرفات عادية) struct Foo Foo ( int Foo ) { struct Foo result = { . Foo = Foo }; if ( Foo < 0 ) { goto Foo ; // في نطاق التسمية }إرجاع النتيجة ؛ Foo : النتيجة . Foo = 0 ؛ إرجاع النتيجة ؛ }int main () { // إنشاء بنية بيانات Foo، باسم Foo، // باستخدام الدالة Foo() struct Foo Foo = Foo ( 42 ); printf ( "%d \n " , Foo . Foo ); }بالإضافة إلى ذلك، من الممكن استخدام الهياكل المجهولة كمساحات أسماء في لغة C منذ C99 .
Math.h :
دبراغما مرة واحدةconst struct { double PI ; double ( * sin )( double ); } Math ;Math.c :
#include <math.h>دالة ثابتة مزدوجة _sin ( مزدوجة arg ) { إرجاع sin ( arg ); }const struct { double PI ; double ( * sin )( double ); } Math = { M_PI , _sin };Main.c :
#include <stdio.h> #include "Math.h"int main () { printf ( "sin(0) = %d \n " , Math . sin ( 0 )); printf ( "pi is %f \n " , Math . PI ); }لغة سي++
في لغة C++ ، يتم تعريف مساحة الاسم باستخدام كتلة مساحة الاسم. [ 11 ]
namespace abc { int bar ; }داخل هذا الجزء، يمكن استخدام المعرفات تمامًا كما هي مُعلنة. خارج هذا الجزء، يجب إضافة مُحدد مساحة الاسم كبادئة. على سبيل المثال، خارج هذا الجزء ، يجب كتابة للوصول إلى . يتضمن C++ بنية أخرى تجعل هذا الإسهاب غير ضروري. بإضافة السطرnamespaceabcbarabc::bar
باستخدام مساحة الاسم abc ؛بالنسبة لجزء من التعليمات البرمجية، abc::لم تعد البادئة مطلوبة.
تعتبر المعرفات التي لم يتم الإعلان عنها صراحةً ضمن نطاق اسم معين موجودة في نطاق الاسم العام.
int foo ;يمكن استخدام هذه المعرّفات كما هي مُعلنة، أو، بما أن نطاق الاسم العام غير مُسمى، ::يمكن إضافة مُحدد نطاق الاسم كبادئة. على سبيل المثال، fooيمكن كتابتها أيضًا على النحو التالي ::foo:
يُعدّ حلّ مساحات الأسماء في لغة C++ هرميًا. وهذا يعني أنه ضمن مساحة الاسم الافتراضية food::soup، يُشير المعرّف Chickenإلى food::soup::Chicken. إذا food::soup::Chickenلم يكن موجودًا، فإنه يُشير إلى food::Chicken. إذا لم يكن أيٌّ من food::soup::Chickenو food::Chickenموجودًا، Chickenفإنه يُشير إلى ::Chicken، وهو معرّف في مساحة الاسم العامة.
تُستخدم مساحات الأسماء في لغة C++ غالبًا لتجنب تضارب الأسماء . ورغم شيوع استخدامها في أكواد C++ الحديثة، فإن معظم الأكواد القديمة لا تستخدم هذه الميزة لعدم وجودها في الإصدارات الأولى من اللغة. على سبيل المثال، مكتبة C++ القياسية بأكملها مُعرّفة ضمن `<namespace>` ، ولكن قبل توحيد المعايير، كانت العديد من المكونات موجودة في مساحة الاسم العامة `<namespace>`. يمكن استخدام عبارة `<namespace>` لاستيراد رمز إلى النطاق الحالي.namespacestdusing
usingيُعتبر استخدام العبارات في ملفات الرأس لأسباب أخرى غير التوافق مع الإصدارات السابقة (مثل سهولة الاستخدام) مخالفًا لأفضل ممارسات البرمجة، حيث usingتنتشر هذه العبارات إلى جميع وحدات الترجمة التي تتضمن ملف الرأس. مع ذلك، لا تُصدّر الوحداتusing النمطية العبارات إلا إذا تم تحديدها صراحةً export، مما يجعل usingاستخدامها أكثر أمانًا. على سبيل المثال، يمكن استيراد وحدة نمطية wikipedia.project.utilذات مساحة اسم مطابقة wikipedia::project::util، ثم استخدام usingعبارات على الرموز من تلك المساحة لتبسيط مساحات الأسماء المطولة. على عكس لغات أخرى مثل جافا أو رست، لا تتطابق بالضرورة وحدات C++ النمطية ومساحات الأسماء وبنية ملفات المصدر، على الرغم من أن العرف السائد هو مطابقتها من أجل الوضوح (على سبيل المثال، foo.bar.baz.Quxتتطابق الوحدة النمطية مع فئة ذات مساحة اسم foo::bar::baz::Quxوتوجد في الملف foo/bar/baz/Qux.cppm ).
usingينبغي استخدامها لتبسيط مساحات الأسماء المتداخلة المطولة عند استخدام وحدات الترجمة المعيارية.
تصدير وحدة ويكيبيديا . مشروع . تطبيق ؛استيراد std ؛استيراد wikipedia.project.fs ؛ استيراد wikipedia.project.util ؛باستخدام wikipedia :: project :: fs :: File ; باستخدام wikipedia :: project :: util :: ConfigLoader ; باستخدام wikipedia :: project :: util :: logging :: Logger ; باستخدام wikipedia :: project :: util :: logging :: LoggerFactory ;تصدير مساحة الاسم wikipedia :: مشروع {class App { private : Logger logger ; // الحقول والأساليب الخاصة public : App () : logger { LoggerFactory :: getLogger ( "Main" ) } { ConfigLoader cl ( File ( "config/config_file.txt" )); logger.log ( " بدء تشغيل التطبيق..." ); // باقي الكود } };}يُقدّم C++11 مساحات الأسماء المضمنة ، حيث تُعامل عناصرها كما لو كانت عناصر في مساحة الاسم المُحيطة بها. ويتم تعريفها بكتابة `inline` . وهي تُشبه عبارة ضمنية، أي أن تحديد الرموز فيها اختياري.inlinenamespaceusingnamespace
خاصية "inline" متعدية. إذا aاحتوى نطاق اسم على نطاق اسم مضمن b، والذي بدوره يحتوي على نطاق اسم مضمن آخر c، فيمكن الوصول إلى أعضاء النطاق المضمن cكما لو كانوا أعضاءً في النطاق المضمن aأو النطاق المضمن الآخر b.
يُعدّ التوافق مع واجهة برمجة التطبيقات الثنائية (ABI ) والتحكم في الإصدارات من أهم استخدامات مساحات الأسماء المضمنة . فمن خلال وضع إصدارات مختلفة من واجهة برمجة التطبيقات ضمن مساحات أسماء مضمنة منفصلة (مثل `<a>`, v1`<a>`, v2`<a>`)، ثم تضمين الإصدار المطلوب حاليًا، يستطيع مطورو المكتبات إدارة التوافق مع واجهة برمجة التطبيقات الثنائية. وعند إصدار نسخة جديدة، يمكن نقل الكلمة المفتاحية `inline` إلى مساحة اسم النسخة الجديدة، مما يسمح للمستخدمين بالربط التلقائي مع النسخة الجديدة مع إمكانية الوصول إلى الإصدارات القديمة من خلال التحديد الصريح.
namespace mylib :: utils { namespace v1 { [[ deprecated ( "استخدم mylib::utils::v2::func() بدلاً من ذلك" )]] void func () { // التنفيذ القديم } }// v2 هو الإصدار النشط حاليًا inline namespace v2 { void func () { // تنفيذ جديد } } }int main () { // يستدعي الدالة mylib::utils::v2::func() ضمنيًا mylib :: utils :: func ();// يستدعي الدالة mylib::utils::v2::func() بشكل صريح mylib :: utils :: v2 :: func ();// يستدعي الدالة mylib::utils::v1::func() بشكل صريح mylib :: utils :: v1 :: func ();return 0 ; }سي شارب
تُستخدم مساحات الأسماء بكثرة في لغة C#. تُنظَّم جميع فئات إطار عمل .NET ضمن مساحات أسماء، لتسهيل استخدامها وتجنب الفوضى. كما يستخدم المبرمجون مساحات الأسماء المخصصة على نطاق واسع لتنظيم عملهم وتجنب تضارب الأسماء . عند الإشارة إلى فئة، يمكن تحديد اسمها الكامل، أي مساحة اسمها متبوعة باسم الفئة.
System.Console.WriteLine ( " Hello World ! " ) ; int i = System.Convert.ToInt32 ( " 123 " ) ;أو أضف usingعبارة. هذا يلغي الحاجة إلى ذكر الاسم الكامل لجميع الفئات في مساحة الاسم تلك.
باستخدام النظام ؛Console.WriteLine ( "Hello World!" ) ; int i = Convert.ToInt32 ( " 123 " ) ;في الأمثلة أعلاه، Systemيمثل مساحة اسم، و Consoleو Convertهما فئتان معرفتان داخل System.
![]()
على عكس لغة C++، usingلا يمكن استيراد سوى جميع الرموز الموجودة في نطاق اسم (كما هو الحال في C++، أو Rust، أو Java). ولا يمكن استخدامها لاستيراد الرموز والفئات الفردية كما هو الحال في Java.usingnamespaceuse*import*
namespace Wikipedia.Project ;باستخدام System ؛ باستخدام System.IO ؛باستخدام Microsoft.Extensions.Logging ؛باستخدام Wikipedia.Project.Utility ؛class App { private static ILogger < Program > logger ;public App ( ) { ConfigLoader cl = new ConfigLoader ( Path.Combine ( " config " , "config_file.txt" )); LoggerFactory loggerFactory = LoggerFactory.Create ( builder = > { builder.AddConsole ( ); } ) ; logger = loggerFactory.CreateLogger<Program> ( ) ; logger.LogInformation ( " بدء تشغيل التطبيق ..." ) ; // باقي الكود } }على عكس لغة C++، لا تسمح مساحات الأسماء في لغة C# بالإشارة النسبية للرموز. على سبيل المثال، Foo.Bar.Baz.Quxلا يمكن الإشارة إلى الفئة باسمها Baz.Quxحتى لو تمت الإشارة إليها من داخل مساحة الاسم Foo.Bar: إما أن يتم استيراد مساحة الاسم Foo.Bar.Bazللإشارة إلى الفئة Qux، أو Foo.Bar.Baz.Quxيجب تحديدها بشكل كامل.
جافا
في لغة جافا ، يتجسد مفهوم مساحة الاسم في حزم جافا . ينتمي كل كود إلى حزمة، مع أن هذه الحزمة لا تحتاج إلى تسمية صريحة. يُمكن الوصول إلى الكود من حزم أخرى بإضافة اسم الحزمة قبل المعرّف المناسب، على سبيل المثال، يُمكن الإشارة إلى الحزمة باسم (يُعرف هذا باسم الفئة المؤهل بالكامل ). وكما هو الحال في لغة C++، توفر جافا بنية تجعل كتابة اسم الحزمة غير ضرورية . مع ذلك، تتطلب بعض الميزات (مثل الانعكاس ) من المبرمج استخدام الاسم المؤهل بالكامل.classStringjava.langjava.lang.Stringimport
على عكس لغة C++، لا تتبع مساحات الأسماء في جافا بنية هرمية فيما يتعلق ببنية اللغة. مع ذلك، تُسمى الحزم بطريقة هرمية. على سبيل المثال، جميع الحزم التي تبدأ بـ `<package>` javaتُعد جزءًا من منصة جافا - java.langتحتوي الحزمة `<package>` على فئات أساسية للغة، وتحتوي الحزمة `<package>` java.lang.reflectعلى فئات أساسية تتعلق تحديدًا بالانعكاس.
في لغة جافا (وأدا ، وسي شارب ، وغيرها)، تُعبّر مساحات الأسماء/الحزم عن فئات دلالية من التعليمات البرمجية. على سبيل المثال، في لغة سي شارب، تحتوي على التعليمات البرمجية التي يوفرها النظام ( إطار عمل .NET ). وتختلف درجة تحديد هذه الفئات وعمق التسلسلات الهرمية من لغة إلى أخرى.namespaceSystem
يمكن اعتبار نطاقات الوظائف والفئات بمثابة مساحات أسماء ضمنية مرتبطة ارتباطًا وثيقًا بالرؤية وإمكانية الوصول وعمر الكائن .
في لغة جافا، لا يمكن تحديد الحزم جزئيًا كما هو الحال في لغة C++. على سبيل المثال، لا يمكن استيراد مساحة javaالاسم ثم الإشارة إليها java.util.ArrayListباسم ` util.ArrayList. يجب تحديد الرموز بشكل كامل أو استيرادها بالكامل إلى النطاق. importعبارات `include` ليست متعدية ولا يمكن تمييزها عمدًا exportكما في لغة C++. يجب أن تظهر جميع importالعبارات في بداية الملف، ولا يمكن كتابتها في أي نطاق آخر. هذا على عكس لغة C++، حيث stdيمكن استيراد مساحة الاسم بكتابة `include` ، ثم الإشارة إليها باسم `.usingnamespacestd;std::chrono::system_clockchrono::system_clock
package org.wikipedia.project ;استيراد java.nio.file.Paths ؛ استيراد java.util.logging.Level ؛ استيراد java.util.logging.Logger ؛استيراد org.wikipedia.project.util.ConfigLoader ؛public class App { private static final Logger logger = Logger . getLogger ( Main . class . getName ());publicApp(){ConfigLoadercl=newConfigLoader(Paths.get("config/config_file.txt"));logger.log(Level.INFO,"Application starting...");// rest of code}}Because Java does not support independent functions outside of classes, static class methods and so-called "utility classes" (classes with private constructors and all methods and fields static) are the equivalent to C++-style namespaces. Some examples are java.lang.Math, which contains the constants like Math.PI and methods like Math.sin().
import statements can be used to import all symbols in a package, called a wildcard import, which is similar to usingnamespace in C++. For instance, writing importjava.util.*; imports all classes in the java.util package. This however, can cause symbol pollution within a file. Furthermore, using glob import statements on packages that have classes with the same name can cause ambiguity, and will fail to compile. However, java.lang.* is implicitly imported into all Java source files by default.
importjava.sql.*;// Imports all classes in java.sql, including java.sql.Dateimportjava.util.*;// Imports all classes in java.util, including java.util.DateDated=newDate();// Ambiguous Date reference resulting in compilation error// Instead, the fully-qualified names must be used:java.sql.DatesqlDate=newjava.sql.Date(System.currentTimeMillis());java.util.DateutilDate=newjava.util.Date();Kotlin
Kotlin packages are very similar to Java packages, but unlike Java where only class-like objects may reside directly in a package, any top-level symbol (such as a variable, class, type alias, etc.) may live directly inside a package.
packageorg.wikipedia.examplesimportkotlin.math.PIvarmyPi=PIfuncircleArea(radius:Double):Double{returnmyPi*radius*radius}ومع ذلك، على الرغم من أن لغة Kotlin تسمح للكائنات غير المصنفة من المستوى الأعلى بالتواجد مباشرة في حزمة، إلا أن هذا يتم تمثيله في آلة جافا الافتراضية داخليًا على أنه موجود داخل فئة تم إنشاؤها، ويشبه شيئًا مثل ما يلي:
package org.wikipedia.examples ;public final class ExampleKt {private static double myPi = Math.PI ;public static final double getMyPi () { return myPi ; }public static final void setMyPi ( double value ) { myPi = value ; }public static final double circleArea ( double radius ) { return myPi * radius * radius ; } }PHP
أُضيفت مساحات الأسماء إلى لغة PHP بدءًا من الإصدار 5.3. يُمكن تجنب تضارب أسماء الأصناف والدوال والمتغيرات. في PHP ، تُعرَّف مساحة الاسم باستخدام كتلة مساحة الاسم.
# ملف phpstar/foobar.phpnamespace phpstar ;class FooBar { public function foo () : void { echo 'Hello world, from function foo' ; }public function bar () : void { echo 'Hello world, from function bar' ; } }يمكننا الإشارة إلى مساحة اسم PHP بالطرق المختلفة التالية:
ملف index.php# قم بتضمين الملف include "phpstar/foobar.php" ;# الخيار 1: إضافة اسم الفئة مباشرةً إلى مساحة الاسم $obj_foobar = new \phpstar\FooBar ();# الخيار الثاني: استيراد مساحة الاسم باستخدام phpstar\FooBar ; $obj_foobar = new FooBar ();# الخيار 2أ: استيراد وتسمية مساحة الاسم باستخدام phpstar\FooBar كـ FB ؛ $obj_foobar = new FB ();# الوصول إلى الخصائص والأساليب بالطريقة المعتادة $obj_foobar -> foo (); $obj_foobar -> bar ();![]()
بايثون
في لغة بايثون ، تُعرَّف مساحات الأسماء بواسطة الوحدات النمطية الفردية، وبما أن الوحدات النمطية يمكن أن تُضمَّن في حزم هرمية، فإن مساحات الأسماء تكون هرمية أيضًا. [ 12 ] [ 13 ] بشكل عام، عند استيراد وحدة نمطية، تُعرَّف الأسماء المُعرَّفة في تلك الوحدة النمطية عبر مساحة أسماء تلك الوحدة، ويتم الوصول إليها من الوحدات النمطية المُستدعِية باستخدام الاسم المؤهل بالكامل.
# نفترض أن mod_a تُعرّف دالتين: func1() و func2() وفئة واحدة: Class1 import mod_amod_a.func1 ( ) mod_a.func2 ( ) a : mod_a.Class1 = mod_a.Class1 ( )يمكن استخدام هذا البيان لإدراج الأسماء ذات الصلة مباشرة في مساحة اسم الوحدة النمطية المستدعِية، ويمكن الوصول إلى هذه الأسماء من الوحدة النمطية المستدعِية بدون الاسم المؤهل:from...import...
# لنفترض أن mod_a تُعرّف دالتين: func1() و func2() وفئة واحدة: Class1 من mod_a استورد func1func1 () func2 () # سيفشل هذا بسبب اسم غير مُعرَّف، وكذلك الاسم الكامل mod_a.func2() a : Class1 = Class1 () # سيفشل هذا بسبب اسم غير مُعرَّف، وكذلك الاسم الكامل mod_a.Class1()بما أن هذا يستورد الأسماء مباشرة (بدون تحديد)، فإنه يستطيع استبدال الأسماء الموجودة دون أي تحذيرات.
يُعدّ استيراد جميع الأسماء المُعرّفة في الحزمة المُسماة مباشرةً إلى مساحة اسم الوحدة المُستدعِية شكلاً خاصاً من أشكال هذا البيان. على الرغم من دعم اللغة لهذا الشكل من الاستيراد، إلا أنه يُنصح عموماً بتجنّبه لأنه يُلوّث مساحة اسم الوحدة المُستدعِية، وسيؤدي إلى استبدال الأسماء المُعرّفة مسبقاً في حالة تعارض الأسماء، [ 14 ] مع العلم أن استخدامه في بايثون يُمكن أن يُبسّط مساحات الأسماء المطوّلة، مثل مساحات الأسماء المُتداخلة.from...import*fromimport
from selenium.webdriver import Firefox from selenium.webdriver.common.action_chains import ActionChains from selenium.webdriver.common.by import By from selenium.webdriver.common.keys import Keys from selenium.webdriver.remote.webelement import WebElementإذا كان __name__ يساوي " __main__ " : driver : Firefox = Firefox ( ) element : WebElement = driver.find_element ( By.ID , " myInputField " ) element.send_keys ( f " Hello World { Keys.ENTER } " ) action : ActionChains = ActionChains ( driver ) action.key_down ( Keys.CONTROL ) .send_keys ( ' a ' ) . key_up ( Keys.CONTROL ) .perform ( )يدعم بايثون أيضًا توفير اسم بديل أو اسم مستعار لاستخدامه من قبل الوحدة النمطية المستدعِية:importxasy
استورد numpy كـ np من numpy.typing استورد NDArray و float32أ : NDArray [ float32 ] = np . نطاق ( 1000 )الصدأ
في لغة Rust ، يُطلق على مساحة الاسم اسم "وحدة" ويتم تعريفها باستخدام mod`. تكون الرموز داخل الوحدة خاصة افتراضيًا، ولا يمكن الوصول إليها خارجيًا إلا إذا تم تعريفها باستخدام الكلمة pubالمفتاحية `. يمكن أن تحتوي الوحدات على وحدات فرعية بداخلها، مما يسمح بوجود مساحات أسماء متداخلة.
على غرار usingالكلمة المفتاحية في لغة C++، تحتوي لغة Rust على useالكلمة المفتاحية لاستيراد الرموز إلى النطاق الحالي.
mod my_module { pub trait Greet { fn greet ( & self ); }pub struct Person { pub name : String , }impl Greet for Person { fn greet ( & self ) { println! ( "مرحباً، {}!" , self . name ); } } }fn main () { use my_module ::{ Person , Greet };let person = Person { name : String :: from ( "Alice" ) }; person . greet (); }يشير كتابة إلى المترجم للعثور على ملف باسم أو . في عبارة يشير إلى جذر "الصندوق" الحالي (المشروع)، بينما يمكن استخدام للإشارة إلى الوحدة الأصلية.modutil;util.rsutil/mod.rscrateusesuper
mod util ;استخدم std :: fs :: File ؛استخدم crate :: util :: ConfigLoader ; استخدم crate :: util :: logging ::{ Logger , LoggerFactory };pub struct App { config_loader : ConfigLoader ; }impl App { pub fn new () -> Self { config_loader = ConfigLoader :: new ( File :: open ( "config/config_file.txt" )); config_loader . load (); let logger : Logger = LoggerFactory :: get_logger ( "Main" ); logger . log ( "بدء تشغيل التطبيق..." ); // باقي الكود } }تُعدّ الكلمة useالمفتاحية `_____` في لغة Rust أكثر تنوعًا من نظيرتها usingفي لغة C++. فبالإضافة إلى استيراد الرموز المفردة، وإمكانية استخدام أسماء بديلة للرموز asواستيراد الأنماط العامة، useيُمكن استيراد عدة رموز في نفس السطر باستخدام الأقواس المعقوفة (التي قد تكون متداخلة)، واستيراد مساحات الأسماء الفردية، والقيام بكل ما سبق في عبارة واحدة. إليك مثال على استخدام كل ما سبق:
استخدم std ::{ alloc :: Layout , // يستورد std::alloc::Layout fmt :: * , // يستورد جميع الرموز في std::fmt fs ::{ File , Metadata }, // يستورد std::fs::File و std::fs::Metadata io ::{ prelude :: * , BufReader , BufWriter } // يستورد جميع الرموز في std::io::prelude::* و std::io::BufReader و std::io::BufWriter process , // يستورد مساحة اسم std::process (على سبيل المثال، يمكن الإشارة إلى std::process::Command باسم process::Command) time ::{ self , Duration } // يستورد مساحة اسم std::time و std::time::Duration };استخدم std :: fmt :: Result كـ FmtResult ؛ // يُعيد تسمية std::fmt::Result إلى FmtResultمساحة اسم XML
في لغة XML ، تُمكّن مواصفات مساحة أسماء XML من أن تكون أسماء العناصر والخصائص في مستند XML فريدة، على غرار دور مساحات الأسماء في لغات البرمجة. وباستخدام مساحات أسماء XML، قد تحتوي مستندات XML على أسماء عناصر أو خصائص من أكثر من مفردات XML.
مساحة اسم SAP
في أنظمة SAP (وخاصة بيئات ABAP)، تُستخدم مساحات الأسماء لمنع تضارب الأسماء بين الكائنات القياسية التي توفرها SAP وتطويرات العملاء أو الشركاء. [ 15 ]
يُفصل مُعرّف مساحة الاسم بالرمز "/" (على سبيل المثال `/MYNS/`) ويتم حجزه عبر عملية تسجيل مساحة الاسم في SAP. بمجرد الحجز، تصبح الكائنات التي يتم إنشاؤها ضمن مساحة الاسم هذه قابلة للتحديد بشكل فريد ومحمية من الكتابة فوقها عن طريق ترقيات SAP أو عمليات الاستيراد. [ 16 ]
في بيئات SAP الحديثة (مثل ABAP في السحابة وحاويات HDI)، يتم استخدام مساحات الأسماء أيضًا لتجميع عناصر التطوير أو الحزم بشكل دلالي.
محاكاة مساحات الأسماء
في لغات البرمجة التي تفتقر إلى دعم مساحات الأسماء، يمكن محاكاة مساحات الأسماء إلى حد ما باستخدام اصطلاح تسمية يعتمد على المعرفات . على سبيل المثال، غالبًا ما تستخدم مكتبات لغة C ، مثل libpng، بادئة ثابتة لجميع الدوال والمتغيرات التي تُعد جزءًا من واجهتها المُتاحة. تُتيح libpng مُعرفات مثل:
png_create_write_struct png_get_signature png_read_row png_set_invalid
يُوفر هذا الاصطلاح في التسمية ضمانًا معقولًا بأن المعرفات فريدة، وبالتالي يمكن استخدامها في برامج أكبر دون حدوث تضارب في التسمية . [ 17 ] وبالمثل، تحتفظ العديد من الحزم المكتوبة أصلاً بلغة فورتران (مثل BLAS و LAPACK ) بالأحرف القليلة الأولى من اسم الدالة للإشارة إلى المجموعة التي تنتمي إليها.
لهذه التقنية عدة عيوب:
- لا يتناسب بشكل جيد مع مساحات الأسماء المتداخلة؛ تصبح المعرفات طويلة بشكل مفرط حيث يجب أن تكون جميع استخدامات المعرفات مؤهلة بالكامل بمساحة الاسم ؛
- قد يستخدم الأفراد أو المنظمات اصطلاحات تسمية غير متسقة، مما قد يؤدي إلى إدخال غموض غير مرغوب فيه؛
- العمليات المركبة أو "القائمة على الاستعلام" على مجموعات من المعرفات، بناءً على مساحات الأسماء التي تم الإعلان عنها فيها، تصبح غير عملية أو غير ممكنة؛
- في اللغات ذات طول المعرف المحدود، يحد استخدام البادئات من عدد الأحرف التي يمكن استخدامها لتحديد ما تفعله الدالة؛ وهذه مشكلة خاصة بالنسبة للحزم المكتوبة أصلاً بلغة FORTRAN 77 ، والتي لم توفر سوى 6 أحرف لكل معرف؛ على سبيل المثال، يشير اسم دالة BLAS
DGEMMإلى أنها تعمل على أعداد الفاصلة العائمة ذات الدقة المزدوجة (D) والمصفوفات العامة (GE)، مع آخر حرفين فقط (MM) يوضحان ما تفعله فعليًا: ضرب المصفوفات.
كما أن لها بعض المزايا:
- لا توجد حاجة إلى أدوات برمجية خاصة لتحديد الأسماء في ملفات التعليمات البرمجية المصدرية؛ يكفي برنامج بسيط مثل grep ؛
- لا توجد تعارضات في الأسماء المتعلقة بمساحة الاسم؛
- لا حاجة لتشويه الأسماء، وبالتالي لا توجد مشاكل محتملة تتعلق بعدم التوافق.
انظر أيضاً
- رمز بريدي لنقطة التسليم مكون من 11 رقمًا
- التسمية الثنائية (الجنس والنوع في علم الأحياء )
- التسمية الكيميائية
- تصنيف ديوي العشري
- معرّف الكائن الرقمي
- نظام أسماء النطاقات
- الهوية (البرمجة الكائنية التوجه)
- تصنيف مكتبة الكونغرس
- فهارس النجوم واتفاقيات التسمية الفلكية
- انتهاك مستوى التجريد
- مساحة اسم XML
- البحث عن الاسم المعتمد على الوسيط
مراجع
- ↑ أنيكيت، سيدهارث؛ أديتيا، أنوشكا؛ ديبا، تشايا؛ سيرماك، باتمان؛ تشايكن، روني؛ دوسور، جون؛ هاول، جون؛ لورش، جاكوب؛ ثايمر، مارفن؛ واتنهوفر، روجر (2002). فارسايت: تخزين موحد، متاح، وموثوق به لبيئة غير موثوقة تمامًا (ملف PDF) . وقائع ندوة USENIX حول تصميم وتنفيذ أنظمة التشغيل. مؤرشف من الأصل (ملف PDF) بتاريخ 28-07-2010.
البنية الأساسية التي يُنشئها نظام الملفات هي مساحة أسماء دليل هرمية، وهي المستودع المنطقي للملفات.
- ↑ "أسئلة وأجوبة حول لغة C#: ما هو نطاق الاسم؟" . موقع C# الإلكتروني. مؤرشف من الأصل بتاريخ 20 أكتوبر 2013. تم الاطلاع عليه بتاريخ 23 فبراير 2010.
نطاق الاسم ليس سوى مجموعة من التجميعات أو الفئات أو الأنواع. يعمل نطاق الاسم كحاوية - مثل مجلد على القرص - للفئات المنظمة في مجموعات، عادةً بناءً على وظائفها. يسمح
بناء جملة نطاق
الاسم في لغة C# بتداخل نطاقات الأسماء.
- ↑ "نظرة عامة على مساحات الأسماء في PHP" . دليل PHP .
ما هي مساحات الأسماء؟ في أوسع تعريف لها، مساحات الأسماء هي طريقة لتغليف العناصر. يمكن اعتبار هذا مفهومًا مجردًا في العديد من المواضع. على سبيل المثال، في أي نظام تشغيل، تُستخدم الدلائل لتجميع الملفات ذات الصلة، وتعمل كمساحة اسم للملفات الموجودة بداخلها.
- ↑ "إنشاء الحزم واستخدامها"
.
وثائق جافا . أوراكل.الحزمة هي مجموعة من الأنواع ذات الصلة توفر حماية الوصول وإدارة مساحة الأسماء. ... تشير الأنواع إلى
الفئات
والواجهات
والتعدادات وأنواع التعليقات
التوضيحية
. التعدادات وأنواع التعليقات التوضيحية هي أنواع خاصة من الفئات والواجهات، على التوالي، لذلك غالبًا ما يُشار إلى الأنواع في هذا الدرس ببساطة باسم الفئات والواجهات.
- ↑ مساحات الأسماء في XML 1.0 . W3C (تقرير) ( الطبعة الثالثة). فريق عمل XML الأساسي. 8 ديسمبر 2009. تم الاطلاع عليه بتاريخ 30 مارس 2012 .
- ↑ مواتس، رايان (مايو 1997). "بنية الجملة" . بنية URN . فريق عمل هندسة الإنترنت (IETF). ص 1 ، قسم 2. doi : 10.17487/RFC2141 . RFC 2141. تاريخ الاسترجاع : 30 مارس 2012 .
- ↑ ستيفن ج. غودي. "قائمة معرفات USB" . 2013.
- ↑ سولينز وماسينتر (ديسمبر 1994). "متطلبات القدرات الوظيفية" . المتطلبات الوظيفية لأسماء الموارد الموحدة . IETF . ص 3، القسم 2. doi : 10.17487/RFC1731 . RFC 1731. تاريخ الاسترجاع : 30 مارس 2012 .
- ↑ "أسئلة وأجوبة حول لغة C#: ما هي مساحة الاسم؟" . موقع C# الإلكتروني . مؤرشف من الأصل بتاريخ 20 أكتوبر 2013. تم الاطلاع عليه بتاريخ 23 فبراير 2010.
على سبيل المثال، [في
نظام ويندوز
]، للوصول إلى فئات وأعضاء الإدخال/الإخراج المضمنة، استخدم مساحة الاسم System.IO. أو، للوصول إلى الفئات والأعضاء المتعلقة بالويب، استخدم مساحة الاسم System.Web.
- ↑ "مساحة الاسم هي "تجميع منطقي للأسماء المستخدمة داخل البرنامج"." . Webopedia.com. 10 أبريل 2002. تم الاطلاع عليه بتاريخ 26 يوليو 2011 .
- ↑ "تتيح مساحات الأسماء تجميع الكيانات مثل الفئات والكائنات والدوال تحت اسم واحد" . Cplusplus.com . تم الاطلاع عليه بتاريخ 26-07-2011 .
- ↑ "6. الوحدات النمطية" . دليل بايثون التعليمي . مؤسسة برمجيات بايثون . تم الاطلاع عليه بتاريخ 25 أكتوبر 2010 .
- ↑ "نطاقات ومساحات أسماء بايثون" . Docs.python.org . تم الاطلاع عليه بتاريخ 26-07-2011 .
- ↑ https://docs.python.org/3/tutorial/modules.html "بشكل عام، يُستحسن تجنب استخدام * من وحدة أو حزمة"
- ↑ "نظرة عامة على مساحات أسماء SAP" . SAPVista . تم الاطلاع عليه في 7 أكتوبر 2025.
تستخدم أنظمة SAP مساحات الأسماء لمنع تعارضات التسمية بين كائنات SAP القياسية والتطويرات الخاصة بالعميل.
- ↑ "بوابة مساعدة SAP - وثائق اتصال ABAP ومساحات الأسماء" . بوابة مساعدة SAP . تم الاطلاع عليه في 7 أكتوبر 2025.
في إطار عمل واجهة تطبيقات SAP، تُستخدم مساحات الأسماء للهيكلة المنطقية للكائنات والتكوينات.
- ↑ داني كاليف. "لماذا أكره مساحات الأسماء" . مؤرشف من الأصل بتاريخ 2016-07-09.
{{cite web}}: CS1 maint: bot: حالة عنوان URL الأصلي غير معروفة ( رابط )
روابط خارجية
تعريف كلمة " namespace " في قاموس ويكاموس
- اصطلاحات التسمية
- مقارنات لغات البرمجة
