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

در دنیای توسعه نرمافزار، الگوهای طراحی (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
و متدهای زنجیرهای به خوبی پیادهسازی کرد.
اولین نفر باش که نظر ثبت میکنی :) یعنی یه کامنت به ما نمیرسه 😁