آموزش C# و .Net
1.56K subscribers
442 photos
329 videos
19 files
2.83K links
تعرفه تبلیغات :
https://t.me/+w-o6dHW5O31jMWNk

آیدی ادمین:
@ma_limbs
Download Telegram


🔵 نکات برنامه‌نویسی



🔄 Idempotency در برنامه‌نویسی


🔹 ایده اصلی

یک عملیات Idempotent یعنی انجام چندباره‌ی اون، نتیجه‌ای بیشتر از یک بار انجام دادن نداره.

📌 مثال روزمره:

⬅️ زدن کلید روشن کردن چراغ → اگر چراغ خاموش باشه روشن میشه.
⬅️ اگر دوباره بزنی، همچنان روشن می‌مونه. (تأثیر اضافه نداره)



🔹 چرا مهمه؟

در سیستم‌های توزیع‌شده و APIها، ممکنه یک درخواست به دلیل مشکل شبکه چند بار تکرار بشه.
اگر عملیات Idempotent نباشه، نتایج خراب میشن.

مثلاً:

⬅️ درخواست "پرداخت" دوبار انجام بشه → 😱 دو بار پول کم میشه!
⬅️ ولی درخواست "لغو سفارش" اگر Idempotent باشه، حتی با چند بار تکرار هم فقط یک بار لغو میشه.



مثال ساده (Python)

# عملیات غیر Idempotent (هر بار تغییر می‌کنه)
count = 0

def increment():
global count
count += 1
return count

print(increment()) # 1
print(increment()) # 2 (نتیجه فرق کرد!)


# عملیات Idempotent
users = set()

def add_user(user):
users.add(user) # اگر کاربر وجود داشته باشه دوباره اضافه نمیشه
return users

print(add_user("Ali")) # {"Ali"}
print(add_user("Ali")) # {"Ali"} (همون نتیجه قبلی)

📖 کاربردهای واقعی

➡️ APIهای بانکی و پرداخت 💳 → جلوگیری از دوبار برداشت پول
➡️ REST API (PUT vs POST)

* POST معمولاً Idempotent نیست (هر بار یک رکورد جدید می‌سازه)
* PUT معمولاً Idempotent هست (یک منبع خاص رو جایگزین می‌کنه)
➡️ Microservices Retry Logic → وقتی درخواست‌ها دوباره فرستاده میشن، جلوی خرابی گرفته میشه



🛠️ مزایا

⬅️ افزایش اطمینان در سیستم‌های توزیع‌شده
⬅️ راحت‌تر شدن Retry و Recovery
⬅️ جلوگیری از Duplicate شدن داده یا عملیات



🎯 تشبیه ساده

Idempotency مثل کلید آسانسوره 🛗:

⬅️ اگر یک بار بزنی → آسانسور میاد.
⬅️ اگر ده بار بزنی → سریع‌تر نمیاد!
نتیجه همونه، فقط یک بار انجام میشه.



ـــــــــــــــــــــــــــــــــــــــــــــــــــــــــ

لطفا ما رو به دیگران هم معرفی کنید...

آدرس کانال اصلی :
https://t.me/Tu_24

آدرس وبسایت:
https://Tutorial24.ir
🔵 با عضویت در لیست تلگرامی جامع آموزش زبان زیر عضو بی نظیرترین‌ و کامل ترین مجموعه آموزش زبان انگلیسی تلگرامی شوید:

🟢 پادکست، کوییز، گرامر، آیلتس، تافل، ویدیو، آموزش زبان به کودکان، اصطلاحات انگلیسی، زبان کنکور و ... :

https://t.me/addlist/hK74E7joz0ZiOGY0
https://t.me/addlist/hK74E7joz0ZiOGY0
https://t.me/addlist/hK74E7joz0ZiOGY0
🔵 نکته یادگیری ماشین

قبل از Clustering، کاهش بعد داده‌ها می‌تونه کیفیت خوشه‌بندی رو بهتر کنه.

🔹 وقتی داده‌ها خیلی زیاد باشن، خوشه‌بندی مستقیم سخت و نویزی می‌شه.
🔹 با روش‌هایی مثل PCA، t-SNE یا UMAP می‌تونی داده‌ها رو به ابعاد کمتر منتقل کنی و ساختار اصلی رو حفظ کنی.

