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

      מחק

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

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

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

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

תכנות מונחה עצמים | Dependency Inversion Principle