Transcript مشاهده
به نام خدا
1
فهرست مطالب
2
طراحی و پیاده سازی انواع داده
جدید
-1مشخص کردن صفات نوع داده یا اطالعاتی که
باید دراین شی داده ذخیره شود(.صفات هر شی داده
معموال در طول عمر آن عوض
و
مثل
نمی شود)
-2تعیین عناصری که شی داده حاوی آن است.
3
تمام فعالیت های طراحی را می توان به عنوان
طراحی
پیاده سازی
-1نمایش خاصی برای اشیاء داده با
استفاده از انواع داده ای که در
زبان موجود است یا سایر انواع داده
انتزاعی.
-2پیاده سازی عملیات بر روی این
اشیاء داده به صورت زیربرنامه هایی
که آرگومان های آنها این اشیاء داده
هستند.
4
مثال:
برای نوشتن برنامه ثبت نام و
تنظیم کالس دانشگاه
شی داده Section :
این شی داده :نام استاد ،شماره
اتاق ،ظرفیت و...
این شی داده :لیستی از
دانشجویان ثبت نام شده
5
که بر روی این شی داده
کار می کنند :ایجاد Sectionجدید ،
انتساب دانشجو به یک ، Sectionاز بین
مثال:
برای نوشتن برنامه ثبت نام و
دانشگاه
تنظیم کالس
نمایش نام
: Section
استاد به صورت یک رشته 10کاراکتری ،
نمایش لیست دانشجویان به صورت یک آرایه
خطی و...
روی : Sectionزیربرنامه
هایی که آرگومان های آنها ،این این شی
داده باشد.
6
برنامه نویس
می تواند دقیقا مثل
نوع داده ی جدیدی است
که توسط برنامه نویس تعریف می شود وشامل
موارد زیراست:
-1 نوع داده ای که توسط برنامه نویس تعریف
می شود.
-2 مجموعه ای از عملیات انتزاعی بر روی
اشیایی ازآن نوع
-3 بسته بندی اشیاء آن نوع ،به طوری که
کاربر آن نوع نمی تواند آن اشیاء را بدون
استفاده از این عملیات دستکاری کند.
7
نمایش حافظه مربوط به مقادیرحقیقی
و صحیح ،کامال بسته بندی شده است ،یعنی از
برنامه نویس پنهان است .برنامه نویس بدون
اینکه از جزئیات نمایش حافظه این انواع
اطالع داشته باشد ،از اشیای داده ی آنها
استفاده می کند .فقط نام و عملیاتی را
برای دستکاری آن نوع فراهم می بیند.
8
تعریف نوع:
مکانیزمی برای توصیف
داده
از اشیاء
تعریف می شود و اعالنی
درتعریف نوع
وجود دارد که ساختار دسته ای از اشیای کالس
را توصیف می کند .بدین ترتیب نام نوع به
عنوان نام دسته ای از اشیاء داده محسوب می
شود .هر وقت به اشیاء داده ای از آن ساختار
نیاز باشد ،به جای تکرار توصیف ساختمان
داده ،کافی است نام نوع ارائه شود.
9
تعریف نوع ،نوع
را تعریف نمی کند ،زیرا عملیاتی را بر
به عنوان مثال:
به رکوردهای B ، Aو Cنیاز باشد ،به طوری که
ساختار آنها یکسان باشد.
تعریف نوع زیر را در نظر بگیرد:
Type Rational = record
;numerator: integer
denominator: integer:
end
اکنون اعالن زیر را در نظر بگیرید که B ، Aو C
را از نوع Retionalدرنظر می گیرد:
;var A, B ,c: Retional
تعریف ساختار شی داده ی نوع ، Retionalبه جای
اینکه سه بار برای B ، Aو Cتکرار شود ،فقط
10
ما :
اّ
اما ساختار داخلی اشیاء داده نوع ،بسته بندی
هر زیربرنامه ای که می تواند
شده
متغیری را از نوع جدید اعالن کند ،اجازه دارد
داشته
به هر عنصر از نمایش آن نوع
باشد .چنین زیر برنامه ای می تواند انواع
تعریف شده بر روی آن اشیای داده را
و آنها را مستقیما دستکاری کند(به آنها
دستیابی داشته باشد).
،این
مفهوم
دستیابی را غیر ممکن می سازد ،به طوری که ،
فقط زیربرنامه هایی که به عنوان بخشی از خود
نوع هستند می دانند اشیای داده آن نوع چگونه
11
مکانیزمهایی را برای
توصیف می کنیم (مانند پکیج در ادا)
پکیج در ادا
این مفهوم را طوری بسط می دهیم که عملیات بر
قابل
روی این اشیا داده از طریق
استفاده باشند.
12
باید توجه کنیم که :
و
،
، SectionType
را تعریف می کند که توسط رویه هایی که
در پکیج های دیگری اعالن شده اند ،قابل مشاهده اند.
برای Sectionنشان می دهد که ساختار
اعالن
توسط زیربرنامه هایی
داخلی اشیاء داده Section
که از پکیچ استفاده می کنند قابل دستیابی باشد.
جزئیات واقعی نوع ، Sectionدر انتهای پکیج
آمده است.
دربخش
13
SectionType مشخصات پکیج
Package SectionType is
type StudentID is integer;
type Section(MaxSize : integer) is private;
procedure AssignStudent(Sect: in out section; Stud in StudentID);
procedure CreateSection(Sect: in out section; Instr in integer; Room in
integer) ;
private
type Section(MaxSize : integer) is
record
Room: integer;
instructor: integer;
ClassSize: integer range 0 .. MaxSize := 0;
Classroll: array (1 .. MaxSize) of StudentID;
end record;
end;
14
مثال:
می
و
رویه های
دستیابی داشته باشند
توانند به آرایه
که عضوی از Sectionاست ،اما هر رویه دیگری که
در خارج از پکیج قرار دارد نمی توانند به این
آرایه دسترسی داشته باشد.حتی اگر متغیری از
نوع Sectionرا تعریف کرده باشند.
15
توجه داشته باشیم که:
پیاده سازی رویه های
در بخش
اعالن شده در بخش مشخصات پکیج ،قرار دارد.
می تواند اشیاء داده و
بخش
انواعی داشته باشد که توسط پکیچ های دیگر
قابل مشاهده نباشد.
رویه ScheduleRoomفقط می تواند در
AssignStudentو createSectionفراخوانی شود .این
نام درخارج از این پکیج ناشناخته است.
16
16
SectionType پیاده سازی پکیج
Package body SectionType is
procedure AssignStudent(…) is
- statements to insert student on ClassRoll
end;
procedure CreateSection(…) is
- Statements to initialize components of record
end;
procedure ScheduleRoom(…) is
- Statements to schedule section in a room
end;
end;
17
خوب حاال یه سؤال ؟؟؟
در تعریف پکیج
به نظر شما چرا از بخش
باال استفاده شد تا اطالعات موجود در آن فقط
توسط بدنه پکیج مورد استفاده قرار گیرد؟ آیا
نمی شد جزئیات نمایش در پکیج دیگری باشد و
دراین پکیج اشاره گری به آن قرار داده می
شد؟ چه مشکلی پیش می آمد؟
را برای پیاده
برای جواب به این سوال
سازی اشیاء داده ی بسته بندی شده معرفی می
کنیم:
18
بسته بندی غیرمستقیم
نوع داده انتزاعی به
دراین حالت ،
وسیله مشخصات پکیج Aتعریف شده است.
برای شی Pدر رکورد فعالیت پکیج A
نگهداری می شود .در پکیج ، Bکه شی Pرا
و استفاده می کند ،رکورد فعالیت باید
اشاره گری به حافظه داده ی واقعی داشته
رکورد
رکورد
باشد.
فعالیت
فعالیت
پکیج B
P
19
پکیج A
معایب بسته بندی غیرمستقیم
دستیابی به Pتاوان اجرایی دارد .هر
دستیابی به Pمستلزم دستیابی غیرمستقیم
به اشاره گر است تا حافظه واقعی پیدا
شود .استفاده مکرر از Pممکن است گران
تمام شود.
20
بسته بندی مستقیم:
همانند حالت غیر مستقیم ،ساختار شی داده ی
انتزاعی توسط مشخصات پکیج Aتعریف شده است.
دراین حالت ،حافظه واقعی Pدر رکورد فعالیت
پکیج Bنگهداری می شود.
رکورد
فعالیت
پکیج B
21
رکورد
فعالیت
پکیج A
ویژگی بسته بندی مستقیم:
اگر نمایش شی انتزاعی عوض شود ،تمام نمونه
های آن (مثال پکیچ )Bنیز باید
کامپایل شوند .این کار ،تغییرات در سیستم
را در زمان کامپایل کردن ،گران می کند ،
اما کارایی اجرای آن
22
استفاده می کند تا
ادا از مدل
را افزایش دهد .پس استفاده از شی
داده انتزاعی مستلزم جزئیات نمایش شی است.
بنابراین ،نیاز به بخش Privateدر مشخصات پکیج
است.
23
وقتی نیاز به تعریف انواع مشابهی باشد ،زبان
ممکن است پارامتری کردن تعریف نوع را تدارک
ببیند.در این حالت شکلهای گوناگونی از
پارامترها استفاده می شوند.
برای Sectionاجازه می دهد که
تعریف نوع دارای پارامتر MaxSizeباشد که حداکثر
ظرفیت کالس را تعیین می کند :
Type Section(MaxSize: integer) is
record
;Room: integer
Instructor: integer:
;ClassSize: integer range 0 .. MaxSize
;ClassRoll:array(1 .. MaxSize) of Student_ID
24
اعالن متغیرهای زیر را درنظربگیرید:
;end record
انواع داده انتزاعی کلی
25
...انواع داده انتزاعی کلی
تعریف نوع، پکیج ادا که در زیر آمده
کلی را برای نوع پشته کلی نشان می دهد که در
که در پشته ذخیره می شود
، آن
به عنوان پارامتر تعریف،
:شده اند
Generic
type Elem is private;
Package AnyStackType is
type Stack(Size:Psitive) is private;
procedure Push(I: in Elem; S: in out Stack);
procedure Pop(I: out Elem; S: in out Stack);
Private
type Stack(Size: Positive) is record
StkStorage: array(1 .. Size) of Elem;
Top: integer range 0 … Size := 0;
end record;
26
نمونه سازی از نوع انتزاعی کلی
تعریف پکیج کلی ،قالبی ( )templateرا نشان می
دهد که می تواند برای ایجاد انواع داده
انتزاعی خاص مورد استفاده قرار گیرد.
فرایند ایجاد نوع خاص از روی الگوی تعریف کلی
،نمونه سازی) (instantiationنام دارد.
27
پیاده سازی نوع داده انتزاعی
کلی:
28
29
وراثت و کالس ها
30
وراثت یگانه :کالس فقط یک پدر دارد.
وراثت چندگانه :کالس بتواند چند پدر
داشته باشد.
V
31
A
U
X
W
وراثت چندگانه
برایX
Y
C
B
D
وراثت یگانه
کالس و بسته بندی
راستی یادتون باشه :در C++وراثت چندگانه
وجود دارد ولی در جاوا ممکن نیست.
کالس ها در زبانهایی مثل C++و اسمالتاک و
جاوا با بسته بندی ارتباط تنگاتنگی دارند.
یعنی کالس ها معموال بخشی دارندکه توسط کالس
دیگربه ارث برده می شود و بخش دیگری دارند که
مخفی است.
32
کالس و بسته بندی
مثال ( )C++در کالس زیر( :اسامی بعد از public
درخارج ازکالس قابل استفاده و قابل ارث بری
هستند)
(اعالن های sizeو storageکه بعد از privateآمده
اند ،فقط در داخل کالس قابل دستیابی اند)
{ Class intstack
public:
};intstack() { size = 0
} ;void push(int i) { size = size + 1; storage[size] = I
… int pop
Private:
;int size
33
;)int storage(100
}
هر انتزاع شامل توصیفگر داده ها و
توابعی است که بر روی اشیایی از آن نوع عمل
نام دارند.
می کنند .این توابع
تابعی که همنام کالس است و
هنگام ایجاد شی از آن کالس ،فراخوانی می
شود.
تابعی همنام با کالس (که در c++با
نام دارد .این
~ شروع می شود) ،
تابع هنگام از بین رفتن شیئی از آن کالس
فراخوانی می شود.
34
و جاوا از طریق کالس هایC++ وراثت در
Class elem {
.مشتق انجام می شود
Public:
elem() { v = 0; }
void ToElem(int b) { v = b; }
int fromElem().{ return v; }
Private:
int v; }
شی داده نوعelem کالس
ElemStack و کالسelem
پشته هایی از اشیا آن
نوع ایجاد می کند
Class ElemStack: elem {
public:
ElemStack() { size = 0;}
void push(elem i)
{ size = size + 1; storage[size] = i; }
elem pop()
{ size = size - 1;return Storage[size + 1] }
Private:
int size;
elem storage[100];
35
}
پیاده سازی کالس ها
در کالس مشتق ،فقط اسامی ارثی ،از کالس پایه
به فضای نام محلی کالس مشتق اضافه می شود و
اسامی عمومی برای کاربران آن کالس قابل مشاهده
اند.
نمایش حافظه واقعی برای اشیای تعریف شده ،می
تواند به طور ایستا ،توسط اعالن داده ها در
تعریف کالس تعیین شود.
هر نمونه ای از کالس ،حافظه داده ی مخصوص به
خود را دارد که شامل داده ها و اشاره گرهایی
به متدهای کالس است .از این رو دو مدل پیاده
سازی برای کالس ها داریم:
-1روش کپی
36
-2روش اشتراک حافظه
پیاده سازی کالس ها
در این مدل هر نمونه ای از کالس
به خود را دارد
مشتق،
به متدهای
و
که شامل
کالس پایه نیز هست .اگر شیئی از کالس پایه ای
مشتق شود ،این وراثت توسط مترجم اداره می
شود و حافظه واقعی آن شی
آن است.
c++
فقط از روش کپی
استفاده می کند.
در این روش همه اشیاء
از کالس مشتق ،از حافظه کالس پایه استفاده
37
وراثت متدها
وراثت متدها برای ایجاد اشیای جدید ،قدرت دیگری
اعمال می کند که در بسته بندی موجود نیست.
مثال قبل را بسط می دهیم و
زیربرنامه عمومی MyTypeرا به کالس ElemStackاضافه
می کنیم که نام نوع را چاپ می کند’’ I am type :
’’.ElemStack
})”Void MyType() {printf(“I am type ElemStack \ n
اگر فرض کنیم نیاز به کالس جدیدی به نام NewStack
است تا مانند ElemStackرفتار کند ،اما شامل متد
جدید peekباشد که عنصرباالی پشته را برمی گرداند و
پشته را نیز تغییر نمی دهد .می توان به جای تعریف
مجدد کالس NewStackاز وراثت استفاده کرد:
38
{ Class NewStack: ElemStack
Public:
آیا متد ارثی مشکل درست می کند؟
برای اشیاء کالس ، NewStackمتد MyTypeپیام ’’ I
’’ am type ElemStackرا چاپ می کند ،زیرا تعریف
متدارثی ازکالس elemstackاست .این مشکل را به
دو طریق می توان حل کرد:
.1می توانیم متد MyTypeرا در تعریف کالس
NewStackدوباره تعریف کنیم:
})”Void MyType() {printf(“I am type NewStack \ n
.2از تابع مجازی ) (virtualاستفاده شود.
39
تابع مجازی:
كالس پایه مي تواند متدهایي داشته باشدكه همنام آن ها
در كالس هاي مشتق نیز موجود باشد .این متد را در كالس
پایه متد مجازي مي گوییم.
در تعریف کالس ، ElemStackزیربرنامه MyTypeرا به صورت زیر تعریف می کنیم:
کالس پایه
برای
NewStack
})” Virtual void TypeName() {printf(“ElemStack \ n
}))(Void MyType() {printf(“ I am type”, TypeName
زمانی که فراخوانی می شود به
زیربرنامه ای مقید می شود که در
زمان تعریف متد به آن مراجعه می
شود.
و در کالس NewStackمی توانیم TypeNameرا به صورت زیر تعریف می کنیم:
40
})” Virtual void TypeName() {printf(“NewStack \ n
به جای تکرار متد MyType
کالس های انتزاعی
اگر قرار باشد از تعریف کالس ها به صورت یک
قالب استفاده کنیم به طوری که کالس های دیگری
از آن ساخته شوند از دو روش استفاده می کنیم:
باید کالس را طوری تغییر دهیم
که دیگر نتوان از آن مستقیم شیی ساخت و اشیایی
که از این کالس استفاده می کنند باید از زیرکالس
مشتق شوند.
در C++این کار را با اعالن
TypeNameبه صورت تابع مجازی تهی انجام می
دهیم:
41
;Virtual void TypeName() = 0
کالس های انتزاعی
شکل دیگری از وراثت که درآن تفاوت
بین کالس پایه و مشتق جدید را تعریف می کنیم.
برای این کار یک کالس deltaتعریف می کنیم که شامل
تغییرات باشد.
کالس ElemStackو کالس مشتق NewStackرا در نظر
بگیرد:
{ Deltaclass StackMod
};)(Int peek() { return storage[size].FromElem
سپس کالس جدید خود را می توانیم به صورت زیر ایجاد
کنیم:
تمام صفات ElemStackرا با
StackMod
توسط کالس
تغییراتی که
Class NewStack
= class ElemStack
+ deltaclass
StackMode
42
اعمال شد به ارث می برد.
مفاهیم انتزاع
وراثت و انتزاع مکانیزمی برای انتقال اطالعات
بین اشیاء کالس های مربوط ارائه می کند.
اگر A=> Bبه معنای این باشد که Bبه Aربط
دارد ،چهار نوع رابطه بین اشیاء Aو Bوجود
دارد:
اختصاصی شدن ) : (specializationمتداول ترین شکل
B compositeخواص
وراثت است که اجازه می دهد شیء مشتق
دقیقتری نسبت به آنچه که در Aوجود دارد کسب
کند.
stack
record
43
…….
Real stack
int stack
مفاهیم انتزاع...
:اصل تفکیک انتزاع
به عناصرآن است.
پشته از دیدگاه خارجی
متشکل از متغیر topو ازدیدگاه داخلی متشکل
از ] storage[100است که اسامی داخلی درخارج
stack
از تعریف کالس ناشناخته اند.
]Stotage[100
44
top
مفاهیم انتزاع...
فرآیند ایجاد نمونه
ای ازکالس است .درواقع عملیات کپی است.
کالس دربرنامه C++است.
اعالن نمونه هایی از شیء
stack
Stack C
45
Stack B
;Stack A, B, C
Stack A
مفهوم متضاد آن دسته بندی است .مثال ما می توانیم A
B ،و Cرا به عنوان نمونه هایی از کالس stackدسته
بندی کنیم.
مفاهیم انتزاع...
در این حالت
،اشیای مشابه ،برای اهداف مشترکی دریک
گروه قرار می گیرند.
مترجم ،
باشد.
ممکن است بین پشته ها دریک
وجود داشته
یا
فعالیت را به صورت پشته
رکوردهای
پاسکال
و
C
stack
پیاده سازی می کنند اما نقش رکورد فعالیت
ساختارهای آنها یکسان
Symbolگرچه
درآنها متفاوتtableاست.
act record
است.
46
Pascal act record
c act record
به معنای این است که نام یک
زیربرنامه یا عملگر بر حسب انواع آرگومان ها و
نتایج ،به هر تعدادی از تعریف توابع اشاره
کند.
به توابعی اعمال می شود که آرگومان
آنها میتواند خود یک نوع باشد .به عبارتی نوع
آرگومان تابع چندریختی می تواند یکی از چند
نوع باشد.
عملگر +هم براي جمع كردن اعداد
اعشاري و هم براي جمع كردن اعداد صحیح به كار
مي رود.
47
را به صورت یك كالس قالب اعالنvector كالس: مثال
كردیم و برداري از آن ساختیم تا حدود آن كنترل
#include "iostream.h"
:شود
#include "conio.h"
#include "stdlib.h"
template <class T>
class vector
{
T *x;
int low, high;
public:
vector (int l, int h)
{
low = l;
high = h;
x = new T[high – low + 1];
}
48
پیاده سازی توابع چندریختی
مثل ام ال یا
برای زبان هایی با
، C++چندریختی پیچیدگی جدیدی را ایجاد نمی
کند.
اما زبان هایی که چندریختی پویا را اجازه می
منجر به مشکل می شود ،زیرا
دهند
آرگومان تابع چندریختی باید درحین اجرای
برنامه تعیین شود.
49
با تشکر صمیمانه از صبر و حوصله
همه شما
50
51