Skip to content

Commit 12e6d00

Browse files
committed
update: Update content formatting
1 parent ec03003 commit 12e6d00

File tree

1 file changed

+45
-23
lines changed

1 file changed

+45
-23
lines changed

content/chapter 9/creational patterns/9.1.6-builder.md

Lines changed: 45 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,8 @@ title: '9.1.6 الگو Builder'
33
slug: go-builder-pattern
44
weight: 172006
55
---
6-
### مقدمه
6+
7+
### توضیحات
78

89
در دنیای طراحی نرم‌افزار، یکی از چالش‌های رایج، **ساخت{{< tooltip text="اشیاء" note="Objects" >}} پیچیده با پارامترهای متعدد و متنوع** است. فرض کنید قصد دارید یک شیء پیکربندی برای اتصال به {{< tooltip text="پایگاه داده" note="Database" >}} بسازید. بسته به نوع پایگاه داده ای که می خواهید (MySQL، PostgreSQL، SQLite و …)، ممکن است به مجموعه‌ای متفاوت از پارامترها نیاز داشته باشید: نام کاربری و گذرواژه، میزبان و پورت، نام پایگاه داده یا حتی مسیر فایل. اگر بخواهیم همه‌ی این موارد را با یک {{< tooltip text="سازنده" note="Constructor" >}} ساده مدیریت کنیم، به زودی با توابعی پر از پارامترهای اختیاری و ترتیب‌های گیج‌کننده مواجه خواهیم شد.
910

@@ -13,30 +14,12 @@ weight: 172006
1314
الگوی بیلدر وقتی کمک کننده است که بخواهید یک شیء پیچیده با پارامترهای زیاد را مرحله به مرحله و خواناتر بسازید، بدون اینکه درگیر سازنده‌های طولانی و گیج‌کننده بشوید.
1415
{{< /hint >}}
1516

16-
### چه زمانی نباید از الگوی Builder استفاده کنیم؟
17-
18-
1. **ساخت اشیاء ساده**
19-
20-
+ اگر شیء شما تنها چند پارامتر ساده دارد و ساخت آن راحت است، Builder پیچیدگی را زیاد می‌کند.
21-
22-
2. **ملاحظات عملکردی**
23-
24-
+ در برنامه‌هایی که {{< tooltip text="کارایی" note="Performance" >}} مهم است، فراخوانی‌های اضافی و ایجاد آبجکت‌های موقت در Builder ممکن است باعث کاهش کارایی شود، به‌ویژه وقتی ساخت شیء مکرر است.
25-
26-
3. **اشیاء immutable و ساده**
27-
28-
+ اگر شیء ثابت و با فیلدهای نهایی است و ساخت آن ساده است، می‌توان از سازنده‌های معمولی یا factory method استفاده کرد.
17+
### دیاگرام
2918

