עם או בלי ?

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

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

Object1.Property1 := 'Hello';
Object1.Property2 := 12;
...
Object1.method11(1, 2, Object1.Width, Object1,Height -2);

אם נכתב את אותו הדבר רק עם with הוא יראה ככה:

with Object1 do
  begin
    Property1 := 'Hello';
    Property2 := 12;
    ...
    method1(1,2,width, height -2);
  end;

ובכן with חוסך לנו לכתוב את Object כל פעם מחדש. נשמע נחמד נכון ? ובכן יש עם זה הרבה בעיות. בפסקל צריך לזכור כי מה שמגיע מצד שמאל חזק יותר מצד ימין, ומה שקרוב יותר אלייך חזק יותר ממה שרחוק יותר ממך. כלומר אם יש לי נגיד 2 סמלים שנקראים Width, אחד שייך למתודה שאני כותב בה את הקוד והשנייה ל 1‏Object, אני לא בהכרח ידע עם מי הוא משתמש, אבל הבעיה יותר חמורה. with מאפשר לי להשתמש עם יותר ממשתנה אחד שיש לו עוד אלמנטים בתוכו, ובנוסף אפשר גם להשתמש ב with מקונן:

  with Object1, Object2 do
    begin
      Height := 24;

      with Rec1 do
        Width := 18;
...
    end;

תיאורטית Height יהיה שייך ל Object1 נכון ? אבל אתם באמת יכולים להיות בטוחים שזה המצב ? אולי הוא משתמש בזה של Object2 בכלל ?

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

אז בבקשה תפסיקו להשתמש ב with. תודה !

11 מחשבות על “עם או בלי ?

        1. ik_5 מאת

          עשיתי ניסוי של הזנה ראשונית של נתונים ואז הוא אומר לי שאחד המשתנים היה בשימוש אבל לא אותחל לו ערך.

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

  1. ארתיום

    אז בבקשה תפסיקו להשתמש ב with. תודה !

    מה שמצחיק כשהתחלתי לכתוב ב־C אחרי תקופה ארוכה שכתבתי בפסקל ה־with היה מאוד חסר לי.

    מצד שני, בעידן OOP ה־With באמת איבד את המשמעות כי אם אתה זקוק ל־with אז סימן שזאת הייתה אמורה להיות מתודה…

  2. עידו ג.

    לדעתי, כל דבר הוא טוב במידה. אם משתמשים ב-with עם מספר אובייקטים בו-זמנית (או בקינון) זה אכן אסון, אבל במקרים נקודתיים של אובייקטים מקוננים מאד הוא בהחלט יכול לעזור. למשל, אם אני רוצה לשנות את הגודל והסגנון של פונט שנמצא ב-Form2.Image1.Bitmap.Canvas.Font, או משהו מעצבן כזה. אם רוצים להיות עוד יותר ברורים ובטוחים, אפשר לסיים את ההפניה שלב אחד למעלה (with Form2.Image1.Bitmap.Canvas do) ולקרוא למשתנים בתוספת האובייקט האחרון (Font.Color := clBlack לדוגמה).

      1. עידו ג.

        כמו שאני יודע שבביטוי a := b AND c ה-AND יקבל קדימות על פני ההשמה. אתה בעצמך אמרת, בענייני scope, מה שקרוב יותר מקבל קדימות. על אותו משקל, אם יש לך משתנה מקומי בשם Height במתודה של הטופס, איך אתה יודע שאתה משנה אותו ולא את ה-Height של הטופס? ואם התשובה היא שאתה מקפיד שלא יהיו שמות זהים, אז קל וחומר שאפשר להשתמש ב-with בבטחה…

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

        1. ik_5 מאת

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

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

          1. עידו ג.

            זה כמו לשאול מישהו אם השרוכים שלו קשורים. עד ששואלים, אין ספק – אבל מרגע ששואלים… 🙂

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

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

להשאיר תגובה

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

הלוגו של WordPress.com

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

תמונת Twitter

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

תמונת Facebook

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

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

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

מתחבר ל-%s