Ninja Learn | نینجا لرن
معرفی Kafka 🌀 اگه سیستمهایی با معماری پیچیده طراحی میکنی یا میخوای با حجم زیادی از داده کار کنی، احتمالش زیاده اسم Kafka رو شنیده باشی. Kafka یه Distributed Streaming Platform هست که توسط LinkedIn ساخته شد و بعدش به Apache منتقل شد. اما چرا Kafka اینقدر…
حس میکنم زیاد از پستای این سبکی خوشتون نمیاد
👎41👍6❤2
ـArchitecture Design چیه؟ 🏗️
اگه با برنامهنویسی آشنا باشی، احتمالش زیاده که اسم Design Patterns به گوشت خورده باشه. Design pattern ها راهحلهای هستن برای مشکلات تکراری که موقع کدنویسی باهاشون مواجه میشی. اما وقتی پروژهها بزرگتر میشن، علاوه بر Design Patterns ها به Architecture Design هم نیاز پیدا میکنیم.
چرا Architecture Design مهمه؟ 🤔
وقتی نرمافزارها تو دهههای ۸۰ و ۹۰ بزرگتر شدن، پیچیدگی سیستمها هم بیشتر شد. اون موقع بیشتر برنامهها Monolithic بودن؛ یعنی همه چیز تو یه کدبیس جمع شده بود. این نوع معماری برای پروژه هایی مناسبه که پیچیدگی زیادی ندارن و نیاز به سرویس های مختلف نیست، ولی وقتی پروژه بزرگ میشه، دردسرایی مثل سختی توسعه، نگهداری، و مقیاسپذیری رو به همراه داره.
اینجاست که Architecture Design بهت کمک میکنه تا یه طرح کلی برای سیستم داشته باشی که هم کارا باشه، هم بتونه چالشایی مثل رشد کاربرها، خطاها، و نیاز به تغییرات رو هندل کنه.
فرق Design Patterns و Architecture Design
ـDesign Patterns 🧩
ـDesign Patterns یعنی یه سری راهحلهای آماده و تستشده که برای مشکلات تکراری توی برنامهنویسی ارائه شدن. این الگوها تو یه سری موقعیت خاص خیلی خوب جواب میدن و باعث میشن که کدی که مینویسی خواناتر، قابلنگهداریتر، و استانداردتر بشه. مثلا:
ـSingleton:
ـFactory:
و...
ـ Architecture Design 🏗
ـArchitecture Design در واقع به طراحی ساختار کلی سیستم اشاره داره. یعنی شما باید از دیدی وسیعتر به پروژه نگاه کنی و تصمیم بگیری که چه نوع معماری به درد پروژه میخوره. هدف اینه که سیستمت بتونه نیازهای آینده رو برآورده کنه و در برابر چالشهایی مثل مقیاسپذیری، نگهداری و توسعه مقاوم باشه.
برای معماری نرمافزار معماری های مختلفی وجود داره. مثلا:
ـEvent-Driven Architecture:
این نوع معماری از Eventها برای ارتباط بین اجزای مختلف سیستم استفاده میکنه. اینطوری سیستمهای پیچیده و بزرگ میتونن به راحتی به هم متصل بشن و با کمترین تغییرات تو اجزا، همچنان عملکرد خوبی داشته باشن.
ـMicroservices:
در این معماری، سیستم به بخشهای کوچکتر و مستقل تقسیم میشه که هر کدوم میتونن به طور جداگانه کار کنن. این باعث میشه که مقیاسپذیری و نگهداری سیستم خیلی راحتتر بشه.
یکسری ابزارهای واسه Architecture Design ⚒
ـUML Diagrams: واسه طراحی ساختار.
ـC4 Model: برای نمایش لایههای مختلف.
ـEvent Storming: برای فهمیدن ارتباطات بین اجزا.
جمعبندی ✍
فهمیدیم Architecture Design دید کلی بهت میده و کمک میکنه پروژههای بزرگ رو راحتتر مدیریت کنی. اینجوری هم از مشکلات و هزینههای اضافه جلوگیری میکنی، هم نرمافزارت بهتر جواب میده.
اگه با برنامهنویسی آشنا باشی، احتمالش زیاده که اسم Design Patterns به گوشت خورده باشه. Design pattern ها راهحلهای هستن برای مشکلات تکراری که موقع کدنویسی باهاشون مواجه میشی. اما وقتی پروژهها بزرگتر میشن، علاوه بر Design Patterns ها به Architecture Design هم نیاز پیدا میکنیم.
چرا Architecture Design مهمه؟ 🤔
وقتی نرمافزارها تو دهههای ۸۰ و ۹۰ بزرگتر شدن، پیچیدگی سیستمها هم بیشتر شد. اون موقع بیشتر برنامهها Monolithic بودن؛ یعنی همه چیز تو یه کدبیس جمع شده بود. این نوع معماری برای پروژه هایی مناسبه که پیچیدگی زیادی ندارن و نیاز به سرویس های مختلف نیست، ولی وقتی پروژه بزرگ میشه، دردسرایی مثل سختی توسعه، نگهداری، و مقیاسپذیری رو به همراه داره.
اینجاست که Architecture Design بهت کمک میکنه تا یه طرح کلی برای سیستم داشته باشی که هم کارا باشه، هم بتونه چالشایی مثل رشد کاربرها، خطاها، و نیاز به تغییرات رو هندل کنه.
فرق Design Patterns و Architecture Design
ـDesign Patterns 🧩
ـDesign Patterns یعنی یه سری راهحلهای آماده و تستشده که برای مشکلات تکراری توی برنامهنویسی ارائه شدن. این الگوها تو یه سری موقعیت خاص خیلی خوب جواب میدن و باعث میشن که کدی که مینویسی خواناتر، قابلنگهداریتر، و استانداردتر بشه. مثلا:
ـSingleton:
فقط یه نمونه از یه کلاس ساخته بشه.
ـFactory:
ساخت اشیا بدون اینکه کلاس دقیقشونو مشخص کنی.
و...
ـ Architecture Design 🏗
ـArchitecture Design در واقع به طراحی ساختار کلی سیستم اشاره داره. یعنی شما باید از دیدی وسیعتر به پروژه نگاه کنی و تصمیم بگیری که چه نوع معماری به درد پروژه میخوره. هدف اینه که سیستمت بتونه نیازهای آینده رو برآورده کنه و در برابر چالشهایی مثل مقیاسپذیری، نگهداری و توسعه مقاوم باشه.
برای معماری نرمافزار معماری های مختلفی وجود داره. مثلا:
ـEvent-Driven Architecture:
این نوع معماری از Eventها برای ارتباط بین اجزای مختلف سیستم استفاده میکنه. اینطوری سیستمهای پیچیده و بزرگ میتونن به راحتی به هم متصل بشن و با کمترین تغییرات تو اجزا، همچنان عملکرد خوبی داشته باشن.
ـMicroservices:
در این معماری، سیستم به بخشهای کوچکتر و مستقل تقسیم میشه که هر کدوم میتونن به طور جداگانه کار کنن. این باعث میشه که مقیاسپذیری و نگهداری سیستم خیلی راحتتر بشه.
یکسری ابزارهای واسه Architecture Design ⚒
ـUML Diagrams: واسه طراحی ساختار.
ـC4 Model: برای نمایش لایههای مختلف.
ـEvent Storming: برای فهمیدن ارتباطات بین اجزا.
جمعبندی ✍
فهمیدیم Architecture Design دید کلی بهت میده و کمک میکنه پروژههای بزرگ رو راحتتر مدیریت کنی. اینجوری هم از مشکلات و هزینههای اضافه جلوگیری میکنی، هم نرمافزارت بهتر جواب میده.
#programming #design
🔆 CHANNEL | GROUP
🔥12👍3❤2
https://t.iss.one/geek_engineers
یکی از کانال هایی که محتواش عالیه ولی اصلا حمایت نمیشه 😕
پیشنهاد میکنم حتما یه سری بزنید واقعا کانال خفنیه و خودم کلی چیز یاد گرفتم ازش
یکی از کانال هایی که محتواش عالیه ولی اصلا حمایت نمیشه 😕
پیشنهاد میکنم حتما یه سری بزنید واقعا کانال خفنیه و خودم کلی چیز یاد گرفتم ازش
Telegram
👾 Geek Engineers
👾 Extremist software engineering guidance for Geeks.
Website:
https://geekengineers.netlify.app
Github:
https://github.com/geekengineers
https://github.com/tahadostifam
Community:
@geek_engineers_community
Website:
https://geekengineers.netlify.app
Github:
https://github.com/geekengineers
https://github.com/tahadostifam
Community:
@geek_engineers_community
🔥5
Ninja Learn | نینجا لرن
https://t.iss.one/geek_engineers یکی از کانال هایی که محتواش عالیه ولی اصلا حمایت نمیشه 😕 پیشنهاد میکنم حتما یه سری بزنید واقعا کانال خفنیه و خودم کلی چیز یاد گرفتم ازش
و این که تبلیغ نیست و حیفم اومد همچین کانالی هست و انقدر ممبراش کمه
❤5
FastAPI.Modern.Python.Web.Development.pdf
24 MB
کتاب Fastapi واقعا یکی از بهترین منابع برای یادگیری Fastapi هست.
اگه دوست دارید fastapi یادبگیرید حتما بخونیدش
اگه دوست دارید fastapi یادبگیرید حتما بخونیدش
#کتاب
🔆 CHANNEL | GROUP
🔥6❤3👍2
میخوام یه سوال ازتون بپرسم، بدون اینکه جوابشو سرچ کنید بگید چرا.
اگه برید یه حلقه for بزنید که ۱۰۰,۰۰۰ بار یه متن رو پرینت کنه (یه بار توی golang یه بارم توی python)
و تست سرعت بگیرید.
میبینید پایتون ۱۰ الا ۱۷ ثانیه اجراش میکنع
گولنگ ۵۰ ثانیه الا ۱ دقیقه
بنظرتون دلیلش چیه؟ چرا بااینکه go کامپایلریه و خیلی سریعه انقدر کند تره نسبت به پایتون توی این مورد؟ 🤔
اگه برید یه حلقه for بزنید که ۱۰۰,۰۰۰ بار یه متن رو پرینت کنه (یه بار توی golang یه بارم توی python)
و تست سرعت بگیرید.
میبینید پایتون ۱۰ الا ۱۷ ثانیه اجراش میکنع
گولنگ ۵۰ ثانیه الا ۱ دقیقه
بنظرتون دلیلش چیه؟ چرا بااینکه go کامپایلریه و خیلی سریعه انقدر کند تره نسبت به پایتون توی این مورد؟ 🤔
#question
🔆 CHANNEL | GROUP
👍4😁3👎2
Ninja Learn | نینجا لرن
میخوام یه سوال ازتون بپرسم، بدون اینکه جوابشو سرچ کنید بگید چرا. اگه برید یه حلقه for بزنید که ۱۰۰,۰۰۰ بار یه متن رو پرینت کنه (یه بار توی golang یه بارم توی python) و تست سرعت بگیرید. میبینید پایتون ۱۰ الا ۱۷ ثانیه اجراش میکنع گولنگ ۵۰ ثانیه الا ۱ دقیقه…
چرا پایتون تو اینجا سریعتر از گولنگه؟ 🤔
1⃣ ماجرای سیستم کال و بافرینگ
وقتی یه متن رو چاپ میکنی، اون متن باید از برنامه به خروجی (مثل ترمینال) فرستاده بشه. این کار با چیزی به اسم System Call انجام میشه، که مثل زنگ زدن به سیستمعامله و میگی: "هی، این متن رو بگیر و به خروجی بفرست".
گولنگ:
پایتون:
2⃣ ـstdout خودش بافرینگ داره، پس چرا مشکل داریم؟
درسته که stdout (که به سیستمعامل تعلق داره) خودش بافرینگ داره، ولی این بافر برای هر تماس جداگانه کار میکنه.
مشکل اصلی اینه که وقتی گولنگ مستقیم دادهها رو به stdout میفرسته، تعداد تماسها (System Calls) خیلی زیاده و این تماسهای متعدد باعث کاهش سرعت میشه.
پایتون با بافر داخلی خودش این مشکل رو حل میکنه و تماسها رو کم میکنه.
3⃣ چطور گولنگ رو بهینه کنیم؟
اگه بخوای گولنگ هم مثل پایتون سریع بشه، باید بافرینگ رو دستی پیادهسازی کنی. مثلاً با bufio.Writer:
اینجا bufio.Writer خروجیها رو توی یه بافر داخلی نگه میداره و فقط وقتی که بافر پر شد یا خودت Flush کردی، دادهها رو به stdout سیستمعامل میفرسته.
4⃣ نتیجه
گولنگ:
پایتون:
اما یادت باشه، این تفاوت فقط تو موارد خاص (مثل چاپ زیاد) خودش رو نشون میده. تو کارهای دیگه، مثل پردازش موازی یا عملیات سنگین، گولنگ از پایتون خیلی سریعتره.
حالا با این توضیحات، اگه جایی سوال داشتی بگو
1⃣ ماجرای سیستم کال و بافرینگ
وقتی یه متن رو چاپ میکنی، اون متن باید از برنامه به خروجی (مثل ترمینال) فرستاده بشه. این کار با چیزی به اسم System Call انجام میشه، که مثل زنگ زدن به سیستمعامله و میگی: "هی، این متن رو بگیر و به خروجی بفرست".
گولنگ:
هر بار که fmt.Println رو صدا میزنی، داده فوراً از برنامه به بافر stdout سیستمعامل فرستاده میشه. یعنی ۱۰۰,۰۰۰ بار fmt.Println یعنی ۱۰۰,۰۰۰ تا تماس جداگانه با سیستمعامل
پایتون:
قبل از اینکه دادهها رو به stdout بفرسته، خروجیها رو تو یه بافر داخلی نگه میداره. بعد وقتی بافر پر شد یا چاپ به انتهای خط رسید (به کمک line buffering)، دادهها رو یهجا به stdout میفرسته. یعنی تعداد تماسها با سیستمعامل خیلی کمتر میشه (مثلاً به جای ۱۰۰,۰۰۰ بار، فقط ۱۰ بار).
2⃣ ـstdout خودش بافرینگ داره، پس چرا مشکل داریم؟
درسته که stdout (که به سیستمعامل تعلق داره) خودش بافرینگ داره، ولی این بافر برای هر تماس جداگانه کار میکنه.
مشکل اصلی اینه که وقتی گولنگ مستقیم دادهها رو به stdout میفرسته، تعداد تماسها (System Calls) خیلی زیاده و این تماسهای متعدد باعث کاهش سرعت میشه.
پایتون با بافر داخلی خودش این مشکل رو حل میکنه و تماسها رو کم میکنه.
3⃣ چطور گولنگ رو بهینه کنیم؟
اگه بخوای گولنگ هم مثل پایتون سریع بشه، باید بافرینگ رو دستی پیادهسازی کنی. مثلاً با bufio.Writer:
package main
import (
"bufio"
"os"
)
func main() {
writer := bufio.NewWriter(os.Stdout) // بافر کردن خروجی
for i := 0; i < 100000; i++ {
writer.WriteString("Hello, world!\n")
}
writer.Flush() // ارسال بافر به خروجی
}
اینجا bufio.Writer خروجیها رو توی یه بافر داخلی نگه میداره و فقط وقتی که بافر پر شد یا خودت Flush کردی، دادهها رو به stdout سیستمعامل میفرسته.
4⃣ نتیجه
گولنگ:
هر بار با fmt.Println یه تماس به سیستمعامل میفرسته، که هزینهی زیادی داره.
پایتون:
با بافر داخلی خودش، تماسها رو کم میکنه و همین باعث میشه در چاپهای متوالی سریعتر باشه.
اما یادت باشه، این تفاوت فقط تو موارد خاص (مثل چاپ زیاد) خودش رو نشون میده. تو کارهای دیگه، مثل پردازش موازی یا عملیات سنگین، گولنگ از پایتون خیلی سریعتره.
حالا با این توضیحات، اگه جایی سوال داشتی بگو
🔆 CHANNEL | GROUP
👍14🔥6❤4
Ninja Learn | نینجا لرن
میخوام یه سوال ازتون بپرسم، بدون اینکه جوابشو سرچ کنید بگید چرا. اگه برید یه حلقه for بزنید که ۱۰۰,۰۰۰ بار یه متن رو پرینت کنه (یه بار توی golang یه بارم توی python) و تست سرعت بگیرید. میبینید پایتون ۱۰ الا ۱۷ ثانیه اجراش میکنع گولنگ ۵۰ ثانیه الا ۱ دقیقه…
یه نکته جالب که الان متوجهش شدم 😳
تست پرفورمنس توی cmd و Powershell متفاوته
و توی cmd جفتشون خیلی سریع تر عمل میکنن.
با این حال پایتون سریع تره.
تست پرفورمنس توی cmd و Powershell متفاوته
و توی cmd جفتشون خیلی سریع تر عمل میکنن.
با این حال پایتون سریع تره.
👀9👍2👌2
Ninja Learn | نینجا لرن
نظرتون چیه درمورد Golang هم پست بزاریم؟
مثل اینکه از go خوشتون اومده😂
👍16👎7❤4😁3🆒1
خب خب Go چیه و چرا؟
گو (Go)، یا همون Golang که لوگوش از حیوان gopher الهام گرفته شده، یه زبان برنامهنویسی مدرنه که گوگل سال 2009 معرفی کرد.
چرا Go ساخته شد؟ 🤔
تو پروژههای بزرگ، زبانهایی مثل C++ و Java، با وجود قدرت زیاد، به دلیل پیچیدگی زیاد و سرعت پایین توسعه، دردسرساز بودن. Go این مشکلات رو با ترکیب سادگی و سرعت حل کرد:
1⃣ سینتکس ساده:
2⃣ عملکرد بالا:
3⃣ مدیریت حافظه خودکار:
4⃣ ابزارهای مدرن:
5⃣ مناسب برای پروژههایی با مقیاس بالا:
ویژگیهای مهم Go 🧩
1⃣ سادگی
2⃣ مدیریت همزمانی به بهترین شکل
ـBackend
ـDevOps
ـCloud
ـDistribution systems
ـBlockchain
و...
نمونه کد Go 💻
یه مثال از ارسال درخواست HTTP همزمان با استفاده از Goroutines
گو (Go)، یا همون Golang که لوگوش از حیوان gopher الهام گرفته شده، یه زبان برنامهنویسی مدرنه که گوگل سال 2009 معرفی کرد.
چرا Go ساخته شد؟ 🤔
تو پروژههای بزرگ، زبانهایی مثل C++ و Java، با وجود قدرت زیاد، به دلیل پیچیدگی زیاد و سرعت پایین توسعه، دردسرساز بودن. Go این مشکلات رو با ترکیب سادگی و سرعت حل کرد:
1⃣ سینتکس ساده:
کدها راحتتر نوشته و خونده میشن.
2⃣ عملکرد بالا:
ـ Go مثل C مستقیماً به کد ماشین کامپایل میشه، برای همین سریع اجرا میشه.
3⃣ مدیریت حافظه خودکار:
با استفاده از Garbage Collection، مدیریت حافظه ساده و بدون دخالت مستقیم برنامهنویس انجام میشه.
4⃣ ابزارهای مدرن:
مدیریت همزمانی، تست، و مدیریت حافظه به شکل مدرنی طراحی شده.
5⃣ مناسب برای پروژههایی با مقیاس بالا:
ـGo در ابتدا برای تسهیل توسعه پروژههای بزرگ و زیرساختی گوگل طراحی شد.
ویژگیهای مهم Go 🧩
1⃣ سادگی
ـGo از همون اول برای ساده بودن طراحی شد. توش خبری از ارثبری پیچیده یا کلی مفهوم سنگین نیست. این یعنی یادگیری و استفاده ازش راحتتره ( البته نه خیلی ساده 😅).
2⃣ مدیریت همزمانی به بهترین شکل
ـGo با Goroutines، اجرای همزمان رو خیلی سبک و سریع کرده. این Goroutines نسبت به Threadها خیلییی کمهزینهتر هستن و فقط چند کیلوبایت حافظه مصرف میکنن. مثلا میتونی صدها کار همزمان انجام بدی بدون اینکه سرور زیر بار بره.3⃣ کتابخانه های قدرت مند
کتابخونه استاندارد Go بیشتر چیزایی که برای ساختن یه برنامه نیاز داری رو داره، از کار با شبکه گرفته تا رمزنگاری و فایل. این کتابخونهها به شکل بهینه طراحی شدن تا بدون نیاز به ابزارهای خارجی، بسیاری از نیازهای شما رو برطرف کنن.4⃣ ـCross-Platform بودن
کد Go رو یه بار کامپایل میکنی و روی سیستمعاملهای مختلف میتونی اجراش کنی. این قابلیت به خاطر تولید فایل باینری مستقل فراهم شده که نیازی به runtime مثل JVM یا Python Interpreter نداره.5⃣ سازگاری با معماری Microservices
ـGo به خاطر سبک و سریع بودنش، برای ساخت Microservices عالیه. سرویسهای کوچیک و مستقلی که Go مدیریتشون رو خیلی راحت کرده.6⃣ مدیریت Dependencyها با Go Modules
ـGo ابزار Go Modules رو داره که مدیریت وابستگیها رو ساده و مدرن کرده. این ابزار امکان تعریف ورژن ها و مدیریت کتابخانهها رو خیلی راحتتر از روشهای سنتی میکنه.کجاها از Go استفاده میشه؟
ـBackend
ـDevOps
ـCloud
ـDistribution systems
ـBlockchain
و...
نمونه کد Go 💻
یه مثال از ارسال درخواست HTTP همزمان با استفاده از Goroutines
:
package main
import (
"fmt"
"net/http"
)
func fetch(url string) {
resp, err := http.Get(url)
if err != nil {
fmt.Println(url, "Error:", err)
return
}
defer resp.Body.Close()
fmt.Println(url, resp.Status)
}
func main() {
urls := []string{"https://example.com", "https://google.com", "https://golang.org"}
for _, url := range urls {
go fetch(url)
}
fmt.Scanln() // برای جلوگیری از بسته شدن برنامه
#go #برنامه_نویسی
🔆 CHANNEL | GROUP
👍8❤4
این گروه رو برای بچه های FastAPI زدم
هرکس دوست داشت جوین بشه.
https://t.iss.one/fastapiir
هرکس دوست داشت جوین بشه.
https://t.iss.one/fastapiir
🔆 CHANNEL | GROUP
👍9
Ninja Learn | نینجا لرن pinned «این گروه رو برای بچه های FastAPI زدم هرکس دوست داشت جوین بشه. https://t.iss.one/fastapiir 🔆 CHANNEL | GROUP»
Ninja Learn | نینجا لرن
این گروه رو برای بچه های FastAPI زدم هرکس دوست داشت جوین بشه. https://t.iss.one/fastapiir 🔆 CHANNEL | GROUP
دوستان سعی کنید این کامیونیتی رو بزرگ کنید چون واقعا کامیونیتی fastapi فارسی خیلی کوچیکه، عملا صفر هست 😕
❤11👎2
خودمونیما
عجب خانواده باحالی شدیم 🙃
واقعا ازتون خیلی انرژی میگیرم ❤️
عجب خانواده باحالی شدیم 🙃
واقعا ازتون خیلی انرژی میگیرم ❤️
❤27
Forwarded from Python BackendHub (Mani)
یکی از اشتباهات رایج و خیلی بد تو دیزاین دیتابیس که من دیدم خیلی انجام میدن اینه که سعی میکنن state یک entity رو با چند boolean ست کنند.
مثلا برای یوزر داریم:
is_active
is_banned
یا شما میتونی برای پردازش یک دیتایی اینطوری هم ذخیره کنی:
is_pending
is_success
اما خیلی پرکتیس بدیه. چرا؟ به ۲ دلیل:
۱. حالت هایی به وجود میاد از ترکیب این boolean ها که رخ دادنش ممکن نیست. مثلا چطوری میشه is_pending=true باشه و is_success هم true باشه؟ حالا هرچی جلوتر برید و تعداد boolean هاتون بیشتر شه این ترکیب هایی که امکان رخ دادنشون وجود نداره خیلی بیشتر میشه. مثلا ۴ تا boolean میشه ۱۶ حالت. آیا واقعا همه ۱۶ حالت رو دارین؟!
۲. راه حل دوم خیلی بهتره! راه حل دوم چیه؟استفاده از یک Enum تو دیتابیستون.
PENDING
SUCCESS
FAILED
حالا یک جایی نیازه که ایمیل بزنید اگه این پردازش موفقیت آمیز نبود. خیلی راحت میتونید رو همه حالت ها match case کنید. و در نهایت یک assert never هم قرار بدید.
اینطوری فردا اگه یک state جدید اضافه کنید به اپلیکیشنتون, همه جای کدتون ارور تایپینگ میخورید تا مجبور شید رفتار و ساید افکت state جدید رو تو همه جا هندل کنید.
@PyBackendHub
مثلا برای یوزر داریم:
is_active
is_banned
یا شما میتونی برای پردازش یک دیتایی اینطوری هم ذخیره کنی:
is_pending
is_success
اما خیلی پرکتیس بدیه. چرا؟ به ۲ دلیل:
۱. حالت هایی به وجود میاد از ترکیب این boolean ها که رخ دادنش ممکن نیست. مثلا چطوری میشه is_pending=true باشه و is_success هم true باشه؟ حالا هرچی جلوتر برید و تعداد boolean هاتون بیشتر شه این ترکیب هایی که امکان رخ دادنشون وجود نداره خیلی بیشتر میشه. مثلا ۴ تا boolean میشه ۱۶ حالت. آیا واقعا همه ۱۶ حالت رو دارین؟!
۲. راه حل دوم خیلی بهتره! راه حل دوم چیه؟استفاده از یک Enum تو دیتابیستون.
PENDING
SUCCESS
FAILED
حالا یک جایی نیازه که ایمیل بزنید اگه این پردازش موفقیت آمیز نبود. خیلی راحت میتونید رو همه حالت ها match case کنید. و در نهایت یک assert never هم قرار بدید.
اینطوری فردا اگه یک state جدید اضافه کنید به اپلیکیشنتون, همه جای کدتون ارور تایپینگ میخورید تا مجبور شید رفتار و ساید افکت state جدید رو تو همه جا هندل کنید.
match state:
case State.FAILED:
email_to_user()
case State.SUCCESS | State.FAILED:
pass # do nothing
case _:
assert_never(state)
@PyBackendHub
🔥9👍4