30-
4. **افزایش پیچیدگی کد**
19+
{{< uml url="<https://viewer.diagrams.net/?tags=%7B%7D&lightbox=1&highlight=0000ff&edit=_blank&layers=1&nav=1&title=Untitled%20Diagram.drawio&dark=auto#R%3Cmxfile%3E%3Cdiagram%20name%3D%22Page-1%22%20id%3D%22ObbL-NJkyKtefCw91bFE%22%3E1VpZk5tIEv41HTH7MBGcbfdjSxxCqypaCITgjcsIxCFLSBy%2FfrMKkGi327Hu8cR4IqZHVNaVlfnlVa4Hfp436sk77lEZRtkDx4TNAy89cBzLCBz8EErbUx7ZgRCfknAYdCdski4aZw7USxJG51cDq7LMquT4mhiURREF1SuadzqV9ethX8rs9a5HL47eEDaBl72l2klY7XvqZ5G50xdREu%2FHnVlm6Mm9cfBAOO%2B9sKwnJF5%2B4Oensqz6r7yZRxkR3iiXfp7yTu%2BNsVNUVN%2BZYJ2jk%2B6nRCYck3k%2B6IUOGqZlXlFZeSZ5lTfQP80euMcHjm%2BeH3j4ZOh%2Fj18vhL9ZSMbdWg%2F886veB4E5V96puuTZgzgvvKAqTzAAeUlB2sBjlQTJEbYEqjSbXZIsjE7f65qXxZckJj3kjy7AMX%2FCTnHVc3WfDQxQNnBU34h%2FhKfkGp3%2B839P3kQVERQ9jdK3X7zzuS5P4ZS2KM8VrEmWJSPKUzXtlWbYy6MpRUmy6IUAYELbbFbEPMgaUz5%2BzB9t%2F%2FGfH08ahDbOOUXV5VS87qH6iMAeTv1St47pSoPE%2BlVALPD%2F27g%2FULtZr%2B7nWa%2BSKqJ8gfKjIhxUP8EEN%2F8Bnr6UJzCQ9xF1vsbTpe7rfOoxfDOD%2BiynQsXz213d5iyPzbmp%2FMnfzOtmNueqHU0aDPFIPpOc2v6sKFeDebDQAvgAIr3sOUviAmhVeQSqdz723uVL0kSw9YxOfh6pzEiBb2oq%2FHPf5BR6klkD4uHmLwvMue1M8O3mEnRM4i0MJpDK64oP%2BbAVedSK1yAPrih9rtH8qQvzINEW%2B8pXxU4v9mfPFk8vm2UZLoxaTz5fYRa%2FKoJulT%2B1bvu50c2DuOL7cVoyS31OZFxbZCzeEH11a0W7WQbzGXe3Z1Yc7oJWi11VYZwNe%2FBspQhypVrtDDFQrSctw4q13SrmASuwVunaWeEt1k9aihi8mwlAq4N827m7JedaSheo2zRUlvtQza6wxwX2zmBMFy6ys2uCvrjsEKrxIzYdLljEnzx1e3S5PaMP6%2Bnccu9wFfDwxPr5%2BlFjXNU4wF96Bhm4WVDgo88JsL98QRstDvMsC5nlNZKYBM2fa02yOJw8d1iyYHx4dBdG%2BbLRWJy6dTTX4ih%2FuvqWcnGV2d5PmcSH8%2Fp5lkcbDfTzohqZW6DrS9oUwx%2Fj7QzgXMSOnV1e5k9DW%2FgMp07D%2BSz37OYMO6RIAm3BH5yW0lb2U%2B3Y%2BBguDsDt82XoTzR1n3l2WIaEYzPmVulawNJ6yi2RqgC%2FjU44Bqnh7nDRzZjBc43wRjSbaQvMRHZDNAnSXV49znrUOlmANRtdqkZaNUoczQVW5zEDkj25oGlnh0tnt2yd3eERb4R6JVnAI5Fy3MDeLUpgb0kD3rUW%2BBHRaz6AL9oH0hYYnMbA82ciwfnTt5KT14clCxI5uDvt84o3jqEKXKdN69qY0VT36Kv1k5ag%2Bi4hSqt8fgZYyBgiAeC%2B74edR8xQCUnOBUs9R8NJgauYnIJilGDkH5IgYHB9wZtRioBvmP9XJYmvfu4e3a6%2BgoUxvmqRkYtl5vDr2M2zsw%2Bo0rrnm6wobc5eA1VJYRUR%2BKpX6Q2pE3uWBbK%2FLq0ZoPOebTAerEURCL%2FY1BrCO8zn9Y0g9uMon2pz9HMrDqh3AY9RDBIyy7SXpCxMpDasXAIX1ieY0%2Fpcla1sYx9w%2B31QLPeRWbLA4ZlIVG%2FJ7jJwZ7V3SQ7fJqEH4io9DPZzaAlucUoQ4Qg61XR9dTvhM3jb1FfBO4G3BUm0IDuQBniAYh1%2F064AXXt3fvOINWiY8cCOYdyF2KxpK0c%2Fod5iYWTR4j25P13COZs7Nnv0iQcoMKyOqoDbtp7tEIxfyW4Blz0Sv4hMOAHYhZ%2BHjCcrB6%2FYdmS3oLeBiwuSCNWtEMrDGOI9bjgnvo54mUBYpRR3ycuB3Xu2QOyN8Ej1tD37alYHnBU7fDzadUqty0QUqbeTMFZrmEuVnCQoRotaioNvunnzUX96gqieQd93ne56f6aD78PmOVmBHkCGjDefHcDiMEq1MwIvjjczRL7Bisk31jd1CwhjNbnu8O2bAX9UM%2Fqc0sWV5HSAn9g0tXYlrQX6LSF2oCc3r5KLYC9EOh%2Bw9PZj%2BAlVwMe%2FFD9g23OBRxJqtPQe8UieAF4o88HSgwXONBULY4RweDoPrE0QsYmaMfqRiAgIUtDBIX6mjQZfEhSHAU0f1UgDEjVKTQWfdaCoaHXTAV9qdWhAEuo0QMGBRZ0MCDlA%2B5m5tSlKUI1HfntkdShFtzUAgR3q4rGN36zZr9G9PfPbfOdnLWTFBdRWg9jhmn3AI9D8DPyicQQtQj4hMtridXtl7zPHJto3IOuSq2%2FwCFIy5utiC%2FZgZMGAu2%2FixcTaJ7G1Jecb4gHVH0po%2FGqpx%2Bi%2FP3TOSabD47aPL6AjbnXDoVUPseUfthCcojGTaFDbR2%2FCNaCxRR1IJn2T3YzedojeYCtnyBM6wMZrTzCffdNmGbC3M%2BwAeYWxX%2B1eaxnmT3dK3uZPGGwN9Jh%2Bk2Gm8S3P6D25Rj19b4fD9wci9zRHgApilFKNk5uUIBJbk0jcUD%2FyTr5HNeVC3QHnE4lPgDN3qx3OAsjNiX2RGgbaxyi3SK5CMHmGmqYI1f3MVY9swK8J%2FzTj9mm9RDRhoH4M4c3phqy6G6MdxXEaQ7YR1GDXEDMnlpKSDAvQIP1tNsk9XQDXhZa%2BrSUmnnOSoWnCPddZUg%2FcWwyNy8P3h7zqJHMO6kFKjG4%2B%2F27WaDoDztYi9Rs0j4bKiubWxLMZ8lICpIAcg7%2FdFodMvP3dPCoaM3bpUP%2Belmhxd4wFY%2BYhQL4%2FZh7f1DnvWmHOZgGP9y5nvWdpFam1hozr%2BxnZnGm%2F41trn2tEFyx0IqVRC8Dx7Ar1I0OyQQSZwkqSa%2BBeIH4W8gIGtXWDJKjvJLDWOckl0BmZMuQPMdE%2B5BKIJ3P0Yc7Pa13%2B9Jdqr%2BZeV9EaQEApPYk4VqfIfBYHbse6anKiX46h7ucxJHcjzlF6GDAkk%2BjT4g6RuKy7u3Cq1dJdLI9hvm3%2Fa%2F5LMMXgFiwidbgRU9iEaqkj9wQjpiwSu0jFO2KKRZt%2Bzu%2BIKasZuL1h6n6i3wFTWo021AfT2KqPGYKJoHqQBdxZyUuGs1Aht51avGpnprsz1iSihNxT686fr5oC%2FfL%2BCntN488vjZvoA3XeQXx7KlI1yzWCmNqfanYNoJodTgXYFfe%2BbY1tFaSeWbR6H06pYNOU2aurWj%2BOtJULv44dZu9F0xW5x3ldo%2FyMVX3sJs%2Bc3tKRvCkmeOx0icajhmKzO1xwugafMt7QyeTmi8PSM%2FerLAUJff2j3b%2FprdZ0J7AeYknmATI8h0GSQ%2BtEXwVdbz5i42CZRP%2FdmrtbaczfrfS%2Bz2iluqmNkrj%2BnB%2BzwHfJ5G6AnoX4MfBdk%2FXqDnI68GMHbtgT%2FJjVwhwRsqHx%2FB%2F1Y%2F%2Bw1QGuhttfKol2yMUAV84FgafGtBbvUb8uf01Ugvx3HkLm6qrb9n17097WH%2BrTObLDqz%2B5vRkRTP6Fx4czhgtEcjeog%2BsWvAbknRZEqJqF7PuMUnKrbLFYCs6YZDoS5JxQW2BzDVHJajCZQ3NVMuenK85muPn5lbbOAupGW3%2FF23Ab36KB%2F98DTRA9x6wZbEYbs%2BYGMh7wDwceMp4W%2FDQb5EI8qYJinwf%2BdssWfn%2BVnx5x80N80dvnn816AEdriLVrTpfic48rEqWGNu0H73DrP0z7f772HW7c%2FrInTYM7ptL1DVP0PruvuUZMkfvr6b%2Fw%2FOOYCtj%2B1oDe3Yi3alFaQ6a%2F7nRaU28hx9Lksdp9Ls1dZlpWTTMDy2qOoWod77fE%2FX25tmEqi11KL9tqY0mzL4i3BN80JLMwbNcOlXWnOKGkVBanXLbdWnDTgA0UZYuYahlJsyQoFNW2j8LW1hpbXrpRfuT9xf5LeGi%2BBpwgOtm%2BMCSnMzjxq53tM383mxt55mA%2B7hw27jbFcWPx2RKbxkw3l0K4c4tNqrSupHw1lGyvL4wKca6%2BMlHrK8fCl40MMw0GTyw69tHaSortzRnO7JZfPSvUYN%2FUOYgXxGucmVeZIZeVfah4195uDNZwI2XZWLIx82yFMdilixWX3yoBY3FPs11nfEFytTRtgdF3me0t9jtddhlcZLutdRRdZmvoalUb3VayrdAGedQ7kN8oyxWPOfgljxbIGwjy6oE8Toiadx8AsZN3D2pU5lF1amHI7THW8BJpeIrFj%2B36%2FrBJfHzsafvJoyZeEIcHVcNjqvi29v29EXwMjy3G5uQF0ki6v3aiwydvxnj5fw%3D%3D%3C%2Fdiagram%3E%3C%2Fmxfile%3E>" >}}
3120

