בראסט ה Enums טובים יותר

    


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

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

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

Enums בראסט

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

היתרונות העיקריים

  1. החזקת נתונים מורכבים – כל variant ב-Rust יכול לשאת נתונים ייחודיים. כלומר, אנחנו לא מוגבלים לערכים סטטיים בלבד, אלא יכולים להוסיף נתונים לכל אפשרות.
  2. exhaustive pattern matching - ראסט מבטיחה שכשנתמש ב enum נהיה חייבים להתייחס לכל אחד מהוריאנטים שלו, דבר שמקטין את מרווח הטעות לפספוסים.
  3. פולימורפיזם - העובדה שהוריאנטים שלנו יכולים להחזיק data והעובדה שכשנעשה match על המידע הזה נהיה חייבים לטפל בכל הוריאנטים נותנת לנו את היכולות להתמודד ולטפל באובייקטים שונים בזמן ריצה בצורה נוחה, יעילה ובטוחה.

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

החזקת מידע ו pattern matching

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



בחלק הראשון אנחנו מגדירים את ה enum ובו 4 וריאנטים, הראשון בסיסי ולא מחזיק מידע, השני מידע ״מורכב״, השלישי מחזיק ownership לאובייקט על ה heap והרביעי יחזיק שלושה מספרים.

כעת בחלק השני, נוכל לכתוב פונקציה על אותו טיפוס Message שהגדרנו שתעבד אותו ותקבל החלטה בהתאם לוריאנט שאותחל. בשימוש ב match נהיה חייבים לטפל בכל הוריאנטים האפשריים שקיימים ב enum, אחרת - נקבל שגיאת קומפילציה דומה לזו:


פולימורפיזם

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

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

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


לסיכום

היכולת של enums בראסט להחזיק טיפוסים מורכבים, יחד עם ה exaustive pattern matching שהשפה מציעה והיכולת לעשות פולימורפיזם פשוט, נוח ויעיל - גורמים לפיצ׳ר הזה בשפה להיות ב level אחר מעל enums בשפות אחרות. 

תגובות

פוסטים פופולריים מהבלוג הזה

קודמתי לדרגת סיניור במיקרוסופט - מה למדתי בדרך

מהם קבצי DLL ואיך להשתמש בהם?

מדריך C# | שימוש ב LINQ