הטיפוס בעל מגוון הפרצופים

אי שם בשנות ה90 נכנסה לשפת פסקל תמיכה ביכולת לעבוד עם טיפוס אחד שיכול להיות או מספר שלם, או מחרוזת, או ממשק של COM/CORBA ואחרים. בעצם כמעט כל דבר שנרצה.

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

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

השימוש ב variant מתבצע בצורה הבאה:

program test_variants;
uses variants;
var
my_var : variant;
counter : integer;
begin
counter := 10;
my_var := 'Hello World';
writeln(my_var);
my_var := counter;
writeln(my_var);
counter := my_var - 3;
my_var := counter + 0.5;
writeln(my_var);
end.

התוכנית הזו כמובן תהודר כמו שצריך ונקבל תמיכה בכל טיפוס שהשתמשנו בו. השימוש ביחידה בשם variants בהתחלה מספקת לנו תמיכה טובה ורחבה יותר ביכולת ליצור, להמיר ולהשתמש בvariants.

מה השימושים הרגילים של variant ? ובכן ב Windows התחברות ל COM בו האובייקט אינו ידוע עד לחיבור עצמו דרש התייחסות בהתאם, וVariant בעצם מספק את זה.

עוד שימוש הוא במסדי נתונים. הרי זה לא יהיה יעיל לקבוע ששדה מסויים הוא מספר שלם 8 ביט ללא סימן, ואז להדר מחדש אם שינינו את הערך ל32 ביט.

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

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

3 מחשבות על “הטיפוס בעל מגוון הפרצופים

  1. יורם

    QT (וכמוה עוד כמה ספריות C++) מאפשרת גם היא שימוש בVARIANT. שם זה נעשה על-ידי מחלקה הנקראת QVariant והאובייקטים שלה יכולים להחזיק מידע בצורת כל אחד מהטיפוסים האטומיים וכ-30 מחלקות שמייצגות בעיקר מידע, בכללן גם מחלקות שהן מבני-נתונים בעצמן.
    בQT זה משמש בעיקר עבור קלאסים שקוראים וכותבים הגדרות תצורה, ושהממשק שלהן לא אמור לדעת מה יהיה הטיפוס. אני לא בטוח עדה כמה כל הדבר הזה באמת נחוץ (אם כי הוא נוח), עקרונית אפשר לפתור את הבעיה הזו באמצעות הגדרה נכונה של מחלקה אבסראקטית וכמה מחלקות שיורשות אותה ומייצגות בצורה "מחלקתית" את טיפוסי המידע הבסיסיים..

  2. ik_5 מאת

    זה בדיוק העניין של ++C. שם אתה מקבל הרבה ספריות שמספקות לך כלים כאלו, בעוד שבפסקל זה חלק מהתחביר.

    ד"א בפסקל כל המחלקות יורשות מ TObject ולכן לכולם יש מכנה משותף. וכמובן שאפשר לעשות אותו הדבר כאשר מדובר במחלקה גבוהה יותר שממנה יורשים.

  3. פינגבק: מערכים « לראות שונה

כתיבת תגובה

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

הלוגו של WordPress.com

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

תמונת Twitter

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

תמונת Facebook

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

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

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

מתחבר ל-%s