مزایا:

الگوریتم خوشه‌بندی سریع‌تر اجرا می‌شه.

نویز و داده‌های کم‌اهمیت کاهش پیدا می‌کنن.

خوشه‌ها واضح‌تر و قابل تفسیرتر می‌شن.

به زبان ساده: کاهش بعد مثل اینه که نقشه‌ی خیلی شلوغ رو ساده‌تر و خواناتر بکشی تا مسیرها و گروه‌ها بهتر دیده بشن. 🗺

ـــــــــــــــــــــــــــــــــــــــــــــــــــــــــ


لطفا ما رو به دیگران هم معرفی کنید...

آدرس کانال اصلی :
https://t.me/Tu_24

آدرس وبسایت:
https://Tutorial24.ir
🔵 نکته یادگیری ماشین

تقسیم‌بندی درست داده‌ها به صورت تصادفی (Shuffling) قبل از آموزش خیلی مهمه.

چرا؟

اگه داده‌ها مرتب باشن (مثلاً همه نمونه‌های کلاس A اول و بعد کلاس B بیان)، مدل به‌درستی الگوها رو یاد نمی‌گیره.

شافل کردن داده‌ها باعث میشه آموزش منصفانه‌تری انجام بشه و مدل دچار bias نشه.

مثال ساده:
در کتابخانه‌ی scikit-learn، توابعی مثل train_test_split به صورت پیش‌فرض داده‌ها رو shuffle می‌کنن تا این مشکل پیش نیاد.

ـــــــــــــــــــــــــــــــــــــــــــــــــــــــــ


لطفا ما رو به دیگران هم معرفی کنید...

آدرس کانال اصلی :
https://t.me/Tu_24

آدرس وبسایت:
https://Tutorial24.ir


🔵 نکته برنامه نویسی




🌳 Strangler Fig Pattern
(الگوی درخت خفه‌کننده)


یک تکنیک معماری نرم‌افزار برای بازنویسی یا مهاجرت سیستم‌های قدیمی (Legacy Systems) به سیستم‌های جدید بدون ایجاد اختلال.



📌 ایده اصلی

* مثل یک درخت انجیر خفه‌کننده (Strangler Fig) که دور یک درخت قدیمی رشد می‌کنه و کم‌کم جای اون رو می‌گیره.
* به‌جای اینکه یک سیستم قدیمی رو یک‌باره کنار بذاری (که ریسکش خیلی بالاست)، بخش‌بخش اون رو با سرویس‌های جدید جایگزین می‌کنی.
* در نهایت، کل سیستم قدیمی از بین میره و سیستم جدید کامل سرجاش میاد.



روند کار

1. سیستم قدیمی هنوز در حال اجراست.
2. یک Facade / Proxy جلوی سیستم قرار می‌دی که درخواست‌های کاربر رو مدیریت کنه.
3. هر وقت یک قابلیت جدید ساختی، به‌جای سیستم قدیمی، به سرویس جدید روت میشه.
4. به مرور، ترافیک سیستم قدیمی کمتر و کمتر میشه، تا جایی که میشه حذفش کرد.



مثال ساده (مفهومی)

User ---> [ Proxy ] ---> [ Old System ]
بعد از جایگزینی بخشی:

User ---> [ Proxy ]
↳ [ New Service: Payments ]
↳ [ Old System: Orders ]
و در نهایت:

User ---> [ Proxy ]
↳ [ New Service: Payments ]
↳ [ New Service: Orders ]


📖 جاهای کاربردی

* مهاجرت از Monolith به Microservices.
* بازنویسی نرم‌افزارهای قدیمی بانک‌ها، بیمه‌ها یا سیستم‌های ERP.
* سیستم‌های حیاتی که نمی‌تونن حتی یک روز Down بشن.



🛠️ مزایا

* کاهش ریسک → مهاجرت تدریجی، نه یک‌باره.
* انعطاف‌پذیری → میشه تست و اصلاح کرد بدون آسیب به کل سیستم.
* تداوم سرویس‌دهی → کاربران هیچ قطعی حس نمی‌کنن.



⚠️ معایب / چالش‌ها

* مدیریت Proxy و Routing پیچیده میشه.
* نیاز به هماهنگی دیتابیس بین بخش‌های قدیم و جدید.
* ممکنه فرآیند مهاجرت خیلی طولانی بشه.



