תכנות מונחה עצמים א` – תש"ע

Download Report

Transcript תכנות מונחה עצמים א` – תש"ע

‫תכנות מונחה עצמים‬
‫ופיתוח משחקים – תשע"ד‬
‫תבניות‬
‫( ‪)Templates‬‬
‫‪1‬‬
‫מטרה‬
‫‪‬‬
‫‪‬‬
‫הגדרת מבנה נתונים או פונקציה‪ ,‬של נתונים כלליים‪.‬‬
‫דוגמא למבנה נתונים של נתונים כלליים‪:‬‬
‫‪‬‬
‫‪‬‬
‫דוגמא לפונקציה של נתונים כלליים‪:‬‬
‫‪‬‬
‫‪2‬‬
‫עץ בינארי יכול להכיל מספרים שלמים‪ ,‬או אנשים‪ ,‬או נקודות במישור‪ ,‬או‬
‫רשימות משורשרות‪.‬‬
‫פונקצית השוואה יכולה להתייחס למספרים שלמים‪ ,‬או למחרוזות‪ ,‬או‬
‫למערכים‪.‬‬
‫פתרונות ליישום כלליות‬
‫‪‬‬
‫שכפול קוד והתאמתו לסוג הנתונים‪.‬‬
‫כפל קוד (מסורבל וקשה לתחזוקה)‪.‬‬
‫‪‬‬
‫שימוש בירושה ובפולימורפיזם (מגדירים מחלקה בסיסית שממנה‬
‫יורשות מחלקות עוטפות לסוג הנתונים הרצויים‪ .‬מבנה הנתונים או‬
‫הפונקציה יוגדרו ביחס לאובייקט של המחלקה הבסיסית)‪.‬‬
‫ניתן להגדיר מבנה נתונים המכיל בו זמנית טיפוסים שונים‪.‬‬
‫לא ניתן ליצור מבנה נתונים של טיפוסים פרמיטיביים‪.‬‬
‫צריך לרשת מהאובייקט הבסיסי‪.‬‬
‫קיימת תקורה בהפעלה של פונקציה וירטואלית‪.‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪3‬‬
‫פתרונות ליישום כלליות‬
‫‪‬‬
‫שימוש במצביע מסוג *‪.void‬‬
‫ההמרות מתבצעות ע"י המפתח‪ .‬הקומפיילר אינו מבצע בדיקות‬
‫התאמה‪.‬‬
‫‪‬‬
‫שימוש בתבניות‪.‬‬
‫שכפול קוד המתבצע על ידי הקומפלייר‪.‬‬
‫יעיל מאוד בזמן ריצה‪.‬‬
‫זמן קומפילציה ארוך וקוד הרצה בעל נפח רב‪.‬‬
‫מורכב לכתיבה‪.‬‬
‫אינו מאפשר לשלב סוגים שונים של נתונים במבנה אחד‪.‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪4‬‬
‫תבניות של פונקציות‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪5‬‬
‫העמסה של פונקציות‪ :‬מספר פונקציות בעלות שם זהה‪ ,‬ארגומנטים‬
‫ומימוש שונים‪.‬‬
‫תבנית של פונקציה‪ :‬מימוש אחיד ואחידות מסוימת בארגומנטים‪,‬‬
‫ביחס לטיפוסים שונים‪.‬‬
‫דוגמא‪ :‬פונקצית מיון תבצע אלגוריתם זהה עבור טיפוסים שונים ‪-‬‬
‫‪.char* ,float ,double ,int‬‬
‫תבניות של פונקציות ‪ -‬הגדרה‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪6‬‬
‫>‪template <class T‬‬
‫>‪template <typename T‬‬
‫>…‪template <class T1, class T2,‬‬
‫‪ T,T1,T2‬מייצגים טיפוס כללי‪.‬‬
‫הטיפוסים הכלליים ייצגו ארגומנטים לפונקציה‪ ,‬ערכי החזרה‬
‫מהפונקציה ומשתנים המוגדרים בפונקציה‪.‬‬
‫דוגמא ‪.fig11_01.cpp‬‬
‫שימוש בטיפוס שהוא מחלקה ‪.templateTypeClass.cpp‬‬
‫הקוד מגדיר תנאים שונים שהטיפוסים צריכים לקיים‪.‬‬
‫פעולת הקומפיילר‪.‬‬
‫רשימת ארגומנטים‬
‫‪‬‬
‫ניתן להגדיר את אותה הפונקציה פעם אחת כתבנית ופעם אחת‬
‫כפונקציה רגילה‪ .‬תהיה עדיפות לשימוש בפונקציה הרגילה‪.‬‬
‫‪‬‬
‫הסקה אוטומטית של טיפוסים )‪(automatic type deduction‬‬
‫תתאפשר רק אם רשימת הארגומנטים לפונקציה תכלול את כל‬
‫הטיפוסים המופיעים בהגדרת התבנית‪:‬‬
‫>‪template <class T1,class T2‬‬
‫} ;‪void f1( T1 t1, T2 t2 ) { T2 data‬‬
‫>‪template <class T1,class T2‬‬
‫} ;‪void f2( T1 t1 ) { T2 data‬‬
‫‪// OK‬‬
‫‪// Error‬‬
‫‪7‬‬
‫{ ) (‪int main‬‬
‫;( ’‪f1( 3.5, ’s‬‬
‫;) ‪f2( 3.5‬‬
‫}‬
‫רשימת ארגומנטים‬
:‫אבל אפשר לכתוב כך‬

template <class T1,class T2>
void f1( T1 t1, T2 t2 ) { T2 data; }
template <class T1,class T2>
void f2( T1 t1 ) { T2 data; }
int main( ) {
f1<double,char>( 3.5, ’s’ (;
f2<double,int>( 3.5 );
}
// OK
// OK
8
‫תבניות של מחלקות‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫תבנית של מחלקה‪ :‬הגדרה ומימוש אחידים של מחלקה ביחס‬
‫לטיפוסים שונים‪.‬‬
‫מאפשר הגדרה של מבני נתונים כלליים‪.‬‬
‫דוגמא‪ :‬מחסנית של ‪.Imployee ,char ,double ,int‬‬
‫הגדרת תבנית של מחלקה‪:‬‬
‫>‪template <class T‬‬
‫{ ‪class Stack‬‬
‫‪:‬‬
‫;}‬
‫‪‬‬
‫‪9‬‬
‫דוגמא ‪.Fig11_02_04.zip‬‬
‫מימוש תבניות של פונקציות‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪10‬‬
‫קוד של תבנית פונקציה יפרש ביחס לקריאות לאותה פונקציה‪.‬‬
‫תזכורת‪ :‬לעיתים קבצי המימוש (‪ )*.cpp‬מתקמפלים בנפרד משאר‬
‫קבצי האפליקציה (‪.)main.cpp‬‬
‫הפרישה אינה מוגדרת אם הקומפילציה נפרדת משאר קבצי‬
‫האפליקציה‪.‬‬
‫פתרון לכך‪ :‬מימוש של תבנית של פונקציה או מימוש של פונקציה‬
‫המוגדרת בתבנית של מחלקה יימצא יחד עם ההצהרות (בקובץ‬
‫‪.)*.h‬‬
‫ארגומנטים של תבניות‬
‫‪‬‬
‫רשימת הארגומנטים יכולה להכיל טיפוס כללי או משתנה מטיפוס‬
‫מסוים שישמש כקבוע‪:‬‬
‫>‪template <class T, int SIZE‬‬
‫{ ‪class A‬‬
‫;]‪T _array[SIZE‬‬
‫;}‬
‫{ )(‪int main‬‬
‫;‪A<double,70> arr1‬‬
‫;‪A<int,10> arr2‬‬
‫}‬
‫‪11‬‬
‫ארגומנטים של תבניות‬
:‫דוגמא נוספת‬

template <class T, T val>
class A {
public:
void f() { cout << val << endl; }
};
int main() {
A<int,7> a1;
A<char,’s’> a2;
a1.f();
a2.f();
}
12
‫ערכי ברירת מחדל של ארגומנטים‬
:‫ארגומנטים של תבניות יכולים לקבל ערכי ברירת מחדל‬

template <class T = float, int elements = 100>
class Stack { ....} ;
int main() {
Stack<> s1;
Stack <int> s2;
Stack <Point,30> s3;
:
}
13
‫תבניות ייחודיות‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫תבניות מאפיינות מקרים רבים‪.‬‬
‫לעיתים נרצה לממש תבנית של פונקציה או תבנית של מחלקה‬
‫למקרה פרטי באופן ייחודי (‪.)template specialization‬‬
‫תבנית ייחודית עבור פונקציה‪ :‬פונקציה בעלת ממשק זהה ומימוש‬
‫שונה‪ ,‬ביחס לטיפוס מסוים‪.‬‬
‫דוגמא לפונקצית השוואה הממומשת באופן ייחודי למקרה של‬
‫*‪.char‬‬
‫‪‬‬
‫‪14‬‬
‫הדוגמא הקודמת הייתה פועלת עבור אובייקטים ממחלקה >‪ A<string‬ללא‬
‫תבנית ייחודית‪.‬‬
‫תבניות ייחודיות‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪15‬‬
‫תבנית ייחודית עבור מחלקה‪ :‬מחלקה המוגדרת וממומשת באופן‬
‫שונה‪ ,‬ביחס לטיפוס מסוים‪.‬‬
‫דוגמא למחלקה הממומשת באופן ייחודי למקרה של ‪.char‬‬
‫ניתן להגדיר תבנית ייחודית למשפחה של מקרים‪ .‬דוגמא‪.‬‬
‫דוגמא למיון גנרי‬
‫‪‬‬
‫מיון כללי בעזרת תבניות‪:‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪16‬‬
‫מיון מערך מטיפוס כללי‪.‬‬
‫מיון מבנה נתונים כללי‪ ,‬מטיפוס כללי‪.‬‬
‫מיון מבנה נתונים כללי‪ ,‬מטיפוס כללי‪ ,‬ביחס לפונקצית השוואה‬
‫כללית‪.‬‬
‫תבניות‪ ,‬ירושה‪ ,‬ופולימורפיזם‬
‫‪‬‬
‫‪‬‬
‫תבניות‪ ,‬ירושה‪ ,‬ופולימורפיזם הם מנגנונים המאפשרים גנריות‪.‬‬
‫נסביר את המשותף‪ ,‬השונה ואת אפשרויות השילוב ביניהם‪:‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪17‬‬
‫תבנית המתפקדת בצורה דומה לפולימורפיזם בזמן קומפילציה‪.‬‬
‫תבנית ביחס לטיפוסים המקיימים ביניהם היררכית ירושה (>*‪,List<Shape‬‬
‫>*‪.)List<Obj‬‬
‫היררכית ירושה של תבניות (>‪,Tree<T> ,List<T> ,Vector<T‬‬
‫>‪ ,Stack<T‬יורשים מ‪.)DataStruct<T>-‬‬
‫דוגמאות‬
‫סיכום‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪18‬‬
‫תבניות מתאימות במיוחד עבור כתיבת קוד תבניתי (מבני נתונים‬
‫ופונקציות סטנדרטיים ביחס לטיפוסים כלליים)‪.‬‬
‫פולימורפיזם בעזרת ירושה מתאים עבור המקרה שנדרשות פעולות‬
‫זהות על החלק המשותף של טיפוסים שונים‪ ,‬או פעולות שונות על‬
‫הטיפוסים השונים‪.‬‬
‫תבניות‪ :‬הקישור בין פונקציה או מבנה נתונים לבין טיפוס מסוים‬
‫מתבצע בזמן קומפילציה‪.‬‬
‫פולימורפיזם‪ :‬הקישור בין פונקציה לטיפוס מסוים מתבצע בזמן‬
‫ריצה‪.‬‬
‫סיכום (המשך)‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪19‬‬
‫תבניות‪ :‬זמן קומפילציה ארוך‪ ,‬קובץ הרצה בעל נפח רב‪ ,‬יעיל‬
‫מבחינת זמן ריצה‪.‬‬
‫פולימורפיזם‪ :‬להיפך‪.‬‬
‫קוד תבניתי מתאים לכל טיפוס המקיים את דרישותיו‪ .‬הטיפוסים‬
‫השונים אינם מוגדרים מראש‪.‬‬
‫פולימורפיזם מאפשר עבודה עם טיפוסים שונים‪ ,‬בעלי מכנה‬
‫משותף‪ ,‬שהוגדרו מראש‪.‬‬
‫ניתן לשלב בין תבניות לפולימורפיזם‪.‬‬
‫סיכום (המשך)‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪20‬‬
‫תבניות הן מורכבות לכתיבה‪ ,‬תחזוקה ותיקונים (הטיפוסים‬
‫המיועדים צריכים לקיים תנאים שונים וקיימים כללים רבים)‪.‬‬
‫רצוי לקודד תחילה ביחס לטיפוס מסוים ורק אחר כך להכליל‪.‬‬
‫לימוד תבניות מהווה בסיס טוב להבנת הספרייה הסטנדרטית‪.‬‬