32-
+ ایجاد یک Builder برای هر شیء پیچیده ممکن است کد را طولانی و پیچیده کند.
33-
+ اگر شیء نیاز به ساخت مرحله‌ای ندارد، Builder می‌تواند اضافه باشد.
21+
### نمونه کد: ساخت پیکربندی پایگاه داده با Builder
3422

35-
5. **وابستگی زیاد به محصول**
36-
37-
+ اگر Builder و محصول خیلی به هم وابسته باشند، تغییر در محصول نیازمند تغییر در Builder است و انعطاف‌پذیری کاهش می‌یابد.
38-
39-
**مثال: ساخت پیکربندی پایگاه داده با Builder**
4023
وقتش رسیده که یک نمونه‌ی واقعی را ببینیم. در کدی که در ادامه می‌آید، ما یک ساختار `DBConfig` داریم که تنظیمات اتصال به پایگاه داده را نگه می‌دارد. یک **Builder** به نام `DBBuilder` ایجاد کرده‌ایم که به ما اجازه می‌دهد با استفاده از متدهای زنجیره‌ای (`SetUser`, `SetHost`, …) تنها فیلدهای مورد نیاز خود را مقداردهی کنیم و در پایان با فراخوانی `Build()` شیء نهایی را تحویل بگیریم.
4124