👉 تشبیه ساده

این الگو شبیه بازسازی یک خانه در حالی که داخلش زندگی می‌کنی 🏡
به‌جای اینکه یک‌باره خرابش کنی، کم‌کم اتاق‌ها رو نوسازی می‌کنی، تا وقتی کل خونه جدید و مدرن بشه.



ـــــــــــــــــــــــــــــــــــــــــــــــــــــــــ

لطفا ما رو به دیگران هم معرفی کنید...

آدرس کانال اصلی :
https://t.me/Tu_24

آدرس وبسایت:
https://Tutorial24.ir
🔵 کوییز #سی_شارپ

🟣 موضوع : ‏استفاده از Switch Expression در نسخه‌های جدید

🟢 سوال :

‏کدام یک از موارد زیر یک عیب استفاده از Switch Expression است؟

گزینه ۱:
‏کاهش کارایی

گزینه ۲:
‏افزایش حجم کد

گزینه ۳:
‏نیاز به نسخه‌های جدید C#

گزینه ۴:
‏افزایش پیچیدگی کد

🔵 گزینه صحیح: 3

🟢 توضیح :

‏Switch Expression فقط در نسخه‌های جدید C# قابل استفاده است.

ـــــــــــــــــــــــــــــــــــــــــــــــــــــــــ

لطفا ما رو به دیگران هم معرفی کنید...

آدرس کانال اصلی :
https://t.me/Tu_24

آدرس وبسایت:
https://Tutorial24.ir
🔵 نکته یادگیری ماشین

یادگیری نیمه‌نظارتی (Semi-Supervised Learning) زمانی به درد می‌خوره که داده‌ی برچسب‌دار کم ولی داده‌ی بدون برچسب زیاد باشه.

🔹 در دنیای واقعی، برچسب‌زدن داده (Labeling) گرون و زمان‌بره (مثلاً برچسب‌زدن تصاویر پزشکی).
🔹 در این حالت می‌تونی از مقدار کم داده‌ی برچسب‌دار + مقدار زیاد داده‌ی بدون برچسب برای بهبود مدل استفاده کنی.

روش‌ها:

روش Self-training: مدل اولیه روی داده‌های برچسب‌دار آموزش می‌بینه، بعد خودش داده‌های بدون برچسب رو برچسب‌گذاری می‌کنه و دوباره آموزش می‌بینه.

روش Consistency Regularization: مدل رو مجبور می‌کنن روی داده‌های مشابه (با نویز یا تغییرات کوچک) خروجی مشابه بده.

روش Graph-based methods: استفاده از گراف برای پخش کردن برچسب‌ها بین داده‌های مشابه.

به زبان ساده: Semi-Supervised یعنی “از داده‌های بی‌صاحب هم یاد بگیر!” 😅

ـــــــــــــــــــــــــــــــــــــــــــــــــــــــــ


لطفا ما رو به دیگران هم معرفی کنید...

آدرس کانال اصلی :
https://t.me/Tu_24

آدرس وبسایت:
https://Tutorial24.ir
🔵 با عضویت در لیست تلگرامی جامع آموزش زبان زیر عضو بی نظیرترین‌ و کامل ترین مجموعه آموزش زبان انگلیسی تلگرامی شوید:

🟢 پادکست، کوییز، گرامر، آیلتس، تافل، ویدیو، آموزش زبان به کودکان، اصطلاحات انگلیسی، زبان کنکور و ... :

https://t.me/addlist/hK74E7joz0ZiOGY0
https://t.me/addlist/hK74E7joz0ZiOGY0
https://t.me/addlist/hK74E7joz0ZiOGY0


🔵 نکته برنامه نویسی

Circuit Breaker 🔌
وقتی یک سرویس خارجی خراب میشه، موقتا درخواست‌ها رو متوقف می‌کنی تا سیستم اصلیت تحت فشار قرار نگیره.
مثل فیوز برق که جلوی آتش‌سوزی رو می‌گیره.


ـــــــــــــــــــــــــــــــــــــــــــــــــــــــــ

لطفا ما رو به دیگران هم معرفی کنید...

آدرس کانال اصلی :
https://t.me/Tu_24

آدرس وبسایت:
https://Tutorial24.ir


🔵 نکته برنامه نویسی



