آموزش دیزاین پترن Builder در گولنگ

در دنیای توسعه نرم‌افزار، الگوهای طراحی (Design Patterns) ابزارهایی قدرتمند برای حل مشکلات تکراری و بهبود ساختار و انعطاف‌پذیری کد هستند. یکی از این الگوها، Builder Pattern است.

الگوی Builder زمانی استفاده می‌شود که شیئی پیچیده با تنظیمات و پیکربندی‌های مختلف ساخته می‌شود و نمی‌خواهیم با استفاده از کانستراکتورهای بزرگ و پر از پارامتر، خوانایی کد را پایین بیاوریم.


چرا Builder در گولنگ؟

گولنگ به دلیل ساختار متفاوتش نسبت به زبان‌هایی مثل Java یا C#، مفهوم کلاس و ارث‌بری کلاسیک ندارد، اما همچنان می‌توان با استفاده از ساختارها (struct) و توابع سازنده (constructor-like functions) این الگوها را پیاده‌سازی کرد.


ساختار کلی Builder Pattern

در گولنگ، برای پیاده‌سازی الگوی Builder، معمولاً:

  • یک struct اصلی داریم که می‌خواهیم آن را بسازیم.

  • یک builder struct برای پیکربندی مقادیر دارد.

  • متدهای زنجیره‌ای (chainable) برای مقداردهی ارائه می‌دهیم.

  • در نهایت، یک متد Build() برای تولید شیء نهایی داریم.


مثال کاربردی: ساخت یک شیء User

فرض کنید می‌خواهیم یک کاربر با فیلدهای زیادی بسازیم:

package main

import "fmt"

type User struct {
    Name     string
    Email    string
    Age      int
    IsActive bool
    Role     string
}

ایجاد UserBuilder

type UserBuilder struct {
    user User
}

func NewUserBuilder() *UserBuilder {
    return &UserBuilder{}
}

func (b *UserBuilder) SetName(name string) *UserBuilder {
    b.user.Name = name
    return b
}

func (b *UserBuilder) SetEmail(email string) *UserBuilder {
    b.user.Email = email
    return b
}

func (b *UserBuilder) SetAge(age int) *UserBuilder {
    b.user.Age = age
    return b
}

func (b *UserBuilder) SetIsActive(active bool) *UserBuilder {
    b.user.IsActive = active
    return b
}

func (b *UserBuilder) SetRole(role string) *UserBuilder {
    b.user.Role = role
    return b
}

func (b *UserBuilder) Build() User {
    return b.user
}

استفاده از UserBuilder

func main() {
    user := NewUserBuilder().
       SetName("Milwad").
       SetEmail("milwad@codenews.com").
       SetAge(28).
       SetIsActive(true).
       SetRole("admin").
       Build()

    fmt.Printf("User: %+v
", user)
}


مزایای استفاده از Builder

  • افزایش خوانایی: متدهای زنجیره‌ای باعث می‌شوند کد خواناتر شود.

  • انعطاف‌پذیری: اجزای مختلف را می‌توان به صورت دلخواه مقداردهی کرد.

  • قابلیت گسترش بالا: در آینده افزودن فیلد جدید به ساختار User بسیار ساده خواهد بود.


نکات پیشرفته

  • می‌توانید اعتبارسنجی مقادیر را در متد Build() انجام دهید.

  • می‌توانید interface برای Builder تعریف کنید تا انعطاف بیشتری داشته باشید.

  • امکان تعریف DefaultBuilder‌ برای تنظیم مقادیر پیش‌فرض نیز وجود دارد.


نتیجه‌گیری

الگوی طراحی Builder راهی عالی برای ساخت اشیای پیچیده به صورت منعطف و قابل‌خواندن است. در زبان Go، با وجود نبود کلاس و کانستراکتورهای چندگانه، همچنان می‌توان این الگو را با استفاده از struct و متدهای زنجیره‌ای به خوبی پیاده‌سازی کرد.

0 🔥
0 🎉
0 😮
0 👍
0 💜
0 👏
میلاد خسروی
نویسنده کد نیوز

برنامه نویس فان | Fun Developer یک آدم ساده که عاشق برنامه نویسی و کد زدنه :) تلاش میکنه تا به بقیه کمک کنه. توسعه دهنده هسته لاراول و فضای اوپن سورس. فاندر پرانتز و کد نیوز.

0+ نظر

برای ثبت نظر ابتدا ورود کنید.

0 نظر

    اولین نفر باش که نظر ثبت میکنی :) یعنی یه کامنت به ما نمیرسه 😁