-
למה string בשפת #C הוא Immutable?
לא מזמן שאלתי בקבוצת המפתחים שלנו חידה קטנה: מה יודפס? התשובה היא True. אבל למה? הרי לא כתבנו b = a. יצרנו שני משתנים נפרדים, ושניהם קיבלו את אותו הטקסט. אחת התשובות שעלו בקבוצה היתה ש־string אינו ממש אובייקט רגיל, וש־#C מתייחסת אליו קצת כמו אל int. זו השערה מובנת, כי הרבה פעמים אנחנו משתמשים במחרוזות כאילו הן ערכים פשוטים. אבל string הוא Reference Type. אם רוצים לבדוק מה קורה עם int, אפשר לנסות: כאן התוצאה היא False. ReferenceEquals מקבלת אובייקטים, ולכן כל אחד מהמספרים עובר boxing לאובייקט נפרד לצורך הקריאה. העובדה שהערכים שווים לא הופכת אותם לאותו אובייקט. התיעוד של Microsoft מסביר את ההבדל הזה. אז מה מיוחד בשתי…
-
תבנית Strategy בשפת #C: האם באמת צריך מחלקה לכל דבר?
נניח שאתם כותבים חנות מקוונת וצריכים לחשב את מחיר המשלוח. בהתחלה יש משלוח רגיל בלבד. בהמשך מוסיפים משלוח מהיר ואיסוף עצמי. החישוב נראה כך: אין כאן בעיה מיוחדת. יש שלושה סוגי משלוח, והקוד קצר וברור. אבל אחר כך מתברר שמשלוח מהיר אינו זמין לכל כתובת. במשלוח רגיל יש הנחה מעל סכום מסוים, ומשלוח לחו״ל מחייב פנייה לשירות חיצוני. לכל סוג משלוח מתווספים כללים משלו, והמתודה הקטנה מתחילה לגדול. לתת לכל דרך חישוב מקום משלה תבנית Strategy מאפשרת להפריד בין הקוד שמבקש לחשב מחיר משלוח לבין הקוד שמבצע את החישוב בפועל. נגדיר ממשק: כל סוג משלוח יממש את החישוב שלו: המחלקה שמשתמשת בחישוב מקבלת את האסטרטגיה מבחוץ: כך נשתמש בה עבור…