Generics בפסקל מונחה עצמים

החל מגרסה 2.0.0 של FPC, נכנסו לעבוד על Generics, אשר ב 2.0.4 גם שוחררה תמיכה ראשונית בטכנולוגיה.

בד"כ נשתמש בטכנולוגיה ע"מ לחסוך קוד "מיותר". עכשיו הקוד המיותר הזה, הוא בד"כ הטיפוס שאיתו אנחנו עובדים. כלומר נגיד ואנחנו נבצע רשימה של טיפוסים שונים אז פעם הרשימה תהיה עבור מחרוזות, פעם עבור מספרים שלמים, פעם אחרת עבור מספרים עשרוניים והרשימה ממשיכה עד אין סוף. התפקיד של Generics הוא לחסוך יצירה של מליון מחלקות שכל מה שמשתנה בהם זה הטיפוס אותו אנחנו שומרים.

בעוד שגם ג'אווה וגם ++C מאוד לא מקפידים על הקריאות של Generics, בפסקל צורת העבודה מאוד קריאה ונקייה, דבר שגורם לקוד להיות קריא ואפשרי לתחזוקה. אז כיצד מגדירים Generics בפסקל ?

Type
generic TMyList<_T> = class(TObject)
private
...
fdata : array of _T;
...
public
...
procedure add(item : _T);
....
end;

ויש לנו מחלקה שהיא מכילה Generics בתוכה.

עכשיו מגיע השינוי הגדול שלא קיים בג'אווה או ++C. אני לא יכול ככה סתם להשתמש במחלקה. כלומר אם אני אעשה את הדבר הבא:

var
MyList : TMyList<Integer>;

המהדר יצעק עלינו ויעיף אותנו מההידור. כלומר חסר עוד משהו קטן.

כידוע בפסקל יש תמיכה בטיפוסי נתונים סטטיים (וגם דינמיים עם variant), והשפה אוכפת את התמיכה בטיפוסי הנתונים בצורה מאוד קשה יחסית לC או ++C. ולכן חסרה כאן הגדרה של טיפוס נתונים שממש את ‎TMyList<Integer>‏ :

type
TMyIntegerList = specialize TMyList<Integer>;

ועכשיו יש לנו טיפוס נתונים שהא רשימה של Integer. חלק ממתכנתי C ו ג'אווה יגידו בטח שזה מוריד את הגמישות כי אז לכל טיפוס שרוצים שהרשימה תתמוך בו, צריך גם ליצור טיפוס שיממש את הGeneric שלו, אבל זה מעלה את הקריאות והתחזוקה של הקוד, במקום שנראה דברים בסגנון הבא (גנבתי מארתיום את הקוד):

pa=shared_ptr<A>(new A);

כשזו עוד דוגמא נקייה פשוטה ויחסית ברורה לשאר הצורות הקיימות.

