You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: content/chapter 9/creational patterns/9.1.6-builder.md
+31-11Lines changed: 31 additions & 11 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -1,10 +1,11 @@
1
1
---
2
-
title: '9.1.6 الگو Builder'
2
+
title: 9.1.6 الگو Builder
3
3
slug: go-builder-pattern
4
4
weight: 172006
5
+
mermaid: "true"
5
6
---
6
7
7
-
###توضیحات
8
+
##9.1.6.1 توضیحات
8
9
9
10
در دنیای طراحی نرمافزار، یکی از چالشهای رایج، **ساخت{{< tooltip text="اشیاء" note="Objects" >}} پیچیده با پارامترهای متعدد و متنوع** است. فرض کنید قصد دارید یک شیء پیکربندی برای اتصال به {{< tooltip text="پایگاه داده" note="Database" >}} بسازید. بسته به نوع پایگاه داده ای که می خواهید (MySQL، PostgreSQL، SQLite و …)، ممکن است به مجموعهای متفاوت از پارامترها نیاز داشته باشید: نام کاربری و گذرواژه، میزبان و پورت، نام پایگاه داده یا حتی مسیر فایل. اگر بخواهیم همهی این موارد را با یک {{< tooltip text="سازنده" note="Constructor" >}} ساده مدیریت کنیم، به زودی با توابعی پر از پارامترهای اختیاری و ترتیبهای گیجکننده مواجه خواهیم شد.
10
11
@@ -14,15 +15,35 @@ weight: 172006
14
15
الگوی بیلدر وقتی کمک کننده است که بخواهید یک شیء پیچیده با پارامترهای زیاد را مرحله به مرحله و خواناتر بسازید، بدون اینکه درگیر سازندههای طولانی و گیجکننده بشوید.
Note over Builder,Config #FCE9D5: Build validates inputs
32
+
Client->>Builder: Build()
33
+
Builder->>Builder: validate driver rules (user/dbname or filepath)
34
+
Builder->>Builder: validate port range
35
+
alt validations pass
36
+
Builder->>Config: return configured DBConfig
37
+
Client->>Config: use config (e.g., connect)
38
+
else validations fail
39
+
Builder-->>Client: return error
40
+
end
41
+
{{< /mermaid >}}
42
+
43
+
## 9.1.6.3 مثال
22
44
23
45
وقتش رسیده که یک نمونهی واقعی را ببینیم. در کدی که در ادامه میآید، ما یک ساختار `DBConfig` داریم که تنظیمات اتصال به پایگاه داده را نگه میدارد. یک **Builder** به نام `DBBuilder` ایجاد کردهایم که به ما اجازه میدهد با استفاده از متدهای زنجیرهای (`SetUser`, `SetHost`, …) تنها فیلدهای مورد نیاز خود را مقداردهی کنیم و در پایان با فراخوانی `Build()` شیء نهایی را تحویل بگیریم.
24
46
25
-
<!-- markdownlint-disable MD010 MD037 MD012 -->
26
47
{{< play >}}
27
48
package main
28
49
@@ -148,7 +169,6 @@ func main() {
148
169
}
149
170
150
171
{{< /play >}}
151
-
<!-- markdownlint-enable MD010 MD037 MD012 -->
152
172
153
173
این کد، مفهوم الگوی بیلدر را در Go به شکلی بسیار ساده و شفاف پیادهسازی کرده است.
154
174
ساختار `DBConfig` شامل تمام فیلدهای لازم اتصال به پایگاه داده مثل نوع درایور، نام کاربری، رمز عبور، هاست، پورت، نام پایگاه داده، مسیر فایل (برای SQLite) و SSLMode است. `DBBuilder` یک سازنده مرحلهای است که این فیلدها را به صورت زنجیروار مقداردهی میکند.
@@ -157,15 +177,15 @@ func main() {
157
177
158
178
در تابع `main` دو مثال واقعی وجود دارد: یکی برای MySQL که تمام فیلدهای مرتبط پر شده و دیگری برای SQLite که تنها مسیر فایل مشخص شده است. این روش باعث میشود کد خوانا، قابل گسترش و ایمن باشد و ساخت پیکربندیهای مختلف پایگاه داده ساده و منعطف انجام شود. این پیادهسازی در عین سادگی نشان میدهد که چگونه میتوان با استفاده از الگوی Builder از پیچیدگیهای ایجاد اشیای بزرگ و متنوع کاست.
159
179
160
-
###کاربرد ها
180
+
##9.1.6.4 کاربرد ها
161
181
162
182
در مواردی که اشیاء ما پارامترهای زیادی دارند و پیچیده هستند، استفاده از الگوی سازنده به کمک ما میآید. در مواردی مثل:
163
183
164
184
1. کانکشن های دیتابیس
165
185
2. فرم یا UIهای پیچیده
166
186
3. {{< tooltip text="لاگر" note="Logger" >}}
167
187
168
-
### چه زمانی نباید از الگوی Builder استفاده کنیم؟
188
+
### 9.1.6.4.1 چه زمانی نباید از الگوی Builder استفاده کنیم؟
0 commit comments