ארכיון יומי: 28 אוגוסט, 2008

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

אי שם בשנות ה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 תצדיק את עצמה מבחינת ניצול הזיכרון. עוד חיסרון, הוא האיטיות היחסית של הטיפוס, היות והוא דורש המרה בזמן ריצה מערך אחד לשני וכן קביעה של הטיםפוס בזמן ריצה. למרות שיש דרכים לפתור את זה, הוא עדיין איטי יותר מאשר שימוש בטיפוס מוצהר.