🧩 Dependency Injection (DI)



یک الگوی طراحی نرم‌افزار برای مدیریت وابستگی‌ها بین کلاس‌ها و کامپوننت‌ها، که باعث کاهش coupling و افزایش انعطاف‌پذیری میشه.




📌 ایده اصلی

* کلاس‌ها نباید خودشون وابستگی‌هاشون رو بسازن یا مدیریت کنن.
* وابستگی‌ها از بیرون بهشون داده میشه (Inject).
* این کار باعث میشه تست واحد، تغییر و نگهداری کد راحت‌تر بشه.



### مثال ساده (جاوا)

// سرویس وابسته
class EmailService {
void sendEmail(String message) {
System.out.println("Sending email: " + message);
}
}

// کلاس اصلی که وابستگی رو دریافت می‌کنه
class UserController {
private EmailService emailService;

// تزریق وابستگی از طریق Constructor
public UserController(EmailService emailService) {
this.emailService = emailService;
}

void notifyUser() {
emailService.sendEmail("Welcome!");
}
}

// استفاده
EmailService emailService = new EmailService();
UserController controller = new UserController(emailService);
controller.notifyUser();
اینجا UserController نیازی به ساختن EmailService نداره، بلکه از بیرون دریافت می‌کنه.



📖 جاهای کاربردی

* معماری Clean Architecture / Hexagonal Architecture
* فریم‌ورک‌هایی مثل Spring, Angular, .NET Core
* هر جایی که بخوای تست‌پذیری و انعطاف‌پذیری بالا داشته باشی



🛠️ مزایا

* کاهش coupling بین کامپوننت‌ها
* تست واحد راحت‌تر (می‌تونی Mock یا Stub بدهی)
* تغییر و جایگزینی وابستگی‌ها بدون تغییر کد اصلی



⚠️ معایب / چالش‌ها

* اگر Overuse بشه، ممکنه کد پیچیده و سخت دنبال‌شدنی بشه
* نیاز به درک اولیه از IoC / DI Containers
* ممکنه منابع زیادی مصرف کنه در صورت مدیریت نادرست



👉 تشبیه ساده

Dependency Injection مثل دادن ابزار به یک کارگر 🛠️

* کارگر (کلاس) لازم نیست خودش ابزار بسازه
* فقط ابزار رو از بیرون می‌گیره و کارش رو انجام میده
* وقتی ابزار تغییر کرد، کارگر بدون مشکل ادامه میده



ـــــــــــــــــــــــــــــــــــــــــــــــــــــــــ

لطفا ما رو به دیگران هم معرفی کنید...

آدرس کانال اصلی :
https://t.me/Tu_24

آدرس وبسایت:
https://Tutorial24.ir
💡 نکته #NoSQL

🟣 موضوع : Change Data Capture (CDC)

نکته :

‏CDC کمک میکنه دیتابیس‌هات همیشه آپدیت باشن، مثل یه باغبون که به گل‌هاش میرسه! 🌷


ـــــــــــــــــــــــــــــــــــــــــــــــــــــــــ

لطفا ما رو به دیگران هم معرفی کنید...

آدرس کانال اصلی :
https://t.me/Tu_24

آدرس وبسایت:
https://Tutorial24.ir


🔵 نکات برنامه‌نویسی



CQRS Pattern

(Command Query Responsibility Segregation)



🔹 ایده اصلی

در سیستم‌های معمولی (CRUD)، هم برای خواندن (Query) و هم برای نوشتن (Command) از یک مدل داده استفاده می‌کنیم.
ولی در CQRS این دو جدا میشن:

➡️ Command: تغییر وضعیت (Insert, Update, Delete)
➡️ Query: فقط خواندن داده‌ها (Read)

این جداسازی باعث میشه که هر بخش رو بتونی بهینه کنی.



🔹 چرا مهمه؟

⬅️ برای نوشتن می‌تونی قوانین پیچیده دامنه (Domain Rules) رو اعمال کنی.
⬅️ برای خواندن می‌تونی مدل‌های سبک و سریع بسازی (مثل View یا Projection).
⬅️ مقیاس‌پذیری سیستم راحت‌تر میشه (مثلاً دیتابیس Read-Only جدا داشته باشی).



مثال ساده (Python)

فرض کن سیستم سفارش داریم:

