# Native Code > برنامه نویسی با C > برنامه نویسی با MFC و ++Visual C >  namespace چیست و به چه دردی میخورد!؟

## Amir-Shabani

با سلام ....

فضای نام چیست!؟ به چه دردی میخورد!؟ تو msdn گشتم تنها چیزیکه فهمیدم این بود :

با معرفیnamespace شما میتوانید ارجاع بدهید به دو کلاس مختلف که فضای نام یکسان دارند.... حالا این یعنی چی .... نمیدونم :گیج:  :خجالت: 
ببخشید دیگه.... برنامه نویس تازه کار سوالاتش هم مبتدی باشه....

----------


## mehdi.mousavi

> با سلام .... فضای نام چیست!؟ به چه دردی میخورد!؟ با معرفیnamespace شما میتوانید ارجاع بدهید به دو کلاس مختلف که فضای نام یکسان دارند....


سلام.
فرض کنید از شما خواسته اند که یک *شکلات صبحانه* تهیه کنید. اولین سوالی که می پرسید اینه: "چه *مارکی* بگیرم؟ پاک، پگاه، Nestle، و ..." همونطوریکه می بینید، عبارت شکلات صبحانه به طیف وسیعی از محصولات شرکت های مختلف اشاره می کنه، بنابراین برای اینکه دو "شکلات صبحانه" رو از هم تمیز بدیم، نام شرکت سازنده اش رو هم دنباله اش میاریم.

در برنامه نویسی هم همین مساله صادقه. Namespace یا فضای نام رو به صورت Container ای تصور کنید که به شما اجازه میده تا دو کلاس هم نام در دو Namespace مجزا داشته باشید. طبیعتا اطلاع دارید که شما نمی تونید در حالت عادی در برنامه، دو کلاس هم نام داشته باشید. در صورتیکه استفاده از Namespace ها، Context ای بوجود میاره که این اجازه رو به برنامه نویس میده. حالا این کجا به درد میخوره؟ فرض کنید شرکت Microsoft کلاسی برای کار با Map به اسم CMap درست کرده. در عین حال، STL نیز کلاسی برای کار با Map ها داره. خوب، حالا قصد داریم تا هر دو Map رو در برنامه استفاده کنیم، پس باید به نوعی Ambiguity بوجود اومده (یعنی ابهام، ابهام در تشخیص اینکه ما کدوم Map رو در کدمون میخواهیم استفاده کنیم) رو Resolve کنیم. به همین دلیل و برای اینکه چنین مشکلاتی پیش نیاد، STL کدهاشو در std namespace گذاشته. حالا هر کسی نیاز داشته باشه تا به vector تعریف شده در STL ارجاعی داشته باشه، باید namespace اونو (یعنی std) ذکر کنه.....

موفق باشید.

----------


## complexcoding

سلام
آقا یه سوال ؟
آوردن دو کلاس با نام های مشابه در صورتی امکان پذیره که هر کدوم در فضای نام خودش باشه یعنی در فضای نام مجزاء. خوب تا اینجا درست حالا اینو چطوری می تونیم مطابقت بدیم با مثال شکلات صبحانه در صورتی که این شکلات ها در هر مارکی هر اسمی باید درون ظرف شکلات قرار بگیرن؟ نمی تونیم یعنی مارک های مشابه اسمی شکلات را در درون ظرف های مجزای شکلات قرار بدیم خوب اسم اون ظرف ها رو چی بذاریم بازم شکلات؟؟؟؟ یا ظرف شکلات های شرکت فرمند یا ظرف شکلات های شرکت پاک و ... آره این درسته ؟... منظورتونو درست متوجه شدم؟

----------


## mehdi.mousavi

> سلام آقا یه سوال ؟ آوردن دو کلاس با نام های مشابه در صورتی امکان پذیره که هر کدوم در فضای نام خودش باشه یعنی در فضای نام مجزاء. خوب تا اینجا درست حالا اینو چطوری می تونیم مطابقت بدیم با مثال شکلات صبحانه در صورتی که این شکلات ها در هر مارکی هر اسمی باید درون ظرف شکلات قرار بگیرن؟ نمی تونیم یعنی مارک های مشابه اسمی شکلات را در درون ظرف های مجزای شکلات قرار بدیم خوب اسم اون ظرف ها رو چی بذاریم بازم شکلات؟؟؟؟ یا ظرف شکلات های شرکت فرمند یا ظرف شکلات های شرکت پاک و ... آره این درسته ؟... منظورتونو درست متوجه شدم؟


سلام.
ببینید. اون ظرف ها، خودشون برای خودشون سازنده ای دارن. فرضا، Tetra Pak از اون ظرف ها می سازه، فلان شرکت گونه دیگه ای از اون ظرفها رو تولید می کنه و ... حالا، ممکنه فرمند، دلش بخواهد از ظرف های ساخت Tetra Pak برای نگهداری محصولاتش استفاده کنه، اما پگاه ترجیح بده مواد غذایی خودش رو در ظروف ساخت خودش نگهداری کنه. مایکروسافت، بسیاری از این ظروف رو از پیش ساخته و آماده کرده و در اختیار برنامه نویس ها قرار داده. List، Collection، Hashtable، HashSet، KeyValuePair، Dictionary و ... همه ظروفی هستن که قادرن Object های مورد نظر ما رو در درون خودشون نگهداری کنن و هر کدوم در جایگاه خودشون، کاربرد دارند...

موفق باشید.

*پاورقی:* اینقدر شکلات شکلات کردید، دلم شکلات خواست  :لبخند:

----------

