Anophel | آنوفل
159 subscribers
283 photos
299 links
آنوفل | Anophel: دنیای بی ‌پایان امکانات برای برنامه‌ نویسان

https://anophel.com

پشتیبانی :
@anophel_support
Download Telegram
ژنریک ها (Generics) در Go : بررسی عمیق

🔺 در Go 1.18، این زبان ویژگی جدیدی به نام انواع generic (که معمولاً، ژنریک شناخته می‌شود) معرفی کرد که مدتی در لیست آرزوهای توسعه‌دهندگان Go قرار داشت. در برنامه نویسی، نوع generic، نوعی است که می تواند همراه با چندین نوع دیگر استفاده شود. معمولاً در G...

🌐 : ژنریک ها (Generics) در Go : بررسی عمیق

#go #golang #گو #گولنگ
FrankenPHP چیست؟ اپ سرور مدرن PHP

🔺 همانطور که پیچیدگی برنامه های کاربردی وب همچنان در حال رشد است، توسعه دهندگان به طور فزاینده ای بر عملکرد و مقیاس پذیری تمرکز می کنند. لاراول که به عنوان یک چارچوب قدرتمند PHP شناخته می شود، این نیازها را برطرف می کند. با این حال، راه حل های مختلفی ب...

🌐 : FrankenPHP چیست؟ اپ سرور مدرن PHP

#فرانیکن #لاراول #php #frankenphp
آشنایی با Error Handling در Go : بررسی عمیق

💠 مدیریت خطا (Error Handling) یک جنبه حیاتی در هر زبان برنامه نویسی است و Go نیز از این قاعده مستثنی نیست. در این مقاله از سری مقالات گولنگ در آنوفل، به بررسی اشتباهات معمولی که حتی توسعه دهندگان باتجربه مرتکب می شوند اختصاص یافته است، ما بر Error Hand...

💙 : آشنایی با Error Handling در Go : بررسی عمیق

#Go #Golang #گو #گولنگ
Please open Telegram to view this post
VIEW IN TELEGRAM
بهترین فریمورک های وب Go در 2024

💠 با ادامه پیشرفت فناوری، نیاز روزافزونی به برنامه های کاربردی وب سریع، قابل اعتماد و مقیاس پذیر وجود دارد. Go که با نام Golang نیز شناخته می شود، یک زبان برنامه نویسی است که به دلیل سادگی، کارایی و همزمانی آن محبوبیت پیدا کرده است. این زبان تبدیل به ز...

💙: بهترین فریمورک های وب Go در 2024

#گو #گولنگ #Gin #Echo
Please open Telegram to view this post
VIEW IN TELEGRAM
🔹یکی از دوستان ی پروژه ای نوشته بودن و از تایپ اسکریپت اومدن استفاده کردن، بعد قرار شد کد هاش بررسی کنم و مواردی که حالا نیاز بود رعایت کنه رو بگم. اینجام قرار میدم که همه مون تو پروژه های آینده مون استفاده کنیم ازش.

🫶1. از Mapped Types استفاده کنید.
حالا Mapped Types در TypeScript به شما اجازه میده تا نوع‌های جدیدی را بر اساس نوع‌های موجود ایجاد کنید. با استفاده از یک نوع ژنریک ( Generic) که از یک union از PropertyKeyها (معمولاً با استفاده از keyof ایجاد میشه) برای تکرار کلیدها و ایجاد یک نوع جدید انجام میشه.

🫶2. از آپشنال chaining ?. استفاده کنید.
این باعث میشه دیگه نگران مقدار های null یا undefined نباشید.

🫶3. از Utility Types استفاده کنید.
حالا Utility Types در TypeScript مجموعه‌ای از نوع‌های از پیش تعریف شده هستند که به شما کمک می‌کنند تا تغییرات و عملیات‌های رایج روی نوع‌ها را انجام بدید. این نوع‌ها به شما اجازه میده تا نوع‌های جدیدی بر اساس نوع‌های موجود ایجاد کنید، پراپرتی ها Partial یا Required و همچنین Readonly کنید، نسخه‌های غیرقابل تغییر از نوع‌ها بسازید و ...