4225
<!-- markdownlint-disable MD010 MD037 MD012 -->
@@ -163,5 +146,44 @@ func main() {
163146
fmt.Printf("SQLite config: %+v\n", sqliteCfg)
164147
}
165148
}
149+
166150
{{< /play >}}
167-
<!-- markdownlint-enable MD010 MD037 MD012 -->
151+
<!-- markdownlint-enable MD010 MD037 MD012 -->
152+
153+
این کد، مفهوم الگوی بیلدر را در Go به شکلی بسیار ساده و شفاف پیاده‌سازی کرده است.
154+
ساختار `DBConfig` شامل تمام فیلدهای لازم اتصال به پایگاه داده مثل نوع درایور، نام کاربری، رمز عبور، هاست، پورت، نام پایگاه داده، مسیر فایل (برای SQLite) و SSLMode است. `DBBuilder` یک سازنده مرحله‌ای است که این فیلدها را به صورت زنجیروار مقداردهی می‌کند.
155+
156+
متدهای `SetUser`، `SetPassword`، `SetHost` و بقیه، امکان پر کردن فیلدها به شکل خوانا و زنجیروار را فراهم می‌کنند. متد `Build` در پایان پیکربندی را اعتبارسنجی می‌کند، برای SQL فیلدهای `User` و `DBName` باید پر شوند، برای SQLite مسیر فایل الزامی است و پورت باید بین ۱ تا ۶۵۵۳۵ باشد. اگر خطایی باشد، ارور باز می‌گردد و در غیر این صورت پیکربندی معتبر تحویل داده می‌شود.
157+
158+
در تابع `main` دو مثال واقعی وجود دارد: یکی برای MySQL که تمام فیلدهای مرتبط پر شده و دیگری برای SQLite که تنها مسیر فایل مشخص شده است. این روش باعث می‌شود کد خوانا، قابل گسترش و ایمن باشد و ساخت پیکربندی‌های مختلف پایگاه داده ساده و منعطف انجام شود. این پیاده‌سازی در عین سادگی نشان می‌دهد که چگونه می‌توان با استفاده از الگوی Builder از پیچیدگی‌های ایجاد اشیای بزرگ و متنوع کاست.
159+
160+
### کاربرد ها
161+
162+
در مواردی که اشیاء ما پارامترهای زیادی دارند و پیچیده هستند، استفاده از الگوی سازنده به کمک ما می‌آید. در مواردی مثل:
163+
164+
1. کانکشن های دیتابیس
165+
2. فرم یا UI‌های پیچیده
166+
3. {{< tooltip text="لاگر" note="Logger" >}}
167+
168+
### چه زمانی نباید از الگوی Builder استفاده کنیم؟
169+
170+
1. **ساخت اشیاء ساده**
171+
172+
+ اگر شیء شما تنها چند پارامتر ساده دارد و ساخت آن راحت است، Builder پیچیدگی را زیاد می‌کند.
173+
174+
2. **ملاحظات عملکردی**
175+
176+
+ در برنامه‌هایی که {{< tooltip text="کارایی" note="Performance" >}} مهم است، فراخوانی‌های اضافی و ایجاد آبجکت‌های موقت در Builder ممکن است باعث کاهش کارایی شود، به‌ویژه وقتی ساخت شیء مکرر است.
177+
178+
3. **اشیاء immutable و ساده**
179+
180+
+ اگر شیء ثابت و با فیلدهای نهایی است و ساخت آن ساده است، می‌توان از سازنده‌های معمولی یا factory method استفاده کرد.
181+
182+
4. **افزایش پیچیدگی کد**
183+
184+
+ ایجاد یک Builder برای هر شیء پیچیده ممکن است کد را طولانی و پیچیده کند.
185+
+ اگر شیء نیاز به ساخت مرحله‌ای ندارد، Builder می‌تواند اضافه باشد.
186+
187+
5. **وابستگی زیاد به محصول**
188+
189+
+ اگر Builder و محصول خیلی به هم وابسته باشند، تغییر در محصول نیازمند تغییر در Builder است و انعطاف‌پذیری کاهش می‌یابد.

0 commit comments

Comments
 (0)