# Command: ثبت سفارش
class OrderService:
def __init__(self):
self.orders = []

def place_order(self, user, product):
order = {"user": user, "product": product}
self.orders.append(order)
return f"Order placed: {order}"

# Query: گرفتن سفارش‌ها
class OrderQuery:
def __init__(self, orders):
self.orders = orders

def get_orders_by_user(self, user):
return [o for o in self.orders if o["user"] == user]

# استفاده
service = OrderService()
service.place_order("Ali", "Laptop")
service.place_order("Ali", "Mouse")
service.place_order("Sara", "Keyboard")

query = OrderQuery(service.orders)
print(query.get_orders_by_user("Ali"))
# [{'user': 'Ali', 'product': 'Laptop'}, {'user': 'Ali', 'product': 'Mouse'}]


📖 کاربردهای واقعی

⬅️ سیستم‌های بزرگ با داده زیاد (مثلاً فروشگاه‌های اینترنتی مثل Amazon)
⬅️ سیستم‌های مالی که Queryهای سریع می‌خوان و Commandها پر از قوانین پیچیده‌ان
⬅️ معماری Microservices → میشه سرویس‌های Query و Command رو جداگانه Deploy کرد



🛠️ مزایا

⬅️ بهینه‌سازی جداگانه برای Read و Write
⬅️ افزایش کارایی و مقیاس‌پذیری
⬅️ کدنویسی تمیزتر (Separation of Concerns)



⚠️ چالش‌ها

⬅️ طراحی و نگهداری پیچیده‌تر از CRUD ساده
⬅️ نیاز به Sync بین مدل Command و Query (ممکنه Eventual Consistency پیش بیاد)



🎯 تشبیه ساده

CQRS مثل رستورانه 🍽️:

⬅️ یه بخش برای گرفتن سفارش (Command)
⬅️ یه بخش برای سرو غذا (Query)
اینطوری کار سریع‌تر و مرتب‌تر پیش میره.



ـــــــــــــــــــــــــــــــــــــــــــــــــــــــــ

لطفا ما رو به دیگران هم معرفی کنید...

آدرس کانال اصلی :
https://t.me/Tu_24

آدرس وبسایت:
https://Tutorial24.ir


🔵 نکته برنامه نویسی



Bulkhead Pattern 🚢

مثل کشتی که اتاق‌هاش از هم جداست تا اگه یکی سوراخ شد، کل کشتی غرق نشه.
اینجا هم بخش‌های مختلف سیستم رو ایزوله می‌کنی تا اگه یک سرویس یا ماژول fail کرد، کل سیستم نخوابه.


ـــــــــــــــــــــــــــــــــــــــــــــــــــــــــ

لطفا ما رو به دیگران هم معرفی کنید...

آدرس کانال اصلی :
https://t.me/Tu_24

آدرس وبسایت:
https://Tutorial24.ir
🔵 دوست داری برنامه نویس حرفه ای بشی یا مهارت های کامپیوتری خودت رو افزایش بدی؟ با عضویت در لیست تلگرامی زیر در بی نظیر ترین کانال های برنامه نویسی ما عضو شوید:

🟢 پایتون، هوش مصنوعی، یادگیری ماشین، سی ++، سی شارپ، دات نت، نود جی اس، جاوا اسکریپت، شبکه، علم داده، پایگاه داده، sql، nosql ، مهارت های ICDL، سیستم عامل، لینوکس، فتوشاپ، گرافیک، اندروید، جاوا، ساخت اپلیکیشن موبایل، ری اکت، جی کوئری، php و laravel، دروس رشته کامپیوتر، کنکور کامپیوتر و ...

عضو لیست جامع شوید:

https://t.me/addlist/_UjG99eD_E4zYzhk
https://t.me/addlist/_UjG99eD_E4zYzhk
https://t.me/addlist/_UjG99eD_E4zYzhk
🔵 نکته یادگیری ماشین

از مدل روی کاغذ، به مدل در دنیای واقعی! 🚀

استقرار مدل (Model Deployment) 🌐

در مورد تمام مراحل ساخت یک مدل، از آماده‌سازی داده‌ها گرفته تا آموزش و بهینه‌سازی، کار کردی؟ اما یه سؤال مهم برات باقی می‌مونه: حالا که مدل رو ساختیم، چطور ازش استفاده کنیم؟ 🤔