🫶4. استفاده از Branded Types
اینم قشنگه و در تایپ‌اسکریپت یک روش برای ایجاد انواع یونیک است که از اشتباهات لاجیکال جلوگیری میکنه. این نوع‌ها با اضافه کردن یک ویژگی خاص به نوع اصلی، به نوعی “برند” می‌شوند.
دقت کنید این ویژگی در زمان اجرا وجود ندارد، اما به کامپایلر تایپ‌اسکریپت کمک می‌کند تا تفاوت بین انواع مختلف را تشخیص بده.

موارد دیگه ای هم بودن، در پست های آینده بهش می پردازیم.

موردی هم بود حتما در بخش کامنت ها بنویسید ♥️

Anophel | آنوفل

#تایپ_اسکریپت #ts #typescript
Please open Telegram to view this post
VIEW IN TELEGRAM
Forwarded from IEEE Sharif UT
🔹انجمن علمی دانشکده مهندسی برق دانشگاه صنعتی شریف برگزار می‌کند:
🔻رویداد Emeet 2024
با حضور کارآفرینان موفق ایرانی

در این رویداد شما فراتر از مفاهیم تئوری و تکراری، روایت‌های ارزشمندی از مسیر پر چالش کارآفرینی، شکست‌ها، موفقیت‌ها و تجربه‌های کاربردی را از زبان کسانی می‌شنوید که این راه را با موفقیت پیموده‌اند.

⬅️ جهت ثبت‌نام در رویداد اینجا را کلیک کنید.
🗓 ۲۶ و ۲۷ مهرماه
📍در دانشگاه صنعتی شریف (به صورت حضوری و مجازی)

🔥 شماره می‌توانید با استفاده از کد off20 از 20 درصد تخفیف ویژه برخوردار شوید.

🔴 ظرفیت شرکت حضوری در رویداد محدود است و ورود برای عموم آزاد است.

🖥 Website | ℹ️ LinkedIn | 💬  Support

@EmeetSUT | @EEResana
Please open Telegram to view this post
VIEW IN TELEGRAM
💠امروز میخوام یک ابزار جدید معرفی کنم به اسم Neu.js.

این یک کتابخانه جاوا اسکریپت سبک و اوپن سورس است که برای توسعه ساده فرانت اند طراحی شده است که بر سهولت استفاده و حداقل کد تأکید دارد.


🔹خب Nue.js به عنوان یک ابزار جدید در حوزه توسعه فرانت اند ظاهر شده است که رویکردی حداقلی برای ساخت اینترفیس های وب ارائه می دهد. البته این به دلیل ماهیت سبک خود متمایز است‌.

🔹زمانی که فشرده می شود تنها 2.3kb حجم دارد و نسبت به فریمورک های مثل Vue.js، React.js یا Svelte آبستکرشن با همون انتزاعات کمتری دارد. این کتابخانه بر طراحی وب بهبود معنایی و پیشرونده تمرکز دارد و برای توسعه دهندگان UI که طراحی تعامل، دسترسی و تجربه کاربر را در اولویت قرار می دهند، هدف قرار گرفته است.

🔹همچنین Nue.js بخشی از یک اکوسیستم پیش‌بینی‌شده است که شامل پروژه‌های آینده مانند Nue CSS، Nue MVC، Nue UI، Nuemark و Nuekit است که هدف آن ارائه یک جایگزین جامع برای راه‌حل‌های موجود مانند Vite، Next.js و Astro است.

🔹سادگی این فریمورک به توسعه دهندگان اجازه می دهد تا به میزان قابل توجهی کد کمتری بنویسند و شامل ویژگی هایی برای توسعه آسان و یک زنجیره ابزار ساده برای SSR و تولید کامپوننت بدون نیاز به ابزارهای باندلر پیچیده است.

آنوفل | Anophel

#nuejs #frontend #js #javascript #جاوااسکریپت
Please open Telegram to view this post
VIEW IN TELEGRAM
💠امروز میخوام درباره 8 تا از راه های استفاده از Shallow Copy تو جاوااسکریپت براتون بگم.

🔺در جاوا اسکریپت، یک Shallow Copy یک کپی از یک آبجکت یا آرایه ای است که در آن فقط ساختار سطح بالا کپی شده، در حالی که ساختارهای تودرتو هنوز ارجاع داده می شوند.

🔺اولی Spread syntax (…):

با استفاده از این می تونید از آرایه یا آبجکت یک کپی بگیرید

🔺دومی Array.from() :
اینم آرایه هایی که شبیه آبجکت هستن یا آبجکت iterable هستند رو به أآرایه تبدیل می کند.

