1 .
3 .
5 پاسکال : در این بخش یک ارزیابی از ویژگیهای پاسکال برای برنامه نویسی بزرگ ارائه می کنیم .
به همین دلیل نسخه اصلی زبان را دراینجا در نظر می گیریم .
اکثر بی مناسبتی های بحث شده در اینجا توسط تأکیدات انجام شده توسط اجراهای مدرن تصحیح شده اند .
روالها و توابع برای تجزیه یک برنامه به مدول ها می باشد که می توانند برای اجرای آبسترهای روالی استفاده گردند بنابراین زبان صرفاً برنامه نویسی روالی را پشتیبانی می کند .
بعضی نسخه های بعدی زبان باعث اصلاح نسخه اصلی پاسکال با افزودن ویژگی های برنامه نویسی شئ گرا و مدول گرا شده اند.
یک برنامه پاسکال دارای ساختار شکل S.6 است .
یک برنامه شامل عملیات و عبارت ها می باشد .
عملیات توسط زبان فراهم می شوند یا بصورت تابع و روال مطرح می گردند .
یک روال یا تابع حاوی بیان ثوابت ، انواع ، متغیرها و سایر روال ها وتوابع است سازمان یک برنامه پاسکال یک ساختار درختی از مدول ها است .
ساختار درختی لانه ای کردن مدول هایی سطح پایین تر را نشان می دهد .
لانه ای کردن برای کنترل دورنمایی اسامی بیان شده در داخل مدول ها مطابق با قانون اتصال استاتیک مطرح شده در بخش 4 .
7 .
2 ، استفاده می شود .
شکل ص 17
برای دسترسی به ساختار برنامه های پاسکال ، مثال زیر را در نظر بگیرید .
فرض کنید که طرح مدولار از بالا به پایین یک مدول A دو مدول را تعریف کند ، C , B .
و آبستره های روالی کمکی را فراهم نماید .
مدول B دو آبستر کش روالی خصوص را فرا می خواند که توسط مدول E , D فراهم می شوند .
مدول C یک آبستراکشن روالی خصوص را فرا می خواند که توسط مدول F فراهم می شود .
شکل S.7 یک ساختار لانه بندی را برای یک برنامه ای نشان می دهد که شرایط های طرح را ارضاء می نماید .
شکل ص 18
یک مسئله اساسی با جواب شکل 7.
5 آن است که ساختار محدودیت ها را بر موارد یافت شده در طراحی تحمیل نمی کند .
در واقع ،ساختار امکان فراخوانی های متعدد دیگر را فراهم می سازد .
مثلاً می تواند A,B,C را فرابخواند .
C میتواند A,B را فرابخواند و غیره از طرف دیگر ، ساختار 7 .5 بعضی شرائط را تحمیل می کند که ممکن است نامطلوب باشند .
بعنوان مثال ، اگر ما کشف کنیم که مدول F به آبستراکشن روالی فراهم شده توسط مدول E احتیاج دارد ، ساختار فعلی دیگر کافی نمی باشد .
شکل 8 .
5 یک آرایش مجدد ساختار برنامه را نشان می دهد که با این نیاز جدید سازگار است .
مسئله با این سازمان جدید آن است که ساختار دیگر تفکیک سلسله مرتبه ای آبستراکشنی را نمایش نمی دهد .
مدول E یک آبستراکشن کمکی است که توسط A بکار می رود ، اگر چه تنها دلیل برای تعویض آن در آن سطح در درخت آن است که هر دو مدول B, F لازم است به آن مراجعه کنند .
مسائل مشابهی برای متغیر ها ، ثابت ها ،و انواع رخ می دهند .
ساختار درخت دسترسی به متغیر های بیان شده را در محول های محصور کننده فراهم می کند .
بعلاوه ، اگر هر مدول N,M لازم باشد که یک متغیر را به اشتراک بگذارد ، این متغیر ممکن است در مدولی بیان شود که از لحاظ استاتیکی N,M را هر دو محصور می نماید لذا متغیر برای هر مدول محصور شده دیگر توسط این مدول قابل دسترسی می شود .
مسائل بعدی توسط طرح یک برنامه متنی از پاسکال ایجاد می شوند .
کل برنامه یک متن یکنواخت واحد می باشد .
اگر برنامه بزرگ باشد ، مرزهای مدول فوراً دیده نمی شوند ، حتی اگر برنامه نویسی از قرار دادهای دقیق برای تعیین هویت استفاده نماید .
یک تسرروال می تواند قبل از بدنه آن دیده شود ، (بدلیل مداخله نمودن بیان های روال داخلی) ، در نتیجه ، برنامه ها به سختی خوانده شده یا اصلاح می گردند .
مسائل مربوط به پاسکال که دراین فصل بحث می شوند از ساختار بلوک ناشی می گردند و بنابراین برای سایر زبان های شبیه به ALGOL صدق می نمایند .
ساختار بلوک برای برنامه نویسی کوچک کافی می باشد زیرا بطور طبیعی پشتیبانی را انجام می دهد ولی برای ساختار بندی برنامه های بزرگ باارزش نمی باشد .
ساختار برنامه حاصل ازلانه بندی ممکن است با ساختار یافت شده در طی طراحی مداخله نماید .
این امر می تواند به نوشتن ، خواندن و اصلاح برنامه ها لطمه بزند .
پرسش مهم دیگر در ارتباط با پاسکال اولیه ، که تعریف زبان رسمی را فراهم می کند این موضوع را اصلاً اشاره نمی نماید .
مثلاً ، گزارش اولیه پرسش های زیر را باقی می گذارد .
به چه موجودیت های برنامه ای می تواند یک صدور واحد تألیف مجزا باشد ؟
چگونه یک رابط واحد معین می شود ؟
چه مقدار از کنترل نوع در مورد رابط های واحد انجام می شود ؟
اجراهای متفاوت راه حل های متفاوت را برای این نکات پذیرفته اند .
در نتیجه برنامه های پاسکال توسعه یافته بر روی سکوهای متفاوت ممکن است ناسازگار باشد .
مثلاً ، بعضی اجراها به روال های سطح خارجی وتوابع سطح خارجی اجازه می دهند که بطور مستقل کامپایل شوند .
واحدهای کامپایل شده بطور مستقل از طریق یک ارتباط دهنده استاندارد جمع آوری و سر هم می شوند که اتصالات بین موجودیت های وارد شده توسط هر مدول و موجودیت های صادر شده بر طرف می کند .
هیچ کنترل درون مدولی انجام نمی شوند تا تایید کنند آیا یک احضار برای یک روال خارجی با بیان روال مربوطه سازگار است یا خیر .
خطاهای از این نوع ممکن است دست نیافته باقی بماند سایر اجراهای پاسکال امکانات کامپایل کردن مجزای سالم تری را براساس نماد گذاری یک مدول فراهم می کنند که یک سری از ثوابت ، روال ها و انواع را احاطه می نماید .
2 .
5 C ـ زبان C تعاریف تابع را بصورت واحدهایی برای تفکیک یک برنامه به دو آبستراکشن روال فراهم می کند .
توابع ممکن است بعداً از طریق توابع لانه بندی شده محلی تفکیک نشوند بعلاوه ، C متکی بر یک حداقل ویژگی های زبان و تعدادی از قرار دادها برای پشتیبانی برنامه نویسی بزرگ می باشد .
این قرار دادها توسط برنامه نویسهای C بخوبی شناسایی می شوند و حتی در ابزارهایی منعکس می گردند که برای پشتیبانی زبان توسعه یافته اند .
در واقع ، بخش عمده برنامه نویسی در پشتیبانی بزرگ توسط فرمان های دخول فایل پیش پردازنده C فراهم می شود .
2.
3.
5 ـ احاطه کردن ـ واحد احاطه کردن در C یک فایل است .
نوعاً ، موجودیت های بیان شده در سر یک فایل برای توابع درآن فایل قابل رویت هستند و همچنین برای توابع در سایر فایل ها فاهم می باشند اگر آن توابع آنها را بیان کنند .
عبارت extern int max بیان می کند که متغیر max بکار رفته در اینجا تعریف می شود و محل ذخیره برای آن درجای دیگر آن تابع معلوم می باشند .
متغیرهای بیان شده در خارج از توابع فرض می شوند که برا سایر واحدها موجود می باشند اگر آنها را با استفاده از معین کننده extern بیان نمایند .
اما یک واحد ممکن است تصمیم بگیرد که چنین متغیرهایی را از سایر واحدها با بیان کردن استاتیک آنها ، پنهان نماید .
5 ـ رابط و اجرا : واحد C از مدولاریته فیزیکی یک فایل است .
هیچ پشتیبانی زبانی برای جدا سازی یک رابط مدول از اجرای آن وجود ندارد .
در عوض ، طبق قرار داد ، یک مدول منطقی در C توسط دو مدول فیزیکی (فایل ها) اجرا می شود ، که مکن است آن را رابط مدول و اجرای آن بنامیم .
رابط ، موسوم به یک header یا یک فایل include ، تمام علائم صادر شده توسط مدول را بیان می کند و بنابراین برای مشتریان مدول فراهم می باشد .
فایل header حاوی اطلاعات ضروری برای ارضاء سیستم نمونه است هنگامی که مدول های مشتری کامپایل می شوند .
فایل اجرایی مدول حاوی خش خصوصی از مدول است و سرویس های صادر شده را اجرا می کند .
یک مدولی مشتری که نیاز دارد که از عملکرد مدول دیگر استفاده کند فایل header از مدول فراهم کننده را در بردارد و به فایل اجرا وصل می شود .
یک فایل header ممکن است ثوابت را بیان کند یا تعاریف نوع ، متغیرها و توابع را ذکر نماید (معرفی نماید) فقط علامت تابع یعنی prototype فراخوانده شده در C توسط اعلام داده می شود .
یعنی تعریف تابع در فایل اجرا ظاهر گردد .
هر نوع اسامی تعریف شده در سطح خارجی یک فایل یعنی نه در داخل توابع ـ در سراسر آن فایل معلوم هستند و ممکن است در خارج از آن فایل معلوم باشند .
فایل های Header لحاظ شده توسط یک مدول ، کامپایلر را قادر می سازد تا مدول را جدا از سایر فایل های اجرا ، کامپایل نماید .
مدول شئ ، مقصد تولید شده توسط کامپایلر شامل مراجع تجزیه نشده برای آن متغیر ها وتوابع توسعه یافته از طریق فایل های header می باشد .
اتصال دهنده چندین مدول کامپایل شده مجزا را به صورت یک مدول قابل اجرا ترکیب می کند و مرجع های داخل مدول را در فرآیند ، تجزیه می نماید .
فایل header معمولاً با یک زائده h ، نام گذاری می شود و فایل اجرا با یک زائده C نامیده می شود .
این قرار دادها برفقدان پشتیبانی آشکار برای سازمان دهی برنامه غلبه کرده اند .
شکل 9 .
5 فایل های header و اجرا را رای یک مدول نشان می دهد که یک ساختار اطلاعات پشته را نشان می دهد .
همانطور که ملاحظه می شود ، در داخل فایل زبان هیچ امکانات محصور سازی را فراهم نمی نماید .
مثلاً برنامه اصلی در شکل 9 .5 دارای دسترسی کامل به ساختار درونی پشته های 51 و 52 است .
در واقع ، این خاصیت توسط برنامه اصلی برای مقدار دهی اولیه پشته های 51 و 52 توسط قرار دادن اشاره گرهای پشته آنها برابر با 5 استفاده می شود .
راه هایی برای اجرای این برنامه برای کاهش این تداخل بین مشتری و سرویس دهنده وجود دارند ، اما تمام آنها بستگی به دقت برنامه نویس دارد .
هیچ کنترلی بر آنچه که صادر می شود وجود ندارد : طبق پیش فرض ، تمام موجودیت های در یک فایل صادر می شوند .
فایل ها ممکن است بطور مجزا کامپایل شوند و مراجع درون فایل در زمان اتصال بدون هیچ نوع کنترلی تجزیه شوند .
یک فایل ممکن است کامپایل شود مادامی که همه فایل های header که او در بر می گیرد موجود باشند .
5 سازمان دهی برنامه ـ ساختار عمومی یک برنامه C در شکل 10 .
5 دیده می شود تمام فایل ها دارای ساختار مشابه هستند غیر از اینکه فقط یکی از فایل ها باید حاوی یک تابع به نام name باشد که برای آغاز اجرای برنامه استفاده می شود .
بدلیل اینکه توابع مجاز نمی باشند که در C لانه بندی شوند ، مسائل لانه بندی پاسکال رخ نمیدهند .
شکل صفحه 22 هیچ امکانات صادرات و واردات آشکاری وجود ندارد .
دو وسیله برای کنترل کردن دورنمایی اسامی در فایل ها وجود دارد .
static,extern : تمام توابع تعریف شده در یک فایل برای صدور توسط پیش فرض موجود هستند .
متغیر ها ممکن است توسط تعریف کردن آشکار آنها وارد شوند ( با استفاده از extern ) برای جلوگیری از وارد شدن یک موجودیت و محدود کردن دورنمایی موجودیت یک مدول ممکن است چنین موجودیت ای را ( تابع یا متغیر)static تعریف کند .
دو خط زیر متغیر صحیح maximum-length را وارد می کند و متغیر صحیحlocal-size را از مدول های دیگر پنهان می نماید .
exten int maximum-length static int local –size علامت static برروی نمادهای صادر شده در زمان ارتباط تأثیر می گذارد .
یک مدول کامپایل شده اسامی روال های ( غیر استاتیک ) و متغیر ها را به صورت نمادهای تعریف شده برای ارتباط دهنده ، صادر می کند .
یک مدول کامپایل شده دارای مراجع تجزیه نشده برای هر نماد تخصیص یافته بصورت extern درمدول می باشد .
ارتباط دهنده تلاش می نماید تا جنین مراجع تجزیه نشده ای را با نمادهای تعریف شده توسط سایر مدول ها منطبق نماید .
3 5 ـC++ براساس C است و اعتماد C بر قراردادها را به اشتراک می گذارد .
همچنین از یک فایل به صورت واحد مدولاریته فیزیکی استفاده می کند .C++ مانند C توابع را به صورت یک ساختار تجزیه برای اجرای عملیات انتزاعی فراهم می کند .
با این حال ،C++ یک واحد مدولاریته منطقی فراهم می کند که اجرای انواع اطلاعات انتزاعی را فراهم می کند .
کلاس ها ممکن است برای اجرای انواع اطلاعات انتزاعی ژنریک استفاده شود .
کلاس احاطه و کنترل را بر رابط ها فراهم می کند .
کلاس ها دارای کاربرد های بسیاری در C++ هستند .
در این فصل ، کاربرد کلاس ها بصورت مدول ها مرور می کنیم .
کاربرد کلاس ها را برای پشتیبانی برنامه نویسی شئ گرا در فصل 6 بررسی می گردد .
1 .3 .3 .5 ـ محصور سازی : واحد مدولاریته منطقی در C++ ، کلاس می باشد .
یک کلاس برای مقاصد مختلفی عمل می کند .
شامل : 5 تعریف یک نوع اطلاعات جدید (تعریف شده توسط کاربر) احاطه سازی یک گروه از موجودیت های درداخل یک گروه موجودیت های تعریف شده توسط یک کلاس یا عمومی هستند که به مستریان صادر می شوند یا خصوصی هستند که از مشتریان پنهان می مانند .
همچنین متغیرهای حفاظت شده وجود دارند که در فصل بعد بحث می گردند .
کلاس یک وع تعریف شده توسط کاربر را تعریف می کند .
یعنی استفاده از سرویس های پیشنهاد شده توسط یک کلاس ، مشتری باید ابتدا یک نمونه از کلاس موسوم به Object را ایجاد کند .
ما یک مثال درباره این امر را با مثال دیکشنری در بخش 1 .
5 ملاحظه کردیم.
کلاس ها ممکن است لانه بندی شوند .
اما همانطور که در مورد پاسکال دیدیم ، لانه بندی ممکن است فقط برای برنامه نویسی در اندازه کوچک بکار برود و از برنامه کمکی utility برای برنامه نویسی ژنریک را پشتیبانی کنند .
ما واحدهای ژنریک را در بخش 4 .
5 بحث نماییم .
5 ـ سازمان دهی برنامه ـ کلاس ها انتزاع ها را تعریف می کنند که از آنها برنامه قرار است تشکیل شود .
برنامه اصلی یا یک مشتری نمونه های کلاس ها را ایجاد می کند و آنها را برای اجرای وظیفه مورد نظر فرا می خواند .
شکل 11 .5 یک کلاس را نشان می دهد که یک پشته از اعداد صحیح را اجرا می کند .
طبق قرار داد ،رابط و اجرایی یک کلاس به دو فایل مجزا می شوند ، یک فایل header و یک فایل اجرا اپراتور عملکرد : بکار رفته در stack : push برای تجزیه دورنمایی اسامی استفاده می شود .
و در این حالت نشان می دهد که عمل push در یک عملیات کلاس stack می باشد .
بطور کلی × :: × به × در دور نمای × اتلاق می شوود ؛ ×:: به × در محیط جهانی اتلاق می شود .
بعضی نکات برای مشاهدهدرباره این برنامه به شرح زیر هستند : × .
دربرنامه اصلی پشته ها به همان صورتی تعریف می شوند که متغیرهای انواع تعریف شده توسط زبان تعریف می گردند .
عملیات صادر شده توسط پشته ـ push و pop ـ در برنامه اصلی توسط استفاده از نماد گذاری dot و دسترسی به عملیات مطلوب از ایشان پشته (s1 یا s2) احضار می شوند .
تعاریف عملیات push و pop ممکن است در دنه کلاس یا خارج از آن ظاهر گردد .
و بالاخره در بعضی حالت ها ، کامپایلر سعی می کند تا کد توابع عضو در خط را گسترش دهد تا از سربار شدن یک احضار تابع پرهیز گردد .
بطور خلاصه C++ توسعهمدول های مستقل را پشتیبانی می کند (اما آن را تاکید نمی نماید) 1ـ یک رابط کلاس و اجرا ممکن است جدا شود و حتی بطور مجزا از هم کامپایل گردد .
اجا باید شامل تعریف رابط باشد و پس از موجود شدن فایل رابط باید کامپایل گردد .
2ـ جدایش بین یک رابط کلاس و تعریف آن کامل نمی باشد .
یک تعریف کلاس ، که ما برابر با رابط آن قرار داده ایم ، حاوی موجودیت های صادر شده و همچنین موجودیت های خصوصی کلاس است .
اگر چه این موجودیت ها در فایل رابط ظاهر می گردند ، آنها برای مشتریان غیرقابل رؤیت هستند .
آنها در رابط لحاظ می شوند تا کامپایلر را قادر سازند که مشتریان کلاس بدون دسترسی به اجرایی کلاس کامپایل نماید .
بخش 5 .
4 .
5 حاوی شرح مفصل این نکته است .
3ـ مدول های مشتری ممکن است با دسترسی به مدول های رابط فراهم کنندگان سرویس کامپایل شوند و نه توسط دسترسی به مدول های اجرای آنها .
4ـ هر نوع نام تعریف شده در یک کلاس برای کلاس ، محلی هستند مگر اینکه بطور آشکار public تعریف شوند .
مدول مشتری باید از نام شئ برای دسترسی به اسامی داخلی کلاس استفاده کنند .
3 .3 3 .
5 ـ گروه بندی واحدها ـ C++ دارای مکانیزم های گوناگون برای ارتباط دادن واحدها به یکدیگر است .
اولاً ، کلاس ها ممکن است لانه بندی شوند .
همانطور که قبلاً گفته ایم ، این یک برنامه نویسی در اندازه کوچک است .
دو مکانیزم دیگر توابع «دولت» و فضا نام ها ، بعداً بحث می شوند .
توابع دولت ـ یک کلاس در C++ یک نوع تعریف شده توسط کاربر را تعریف می کند .
در نتیجه عملیاتی که بصورت عمومی تعریف می کند عملیات بر روی اشیای آن نوع می باشند .
اما گاهی اوقات ما ممکن است با عملیاتی مواجه گردیم که معمولاً به یک شئ یا شئ دیگر تعلق ندارد .
مثلاً ، اگر یک کلاس را برای اعداد مختلف تعریف نماییم ممکن است یک بخش اطلاعات داشته باشیم که بخش های موهومی و حقیقی از عدد را ذخیره می کند ، همراه با عملیات توسعه یافته ای که اجازه می دهدتا مشتریان اشیایی از نوع مختلط را ایجاد کرده و بکار گیرند .
اما درباره یک عملیات اضافه که دو شئ مختلط را برای جمع کردن باهم انتخاب می کند چه می توان گفت ؟
بعنوان مثال دیگر ، تعریف یک تابع را در نظر بگیرید که یک بردار را در یک ماتریس ضرب می کند .
آیا تابع باید عضوی از کلاس بردار یا کلاس ماتریس باشد ؟
برای اینکه چنین توابعی بطور مؤثر اجرا شوند ، لازم است که آنها به بخش های خصوصی اشیایی که بکار می گیرند دسترسی داشته باشند اما واقعاً به یک شئ خاص تعلق نداشته باشند .
زبان های بر پایه مدول مثل Module-z ,Ada به این موجودیت های مرتبط اجازه می دهند که با یکدیگر در یک واحد متینی واحد بسته بندی شوند ، یک زبان بر پایه کلاس مثل C++ باید یک راه حل متفاوت را بپذیرد .
در C++ ، یک کلاس می تواند به بخش های خصوصی اش توسط بیان کردن توابع معینی بصورت « دوستان اش » دسترسی یابد .
توابع دوست دارای همان حقوق مانند توابع عضو کلاس هستند اما توابع جهانی معمولی یا روش هایی برای سایر کلاس ها می باشند .
شکل 12 .5 تعریف یک کلاس عدد مختلط را نشان می دهد .
کلاس نوع مختلط را تعریف میکند که از دو دوبل تشکیل می شود که بخش های موهومی و واقعی یک عدد مختلط را نشان می دهد .اینها از مشتریان پنهان هستند .
کلاس یک روش ایجاد یک عدد مختلط خارج از دو دوبل را صادر می کند .
بنابراین ، تعریف زیر دو عدد مختلط را ایجاد می کند : Complex x(1.0,2.0),y(2.5,3.5), تعاریف دگر در شکل 12 .5 بیان می نمایند که توابع عملگر بعداً تعریف می شوند ( / ، × ،- ،+ ) دوستان مختلط کلاس هستند و بنابراین ممکن است به بخشهای خصوصی کلاس دسترسی داشته باشد .
آنها توابع عضو کلاس نمی باشند و توسط کلاس صادر نمی شوند آنها به سادگی توسط کلاس مورد عمل قرار نمی گیرند .
البته ، توابع friend لازم نیست به مشتریان صادر شوند اگر آنها توابع جهانی می باشند .
تریف این عملگر ها بصورت توابع friend به مشتریان اجازه می دهد تا بطور طبیعی از این توابع بصورت عملیات نیری استفاده کنند از قبیل complex C =C+X ; اگر عملیات اضافی یک عضو از کلاس بودند ، نمادگذاری برای مشتریان کاملاً ساده می شد مثلاً ممکن است مجبور می شدیم چیزی شبیه به این بنویسیم C.add(x) تا مختلط x را به مختلط c اضافه نماییم .
نیاز برای توابع friend یک پس آمد کاربرد C++ از کلاس ها بصورت انواع تعریف شده با ماربر و به صورت مکانیزم احاطه سازی است .
در یک زبان شبیه به Ada ، جایی که بسته استفاده می شود (برای انواع و گروه بندی موجودیت های مرتبط ، ما بطور طبیعی تعاریف نوع را برای complex و توابع «دوست» آن در همان بسته گروه بندی می نماییم .
توابع بطور خودکار به بخش های خصوصی از بسته دسترسی می یابند زیرا انها بخشی از بسته هستند در هر دو حالت ، هر تغییر برای نمایش اطلاعات ممکن دست به تغییرات برای توابع نیاز داشته باشد ، اعم از اینکه آنها بخشی از یک بسته باشند یا توابع دوست باشند .
ما در بخش 5 .
6 ملاحظه می کنیم که Java کلاس ها و بسته ها را ترکیب می نماید و این تقسیم به دو بخش را بر طرف می نماید .
نام فضاها ـ در C و C++ ، واحد نامگذاری جهانی یک فایل است .
اسامی تعریف شده در سطح خارجی یک فایل بطور جهانی توسط پیش فرض معلوم می شوند .
مثلاً ، نامهای تمام کلاس های تعریف شده در یک فایل اجرا کننده یک کتابخانه برای هر مشتری معلوم هستند که آن فایل را شامل می باشد .
همانطور که ما در بخش 4 .
5 پرسیدیم ، چگونه می توانیم موقعیت را اداره کنیم هنگامی که دو کتابخانه دو کلاس دارای نام یکسان را فراهم می کنند ؟
چگونه یک مشتری می تواند از هر دو کلاس استفاده نماید ؟
چگونه فراهم کننده کتابخانه یک سرویس جدید به کتابخانه اش اضافه می کند و مطمئن می شود که نام جدید سرویس با هر کاربرد موجود از مشتریان تصادم نمی کند ؟
از آنجایی که اسامی توسط افراد مستقل ایجاد می شوند ، یک فضا نام جهانی ساده یک مسئله جدی در توسعه برنامه های بزرگ است .
راه حل C++ عبارت انداز جدایش فضا نام جهانی به فضاهای کوچکتر موسوم به فضا نام ها است .
نام های تعریف شده در یک فضا نام درجاع شود .
این مکانیزم نویسندگان کتابخانه قادر می سازد که کتابخانه هایشان را در فضا نام های خودشان با یک تضمینی استقلال از سایر فراهم کنندگان کتابخانه ، تجهیز نمایند .
البته ، برای اسامی فضا نام ها لازم است که منحصر بفرد باشند .
مثلاً xyz corp …….
را در نظر بگیرید که یک کتابخانه از کلاس ها را برای بکارگیری موتورهای توربین فراهم می کند و ممکن است کتابخانه اش را در یک فضا نام xyz corp فراهم نماید .
name space xyz corp .
.
یک مشتری که می خواهد تعریف turbo diesel را استفاده کند .
دارای آپشن های متعدد است .
یکی عبارت انداز از نامیدن تعریف بطور مستقیم می باشد .
اپراتور :: برای تعیین کیفی فضا نام استفاده می شود کهدر آن کامپایلر باید شئ مورد نظر را جستجو نماید .
یک آپشن دیگر عبارت انداز ایجاد یک مترادف برای نام است طوری که نام فضا نام لازم نیست که تکرار شود .
using xyz corp…… .
xyz corp :: start (+) آپشن نهایی برای مشتری ای است که می خواهد تمام تعاریف را از یک فضا نام وارد نماید .
فضا نام ممکن است توسط وارد کردن آن باز شود : using…… .
start (+) مکانیزم فضا نام برای کمک به فراهم کنندگان کتابخانه جهت مستقل شدن از سایر فراهم کنندگان کتابخانه در نظر گرفته می شود ، و آنها را اقدر می سازد که کتابخانه های خودشان به روز نمایند بدون آنکه خطر تداخل با کد مشتری وجود داشته باشد و حتی انتشارات جدیدی از کتابخانه ها فراهم کنند که با انتشارهای قدیمی وجود دارد (هر انتشار در یک فضا نام متفاوت زندگی می کند) .
اپراتور :: برای تجزیه و تفکیک می باشد .
×::× به × دردور نمای × اتلاق می شود ، که ممکن است یک فضا نام با یک کلاس باشد که نام آن ، × ، در محیط مراجعه جاری معلوم می باشد .
5 ـ Ada ـ برای پشتیبانی برنامه نویسی بزرگ طراحی شد .
و امکاناتی را برای پشتیبانی مدول ها ، احاطه سازی و رابط ها ظاهر می نماید .
یک تمایز آشکار بین تعیین اجرای یک مدول ایجاد می کند .
یک فایل ممکن است کامپایل شود اگر مشخصات مدول هایی که استفاده می کند ، موجود باشند .
بنابراین ، Ada یک فرآیند توسعه نرم افزار را پشتیبانی می کند که در آن مشخصات مدول اولین بار توسعه می یابند و اجرایی آن مدول ها ممکن است بطور مستقل انجام گیرد .
چون Ada به کنترل کردن نوع در مدول ها نیاز دارد ، اجرای Ada بر اساس یک کتابخانه زمان ـ کامپایل است که با آن مشخصات مدول کامپایل می شوند .
هر بار که یک مشخصه مدول کامپایل می شود ، تمام اطلاعات نوع مربوط در کتابخانه ذخیره می گردد .
یک مدول ممکن است کامپایل شود اگر مشخصات مدول ای که نیاز دارد قبلاً در کتاببخانه باشند .
این کتابخانه کنترل رابط های درون مدول (بین مدول) را در زمانی کاپایل پشتیبانی می نماید .
(بخش 3 .
5 .
3 ) .
/ 1 .
5 ـ محصور سازی ـ بسته ، واحد مدولاریته Ada است یک مدول Ada یک گروه از موجودیت ها را محصور می کند بنابراین برنامه نویس برپایه مدول را پشتیبانی می نماید .
قبلاً دیدیم که تمایز آشکار زبان بین مشخصه مدول و بدنه مدول برنامه نویس را مجبور می کند تا آنچه را که انتظار می رود توسط مدول از آنچه که در داخل مدول پنهان است ، مجزا نماید .
تمام واحد ها در Ada ممکن است ژنریک باشند .
ما واحدهای ژنریک را در بخش 4 .5 بحث می کنیم .
/ 2 .
5 ـ رابط و اجرا ـ قبلاً در 2 .
5 دیده ایم که بسته Ada جداسازی مشخصه و بدنه یک مدول را پشتیبانی می کند ، رابط یک واحد Ada شامل دستور with است ، که اسامی واحدهایی را فهرست می کند که از آنها موجودیت ها وارد می شوند ، و مشخصه واحد (قرار گرفته در داخل زوج is…end) که موجودیت ها را فهرست می نماید ، توسط واحد صادر می شود .
مثلاً ، واحد زیر ، T ، واحد X را (یک برنامه فرعی) درداخل عبارت with آن فهرست می کند .
در نتیجه ، از x درداخل بدنه T استفاده می نمایند .
with x package .
end T بطور مشابه ،روال U میتواند روال T.D و متغیر دسترسی T.C را احضار نماید از طرف دیگر واحد X برای U قابل رؤیت نمی باشد .
with T .
….
T.C….
end U برای امکان ارجاع به موجودیت های وارد شده ، Ada یک عبارت use دارد که برای باز کردن دورنمای واحد بکار رفته به کار می رود .
با عبارت use ، از نماد گذاری dot ممکن است پرهیز شود .
مثلاً ، همان برنامه بالا ممکن است چنین نوشته شود .
…C…noneed fort … end U عبارت with برای بخش مشخصه یک بسته بکار می رود .
یعنی ، فقط موجودیت های فهرست شده در بخش مشخصه برای واحد وارد کننده موجود هستند .
بدنه بسته ، اجرایی مدول است و از مدول وارد کننده ، پنهان می شود .
جدایش بین رابط اجرا از بین می رود اگر یک واحد بخواهد یک نوع را صادر کند .
ما این موضوع را در بخش 5 .
5 بحث می کنیم پس از اینکه به امکان کامپایل کردن مجزای Ada نگاهی انداختیم .
5 ـ سازمان دهی برنامه پشتیبانی ـ Ada برای برنامه نویسی بزرگ شامل برنامه های مدولار و پشتیبانی توسعهمجزا و کامپایل کردن مدول ها است .
یک برنامه Ada یک مجموعه خطی از مدول هایی است که می توانند برنامه های فرعی یا بسته باشند .
این مدول ها موسوم به واحدها هستند .
یک واحد خاص که یک برنامه فرعی را اجرا می نماید برنامه اصلی درمعنی متداول است .
تعاریف مدول ممکن است لانه بندی شوند .
لذا ،یک واحد می تواند بصورت یک ساختار درختی از مدول ها سازمان دهی گردد .
استفاده بیش از حد از لانه بندی در داخل یک واحد باعث همان مشکلات بحث شده برای پاسکال می شود .(1 .3 .5 را ببینید ) این مشکلات می توانند توسط استفاده از submit پیشنهاد شده توسط Ada تکرار گردند .
این وسیله به بدنه یک مدول فرورفته در بخش تعریفی یک واحد (یا واحد فرعی ) اجازه می دهد که جدای از واحد محصور کننده نوشته شود .
بجای مدول کل ، فقط یک stub لازم است در بخش تعریفی واحد محصور کننده ظاهر گردد .
برنامه در شکل 13 .5 مفهوم واحد فرعی را نشان می دهد .
شکل ص 32 پسوند (x) separate بدنه بسته Y را بصورت یک واحد فرعی از واحد X تعریف می کند .
بطور مشابه ، (x,y) separate روال Z را بصورت یک واحد فرعی از بسته Y لانه بندی شده در داخل X نشان می دهد .
واحد فرعی می تواند خواندن برنامه ها را توسعه دهد و برنامه نویسی از بالا به پایین را پشتیبانی نماید .
هنگام نوشتن یک برنامه در یک سطح معین از انتزاع ممکن است بخواهید بعضی جزئیات را رها کنید تا در یک سطح پایین تر تصمیم گیری شود .
فرض کنید شما یک روال معین را برای انجام یک کار معین نیاز داشته باشید .
اگرچه احضارهایی برای آن روال می تواند مفید باشند هنگامی که می خواهید جریان اجرا را کنترل نمایید ، بدنه روال می تواند در یک زمان دیرتر نوشته شود ، اکنون ، همه آنچه که شما نیاز دارید یک stub است ، واحد فرعی ، برمشکلات ایجاد شده توسط ساختار لانه بندی درخت غلبه نمی کند .
بدنه واحد فرعی مجزای متنی هنوز از لحاظ منطقی در نقطه ای واقع است که در آن stub مربوطه در واحد (فرعی) محصورکننده ظاهر می گردد .
این نقطه ای است که موجودیت های قابل رویت برای واحد فرعی را تضمین می نماید .
هر دو واحد فرعی Y,Z می توانند به متغیر تعریف شده در واحد X دسترسی یابند .
هر مدول منطقی کشف شده در مرحله طراحی می تواند به صورت یک واحد اجرا شود .
اگر طرح از بالا به پایین به دقت انجام شده باشد ،مدولهای منطقی باید نسبتاً ساده باشند .
لذا ، درداخل واحدها نباید لانه بندی ای وجود داشته باشد .
در واقع ، کل برنامه باید بصورت یک واحد یکتا با یک ساختار درخت لانه بندی شده عمیق می توانست طراحی گردد و بدست آوردن یک ساختار برنامه مطلوب تر بستگی به طراح یا برنامه نویس دارد .