استقرار مدل (Model Deployment) به معنی قرار دادن یک مدل یادگیری ماشین در یک محیط عملیاتی است تا بتونه به صورت زنده، پیش‌بینی‌ها رو انجام بده.

به زبان ساده‌تر:

تصور کن یک آشپز هستی که یه دستور غذای جدید و عالی رو تمرین کردی و حالا اون غذا رو می‌تونی بی‌نقص درست کنی. 🧑‍🍳 حالا وقتشه که رستوران خودت رو باز کنی تا مشتری‌ها بتونن اون غذای عالی رو سفارش بدن و بخورن.

آشپزخونه‌ی تو، محیط توسعه (Development Environment) توست.

رستوران تو، محیط عملیاتی یا استقرار (Deployment) توست.

چرا استقرار مدل اینقدر مهمه؟

استفاده واقعی: تا وقتی مدل رو مستقر نکنی، فقط یه فایل توی کامپیوترت باقی می‌مونه. استقرار بهت اجازه می‌ده که مدل رو به یک وب‌سایت، اپلیکیشن موبایل یا هر سرویس دیگه‌ای متصل کنی تا کاربرها بتونن ازش استفاده کنن. 📱

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

نظارت: بعد از استقرار، می‌تونی عملکرد مدل رو در دنیای واقعی پایش کنی و اگر نیاز به بهبود یا آموزش دوباره داشت، متوجه بشی.

استقرار مدل یک حوزه کاملاً تخصصی به نام MLOps (عملیات یادگیری ماشین) است. این حوزه به تمام فرآیندهای مربوط به قرار دادن مدل‌ها در محیط واقعی و مدیریت اون‌ها می‌پردازه.

خلاصه که، استقرار مدل مثل روشن کردن چراغ‌های یک محصول جدیده. اینجاست که کار سخت‌ات به ثمر می‌شینه و مدل‌ت واقعاً شروع به خدمت‌رسانی می‌کنه.

ـــــــــــــــــــــــــــــــــــــــــــــــــــــــــ


لطفا ما رو به دیگران هم معرفی کنید...

آدرس کانال اصلی :
https://t.me/Tu_24

آدرس وبسایت:
https://Tutorial24.ir
🔵 نکته برنامه نویسی

یک تکنیک نسبتاً عجیب ولی مؤثر در برنامه‌نویسی "Negative Testing" (آزمایش منفی) است.

برخلاف تست معمولی که بررسی می‌کنی آیا کد در شرایط درست درست کار می‌کند یا نه، در Negative Testing عمداً شرایط غلط، ورودی‌های عجیب یا سناریوهای غیرعادی را امتحان می‌کنی تا ببینی کد چطور واکنش نشان می‌دهد.

مثلاً:

ارسال رشته خالی یا Null به تابعی که انتظار ورودی معتبر دارد.

دادن اعداد خیلی بزرگ یا منفی جایی که معمولاً انتظار اعداد کوچک می‌رود.

شبیه‌سازی قطعی اینترنت در وسط یک درخواست API.

این کار باعث می‌شود نقاط ضعف و باگ‌های پنهان کد قبل از رسیدن به کاربر نهایی پیدا شوند.

ـــــــــــــــــــــــــــــــــــــــــــــــــــــــــ

لطفا ما رو به دیگران هم معرفی کنید...

آدرس کانال اصلی :
https://t.me/Tu_24

آدرس وبسایت:
https://Tutorial24.ir


🔵 نکته برنامه نویسی

Null Object Pattern 🪄

به‌جای این‌که همه‌جا if object is None بذاری، یک شیء پیش‌فرض می‌سازی که دقیقا مثل کلاس اصلی رفتار می‌کنه ولی کار خالی انجام می‌ده.
این باعث میشه کد تمیزتر و بدون شرط‌های اضافه بشه.
مثلاً:

مثلاً:

مثلاً:
Copy code
class NullLogger: def log(self, msg): pass # هیچ کاری نمی‌کنه logger = NullLogger() logger.log("Test") #باگ یا خطا نداره
ـــــــــــــــــــــــــــــــــــــــــــــــــــــــــ

لطفا ما رو به دیگران هم معرفی کنید...

آدرس کانال اصلی :
https://t.me/Tu_24