🔺سومی Object.assign() :
پراپرتی ها را از یک یا چند آبجکت منبع به یک آبجکت هدف کپی می‌کند و آبجکت مورد نظر را تغییر می‌دهد.

🔺چهارمی Array.prototype.concat() :
اینم با ترکیب یک مقدار یا یک آرایه موجود به یک آرایه جدید یک shallow Copy ایجاد می کند.

🔺پنجمی Array.prototype.slice() :
با اینم بخشی از آرایه رو اسلایس می کنید و یک آرایه جدید می سازید و یک Shallow Copy ایجاد می کند.

🔺ششمی Object.keys():
با استفاده از این هم می تونید یک Shallow Copy از پراپرتی های یک آبجکت بگرید.

🔺هفتمی اپراتور =
با اساین کردن یک مقدار به یک متغیر دیگر، یک shallow copy ایجاد می کند.

🔺هشتمی Object.create() :
از آبجکت نمونه یک آبجکت جدید همراه با پراپرتی ها می سازد.


🔸بر اساس سناریویی که دارید می تونید از یکی از روش های بالا استفاده کنید.

💙آنوفل | Anophel

#جاوااسکرپیت #فرانت_اند #ری_اکت #js #javascript #frontend #react
Please open Telegram to view this post
VIEW IN TELEGRAM
در جاوااسکریپت، مفاهیم "Execution Context"و "Execution Stack"و "Variable Object" و "Scope Chain" به ترتیب با مکانیزم‌های اجرایی و مدیریت متغیرها و توابع در کد ارتباط دارند.

خب این مفاهیم برای درک چگونگی اجرای کدهای جاوااسکریپت و مدیریت فضای حافظه اهمیت دارند. بیاید بیشتر باهاش آشنا شیم:


1. Execution Context:
این مفهوم به معنای فضاییه که کدهای جاوااسکریپت توش اجرا میشن. وقتی یه اسکریپت یا تابع اجرا میشه، یه "بافت اجرایی" براش ساخته میشه که مرورگر بهش نیاز داره تا کد رو درست اجرا کنه.

سه نوع کلی داریم:
- Global Execution Context: وقتی کد برای اولین بار اجرا میشه، این بافت ساخته میشه و همه کدهای خارج از توابع توش قرار میگیرن.
- Function Execution Context: هر بار که یه تابع فراخوانی میشه، یه بافت اجرایی جدید برای اون ساخته میشه.
- Eval Execution Context: وقتی کدها از طریق تابع eval() اجرا میشن، یه بافت اجرایی خاص برای اون ساخته میشه.

هر Execution Context سه بخش اصلی داره:
1.Variable Object: جایی که متغیرها و توابع تعریف‌شده توش ذخیره میشن.
2. Scope Chain: برای دسترسی به متغیرها و توابع در دامنه‌های دیگه استفاده میشه.
3. this: به آبجکت فعلی یا محیط اجرایی خاص در زمان اجرا اشاره داره.

2. Execution Stack:
اینو بهش Call Stack هم میگن. یه جور ساختار داده‌ای از نوع استک (LIFO: Last In, First Out) که بافت‌های اجرایی رو مدیریت میکنه. هر بار که یه تابع فراخوانی میشه، بافت اجرایی اون تابع به استک اضافه میشه و بعد از اتمام اجرا، از استک خارج میشه.

3. Variable Object:
فضایی که تو هر بافت اجرایی ایجاد میشه و متغیرها، توابع و پارامترهای مربوط به اون رو ذخیره میکنه.

دو نوع اصلی داره:
- Global Execution Context: آبجکت متغیر به عنوان Global Object عمل میکنه (معمولاً window تو مرورگر).
- Function Execution Context: شامل پارامترهای تابع، متغیرهای داخل تابع و توابع درونی اون.

۴. Scope Chain:
مکانیزمیه که جاوااسکریپت برای دسترسی به متغیرها و توابع ازش استفاده میکنه. هر بافت اجرایی یه زنجیره‌ای از دامنه‌ها داره که تو اون به دنبال متغیرها و توابع میگرده. وقتی جاوااسکریپت دنبال مقدار یه متغیره، اول از دامنه فعلی شروع میکنه و اگه اونجا پیدا نکرد، میره سراغ دامنه‌های بالاتر (مثلاً دامنه گلوبال).