8 מחשבות על “Generics בפסקל מונחה עצמים

  1. עודד

    אני לא חושב שזה משמעותי במיוחד (ולא ברור לי בכלל ההערה מסוג "זה וזה לא מקפידים בכלל.." וגו'. אשמח אם תבאר).

    ב-C אוהבים מאוד להשתמש ב-typedef כמו בסוג של alias, ובפסקל אוהבים מאוד להשתמש ב-type מאותה סיבה רק שבפסקל אתה חייב לעשות את זה וב-C זה אופציונאלי.

    וכאן אנחנו חוזרים לויכוח הרגיל בין המצדדים בגישת "תחביר נכון הוא דבר חשוב מכדי להשאיר אותו למתכנת" לבין המצדדים בגישת "תחביר נכון הוא דבר חשוב מכדי להשאיר אותו לשפת התכנות". אני כמובן אוהב לכתוב ב-Perl כך שברור הצד שבו אני עומד.

  2. ik_5 מאת

    אני מאוד אוהב לתכנת בפרל, אבל לא זו הנקודה.

    כמה פעמים קרה לך עם PHP למשל מצב בו כתבת שם של משתנה, והכנסת לו תוכן, שורה הבאה כתבת את אותו שם משתנה וניסית לעשות איתו משהו, רק בשביל לגלות שזה לא עשה שום דבר, ושעה אחרי זה אתה מבין שכתבת אותו בשגיאת כתיב, וPHP פשוט מקבל את זה כמו שזה…

    הרבה מתכנתי C הפחות "טובים" (הם יכולים לדעת C מצויין, אבל עדיין לעשות שטויות), יוצרים לך כמה משתנים בעלי אותו שם רק ב scope שונה. כמה פעמים קרה לך שיש לך משתנה i למשהו כללי, ואז בהגדרת לולאה של אותו scope עוד פעם השתמשו לך ב int i = 0 וכו' ?
    שפה שאפשר להתעלל בה ולגרום לה לא לעבוד כמו שצריך בד"כ תכיל הרבה בעיות. רק מתכנתים בעלי המון ניסיון ילמדו שלא מתעללים בשפה אלא אם אין ברירה אחרת. אבל מה קורה כאשר ההתעללות הזו נדרשת ואי אפשר להמינע מזה ? אישית אני מעדיף שפה שלא תאפשר לי להתעלל בה כדוגמת פסקל, מה שיגרום לי לגשת לבעיות בצורה אחרת, מאשר שפה כמו C ששם אי אפשר לתחזק הרבה פעמים קוד שלא לדבר על בעיות אבטחה רק בגלל הגישה הזו (כאילו שבאגים "רגילים" לא מספיק נורא).

  3. עודד

    אני מאוד בעד גילוי שגיאות בזמן קימפול ולא בזמן ריצה – ובשביל זה המציאו בפרל את use strict. אגב שימוש במשתנים בשם זהה בסקופים שונים זה דבר בסדר גמור ואין לי איתו שום בעיה.

    לכל זה אין קשר ל-typedef.

  4. ik_5 מאת

    כמו שאמרתי, אם יש יכולת לשפה אפשרות של ניצול, אז ינצלו אותה. דווקא בפסקל כלים שכן אשר לנצל אותם ולהגיע למצב בעייתי, הרבה מאוד אנשים לא משתמשים בהם (בדיוק מהסיבה הזו). כלי אחד כזה הוא הפקדוה with. המאפשרת לי במקום לכתוב את ה scope לרדת לרמות נמוכות יותר, העניין הוא שאפשר לנצל את זה ולפתוח במשפט with אחד יותר ממחלקה/רשומה/אובייקט אחד ואז יכולים להיות בעיות, וזו הסיבה שרובנו לא משתמשים בפקודה.

    בC, מרבית הפרוייקטים שאני ראיתי לא עושים שימוש ב typedef אלא אם מדובר ב API בו עוברים הרבה ידיים. הניצול ממושך של הרבה דברים גורמים לחוסר קריאות משווע בשפה. לפעמים לנסות ולהבין callbacks זה סיוט שלא מצליח גם לאנשים המנוסים ביותר בגלל ניצול העובדה של חוסר השימוש ב typedef. בפסקל פתרו לך את זה (למרות שהתחביר מההתחלה יותר נקי והגיוני).

  5. פינגבק: הטיפוס בעל מגוון הפרצופים « לראות שונה

  6. פינגבק: מערך כתכונה | לראות שונה

  7. פינגבק: Redis סיבוב שלישי | לראות שונה

  8. פינגבק: הדגמה מתקדמת לשימוש ב TFPSMap | לראות שונה

כתיבת תגובה

הזינו את פרטיכם בטופס, או לחצו על אחד מהאייקונים כדי להשתמש בחשבון קיים:

הלוגו של WordPress.com

אתה מגיב באמצעות חשבון WordPress.com שלך. לצאת מהמערכת / לשנות )

תמונת Twitter

אתה מגיב באמצעות חשבון Twitter שלך. לצאת מהמערכת / לשנות )

תמונת Facebook

אתה מגיב באמצעות חשבון Facebook שלך. לצאת מהמערכת / לשנות )

תמונת גוגל פלוס

אתה מגיב באמצעות חשבון Google+ שלך. לצאת מהמערכת / לשנות )

מתחבר ל-%s