آدرس وبسایت:
https://Tutorial24.ir


🔵 نکات برنامه‌نویسی




  Circuit Breaker
(شکستن مدار)


🔹 ایده اصلی

محافظت از سیستم در برابر شکست‌های پی‌درپی و جلوگیری از اثر دومینو.

⬅️ وقتی یک سرویس یا API خراب میشه و درخواست‌ها پشت سر هم Fail میشن، Circuit Breaker جلوی ارسال درخواست‌های بیشتر رو می‌گیره تا سرویس فرصت بازیابی پیدا کنه.

📌 مثل فیوز برق خونه:

⬅️ اگر جریان زیادی بره → فیوز قطع میشه تا آسیب بیشتری نرسه.



🔹 چرا مهمه؟

⬅️ جلوگیری از فاجعه در سیستم‌های توزیع‌شده
⬅️ کاهش فشار روی سرویس خراب
⬅️ بهبود پایداری و تجربه کاربری



مثال ساده (Python)

import time
import random

class CircuitBreaker:
def __init__(self, failure_threshold, recovery_time):
self.failure_threshold = failure_threshold
self.recovery_time = recovery_time
self.failures = 0
self.last_failure_time = None
self.state = "CLOSED" # CLOSED, OPEN, HALF-OPEN

def call(self, func):
now = time.time()
if self.state == "OPEN":
if now - self.last_failure_time > self.recovery_time:
self.state = "HALF-OPEN"
else:
return " Service unavailable"

try:
result = func()
self.failures = 0
if self.state == "HALF-OPEN":
self.state = "CLOSED"
return result
except Exception as e:
self.failures += 1
self.last_failure_time = now
if self.failures >= self.failure_threshold:
self.state = "OPEN"
return f"⚠️ Failure: {e}"


# مثال: سرویس با احتمال شکست
def unreliable_service():
if random.random() < 0.6:
raise Exception("Service failed!")
return " Service success"

breaker = CircuitBreaker(failure_threshold=3, recovery_time=5)

for i in range(10):
print(breaker.call(unreliable_service))
time.sleep(1)


📖 کاربردهای واقعی

➡️ Microservices → جلوگیری از اثر دومینو وقتی یک سرویس Down میشه
➡️ API Gateway → محدود کردن فشار روی سرویس‌های خارجی
⬅️ سیستم‌های مالی و پرداخت آنلاین → جلوگیری از تراکنش‌های خراب پی‌درپی



🛠️ مزایا

⬅️ افزایش پایداری سیستم
⬅️ کاهش فشار روی سرویس خراب
⬅️ تجربه کاربری بهتر در زمان خرابی



🎯 تشبیه ساده

Circuit Breaker مثل فیوز خانه :

⬅️ اگر جریان برق بیش از حد باشه → فیوز قطع میشه تا همه چیز نسوزه.
⬅️ بعد از مدتی می‌تونه دوباره وصل بشه و سیستم آزمایش کنه که سالمه یا نه.




ـــــــــــــــــــــــــــــــــــــــــــــــــــــــــ

لطفا ما رو به دیگران هم معرفی کنید...

آدرس کانال اصلی :
https://t.me/Tu_24

آدرس وبسایت:
https://Tutorial24.ir
🔵 نکته برنامه نویسی

یک تکنیک جالب و نسبتاً کم‌حرف‌زده در برنامه‌نویسی، "Memoization" (ذخیره‌سازی نتایج محاسبات) هست.

در این روش، وقتی یک تابع با ورودی مشخص محاسبه می‌شود، نتیجه آن در حافظه (مثل یک دیکشنری یا کش) ذخیره می‌شود. اگر دفعه بعد همان ورودی دوباره درخواست شود، به جای محاسبه دوباره، نتیجه ذخیره‌شده برگردانده می‌شود.

این کار برای توابع سنگین محاسباتی (مثل محاسبه اعداد فیبوناچی یا الگوریتم‌های بازگشتی) فوق‌العاده مفید است و باعث می‌شود سرعت برنامه گاهی چندین برابر شود.

ـــــــــــــــــــــــــــــــــــــــــــــــــــــــــ

لطفا ما رو به دیگران هم معرفی کنید...

آدرس کانال اصلی :
https://t.me/Tu_24