این مفهوم اجازه میده که متغیرها و توابع تو جاوااسکریپت به طور سلسله‌ مراتبی و براساس مکان تعریفشون تو کد دسترسی‌پذیر باشن.


ANOPHEL I آنوفل

#جاوااسکریپت #javascript #stack #react #vue
بهترین Best Practice های گولنگ که هر برنامه نویس Go بداند

🔺 گولنگ (Golang) که با نام Go نیز شناخته می شود، یک زبان برنامه نویسی منبع باز محبوب است که توسط غول فناوری گوگل توسعه یافته است. Go با سادگی، کارایی و پشتیبانی قوی از همزمانی، محبوبیت زیادی در بین توسعه دهندگان در سراسر جهان به دست آورده است. از آنجای...

🌐 : بهترین Best Practice های گولنگ که هر برنامه نویس Go بداند
تسلط و بررسی package.json : قلب پروژه Node.JS

🔺 اگر تا به حال با یک پروژه node.js یا ری اکت کار کرده اید، احتمالا با فایل package.json مواجه شده اید. این فایل که بی سر و صدا در ریشه شما قرار دارد اما اجازه ندهید اندازه خودتون شما را فریب دهد این یکی از مهم ترین بخش های هر پروژه JavaScript/TypeScri...

🌐 : تسلط و بررسی package.json : قلب پروژه Node.JS
آیا تا به حال به یک ساختار کامل و منظم برای مدیریت پروژه‌های #گولنگ ( Go# ) با معماری Domain-Driven Design (DDD) فکر کرده‌اید؟ در این پست قصد داریم این ساختار را با جزئیات بیشتری بررسی کنیم و به شما نشان دهیم چگونه می‌توانید پروژه‌تان را مرتب‌تر و کارآمدتر پیش ببرید.

پست قبلی ما در این لینک:

https://lnkd.in/evuPH7cB

1. سطح بالا (Root Directory):
-cmd/:
- این دایرکتوری برای نقاط ورود برنامه استفاده می‌شه. هر اپلیکیشن قابل‌اجرا، چه سرور باشه چه ابزارهای CLI یا میکروسرویس‌ها، اینجا قرار می‌گیره.

- مثال: cmd/app/main.go: فایل اصلی که نقطه شروع اجرای برنامه است. این فایل باید تمیز و ساده باشه و فقط وظیفه‌ی مقداردهی اولیه مثل خواندن تنظیمات، ایجاد کانکشن‌ها، و شروع سرور رو برعهده داشته باشه.

- internal/:
- کدهایی که مختص پروژه‌ی ما هستن و نباید توسط ماژول‌های خارجی استفاده بشن، اینجا قرار می‌گیرن. در گولنگ، دایرکتوری internal به‌صورت پیش‌فرض دسترسی ماژول‌های خارجی رو محدود می‌کنه.

- pkg/:
- شامل کتابخانه‌ها و کدهای قابل استفاده مجدد هست که ممکنه در پروژه‌های دیگه یا بخش‌های دیگه همین پروژه استفاده بشن. دقت کنید که این دایرکتوری باید از internal جدا باشه چون عمومی‌تر هست.

- configs/:
- تنظیمات پروژه مثل فایل‌های yaml، json یا toml که برای کانفیگ سرور، دیتابیس یا سرویس‌های دیگه استفاده می‌شن اینجا قرار می‌گیرن.

- go.mod و go.sum:
- این فایل‌ها وظیفه مدیریت وابستگی‌ها رو به عهده دارن و توسط Go Modules استفاده می‌شن.

2. دایرکتوری داخلی (internal/):
این دایرکتوری قلب پروژه‌ست و تمامی دامنه‌های پروژه رو در خودش جای می‌ده. هر دامنه یا Bounded Context به صورت جداگانه سازمان‌دهی شده.

ساختار دامنه (مثال: user/):
- user.go (Model):
- شامل مدل‌ها و ساختارهای داده‌ای مرتبط با دامنه است.

- repository.go:
- مسئول مدیریت دسترسی به داده‌ها (Data Access Layer) هست.

- service.go:
- این لایه منطق تجاری رو پیاده‌سازی می‌کنه و سرویس‌ها با repository تعامل دارند و مدیریت فرآیندهای مربوط به دامنه رو انجام می‌دن.

- handler.go:
- این لایه مدیریت درخواست‌های ورودی (HTTP یا gRPC) و اتصال اون‌ها به سرویس‌ها رو بر عهده داره.

