Rust Builder Pattern


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

כלומר, באותו ה namespace תוכל להיות לנו רק פונקציה אחת עם אותו השם וכשאנחנו מגדירים פונקציה אנחנו לא נוכל לקבוע לפרמטרים שלה ערכים דיפולטיים כדי להקל על המשתמש ב API. זאת להבדיל משפות כמו C#, C++, Java שתומכות ביכולות.

בפוסט הזה נדבר על איך Builder Pattern יכול לעזור לנו להתגבר על המגבלות הללו.

מה זה Builder Pattern

ה"בילדר" היא תבנית עיצוב ממשפחת ה "creational" שמאפשרת לנו לייצר אובייקטים בצורה של הדרגתית וגמישה יותר משימוש ב constructor רגיל. באמצעות הבילדר נוכל להפריד את הרכבת שדות האובייקט מיצירתו בפועל. 

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

מימוש ה Builder

נתחיל בלייצר struct פשוט של Person שיכיל שדות שנהפוך לאופציונאליים בעוד רגע באמצעות הבילדר.


השלבים הבאים יהיו:
1. נייצר מבנה של PersonBuilder שיהיה אחראי על בניית האובייקט Person
2. נממש פונקציות השמה לכל אחד מהשדות האופציונאליים שיצרנו בבילדר
3. נממש את הפונקציה `build` שכשמה כן היא - תבנה עבורנו את האובייקט וכן תוכל גם לספק עבורו את השדות הדיפולטיים אם נרצה (באמצעות unwrap_or_else)



שימוש ב Builder

כעת נשתמש בבילדר שיצרנו על מנת לייצר Person ולהשתמש בו.


באמצעות שרשור הפונקציות של הבילדר, יצרנו את האובייקט בדיוק באופן שרצינו, והשדות שלא מילאנו ימולאו בדיפולט שהגדרנו בפונקציית build.

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

Builder Crate???

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


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

סיכום

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

בפוסט ראינו דוגמה למימוש בילדר פשוט משלנו וכן שימוש בספריה מאוד מגניבה שתעשה את רוב העבודה בשבילנו.

תגובות

  1. קריאה מעניינת! טוב לראות תוכן ראסט איכותי בעברית!
    למען שלמות הדיון רצוי לציין שראסט כן מגיעה עם ה default pattern והטרייט המלווה אליו. שווה להכיר את היתרונות והחסרונות לעומת builder pattern לפני שבוחרים אסטרטגיית מימוש

    השבמחק
    תשובות
    1. פוסט נחמד בנושא, למרות היותו *מאד* מוטה נגד builder pattern. עדיין קריאה מעניינת.
      https://kerkour.com/rust-abolish-the-builder-pattern

      מחק
  2. היי, אני כל כך מתרגשת לקבל בחזרה את נישואיי השבורים ואת בעלי אחרי שהוא עזב אותי ואת שני ילדינו למען אישה אחרת. אחרי 8 שנות נישואים, לבעלי ולי היה ויכוח אחד על השני עד שהוא סוף סוף עזב אותי ועבר לקליפורניה להיות עם אישה אחרת. הרגשתי שהחיים שלי נגמרו והילדים שלי חשבו שהם לעולם לא יראו את אביהם שוב. ניסיתי להיות חזקה רק בשביל הילדים, אבל לא יכולתי לשלוט בכאבים שעינו אותי, ליבי התמלא עצב וכאב, כי הייתי ממש מאוהבת בבעלי. אני חושבת עליו כל יום ולילה ותמיד רוצה שהוא יחזור אליי, הייתי ממש נסערת והייתי צריכה עזרה, אז חיפשתי עזרה באינטרנט ונתקלתי באתר שהציע שד"ר אפאטה יכול לעזור לי לחזור במהירות, אז הרגשתי שאני צריכה לנסות את זה. יצרתי איתו קשר והוא אמר לי מה לעשות ועשיתי את זה, ואז הוא עשה (כישוף אהבה) בשבילי. 48 שעות לאחר מכן, בעלי באמת התקשר אליי ואמר לי שהוא מתגעגע אליי ולילדים כל כך, כל כך מדהים!! אז הוא חזר באותו יום, עם הרבה אהבה ושמחה, והתנצל על הטעות שלו ועל הכאב שהוא גרם לי ולילדים. ואז, מאותו יום ואילך, הנישואים שלנו היו חזקים יותר מבעבר, הכל בזכות ד"ר אפאטה. הוא כל כך חזק והחלטתי לשתף את הסיפור שלי באינטרנט. ד"ר אפאטה הוא גלגל לחשים אמיתי ועוצמתי שאני תמיד אתפלל שיחיה זמן רב כדי לעזור לילדיי בעת צרה. אם אתם כאן וצריכים את האקס שלכם בחזרה או שבעלכם עבר לאישה אחרת, אל תבכו יותר, צרו קשר עם הקוסם העוצמתי הזה עכשיו. הנה פרטי הקשר שלו: שלחו לו אימייל לכתובת: drapata4@gmail.com, אתם יכולים גם ליצור איתו קשר דרך וואטסאפ או וייבר עם המספר הזה (+447307347648), תודה.

    השבמחק

הוסף רשומת תגובה

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

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

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