דפוסי עיצוב יצירה בקוטלין: בונה

1. הקדמה

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

2. תבנית בונה

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

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

למידע נוסף, עיין במדריך שלנו בנושא דפוסי עיצוב יצירה כאן.

3. יישום

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

מסיבה זו, נראה תחילה יישום בסגנון Java קלאסי ואז טופס קצר יותר בסגנון Kotlin.

3.1. יישום בסגנון Java

נתחיל ליצור כיתה אחת - הזמנת אוכל - המכיל שדות לקריאה בלבד מכיוון שאיננו רוצים שאובייקטים חיצוניים ייגשו אליהם ישירות:

כיתת בניין פרטי FoodOrder (בונה: FoodOrder.Builder) {val לחם: מחרוזת? תבלינים ואליים: מחרוזת? בשר ואל: מחרוזת? דג ואל: מחרוזת? init {this.bread = builder.bread this.condiments = builder.condiments this.meat = builder.meat this.fish = builder.fish} Builder class {// קוד בונה}}

שים לב ש הקונסטרוקטור הוא פְּרָטִי כך שרק המקוננים בּוֹנֶה הכיתה יכולה לגשת אליו.

כעת נעבור ליצירת המחלקה המקוננת אשר תשמש לבניית אובייקטים:

בונה כיתות {לחם var: מחרוזת? = null סט פרטי פרטי var תבלינים: מחרוזת? = null סט קבוצתי פרטי var: מחרוזת? = סט פרטי פרטי var var fish: מחרוזת? = null לחם כיף סט פרטי (לחם: מחרוזת) = למרוח {this.bread = לחם} תבלינים מהנים (תבלינים: String) = להחיל {this.condiments = תבלינים} בשר כיף (בשר: מחרוזת) = להחיל {this.meat = בשר} דג מהנה (דג: מחרוזת) = החל {this.fish = דג} כיף לבנות () = FoodOrder (זה)} 

כפי שאנו רואים, שֶׁלָנוּ בּוֹנֶה יש את אותם שדות כמו המעמד החיצוני. עבור כל שדה חיצוני יש לנו שיטת קביעת התאמה.

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

שים לב שאנחנו משתמשים ב- להגיש מועמדות לתפקד על מנת לתמוך בגישה העיצובית השוטפת.

לבסוף, עם לִבנוֹת שיטה, אנו מכנים הזמנת אוכל בַּנַאִי.

3.2. יישום בסגנון קוטלין

על מנת לנצל את Kotlin באופן מלא, עלינו לבחון שוב כמה שיטות מומלצות שהתרגלנו לג'אווה. רבים מהם ניתנים להחלפה בחלופות טובות יותר.

בואו נראה איך נוכל לכתוב קוד קוטלין אידיומטי:

class FoodOrder בנאי פרטי (לחם val: מחרוזת ?, תבליני val: מחרוזת ?, val בשר: מחרוזת ?, דג דג: מחרוזת?) {מחלקת נתונים Builder (var לחם: מחרוזת? = null, var תבלינים: מחרוזת? = null, var בשר: מחרוזת? = null, var דג: מחרוזת? = null) {לחם כיף (לחם: מחרוזת) = להחיל {this.bread = לחם} תבלינים מהנים (תבלינים: מחרוזת) = להחיל {this.condiments = תבלינים} כיף בשר (בשר: מחרוזת) = למרוח {this.meat = בשר} דג כיף (דג: מחרוזת) = להחיל {this.fish = דג} לבנות כיף () = הזמנה של אוכל (לחם, תבלינים, בשר, דג)}}

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

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

לבסוף, כמו גם ביישום בסגנון Java, להגיש מועמדות() שימושי ליישום קובעים שוטפים.

4. דוגמאות לשימושים

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

val foodOrder = FoodOrder.Builder (). לחם ("לחם לבן"). בשר ("בייקון"). תוספות ("שמן זית"). בניין () 

5. מסקנה

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

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

כמו תמיד, הקוד זמין ב- Github.


$config[zx-auto] not found$config[zx-overlay] not found