ساختار دامنه دیگر (مثال: product/):
- دامنه‌های دیگه مثل product ساختاری مشابه دارند. هر دامنه به‌صورت مستقل پیاده‌سازی شده و شامل لایه‌های مدل، سرویس، ریپازیتوری و هندلر هست.

کاربرد این ساختار در DDD:
- تفکیک دامنه‌ها :
- هر دامنه کاملاً مستقل پیاده‌سازی شده و می‌تونه به صورت جداگانه توسعه یابد.

- انعطاف‌پذیری:
- با این ساختار، می‌تونید تغییرات یا افزودن دامنه‌های جدید رو بدون تأثیر روی سایر بخش‌ها انجام بدید.

-مقیاس‌پذیری:
- هر دامنه می‌تونه به‌صورت مجزا تست و مقیاس‌دهی بشه. برای مثال، در صورت نیاز، می‌تونید دامنه خاصی رو به یک سرویس مستقل تبدیل کنید.

سازگاری با معماری‌های مدرن:
- این ساختار برای پروژه‌های میکروسرویس، مونولیت ماژولار یا حتی معماری‌های لایه‌ای مناسب است.

آیا شما هم تجربه‌ای در استفاده از معماری DDD# دارید؟ خوشحال می‌شوم که تجربیات و نظرات خود را با ما به اشتراک بگذارید!

Anophel | آنوفل
💙 تا حالا شده بخوای یه سیستم رو طوری بسازی که بتونی راحت تغییرش بدی بدون اینکه کل کدها رو عوض کنی؟ معماری شش‌ضلعی (Hexagonal Architecture
) همون چیزیه که دنبالش می‌گردی!

💠اصول Hexagonal Architecture :
-هسته کسب‌وکار (Core Domain): منطق اصلی برنامه که بدون وابستگی به هیچ چیزی کار می‌کنه.
- پورت‌ها (Ports) : رابط‌هایی که هسته از طریق اونا با دنیای بیرون ارتباط می‌گیره.
- آداپتورها (Adapters): وظیفه‌ی پیاده‌سازی پورت‌ها و برقراری ارتباط بین هسته و اجزای خارجی.

💠مزایای معماری Hexagonal :
- کاهش وابستگی‌ها: بخش‌های مختلف مستقل از همدیگه هستن.
- انعطاف‌پذیری: راحت می‌تونی واسط‌های خارجی رو بدون دست زدن به هسته عوض کنی.
- بهبود تست‌پذیری: تست‌نویسی خیلی ساده‌تر می‌شه چون هسته مستقله.
- قابلیت تغییر فناوری: راحت می‌تونی تکنولوژی‌های خارجی رو بدون تغییرات زیاد جایگزین کنی.

این معماری به خصوص برای پروژه‌هایی که تغییرات زیادی دارن یا نیاز به انعطاف بالایی دارن عالیه. با این روش، کدهای تمیز و قابل تست می‌نویسی و راحت‌تر می‌تونی سیستم رو توسعه بدی.

⭐️در پست های قبلی نیز به یک سری معماری و architectural approach رو نیز بررسی کردم:

https://lnkd.in/evuPH7cB

🌐لینک پست:
https://www.linkedin.com/posts/mohammad-abdorrahmani-051914198_agvaewaesaeuagv-agvaew-go-activity-7273570842481942528-vlh6?utm_source=share&utm_medium=member_desktop

#گولنگ #گو #go #golang
Please open Telegram to view this post
VIEW IN TELEGRAM
💢 آیا تا حالا فکر کردی چطور میشه سیستم‌های بزرگ و پیچیده رو به بخش‌های کوچیک‌تر و مستقل تقسیم کرد تا مدیریت و توسعه‌شون راحت‌تر بشه؟ خب، معماری Vertical Slice دقیقا همین کار رو می‌کنه!



💢معماری Vertical Slice :

در معماری Vertical Slice، به جای اینکه سیستم را به لایه‌های مختلف (مثل لایه UI, business logic, data access) تقسیم کنیم، هر قابلیت یا ویژگی را به یک واحد مستقل به نام Slice تبدیل می‌کنیم. هر Slice شامل تمام اجزای مورد نیاز برای ارائه یک قابلیت خاص است. و هر Slice را می توان به عنوان یک برنامه کوچک با عملکرد متمایز دید.



