آشنایی با روش برنامه نویسی شئ گرا- قسمت دوم
سلام بچه ها من در پست بعدی یکم درباره ی ado.net براتون میگم ...![]()
ولی امیدوارم خسته نشین![]()
واسه همین..
. یکم پست بعدی پر جذبه تر خواهد شد!!!!
معرفی ساختار کلاس ها:
همانطور که قبلاً گفته شد
ایجاد کلاس های جدید اساس برنامه نویسی به روش شئ گراست .
حال به معرفی ساختار یک کلاس و ویژگی های آن میپردازیم.
در برنامه نویسی ساخت یافته هر برنامه را می توانستیم به دو بخش اصلی که کاملاً از هم جدا بودند تقسیم کنیم:
1-الگوریتم ها 2-داده ها
ولی در روش شئ گرا این دو بخش را در یک بسته به نام کلاس قرار داده ایم وبین آنها یک ارتباط دائمی برقرار کرده ایم . به این بسته ها کلاس میگوییم.
|
الگوریتم ها Metod) یا Bihaviors) |
داده ها State) یا (properties |
در هر برنامه شئ گرا اغلب نیاز به تعریف چندین کلاس مختلف داریم و برای استفاده از آنها کافی است از آنها یک نمونه یا instance بگیریم.
در واقع کلاس یک نوع abstract data type است که دارای یکسری property میباشد. بنا براین در هر زبانی برای تعریف یک نمونه کافی است یک متغیر از نوع آن کلاس تعریف کنیم.
پیاده سازی اشیاء :
در عمل به ازای تعریف هر نمونه جدید (شئ جدید) تمام خصوصیات کلاس مورد نظر برای آن شئ تعریف میشوند ولی الگوریتم ها بین تمامی اشیاء مشترک است (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
ویژگی ها و مفاهیم روش شئ گرا :
این روش دارای یکسری مفاهیم و ویژگی هاست ولی این مفاهیم از ابتدای ایجاد این روش به وجود نیامدند بلکه به مرور زمان وبا پیشرفت این روس به وجود آمدند.
حال به بررسی اجمالی هر یک از این مفاهیم می پردازیم.
encapsulation(1
Inheritance (2
polimorphism(3
--------------------------------------1.4.3
:encapsulation(1
کپسوله سازی مکانیزمی است که به موجب آن داده ها و دستورالعمل ها یی که روی آنها کار میکنند رامجتمع و پیوند میدهند و هر دو را دور از دسترس محیط خارجی قرار داده و از استفاده بی مورد آنها جلوگیری می کند.
در واقع در این مکانیسم داده ها و دستورالعمل ها همگی مثل یک جعبه سیاه هستند که همه داده ها و دستورالعمل ها در آن وجود دارد و هنگامی که به این شکل به هم پیوند می خورند یک شئ تشکیل می شود.
داستان کپسوله سازی از آنجایی شروع شد که در برنامه سازی ساخت یافته یک ساختمان داده مثل لیست پیوندی بین چندین تابع به اشتراک گذاشته میشد.
هر یک از این توابع به طور مستقیم به این ساختار دسترسی داشتند . در نتیجه اگر یکی از توابع یک تغییر اشتباه در ساختار ایجاد کنند سایر توابع نیز به طور خودکار دچار اشتباه می شدند.
روش شئ گرا برای حل این مشکل مکانیزم کپسوله سازی را مطرح کرد ودر واقع لیست پیوندی را از ساختار داده ای به یک کلاس تبدیل کرد.
به این ترتیب کلیه تغییراتی که در لیست ایجاد میشود توسط خود شئ ایجاد میشود و احتمال ایجاد اشتباه تقریباً از بین میرود.
در واقع شئ مورد نظر خودش روابطش را کنترل میکند.
این مکانیزم برای عناصر یک کلاس سه سطح دسترسی تعریف میکند که عبارتند از:
(عمومی)Public
(اختصاصی)Private
(حفاظت شده)Protected
کلیه عناصری که از سطح دسترسی عمومی تعریف شوند توسط تمام توابع سیستم از تمام کلاسها قابل دسترسی میباشند.
کلیه عناصری که از سطح اختصاصی تعریف میشوند تنها توسط توابع همان کلاس قابل دسترسی میباشند.
کلیه عناصری که از نوع حفاظت شده تعریف میشوند تنها توسط کلاسهای فرزند آن کلاس قابل دسترسی میباشند که در مبحث وراثت به توضیح آن پرداخته ایم.
در اینجا سئوالی ایجاد می شود که رابطه بین اشیاء چگونه ایجاد می شود؟
یعنی مثلاً شئ لست پیوندی از کجا متوجه میشود که مثلاً باید یکی از نود هایش را حذف کند؟
در روش شئ گرا این وظیفه را پیام ها بر عهده دارند که در ادامه به توضیح این مکانیزم میپردازیم.
--------------------------------------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.4.3
:polimorphism
این مفهوم ویا ویژگی روش شئ گرا امکان پیاده سازی چند تابع با یک نام و ساختارهای متفاوت را برای برنامه نویس فراهم میکند.
بعد از عنوان شدن مفهوم وراثت یکسری مشکلات پیش روی برنامه نویسان قرار گرفت که منجر به پیدایش مفهوم" چند ریختی" گردید.
برای درک مشکلات ذکر شده توجه شما را همان مثال ماشین ها جلب مینماییم.
تصور کنید یک کلاس پدر به نام کلاس ماشین ایجاد کرده ایم ورفتارهای حرکت کردن و ایستادن آن را از نوع حفاظت شده تعریف کرده ایم وسپس آنها را به دو فرزندش یعنی کلاسهای کامیون و سواری به ارث داده ایم و سپس دو فرزند به نامهای بنز و بی ام و برای کلاس سواری تعریف کرده ایم.
در این حالت سیستم و فرآیند حرکت کردن و ایستادن در دو ماشین بنز و بی ام و یکسان خواهد بود در حالی که در عمل اینطور نیست.
برای رفع این مشکل بحث چند ریختی مطرح شده است یعنی برنامه نویس میتواند تابعی هم نام با تابع حرکت کردن یا ایستادن ولی با ساختای متفاوت ایجاد کند.
برای پیاده سازی این مفهوم ا دو عبارت زیر استفاده میکنیم:
--------------------------------------
Over load نام یکسان (پارامتر ها متفاوت)
پیاده سازی یکسان
-------------------------------------------------
Over write نام یکسان (پارامترها یکسان)
پیاده سازی متفاوت
----------------------------------------5.3
روش برنامه نویسی شئ گرا:
برای طراحی یک برنامه به روش ساخت یافته لازم بود که ابتدا برنامه به چند زیر برنامه تقسیم شود و سپس هر از زیر برنامه ها نیز به چند زیر برنامه دیگر تبدیل می شدند تا در نهایت به چندین تابع میرسیدیم وسپس آنها راپیاده سازی میکردیم اما در روش شئ گرا باید با شیوه ای مشابه به توابع مورد نیاز رسید وسپس آنها را در یکسری کلاس پیاده سازی کنیم که البته مهمترین بخش این روش مرحله انتخاب اشیاء است.
برای اینکه بتوانیم بهترین انتخاب را داشته باشیم روش های متعددی مطرح شده است که در این قسمت به بررسی روش آقای کد میپردازیم:
codd
میگوید برای رسیدن به بهترین و کمترین تعداد کلاس باید سه دسته کلاس زیر را در برنامه تعریف کرد:
PERSON(1
place(2
things event(3
یعنی بهتر است ابتدا برای هر یک از اشخاص یا انسان های برنامه یک کلاس طراحی کنیم
وسپس برای مکان های مورد نیاز سیستم و در نهایت برای نقاضا ها یاخواسته ها ی اشخاص در سیستم کلاس هایی را تعریف کنیم.