ادامه . . .

 

--------------------------------------2.4.3

Message passing

 

یک مسیج یک جنرال متد است که باعث می شود یک شئ یک رفتار خاص را انجام دهد وتفاوت آن با یک متد این است که یک مسیج دستور انجام یک عمل خاص است ولی یک متد شیوه ی اجرای آن عمل است.

یکی از کاربرد های این شیوه در سیستم های شبکه ای امروزی میباشد.

فرض کنید در یک شبکه برنامه ای به روش ساخت یافته ایجاد شده است و در یک لحظه خاص 100 تابع در حال اجرا شدن میباشند. اگر هر یک از توابع فقط به یک پارامتر نیاز داشته باشند واین پارامتر هم از نوع آرایه یا رکورد نباشد ویک متغیر معمولی باشد باید 100 متغیر هم زمان به 100 تابع پاس شوند وبعد هم نتایج توابع بازگردانده شوند در حالی که اگر از روش شئ گرا استفاده می شد تمام این توابع توسط 100 پیام یا میسج انجام میشدند زیرا تمام توابع چون با داده ها در یک کلاس کپسوله شده اند به آنها مستقیماً دسترسی دارند. 

 

 

 

 

 

 

 

 

 

 

---------------------------------3.4.3

 

:Inheritance(2

 

 

وراثت نیز یکی از مفاهیم مهم و پر کاربرد در روش شئ گرا می باشد.

این مفهوم از زمانی بوجود آمد که در یک سیستم کلاس هایی وجود داشتند که یکی از آنها دارای بسیاری از ویژگی های سایر کلاسها ی دیگر بود.

وراثت در روش شئ گرا به این مفهوم است که یک کلاس را به عنوان کلاس پدر در نظر میگیریم و سایر کلاس ها را به عنوان فرزند برای کلاس پدر تعریف می کنیم.به این ترتیب کلیه عناصر کلاس پدر که از نوع حفاظت شده تعریف شده اند به فرزندان به ارث میرسد . البته باید توجه داشت که عناصر عمومی و اختصاصی به ارث نمی رسند.

به این مثال توجه کنید:

 

تصور کنید در برنامه ای نیاز به تعریف چندین کلاس برای ایجاد شئ های ماشین های مختلف داریم. در حالت عادی باید شروع به تهریف این کلاس ها کنیم و برای هر یک از آنها یکسری خصوصیات ورفتار ایجاد کنیم اما اگر کمی دقت کنیم متوجه خواهیم شد که بسیاری از این عناصر بین تمام انواع ماشین ها مشترک است.

عناصری از قبیل:

خواص:

نام

رنگ

شماره شاسی

تعداد سرنشین

و . . .

رفتارها:

حرکت کردن

ایستادن

مسافر حمل کردن

و . . .

پس چرا باید این عناصر را برای هر کلاس مجدداً ایجاد کنیم ؟

آیا بهتر نیست سیستمی اتخاذ شود تا این عناصر مشترک فقط برای یک کلاس تعریف شود ولی در همه کلاس ها استفاده شود؟

این سیستم همن سیستم وراثت است.

به این ترتیب که برنامه نویس تمامی عناصر مشترک را در کلاس پدر از نوع حفاظت شده تعریف میکند. در این سیستم دو دسته از کلاس ها ایجاد میشوند:

 

                                        base class or super class(1

drive class or sub class(2

                                                                

 

 

               base class

         ماشین

 

        سواری

       کامیون  

 

 

 

 

           بنز

        بی ام و

                

 

 

Sub classes

 

نويسنده: سيدمحمود شجاعي كياسري

 

ادامه . . .

 

 

 

4.3  ویژگی ها و مفاهیم روش شئ گرا :

این روش دارای یکسری مفاهیم و ویژگی هاست ولی این مفاهیم از ابتدای ایجاد این روش به وجود نیامدند بلکه به مرور زمان وبا پیشرفت این روس به وجود آمدند.

حال به بررسی اجمالی هر یک از این مفاهیم می پردازیم.

 

 

encapsulation(1

Inheritance (2

polimorphism(3

 

--------------------------------------1.4.3

 :encapsulation(1

 کپسوله سازی مکانیزمی است که به موجب آن داده ها و دستورالعمل ها یی که روی آنها کار میکنند رامجتمع و پیوند میدهند و هر دو را دور از دسترس محیط خارجی قرار داده و از استفاده بی مورد آنها جلوگیری می کند.

در واقع در این مکانیسم داده ها و دستورالعمل ها همگی مثل یک جعبه سیاه هستند که همه داده ها و دستورالعمل ها در آن وجود دارد و هنگامی که به این شکل به هم پیوند می خورند یک شئ تشکیل می شود.

داستان کپسوله سازی از آنجایی شروع شد که در برنامه سازی ساخت یافته یک ساختمان داده مثل لیست پیوندی بین چندین تابع به اشتراک گذاشته میشد.

هر یک از این  توابع به طور مستقیم به این ساختار دسترسی داشتند . در نتیجه اگر یکی از توابع یک تغییر اشتباه در ساختار ایجاد کنند سایر توابع نیز به طور خودکار دچار اشتباه می شدند.

روش شئ گرا برای حل این مشکل مکانیزم کپسوله سازی را مطرح کرد ودر واقع لیست پیوندی را از ساختار داده ای به یک کلاس تبدیل کرد.

به این ترتیب کلیه تغییراتی که در لیست ایجاد میشود توسط خود شئ ایجاد میشود و احتمال ایجاد اشتباه تقریباً از بین میرود.

در واقع شئ مورد نظر خودش روابطش را کنترل میکند.

این مکانیزم برای عناصر یک کلاس سه سطح دسترسی تعریف میکند که عبارتند از:

   (عمومی)Public

    (اختصاصی)Private

  (حفاظت شده)Protected

کلیه عناصری که از سطح دسترسی عمومی تعریف شوند توسط تمام توابع سیستم از تمام کلاسها قابل دسترسی میباشند.

کلیه عناصری که از سطح اختصاصی تعریف میشوند تنها توسط توابع همان کلاس قابل دسترسی میباشند.

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

در اینجا سئوالی ایجاد می شود که رابطه بین اشیاء چگونه ایجاد می شود؟

یعنی مثلاً شئ لست پیوندی از کجا متوجه میشود که مثلاً باید یکی از نود هایش را حذف کند؟

در روش شئ گرا این وظیفه را  پیام ها بر عهده دارند که در ادامه به توضیح این مکانیزم میپردازیم.

نويسنده: سيدمحمود شجاعي كياسري

ادامه . . .

کلاس (شئ) ماشین

خصوصیات:(properties)

نام

رنک

شماره شاسی

تعداد سرنشین

و . . .

رفتارها:(metod)

حرکت کردن

ایستادن

حمل مسافر

تعویض دنده ها

و . . .

 

 2.3  معرفی ساختار کلاس ها:

همانطور که قبلاً گفته شد ایجاد کلاس های جدید اساس برنامه نویسی به روش شئ گراست .

حال به معرفی ساختار یک کلاس  و ویژگی های آن میپردازیم.

در برنامه نویسی ساخت یافته هر برنامه را می توانستیم به دو بخش اصلی که کاملاً از هم جدا بودند تقسیم کنیم:

              

                       1-الگوریتم ها                                 2-داده ها

ولی در روش شئ گرا این دو بخش را در یک بسته به نام کلاس قرار داده ایم وبین آنها یک ارتباط دائمی برقرار کرده ایم . به این بسته ها کلاس میگوییم.

الگوریتم ها

Metod)

 یا 

Bihaviors)

داده ها

State) 

یا

(properties

 

 

در هر برنامه شئ گرا اغلب  نیاز به تعریف چندین کلاس مختلف داریم و برای استفاده از آنها کافی است از آنها یک نمونه یا instance بگیریم.

در واقع کلاس یک نوع abstract data type  است که دارای یکسری property  میباشد. بنا براین در هر زبانی برای تعریف یک نمونه کافی است یک متغیر از نوع آن کلاس تعریف کنیم.

 

3.3  پیاده سازی اشیاء :

در عمل به ازای تعریف هر نمونه جدید (شئ جدید) تمام خصوصیات کلاس مورد نظر برای آن شئ  تعریف میشوند ولی الگوریتم ها بین تمامی اشیاء مشترک است (share)

c

b

a

و هر گاه یکی از آنها به یک metod  نیاز داشته باشند یک اشاره گر (this) که از آن شئ خاص به metod  ایجاد میشود وارتباط لازم را بین داده ها و الگوریتم ها ایجاد می کند.

Instance 2         instance 3                         Instance 1

c

b

a

c

b

a

 

 

 

 

 

a

 

b

 

  C  

 

F1();

F2();

.

.

.

 

 

Class a

 

     Properties   

 

 

 

 

 

    Metods

 

 

 

 

 

نويسنده: سيدمحمود شجاعي كياسري

روش برنامه نویسی شئ گر ا

بررسی روش شئ گرا:

بعد از بررسی اجمالی تاریخچه برنامه نویسی ومعرفی اصول روش ساخت یافته میخواهیم به بررسی روش شئ گرا بپردازیم.

روش شئ گرا از چند دیدگاه قابل بررسی است که در ادامه به تبیین هر یک از دیدگاه ها خواهیم پرداخت.

1.3  اهداف روش شئ گرا:

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

برای دستیابی به این هدف لازم است که برنامه به صورت یک دنیای واقعی از اشیاء که ارتباطی واقعی دارند دیده شود.

زمانی که توسط این دیدگاه اشیاء مورد نیاز توسط برنامه نویس ایجاد گردد  وظیفه سیستم تنها کنترل روی اشیاء وروابط بین آنها خواهد بود.

به عنوان مثال یک پنجره را در نظر بگیرید .

رسم شئ پنجره بر عهده خودش میباشد و برنامه نویس هنگام طراحی سیستم هیچگونه نگرانی راجع به اینگونه مسائل نخواهد داشت.

همین مساله باعث راحت تر شدن اشکالزدایی برتامه خواهد شد زیرا به محض وقوع یک خطا در برنامه برنامه نویس میداند که اشکال یا از شئ است و یا ازسیستم   واینکه اشکال از جای دیگری نمی تواند باشد.در نتیجه به سرعت عملیات اشکالزدایی انجام خواهد شد.

روش برنامه نویسی شئ گرا میگوید برای دستیابی به اهداف فوق لازم است به بالاترین سطح از "Abstraction" برسیم.

 حال به توضیح بیشتر راجع به مفهوم "abstraction"  میپردازیم.

Abstraction در لغت به معنای تجرد یا انتزاع است.

وبه مفهوم یک برداشت واحد از مجموعه مشاهدات میباشد.

در واقع انتزاع همان نیرویی است که با دیدن تعداد زیادی درخت مفهوم جنگل را در ذهن انسان تداعی میکند یا با دیدن مجموعه ای از پیکسل های صفحه نمایش کامپیوتر یک تصویر خاص را در ذهن ایجاد میکند.

حال به توضیح این مفهوم در برنامه نویسی شئ گرا میپردازیم.

در این روش برنامه نویس باید سعی کند اشیایی راتعریف کند که برنامه را از تعریف اشیاء بیشتر بی نیاز کند. در واقع او همواره  باید به دنبال اشیاء مادر بگردد.

یعنی بعد از یافتن توابع و داده های مورد نیاز برای پیاده سازی سیستم مورد نظر باید مجموعه ای از توابع و داده ها را توسط "یک" کلاس (شئ) پیاده سازی کند.(انتزاع)

ضمناً این کلاس برای اجرای توابع درونی خود باید حتی المقدور به کلاس های دیکر نیازی نداشته باشد وبه نوعی مستقل از سایر اجزای سیستم باشد واین همان مفهوم تجرد یا abstraction    در برنامه نویسی شئ گرا می باشد.

به عنوان مثال فرض کنید در حال نوشتن برنامه ای هستید که بخشی از آن مربوط به طراحی سیستم یک ماشین است.

هر ماشین دارای یک سری خصوصیات از قبیل : نام و رنگ و حجم موتور و تعداد سرنشین و شماره شاسی و . . . میباشد.

در عین حال دارای مجموعه ای از رفتارها است که باید  توسط توابع برای ماشین پیاده سازی شود.

 رفتارهايي از قبیل:

  حرکت کردن و ایستادن و حمل مسافر و شتاب داشتن و تعویض دنده هاو . . .

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

یعنی در پایین ترین سطح از abstraction  به طراحی بپردازیم.

ولی اگر به روش شئ گرا به طراحی سیستم بپردازیم میتوانیم یک کلاس به نام ماشین به شکل زیر طراحی کنیم دراين  حالت که توابع به شکل زیر مجموعه ای از یک شئ در آمده اند میتوان گفت که به سطح بالاتری از abstraction  رسیده ایم. همان طور كه گفته شد در اين روش نیازی به ارسال پارامتر ها نیست زیرا تمام توابع به تمام خصوصیات دسترسی دارند.

نويسنده: سيدمحمود شجاعي كياسري