💢هدف این معماری چیه؟

هدف اینه که کد رو براساس ویژگی‌ها و نیازهای خاص دسته‌بندی کنیم، نه براساس موارد فنی.



💠مزایا:

تفکیک مسئولیت‌ها: هر قابلیت تو Slice خودش قرار می‌گیره، که باعث میشه وابستگی‌ها کمتر و کدها خواناتر بشن.

تست راحت‌تر: چون هر Slice مستقله، تست کردنش راحت‌تره.

مقیاس‌پذیری تیم: تیم‌های مختلف می‌تونن به صورت مستقل رو Slices مختلف کار کنن.

کاهش وابستگی‌ها: سیستم تمیزتر و مدیریت کردنش آسون‌تر میشه.

انعطاف‌پذیری در تغییرات: تغییرات تو یه Slice معمولاً تأثیری رو بقیه سیستم نداره.



💠معایب:

پیچیدگی برای سیستم‌های کوچیک: این معماری ممکنه برای سیستم‌های کوچیک بیش از حد پیچیده باشه.

کد تکراری: بعضی کدها ممکنه بین Slices تکرار بشن.

یادگیری و تنظیم تیم‌ها: ممکنه یه کم زمان ببره تا تیم‌ها به این معماری عادت کنن.



💠کجاها میشه از این معماری استفاده کرد؟

سیستم‌های بزرگ و پیچیده: برای سیستم‌هایی که ویژگی‌های متعددی دارن.

تیم‌های چندگانه: وقتی تیم‌های مختلف رو قابلیت‌های مختلف کار می‌کنن.

سیستم‌های مبتنی بر میکروسرویس: این معماری با میکروسرویس‌ها خیلی خوب سازگاره.

سیستم‌های با نیاز به توسعه مستمر: برای سیستم‌هایی که نیاز به انتشار مکرر و سریع ویژگی‌های جدید دارن.



💠معماری Vertical Slice به خوبی با محیط‌های Agile و fast-paced سازگاره. شما فقط یه لایه رو اصلاح نمی‌کنید، بلکه ویژگی‌های کامل و با ارزش رو از اول تا آخر در بسته‌های منظم و مستقل ارائه میدید. این معماری روی سرعت، استقلال و کاهش وابستگی‌های پیچیده بین ویژگی‌ها تمرکز داره.



⭐️نظر شما چیه؟ آیا این معماری به نظرتون کارآمد هست؟
💙 Anophel.com


#گولنگ #گو #Go #Golang #Vertical_Slice
Please open Telegram to view this post
VIEW IN TELEGRAM
چطور گوروتین‌های گولنگ رو مدیریت کنیم؟💢

تا حالا شده تو برنامه‌هاتون بخواید یه کار طولانی رو نصفه‌نیمه قطع کنید؟ اینجاست که دو تا ابزار قدرتمند گولنگ یعنی Cancel و Done به کمکتون میان!



💠Cancel:

فرض کنید یه گوروتین دارید که نمی‌خواید ادامه بده. با Cancel می‌تونید مستقیم بهش بگید "بسه، دیگه جلوتر نرو!" و منابعش هم آزاد بشه. این کارو با تابع context.WithCancel انجام می‌دید و هر وقت ()cancel رو صدا بزنید، همه گوروتین‌های مربوط به اون کانتکست متوقف می‌شن.



💠Done:

حالا یه حالت دیگه: به جای اینکه دستی گوروتین‌ها رو متوقف کنید، بذارید خودشون بفهمن باید کارشون رو تموم کنن. اینجا Done به درد می‌خوره. Done یه کاناله که وقتی کانتکست تموم شد (مثلاً به خاطر تایم‌آوت یا لغو شدن)، بسته می‌شه و گوروتین‌ها سیگنال می‌گیرن که "وقت رفتنه!".



⭐️خلاصه صحبت ها

💢Cancel برای متوقف کردن مستقیمه.

💢Done برای سیگنال دادن غیرمستقیمه.



💙 Anophel | آنوفل
#
گولنگ #گو #go #golang
Please open Telegram to view this post
VIEW IN TELEGRAM
💢وقتی چند تا گوروتین داده تولید می‌کنن، چطور خروجی‌ها رو توی یه کانال واحد ترکیب کنیم؟