آدرس وبسایت:
https://Tutorial24.ir
🔵 دوست داری برنامه نویس حرفه ای بشی یا مهارت های کامپیوتری خودت رو افزایش بدی؟ با عضویت در لیست تلگرامی زیر در بی نظیر ترین کانال های برنامه نویسی ما عضو شوید:

🟢 پایتون، هوش مصنوعی، یادگیری ماشین، سی ++، سی شارپ، دات نت، نود جی اس، جاوا اسکریپت، شبکه، علم داده، پایگاه داده، sql، nosql ، مهارت های ICDL، سیستم عامل، لینوکس، فتوشاپ، گرافیک، اندروید، جاوا، ساخت اپلیکیشن موبایل، ری اکت، جی کوئری، php و laravel، دروس رشته کامپیوتر، کنکور کامپیوتر و ...

عضو لیست جامع شوید:

https://t.me/addlist/_UjG99eD_E4zYzhk
https://t.me/addlist/_UjG99eD_E4zYzhk
https://t.me/addlist/_UjG99eD_E4zYzhk


🔵 نکته برنامه نویسی



📨 Dead Letter Queue
(صف نامه‌های مُرده)

DLQ یک صف ویژه هست که پیام‌هایی رو نگه می‌داره که سیستم نتونسته اون‌ها رو به‌درستی پردازش کنه.



📌 چرا مهمه؟

* توی سیستم‌های صف پیام (Message Queue) همیشه احتمال هست بعضی پیام‌ها مشکل داشته باشن (خراب، ناقص یا پردازش‌نشونده).
* اگه این پیام‌ها همین‌جوری توی صف بمونن، می‌تونن کل سیستم رو قفل کنن.
* DLQ مثل یک زباله‌دان هوشمند عمل می‌کنه: پیام خراب رو جدا می‌کنه تا بقیه سیستم درست کار کنن.



مثال ساده

فرض کن با RabbitMQ یا Kafka داری سفارش‌های خرید رو پردازش می‌کنی:

* پیام: { "order_id": 123, "amount": 50 } → اوکی
* پیام: { "order_id": null, "amount": -10 } → مشکل

اینجا پیام خراب به جای اینکه دوباره و دوباره تلاش بشه، به DLQ فرستاده میشه:

def process_message(msg):
try:
if not msg.get("order_id") or msg["amount"] <= 0:
raise ValueError("Invalid order")
print(" Order processed:", msg)
except Exception as e:
print(" Moved to DLQ:", msg)
dlq.append(msg)

dlq = []
process_message({"order_id": 123, "amount": 50})
process_message({"order_id": None, "amount": -10})


📖 جاهای کاربردی:

* پرداخت آنلاین → تراکنش خراب نباید سیستم رو متوقف کنه.
* IoT و داده‌های سنسور → داده ناقص به DLQ میره.
* سیستم‌های بزرگ Microservices → پیام‌های ناسازگار در صف اصلی نمی‌مونن.



🛠️ مزایا

* پایداری سیستم → پیام خراب جلوی پردازش پیام‌های سالم رو نمی‌گیره.
* امکان بررسی دستی → تیم توسعه یا پشتیبانی می‌تونه بعداً پیام‌ها رو تحلیل کنه.
* ردیابی خطا → کمک می‌کنه الگوهای خطا رو پیدا کنیم.



⚠️ چالش‌ها

* پیام‌های DLQ نباید همین‌جوری رها بشن → باید مکانیزم بررسی و اصلاح وجود داشته باشه.
* حجم زیاد DLQ می‌تونه نشونه یک بگ بزرگ توی سیستم باشه.
* بعضی وقت‌ها لازمه پیام‌ها رو بعد از اصلاح دوباره به صف اصلی برگردونیم.



👉 تشبیه ساده:
DLQ مثل بخش مرجوعی یک فروشگاهه 🛒
کالاهایی که مشکل دارن برن اونجا، تا هم مشتری‌های دیگه راحت خرید کنن، هم مسئول بررسی فرصت داشته باشه مشکل رو بررسی کنه.



ـــــــــــــــــــــــــــــــــــــــــــــــــــــــــ

لطفا ما رو به دیگران هم معرفی کنید...

آدرس کانال اصلی :
https://t.me/Tu_24

آدرس وبسایت:
https://Tutorial24.ir