מערך כתכונה

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

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

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

עוד יכולת מעניינת שיש ברובי, אבל לא בשאר השפות שאני מכיר, היא העבודה עם תכונות (properties). רובי מאפשרת לנו ליצור תכונות, אשר לא דורשות מאיתנו Getter ו Setter כל הזמן. וגם פסקל מציעה תמיכה דומה בפיטצ'ר הזה.

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

...
  TPerson = class(TPrimates)
...
  public
...
    property MatchingColor[name : string] : TColor read GetColor write SetColor;
...
  published
...
    property ShirtColor : TColor read FShirtColor write FShirtColor;
...
  end;
...

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

לתכונה הגדרנו שם כלשהו שהוא מחרוזת. וGetter ו Setter. כלומר התכונה היא גם לקריאה וגם לכתיבה.

הגדרת ה Getter תראה בצורה הבאה:

private
...
   function GetColor(AName : String) : TColor;
...

ה Setter יראה בצורה הבאה:

private
...
   procedure SetColor(AName : String; AValue : TColor);
...

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

התכונה של צבע החולצה (ShirtColor), כותבת ישירות לשדה מסויים, ולא דורשת מאיתנו בעצם ליצור Getter ו Setter בכלל. היות ואין פעולה חשובה שצריך לבצע במיוחד לשם כך. הגדרות של Geter ו/או Setter מתבצעות רק כאשר אנחנו צריכים להתערב במשהו, ולא בכל פעם שאנחנו כותבים תכונה.

להמשך קריאה בנושא, אתם מוזמנים לגשת לכאן.

11 מחשבות על “מערך כתכונה

  1. יורם

    היכולת לייצר "תכונות" אשר ממומשות בפועל על-ידי הדלרים מתאימים דווקא קיימת בכמה וכמה שפות.
    היא קיימת מזמן ב-ויזואל-בייסיק (אבל זו לא סיבה לעבוד בשפה הנוראה הזו), היא ניתנת לביצוע ב-PHP, אם כי באופן עקום ודפוק – על-ידי "מתודות קסם" כלליות של המחלקה, שאינן ספציפיות ל"תכונה" מסויימת, אבל לא מסובך לעשות מהן dispatching להנדלר מתאים לפי שם התכונה.
    בפרל ניתן להשיג את אותו הדבר בכמה דרכים לא פורמאליות (כלומר ללא מילת מפתח ייעודית לזה) אבל זה לא ממש הכרחי כי אתה תמיד יכול להגדיר מתודה שהיא גם getter גם setter וגם lvalue ואז לעבוד איתה כמו שהייתה עובד עם "תכונה".

    1. ik_5 מאת

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

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

      ד"א רק פרל 5.14 מתחילה להתעסק קצת בתכנות מונחה עצמים בגישה של עצמים וכו'… והם פשוט מעתיקים את Moose. ובMoose כן יש לך משהו בסגנון של properties, אבל זה לא שפת פרל, אלא מודולים שכתובים בפרל עבור פרל. זה בערך כמו jQuery ל Javascript.

      1. יורם

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

        1. ik_5 מאת

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

          בדלפי למשל יש לך אפשרות ליצור משתנים שלמים פיזית בעברית. ממש כמו ברוב השפות הדינאמיות. אתה יכול לשכתב מספר דברים של השפה. אבל למה לעשות את זה?

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

  2. עידו גנדל

    TPrimates 🙂

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

    עוד משהו: עקבתי אחרי הקישור שנתת והגעתי משם לדף של Indexed properties:
    http://freepascal.org/docs-html/ref/refsu31.html#x78-880006.4.2
    את זה אני לא מבין מהדוגמה. מה זה נותן? יצא לך להשתמש בטכניקה הזו?

    1. ik_5 מאת

      המטריצה נמצאת בשימוש למשל בTCustomGrid כאשר אתה חוקר את Cells.

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

      זה עוזר לך להשתמש ב Getter ו Setter אחידים במידת הצורך. התכונה השלישית לא שייכת לשום דבר

כתיבת תגובה

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

הלוגו של WordPress.com

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

תמונת Twitter

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

תמונת Facebook

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

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

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

מתחבר ל-%s