⭐️ این یکی از چالش‌های جالب توی گولنگه! برای این کار، روش‌های مختلفی وجود داره که هر کدوم مزایا و معایب خودشون رو دارن.



⭐️ترکیب کانال‌ها (Merging Channels) توی گولنگ یکی از اون چالش‌های جالبیه که برای مدیریت همزمانی و ارتباط بین گوروتین‌ها استفاده میشه.



⭐️ دو روش اصلی برای این کار وجود داره:



💠- ترکیب ترتیبی (Sequential Merging):

توی این روش، کانال‌ها یکی‌یکی خونده میشن. یعنی اول داده‌های کانال اول رو می‌خونیم، وقتی تموم شد میریم سراغ کانال بعدی.

این روش ساده‌تره ولی ممکنه زمان بیشتری بگیره چون منتظره که هر کانال بسته بشه.

مثال: تصویر 1

گه دو کانال داشته باشیم که هر کدوم ۴ عدد تولید می‌کنن و هر عدد ۵۰ میلی‌ثانیه طول بکشه، زمان کلی ۳۵۰ میلی‌ثانیه میشه (یعنی یکی بعد از دیگری).



💠-- ترکیب همزمان (Concurrent Merging):

اینجا همه کانال‌ها همزمان خونده میشن و داده‌ها به کانال مقصد ارسال میشن. این روش سریع‌تره ولی ترتیب داده‌ها رو تضمین نمی‌کنه. معمولاً برای پروژه‌هایی که سرعت مهمه از این روش استفاده می‌کنیم.

مثال : تصویر 2

با استفاده از این روش، دو کانال ما فقط ۲۰۰ میلی‌ثانیه طول می‌کشن تا داده‌ها رو ترکیب کنن.



💢اگر ترتیب داده‌ها مهم است:

از روش Sequential استفاده کنید.

اگر کارایی و همزمانی اهمیت دارند: از روش Concurrent استفاده کنید.



💢هر دو روش به نیاز برنامه و محدودیت‌های شما وابسته هستند.


💙 Anophel | آنوفل

#گو #گولنگ #go #golang #goroutines
Please open Telegram to view this post
VIEW IN TELEGRAM
💢 تا حالا شده بخوای کلی فانکشن رو همزمان اجرا کنی، ولی نخوای با دردسرهای Goroutine و WaitGroup کلنجار بری؟
یا شاید دلت بخواد یه بار فانکشن‌ها رو آماده کنی و هر وقت خواستی دوباره اجراشون کنی؟
اینجاست که مفهوم Wrapper Types تو گولنگ میاد وسط. تو این پست، می‌خوام یه راه حل تمیز و شیک بهت معرفی کنم: ConcRunner

Wrapper Types چیه؟
⭐️تو گولنگ، Wrapper Type یه نوع خاصه که یه ساختار ساده می‌سازه و پشتش کلی جادو (یعنی همون منطق و پیچیدگی‌ها) قایم می‌کنه. هدفش اینه که کد رو تر و تمیز نگه داره.

💠مثال عملی:
فرض کن یه چیزی داری مثل اجرای فانکشن‌ها به صورت همزمان (concurrently). خب، این کار خودش یه ذره پیچیدگی داره چون باید با goroutine‌ها و sync.WaitGroup کلنجار بری. حالا ما اومدیم یه نوع جدید به اسم ConcRunner درست کردیم که این داستان رو می‌پیچه تو خودش. دولوپر فقط میگه «هی، این فانکشن‌هام رو بگیر و همزمان اجراشون کن»، دیگه نمی‌پرسه چطور این کار انجام میشه.

مثال تصویر 1

⭐️چرا این خوبه؟
سادگی در استفاده: دیگه کسی لازم نیست نگران goroutine و sync.WaitGroup باشه.
قابلیت استفاده مجدد: فانکشن‌ها رو هر چند بار که بخوای می‌تونی اضافه و اجرا کنی.
محافظت از جزئیات: کل سینک شدن و داستان‌های پشت پرده رو می‌سپری به ConcRunner، تمیز و بی‌دردسر.

⭐️چطوری استفاده کنیم؟ یه چیزی مثل تصویر 2.

💠این روش یه نمونه خوب از Encapsulation تو کده به‌قول معروف: «جادوی گولنگ تو اینجور جاها معلوم میشه!»

💙 Anophel | آنوفل

#گو #گولنگ #go #golang
Please open Telegram to view this post
VIEW IN TELEGRAM