“Specification by Example” by Example
ابیات بالا منتسب به حضرت مولانا و از مجموعه داستان طوطی و بقال برگزیده شده.
اگر به اعجاز ابیات بالا نگاه کنیم میبینیم که کلمات شیر در دو مصرع اول، و بادیه(معنای کاسه) در دو مصرع دوم، چگونه به زیبایی بکار گرفته شده اند.
شاعر در اینجا به زیبایی از صنایع ادبی استفاده کرده و شاهکاری ادبی خلق کرده.
از زاویهای دیگر اما، با نگاهی دقیقتر به شعر بالا، این شعر بهمون نشون میده که برای جلوگیری از اشتباه و ابهام، باید مفاهیم رو دقیق و واضح تعریف کنیم. همونطور که "شیر" در این شعر دو معنی کاملاً متفاوت داره، ایضا “بادیه”، در تعریف ویژگیهای محصول باید از بکار بردن عمدی یا سهوی این صنایع ادبی جدا خودداری کنیم.
رویکرد Specification by Example با همین هدف به وجود اومده: به جای تعریفهای انتزاعی، با مثالهای ملموس و قابل فهم، رفتار سیستم رو مشخص میکنیم و نشون میدیم که دقیقاً چطور باید کار کنه تا از هرگونه ابهامی جلوگیری بشه. ما از با کمک ارائه مثالهای ملموس، ساده، و مشخص، ویژگی(specification) و بصورت کلی چیزی که در ذهن داریم رو مشخص میکنیم.
فرض کنید میخوایم یک ماشین حساب ساده را طراحی کنیم. اسم این ماشین حساب را "حسابچی" میذاریم. "حسابچی" باید عملیات اصلی ریاضی مثل جمع، تفریق، ضرب و تقسیم رو انجام بده.
برای تعریف دقیق نحوه عملکرد جمع در "حسابچی"، از رویکرد Specification by Example استفاده میکنیم. به این ترتیب، با ارائه مثالهای مشخص، انتظاراتمون رو از ویژگی جمع بیان میکنیم. این کار رو به صورت یک مکالمه بین دو نفر، تقی و نقی، نشون میدم:
مکالمه بین تقی و نقی:
همانطور که مشاهده کردید، در این روش با ارائه مثالهای ملموس و گام به گام، ویژگیهای سیستم را مشخص کردیم.
هر مثال، بر پایه مثال قبلی بنا شده و جنبه جدیدی از رفتار سیستم رو آشکار کرد. همین کار باعث شد که که همگی ذینفعان درک مشترکی از چیزی که قرار تولید کنند داشته باشند. این مثالها همینطور حکم proof-of-work کار نهایی رو هم دارند.
یعنی قبل از پیادهسازی هر خط کدی ما مکانیزم نهایی اعتبار سنجی سیستم رو بهش دست پیدا کردیم.
آن یکی شیر است که آدم میخورد
آن یکی شیر است که آدم میخورد
کان یکی شیر است اندر بادیه
کان یکی شیر است اندر بادیه
ابیات بالا منتسب به حضرت مولانا و از مجموعه داستان طوطی و بقال برگزیده شده.
اگر به اعجاز ابیات بالا نگاه کنیم میبینیم که کلمات شیر در دو مصرع اول، و بادیه(معنای کاسه) در دو مصرع دوم، چگونه به زیبایی بکار گرفته شده اند.
شاعر در اینجا به زیبایی از صنایع ادبی استفاده کرده و شاهکاری ادبی خلق کرده.
از زاویهای دیگر اما، با نگاهی دقیقتر به شعر بالا، این شعر بهمون نشون میده که برای جلوگیری از اشتباه و ابهام، باید مفاهیم رو دقیق و واضح تعریف کنیم. همونطور که "شیر" در این شعر دو معنی کاملاً متفاوت داره، ایضا “بادیه”، در تعریف ویژگیهای محصول باید از بکار بردن عمدی یا سهوی این صنایع ادبی جدا خودداری کنیم.
رویکرد Specification by Example با همین هدف به وجود اومده: به جای تعریفهای انتزاعی، با مثالهای ملموس و قابل فهم، رفتار سیستم رو مشخص میکنیم و نشون میدیم که دقیقاً چطور باید کار کنه تا از هرگونه ابهامی جلوگیری بشه. ما از با کمک ارائه مثالهای ملموس، ساده، و مشخص، ویژگی(specification) و بصورت کلی چیزی که در ذهن داریم رو مشخص میکنیم.
فرض کنید میخوایم یک ماشین حساب ساده را طراحی کنیم. اسم این ماشین حساب را "حسابچی" میذاریم. "حسابچی" باید عملیات اصلی ریاضی مثل جمع، تفریق، ضرب و تقسیم رو انجام بده.
برای تعریف دقیق نحوه عملکرد جمع در "حسابچی"، از رویکرد Specification by Example استفاده میکنیم. به این ترتیب، با ارائه مثالهای مشخص، انتظاراتمون رو از ویژگی جمع بیان میکنیم. این کار رو به صورت یک مکالمه بین دو نفر، تقی و نقی، نشون میدم:
مکالمه بین تقی و نقی:
تقی: خب، برای جمع تو "حسابچی" اول از یه چیز خیلی ساده شروع کنیم: ۲ + ۲، جوابش میشه ۴، درسته؟
نقی: آره، این که خیلی واضحه. جمع دو تا عدد صحیح و مثبت.
تقی: حالا یه کم بزرگترش کنیم: ۲ + ۱۰، میشه ۱۲.
نقی: اوکی، اینم مثل قبلیه. فقط اعداد بزرگتر شدن.
تقی: حالا ۲ + ۱۲۵۰ رو امتحان کن.
نقی: خب، اینم میشه ۱۲۵۲. پس "حسابچی" باید از اعداد صحیح بزرگ هم پشتیبانی کنه.
تقی: دقیقاً. حالا فرض کن بخوایم اعداد اعشاری رو هم جمع کنیم. مثلاً ۲ + ۱۰.۲.
نقی: خب، این میشه ۱۲.۲. پس "حسابچی" باید اعداد اعشاری رو هم در نظر بگیره.
تقی: عالیه. حالا یه کم پیچیدهترش کنیم. ۲ + ۱۰.۲ + ۲۵ چی؟ یعنی سه تا عدد رو با هم جمع کنیم.
نقی: این میشه ۳۷.۲. پس "حسابچی" باید بتونه چند تا عدد رو هم با هم جمع کنه، حتی اگه اعشاری باشن.
تقی: آفرین. حالا یه چیز دیگه. ۲ + ۲ + (۲ * ۲) رو حساب کن. اینجا یه عبارت ریاضی داریم که هم جمع داره و هم ضرب.
نقی: خب، طبق قواعد ریاضی، اولویت با ضربه، پس ۲ ضربدر ۲ میشه ۴، بعدش با ۲ و ۲ جمع میشه که میشه ۸. پس "حسابچی" باید از عبارات ریاضی (expressions) و تقدم عملگرها هم پشتیبانی کنه. یعنی بدونه اول ضرب رو حساب کنه بعد جمع رو.
تقی: دقیقاً همینطوره.
همانطور که مشاهده کردید، در این روش با ارائه مثالهای ملموس و گام به گام، ویژگیهای سیستم را مشخص کردیم.
هر مثال، بر پایه مثال قبلی بنا شده و جنبه جدیدی از رفتار سیستم رو آشکار کرد. همین کار باعث شد که که همگی ذینفعان درک مشترکی از چیزی که قرار تولید کنند داشته باشند. این مثالها همینطور حکم proof-of-work کار نهایی رو هم دارند.
یعنی قبل از پیادهسازی هر خط کدی ما مکانیزم نهایی اعتبار سنجی سیستم رو بهش دست پیدا کردیم.
❤6👍1
📍Domain Driven Design Roadmap 🗺 🗾 📖
As a DDD instructor, I’ve often been asked to provide a roadmap for learning Domain Driven Design. Despite attempts, the vast scope of DDD, combined with the diverse backgrounds of people—such as product managers, developers, architects—means many roadmaps don’t cover its complexities. DDD spans both strategic and technical aspects, making it challenging to create a comprehensive roadmap for everyone.
To address this, I’ve created an initial version (0.0.1)! This roadmap guides learners through all levels of DDD, from concepts to advanced practices. Whether you’re starting with DDD or deepening your expertise, it offers structured paths for different stages of learning.
Link to the repo:👇
https://github.com/masoud-bahrami/domain-driven-design-roadmap
As a DDD instructor, I’ve often been asked to provide a roadmap for learning Domain Driven Design. Despite attempts, the vast scope of DDD, combined with the diverse backgrounds of people—such as product managers, developers, architects—means many roadmaps don’t cover its complexities. DDD spans both strategic and technical aspects, making it challenging to create a comprehensive roadmap for everyone.
To address this, I’ve created an initial version (0.0.1)! This roadmap guides learners through all levels of DDD, from concepts to advanced practices. Whether you’re starting with DDD or deepening your expertise, it offers structured paths for different stages of learning.
Link to the repo:👇
https://github.com/masoud-bahrami/domain-driven-design-roadmap
👍6👌1
کانال مکتبخانه DDD
📍Domain Driven Design Roadmap 🗺 🗾 📖 As a DDD instructor, I’ve often been asked to provide a roadmap for learning Domain Driven Design. Despite attempts, the vast scope of DDD, combined with the diverse backgrounds of people—such as product managers, developers…
Domain Driven Design Roadmap 🗺
A guided journey through DDD, covering essential concepts and advanced topics.
Here’s a brief overview of the roadmap's structure:
-------------------------------------------------------
A guided journey through DDD, covering essential concepts and advanced topics.
Here’s a brief overview of the roadmap's structure:
-------------------------------------------------------
Why Domain-Driven Design?🤔
I. Pre-DDD Context for Different Roles 🧩
II. Glossary of Terms 📖🔤 Domain Jargon Demystified
III. Level 1: DDD Fundamentals 🌱
IV. Level 2: Collaborative Modeling and Designing 🤝
V. Level 3: Strategic Design ♟️
VI. Level 4: Tactical Design and Implementation🏗️
VII. Level 5: Architecture and DDD 🏛️🧩🏗️
XIII. Level 6: Domain-Driven Design with Event Sourcing and CQRS🌊💾
XXX. Measuring Success with DDD ✅📈
IX. Level 8: DDD and Programming Paradigms 💻⚙️🧩
X. Level 9: Advanced and Emerging Topics 🔮
XI. Level 10: Team Topologies and DDD 🧑🤝🧑🏢🤝
XII. Level 11: Strategic Analysis with Wardley Mapping and Related Techniques 🗺️📈🧭
XIII. Level 12: Visualizing DDD: Canvases for Collaboration and Clarity 🖼️🤝
XIV. Level 13: Supple Design: Techniques for Evolving Domain Models 🌿🌊🔄
XIV. Level 14: Breakthrough Refactoring: Refactoring Towards Deeper Insight 🚀💡
XV. Level 15: Scaling DDD 🚀🏢
XVI. Level 16: Dealing with Legacy Systems in DDD 🏛️➡️🔄
XVII. Level 17: Anti-Patterns in DDD 🚫🚧 Common Mistakes to Avoid
XVIII. Level 18: Practical Tools and Checklists for DDD 🛠️✅📝
XIX. Tools (Optional 🧰🛠️)
👍3
Software Architecture vs. Design Patterns
Simply put, both software architecture and design patterns are essential for good software. Architecture is the big picture, the overall structure. Design patterns are solutions to smaller, local problems. Understanding the difference is key for any software developer.
https://masoudbahrami.medium.com/software-architecture-vs-design-patterns-6ceb535cf9c9
Simply put, both software architecture and design patterns are essential for good software. Architecture is the big picture, the overall structure. Design patterns are solutions to smaller, local problems. Understanding the difference is key for any software developer.
https://masoudbahrami.medium.com/software-architecture-vs-design-patterns-6ceb535cf9c9
Medium
Software Architecture vs. Design Patterns
Software architecture is not about local optimization techniques or patterns. Design patterns on the other hand, focus more on design…
👍3
What if you could treat dates and times as data in C# and Java?🤨
Are you looking for a better way to handle dates and times?
I'm exploring a homoiconic approach and developing a library to simplify date and time handling
https://medium.com/p/homoiconicity-inspired-date-time-handling-in-c-sharp-f38c7cf8704e
Are you looking for a better way to handle dates and times?
I'm exploring a homoiconic approach and developing a library to simplify date and time handling
https://medium.com/p/homoiconicity-inspired-date-time-handling-in-c-sharp-f38c7cf8704e
Medium
Homoiconicity-Inspired Date/Time Handling in C#
Homoiconicity is a fascinating concept in programming languages where a program’s code and its data share the same structure. This means…
❤2👌1
چالشهای معماری نرمافزار و تصمیمات سخت 🚀
معماران و بصورت کلی تصمیم گیران در حوزه تولید نرمافزار، نرمافزار اغلب نگران و مضطرب به نظر میرسند چون هیچ تصمیم ساده و واضحی ندارند: همه چیز یک تعویض سخت است. معماری نرمافزار یک حوزه پر از پیچیدگیها و انتخابهای دشوار است که در آن، هر تصمیم بهنوعی با چالشهای خاص خود همراه است. در این سخنرانی، نیل فورد به بررسی این مشکلات و دلایلی میپردازد که معماری نرمافزار را به چنین عرصهای پر از دشواری تبدیل کردهاند. او با کاوش در مفهوم "دقت مناسب" و چگونگی رسیدن به آن، مفاهیم پیچیدهای چون معماریهای مبتنی بر رویداد، تیمها، اجزا و حتی "کوانتوم معماری" را مورد بحث قرار میدهد تا روشن کند که چرا معماری همواره چنین چالشبرانگیز است.
یکی از مسائل کلیدی که در این سخنرانی مورد توجه قرار میگیرد، مسئله بازاستفاده است. نیل فورد با ارائه مثالهایی از سطح برنامهها، دپارتمانها و حتی سازمانها، توضیح میدهد که چرا بازاستفاده بهظاهر مفهومی ساده است، اما در عمل به یکی از بزرگترین چالشها تبدیل میشود. به عنوان مثال، در یک پروژه بزرگ نرمافزاری، اگر بخواهید یک ماژول مشترک برای پردازش دادهها در بخشهای مختلف استفاده کنید، ممکن است در ابتدا به نظر برسد که این تصمیم باعث کاهش کدهای تکراری و افزایش بهرهوری میشود. اما پس از مدتی متوجه میشوید که این ماژول نیاز به تغییرات زیادی دارد تا با نیازهای هر بخش تطابق پیدا کند. این مشکلات شامل همگامسازی تغییرات در بخشهای مختلف، افزایش وابستگیها و پیچیدگی در نگهداری سیستم خواهد بود. در نتیجه، تصمیم به بازاستفاده نه تنها هزینههای پنهانی دارد بلکه میتواند باعث کاهش انعطافپذیری سیستم شود.
او همچنین به تشریح نحوهی تحلیلهای تعویض در معماری، ابزارهایی چون لیستهای MECE (Mutually Exclusive, Collectively Exhaustive) و روشهایی برای تفکیک سرویسها به منظور دستیابی به دقت مناسب خواهد پرداخت.
به عنوان مثال، در یک معماری میکروسرویسها، شما باید تصمیم بگیرید که هر سرویس را به چه اندازهای تفکیک کنید. اگر سرویسها خیلی ریز تقسیم شوند، مدیریت و نگهداری آنها دشوار میشود، اما اگر بیش از حد کلی باشند، ممکن است در عملکرد و مقیاسپذیری سیستم مشکلاتی ایجاد کند.
علاوه بر این، نیل فورد توضیح میدهد که چگونه میتوان از این ابزارها و رویکردها برای حل مشکلات معماری استفاده کرد و همچنین چرا تصمیمگیریهای معماری به ندرت ساده هستند❓ او به بررسی مشکلات معمولی که در معماری نرمافزار با آنها مواجه میشویم، پرداخته و راهحلهایی برای کاهش پیچیدگیها و تسهیل این فرآیندها ارائه میدهد. از طریق شناسایی دلایل مشترک این چالشها و اعمال درسهایی که میتوانند به طور کلی در معماری نرمافزار موثر واقع شوند، نیل فورد راههایی برای تبدیل معماری سخت و پیچیده به فرآیندی نرمتر و قابلمدیریتتر معرفی خواهد کرد.
این سخنرانی به شما کمک خواهد کرد تا نه تنها دید بهتری از چالشهای معماری نرمافزار پیدا کنید، بلکه توانایی تحلیل و تصمیمگیریهای پیچیدهتر را در این حوزه تقویت کنید. پس با ما همراه باشید تا با درک عمیقتری از معماری نرمافزار و چالشهای آن روبهرو شوید.
https://www.youtube.com/watch?v=Q6RfMmMwhvM
معماران و بصورت کلی تصمیم گیران در حوزه تولید نرمافزار، نرمافزار اغلب نگران و مضطرب به نظر میرسند چون هیچ تصمیم ساده و واضحی ندارند: همه چیز یک تعویض سخت است. معماری نرمافزار یک حوزه پر از پیچیدگیها و انتخابهای دشوار است که در آن، هر تصمیم بهنوعی با چالشهای خاص خود همراه است. در این سخنرانی، نیل فورد به بررسی این مشکلات و دلایلی میپردازد که معماری نرمافزار را به چنین عرصهای پر از دشواری تبدیل کردهاند. او با کاوش در مفهوم "دقت مناسب" و چگونگی رسیدن به آن، مفاهیم پیچیدهای چون معماریهای مبتنی بر رویداد، تیمها، اجزا و حتی "کوانتوم معماری" را مورد بحث قرار میدهد تا روشن کند که چرا معماری همواره چنین چالشبرانگیز است.
یکی از مسائل کلیدی که در این سخنرانی مورد توجه قرار میگیرد، مسئله بازاستفاده است. نیل فورد با ارائه مثالهایی از سطح برنامهها، دپارتمانها و حتی سازمانها، توضیح میدهد که چرا بازاستفاده بهظاهر مفهومی ساده است، اما در عمل به یکی از بزرگترین چالشها تبدیل میشود. به عنوان مثال، در یک پروژه بزرگ نرمافزاری، اگر بخواهید یک ماژول مشترک برای پردازش دادهها در بخشهای مختلف استفاده کنید، ممکن است در ابتدا به نظر برسد که این تصمیم باعث کاهش کدهای تکراری و افزایش بهرهوری میشود. اما پس از مدتی متوجه میشوید که این ماژول نیاز به تغییرات زیادی دارد تا با نیازهای هر بخش تطابق پیدا کند. این مشکلات شامل همگامسازی تغییرات در بخشهای مختلف، افزایش وابستگیها و پیچیدگی در نگهداری سیستم خواهد بود. در نتیجه، تصمیم به بازاستفاده نه تنها هزینههای پنهانی دارد بلکه میتواند باعث کاهش انعطافپذیری سیستم شود.
او همچنین به تشریح نحوهی تحلیلهای تعویض در معماری، ابزارهایی چون لیستهای MECE (Mutually Exclusive, Collectively Exhaustive) و روشهایی برای تفکیک سرویسها به منظور دستیابی به دقت مناسب خواهد پرداخت.
به عنوان مثال، در یک معماری میکروسرویسها، شما باید تصمیم بگیرید که هر سرویس را به چه اندازهای تفکیک کنید. اگر سرویسها خیلی ریز تقسیم شوند، مدیریت و نگهداری آنها دشوار میشود، اما اگر بیش از حد کلی باشند، ممکن است در عملکرد و مقیاسپذیری سیستم مشکلاتی ایجاد کند.
علاوه بر این، نیل فورد توضیح میدهد که چگونه میتوان از این ابزارها و رویکردها برای حل مشکلات معماری استفاده کرد و همچنین چرا تصمیمگیریهای معماری به ندرت ساده هستند❓ او به بررسی مشکلات معمولی که در معماری نرمافزار با آنها مواجه میشویم، پرداخته و راهحلهایی برای کاهش پیچیدگیها و تسهیل این فرآیندها ارائه میدهد. از طریق شناسایی دلایل مشترک این چالشها و اعمال درسهایی که میتوانند به طور کلی در معماری نرمافزار موثر واقع شوند، نیل فورد راههایی برای تبدیل معماری سخت و پیچیده به فرآیندی نرمتر و قابلمدیریتتر معرفی خواهد کرد.
این سخنرانی به شما کمک خواهد کرد تا نه تنها دید بهتری از چالشهای معماری نرمافزار پیدا کنید، بلکه توانایی تحلیل و تصمیمگیریهای پیچیدهتر را در این حوزه تقویت کنید. پس با ما همراه باشید تا با درک عمیقتری از معماری نرمافزار و چالشهای آن روبهرو شوید.
https://www.youtube.com/watch?v=Q6RfMmMwhvM
YouTube
Software Architecture: The Hard Parts - Neal Ford
Architects often look harried and worried because they have no clean, easy decisions: everything is an awful tradeoff. Architecture has lots of difficult problems, which this talk highlights by investigating what makes architecture so hard. At the of core…
❤2
Forwarded from Masoud Bahrami
Language-Driven Design
In the realm of software development, we assert that software systems are fundamentally rooted in language. The Language-Driven Design (LDD) approach emphasizes that:
🧠 Clarity over Complexity
We prioritize simplicity in communication, which leads to greater understanding among team members and stakeholders. By avoiding jargon and convoluted terminology, we make our systems more accessible and reduce the possibility of misunderstandings that can hinder progress.
💬 Language Unites Teams
A common vocabulary fosters collaboration and strengthens team dynamics. When teams speak the same language, they can collaborate more efficiently, share knowledge effectively, and align their efforts towards common goals, resulting in improved productivity and innovation.
🧱 Architecture Reflects Language
The structure of our systems should mirror the language we use to describe them. A well-designed architecture based on a shared language not only enhances comprehension but also facilitates maintenance and future development. This alignment enables developers to iterate quickly and respond to changing requirements with confidence.
🔁 Language Evolves with Reality
We acknowledge that both language and systems are dynamic and must evolve as our understanding and needs change. By fostering a culture of continuous learning and adaptation, we can ensure that our language and designs remain relevant and effective in addressing real-world challenges.
In the realm of software development, we assert that software systems are fundamentally rooted in language. The Language-Driven Design (LDD) approach emphasizes that:
a clear and shared language is paramount for creating systems that are not only effective but also easily understandable and adaptable to change.
🧠 Clarity over Complexity
We prioritize simplicity in communication, which leads to greater understanding among team members and stakeholders. By avoiding jargon and convoluted terminology, we make our systems more accessible and reduce the possibility of misunderstandings that can hinder progress.
💬 Language Unites Teams
A common vocabulary fosters collaboration and strengthens team dynamics. When teams speak the same language, they can collaborate more efficiently, share knowledge effectively, and align their efforts towards common goals, resulting in improved productivity and innovation.
🧱 Architecture Reflects Language
The structure of our systems should mirror the language we use to describe them. A well-designed architecture based on a shared language not only enhances comprehension but also facilitates maintenance and future development. This alignment enables developers to iterate quickly and respond to changing requirements with confidence.
🔁 Language Evolves with Reality
We acknowledge that both language and systems are dynamic and must evolve as our understanding and needs change. By fostering a culture of continuous learning and adaptation, we can ensure that our language and designs remain relevant and effective in addressing real-world challenges.
Forwarded from Masoud Bahrami
Introducing (Domain)Language-First Architecture
Imagine an architecture where the very language of your domain is the foundation upon which your software is built. This is the core principle of Language-First Architecture. As you can see in the diagrams, at the heart of LFA is Language itself. It's not just about using domain language in communication; it's about making it the blueprint for your system.
Imagine an architecture where the very language of your domain is the foundation upon which your software is built. This is the core principle of Language-First Architecture. As you can see in the diagrams, at the heart of LFA is Language itself. It's not just about using domain language in communication; it's about making it the blueprint for your system.
👍2
Masoud Bahrami
Introducing (Domain)Language-First Architecture Imagine an architecture where the very language of your domain is the foundation upon which your software is built. This is the core principle of Language-First Architecture. As you can see in the diagrams,…
📌Introducing (Domain)Language-First Architecture
Imagine an architecture where the very language of your domain is the foundation upon which your software is built. This is the core principle of Language-First Architecture.
✅ As you can see in the diagrams, at the heart of LFA is Language itself. It's not just about using domain language in communication; it's about making it the blueprint for your system.
✅ Surrounding the Language core is the Model. Here, the domain language is transformed into concrete data structures and business rules, directly reflecting the language's vocabulary and grammar.
✅ Expanding further, we have the Context. This layer represents the environment in which the system operates, encompassing user interactions and external dependencies. It's where the language's meaning is understood within the system's real-world application.
✅ Finally, the Logic layer is the outermost shell. It's where the magic happens – where the domain language is processed and executed, driving the system's behavior.
The small squares you see represent the interaction points with the outside world – APIs, databases, user interfaces – all communicating with the system in the language it understands best.
Start with words: Use the same words your business uses every day.
Words make the rules: These words decide how the software works.
Imagine an architecture where the very language of your domain is the foundation upon which your software is built. This is the core principle of Language-First Architecture.
✅ As you can see in the diagrams, at the heart of LFA is Language itself. It's not just about using domain language in communication; it's about making it the blueprint for your system.
✅ Surrounding the Language core is the Model. Here, the domain language is transformed into concrete data structures and business rules, directly reflecting the language's vocabulary and grammar.
✅ Expanding further, we have the Context. This layer represents the environment in which the system operates, encompassing user interactions and external dependencies. It's where the language's meaning is understood within the system's real-world application.
✅ Finally, the Logic layer is the outermost shell. It's where the magic happens – where the domain language is processed and executed, driving the system's behavior.
The small squares you see represent the interaction points with the outside world – APIs, databases, user interfaces – all communicating with the system in the language it understands best.
Start with words: Use the same words your business uses every day.
Words make the rules: These words decide how the software works.
👍3
📌 چهار ضلع طراحی نرمافزار: زبان، مدل، متخصصان دامنه، و کد
وقتی از طراحی نرمافزار حرف میزنیم، خیلیها سریع میرن سراغ معماری، فریمورک، یا ساختارهای کدی. ولی اصل ماجرا از یه جای دیگه شروع میشه: مدل. مدلی که قراره بین آدمها و کد یه پل بزنه، و ریشهش توی دنیای واقعی باشه.
تو رویکرد DDD، مدل فقط یه دیاگرام نیست؛ یه گفتوگوی زندهست، یه ابزار برای درک و بازنمایی مسئله — نه صرفاً راهحل.
👥 یکی از ضلعهای مهم طراحی، متخصصان دامنهان. آدمهایی که از نزدیک با مسئله سر و کار دارن. اگه باهاشون گفتوگو نکنیم، مدلمون تبدیل میشه به یه سری حدس و گمان. ولی اگه زبان مشترک بسازیم و مفاهیم رو دقیق ازشون بگیریم، مدل ما هم واقعیتر و هم قابل استفادهتر میشه.
💬 مدلسازی یه فرایند لحظهای نیست، یه مسیر تدریجیه. وسط گفتوگوها شکل میگیره، توی برخورد با واقعیتها اصلاح میشه، و دائم در حال تغییره. یک فرآیند Just-In-Time
💻 از طرف دیگه، کد هم ساکت نیست. وقتی مدل رو پیادهسازی میکنیم، کد بهمون میگه کجای مدل سادهسازی بیش از حد داشتیم یا کجا درکمون اشتباه بوده. حتی ممکنه راهحلهای دیروزمون، الان خودشون مشکلزا شده باشن. در واقع، کد تبدیل میشه به آیینهی مدل — همونقدر که مدل راهنمای کده، کد هم راهنمای مدل میشه.
♻️ این تعامل بین چهار ضلع طراحی نرمافزار — زبان، مدل، متخصصان دامنه و کد — یه چرخهی بازخورد دائمی میسازه. چرخهای که باعث میشه نرمافزار هم دقیقتر بشه، هم قابل نگهداریتر، و هم واقعاً به درد بخور.
مدل، فقط یه ابزار طراحی نیست. قلب فهم مشترک تیمه. اونجاست که مسئله شفاف میشه، و راهحل معنا پیدا میکنه.
https://domaindrivendesign.ir/the-four-angles-of-software-design/
وقتی از طراحی نرمافزار حرف میزنیم، خیلیها سریع میرن سراغ معماری، فریمورک، یا ساختارهای کدی. ولی اصل ماجرا از یه جای دیگه شروع میشه: مدل. مدلی که قراره بین آدمها و کد یه پل بزنه، و ریشهش توی دنیای واقعی باشه.
تو رویکرد DDD، مدل فقط یه دیاگرام نیست؛ یه گفتوگوی زندهست، یه ابزار برای درک و بازنمایی مسئله — نه صرفاً راهحل.
👥 یکی از ضلعهای مهم طراحی، متخصصان دامنهان. آدمهایی که از نزدیک با مسئله سر و کار دارن. اگه باهاشون گفتوگو نکنیم، مدلمون تبدیل میشه به یه سری حدس و گمان. ولی اگه زبان مشترک بسازیم و مفاهیم رو دقیق ازشون بگیریم، مدل ما هم واقعیتر و هم قابل استفادهتر میشه.
💬 مدلسازی یه فرایند لحظهای نیست، یه مسیر تدریجیه. وسط گفتوگوها شکل میگیره، توی برخورد با واقعیتها اصلاح میشه، و دائم در حال تغییره. یک فرآیند Just-In-Time
💻 از طرف دیگه، کد هم ساکت نیست. وقتی مدل رو پیادهسازی میکنیم، کد بهمون میگه کجای مدل سادهسازی بیش از حد داشتیم یا کجا درکمون اشتباه بوده. حتی ممکنه راهحلهای دیروزمون، الان خودشون مشکلزا شده باشن. در واقع، کد تبدیل میشه به آیینهی مدل — همونقدر که مدل راهنمای کده، کد هم راهنمای مدل میشه.
♻️ این تعامل بین چهار ضلع طراحی نرمافزار — زبان، مدل، متخصصان دامنه و کد — یه چرخهی بازخورد دائمی میسازه. چرخهای که باعث میشه نرمافزار هم دقیقتر بشه، هم قابل نگهداریتر، و هم واقعاً به درد بخور.
مدل، فقط یه ابزار طراحی نیست. قلب فهم مشترک تیمه. اونجاست که مسئله شفاف میشه، و راهحل معنا پیدا میکنه.
https://domaindrivendesign.ir/the-four-angles-of-software-design/
مکتبخانه DDD
چهار ضلع طراحی نرمافزار – زبان، مدل، متخصصان دامنه و کد | مکتبخانه DDD
مدل نرمافزار یه گفتوگوی دائمیه، هم با آدمای متخصص حوزه (خبرگان دامنه) و هم با خود کد طراحی نرمافزار بر پایهی مدل، قلب ماجرای DDD محسوب میشه. مدل صرفاً یه نقشه یا دیاگرام نیست؛ بلکه عنصری زنده و فعال در کل فرایند طراحی و توسعهست. مهمتر از همه، ما فقط…
👍3👏1
🚀مقایسه Exploratory Domain Discovery با EventStorming و Domain Story Telling
از چت جیپیتی پرسیدم که Exploratory Domain Discovery رو با دو رویکرد متداول و شناخته شدهی دیگر یعنی EventStorming و Domain Story Telling مقایسه کند.
https://exploratorydomaindiscovery.com/
از چت جیپیتی پرسیدم که Exploratory Domain Discovery رو با دو رویکرد متداول و شناخته شدهی دیگر یعنی EventStorming و Domain Story Telling مقایسه کند.
https://exploratorydomaindiscovery.com/
❤1
کانال مکتبخانه DDD
🚀مقایسه Exploratory Domain Discovery با EventStorming و Domain Story Telling از چت جیپیتی پرسیدم که Exploratory Domain Discovery رو با دو رویکرد متداول و شناخته شدهی دیگر یعنی EventStorming و Domain Story Telling مقایسه کند. https://exploratorydom…
تصور کنید میخواهید بفهمید یک سیستم حقوق و دستمزد آنلاین چطور کار میکند.
🟡 ایونت استورمینگ: چه اتفاقی چه زمانی میافتد؟ ⏰
مثل این است که یک جدول زمانی از تمام اتفاقات مهم در سیستم حقوق و دستمزد درست کنید.
⬅ تمرکز: ترتیب رویدادها.
⬅ شروع: اولین رویداد مهم چیست؟ شاید «اطلاعات کارمند ثبت شد». بعدش چی؟ «ساعتهای کاری وارد شد». بعد چی؟ «حقوق محاسبه شد». بعد «پرداخت انجام شد».
⬅ شبیه: کشیدن یک نمودار جریان ساده از تمام مراحل کلیدی در پرداخت حقوق.
🔴 دومین استوری تلینگ: چه کسی چه کاری میکند؟ 👤⚙️
مثل این است که داستانهای سادهای درباره افرادی که با سیستم حقوق و دستمزد کار میکنند تعریف کنید.
⬅ تمرکز: چه کسی چه عملی انجام میدهد.
⬅ شروع: تصور کنید یک «مدیر منابع انسانی» «اطلاعات کارمند جدید» را «وارد سیستم میکند». این یک داستان است. تصور کنید «سیستم» به صورت خودکار «مالیات» را از «حقوق» «کسر میکند». این یک داستان دیگر است.
⬅ شبیه : درست کردن یک نوار خیلی ساده از داستانهای فرآیندهای مختلف در سیستم است، که نشان میدهد افراد مختلف (مدیر منابع انسانی، کارمند، سیستم) چه کارهایی انجام میدهند.
🟢 Exploratory Domain Discovery:
نقطه کانونی و مرکزی و هستهی اصلی در مسئله حقوق و دستمزد چیست؟ 🎯
مثل این است که بفهمید هدف اصلی این سیستم حقوق و دستمزد چیست.
⬅ تمرکز: هدف اصلی و مهمترین چیز.
⬅ شروع: چرا این سیستم حقوق و دستمزد وجود دارد؟ شاید هدف اصلی «پرداخت دقیق و به موقع حقوق به کارمندان» باشد. بعد به این فکر میکنید که برای رسیدن به این هدف چه چیزهایی واقعاً ضروری است (اطلاعات کارمندان، اطلاعات مربوط به حقوق و دستمزد، محاسبات حقوق، فرایند پرداخت).
⬅ شبیه: کشیدن یک دایره ساده با ایده اصلی «پرداخت دقیق و به موقع حقوق»، و بعد کشیدن دایرههای دیگر دور آن برای تمام مفاهیم مهم مرتبط (اطلاعات کارمند، قوانین مالیاتی، گزارشهای حقوقی). هر زمان نیاز باشد میتوانیم زوم را در هر جای این دایره را بیشتر یا کمتر کنیم.
----------------------------
💡 در مجموع:
• ایونت استورمینگ: نشان میدهد مراحل پرداخت حقوق به چه ترتیبی انجام میشود.
• دامین استوری تلینگ: نشان میدهد چه کسی در فرایند پرداخت حقوق چه کاری انجام میدهد.
• EDD: کمک میکند بفهمید هدف اصلی سیستم حقوق و دستمزد چیست و مهمترین بخشهایی که باید روی آنها تمرکز کنید کدامند.
در نهایت اینکه EDD به شما کمک میکند قبل از اینکه به جزئیات فرایندها یا تعاملات بپردازید، درک کنید که هدف اصلی سیستم چیست و چه اجزایی برای دستیابی به آن حیاتی هستند.
🟡 ایونت استورمینگ: چه اتفاقی چه زمانی میافتد؟ ⏰
مثل این است که یک جدول زمانی از تمام اتفاقات مهم در سیستم حقوق و دستمزد درست کنید.
⬅ تمرکز: ترتیب رویدادها.
⬅ شروع: اولین رویداد مهم چیست؟ شاید «اطلاعات کارمند ثبت شد». بعدش چی؟ «ساعتهای کاری وارد شد». بعد چی؟ «حقوق محاسبه شد». بعد «پرداخت انجام شد».
⬅ شبیه: کشیدن یک نمودار جریان ساده از تمام مراحل کلیدی در پرداخت حقوق.
🔴 دومین استوری تلینگ: چه کسی چه کاری میکند؟ 👤⚙️
مثل این است که داستانهای سادهای درباره افرادی که با سیستم حقوق و دستمزد کار میکنند تعریف کنید.
⬅ تمرکز: چه کسی چه عملی انجام میدهد.
⬅ شروع: تصور کنید یک «مدیر منابع انسانی» «اطلاعات کارمند جدید» را «وارد سیستم میکند». این یک داستان است. تصور کنید «سیستم» به صورت خودکار «مالیات» را از «حقوق» «کسر میکند». این یک داستان دیگر است.
⬅ شبیه : درست کردن یک نوار خیلی ساده از داستانهای فرآیندهای مختلف در سیستم است، که نشان میدهد افراد مختلف (مدیر منابع انسانی، کارمند، سیستم) چه کارهایی انجام میدهند.
🟢 Exploratory Domain Discovery:
نقطه کانونی و مرکزی و هستهی اصلی در مسئله حقوق و دستمزد چیست؟ 🎯
مثل این است که بفهمید هدف اصلی این سیستم حقوق و دستمزد چیست.
⬅ تمرکز: هدف اصلی و مهمترین چیز.
⬅ شروع: چرا این سیستم حقوق و دستمزد وجود دارد؟ شاید هدف اصلی «پرداخت دقیق و به موقع حقوق به کارمندان» باشد. بعد به این فکر میکنید که برای رسیدن به این هدف چه چیزهایی واقعاً ضروری است (اطلاعات کارمندان، اطلاعات مربوط به حقوق و دستمزد، محاسبات حقوق، فرایند پرداخت).
⬅ شبیه: کشیدن یک دایره ساده با ایده اصلی «پرداخت دقیق و به موقع حقوق»، و بعد کشیدن دایرههای دیگر دور آن برای تمام مفاهیم مهم مرتبط (اطلاعات کارمند، قوانین مالیاتی، گزارشهای حقوقی). هر زمان نیاز باشد میتوانیم زوم را در هر جای این دایره را بیشتر یا کمتر کنیم.
----------------------------
💡 در مجموع:
• ایونت استورمینگ: نشان میدهد مراحل پرداخت حقوق به چه ترتیبی انجام میشود.
• دامین استوری تلینگ: نشان میدهد چه کسی در فرایند پرداخت حقوق چه کاری انجام میدهد.
• EDD: کمک میکند بفهمید هدف اصلی سیستم حقوق و دستمزد چیست و مهمترین بخشهایی که باید روی آنها تمرکز کنید کدامند.
در نهایت اینکه EDD به شما کمک میکند قبل از اینکه به جزئیات فرایندها یا تعاملات بپردازید، درک کنید که هدف اصلی سیستم چیست و چه اجزایی برای دستیابی به آن حیاتی هستند.
👍4👌1
Forwarded from انجمن DDD ایران
🔍 معرفی مختصر Exploratory Domain Discovery (EDD)
رویکرد EDD روشی است برای کشف و درک عمیقتر مسئله، پیش از آنکه وارد طراحی یا توسعه نرمافزار شویم. برخلاف بسیاری از روشهای رایج که از ابتدا به دنبال جزئیات میروند، EDD از پایان آغاز میکند — جایی که نتیجه یا خروجی مورد انتظار سیستم قرار دارد — و با نگاهی معکوس، به عقب بازمیگردد تا مفاهیم پنهان و ساختارهای بنیادین دامنه را آشکار کند.
این رویکرد، ریشه در تفکر سیستماتیک و روایتمحور دارد. درست مثل یک فیلم یا رمان که همهی اتفاقات برای انتقال یک پیام اصلی طراحی شدهاند، در دامنهی یک نرمافزار هم بیشتر اجزای سیستم در خدمت یک «مفهوم کلیدی» یا همان Main Point هستند؛ چیزی که بدون آن، کل ساختار بیمعنا میشود. در EDD ما تلاش میکنیم این نقطهی مرکزی را پیدا کرده و روابط علّی و ساختارهای اطراف آن را کشف کنیم.
🌀 فرآیند اکتشاف در EDD بهصورت چرخشی (Iterative) و عرضی (Breadth-First) انجام میشود. فرض کنید Main Point در مرکز یکسری دایرهی هممرکز قرار دارد. در دور اول، تصویری کلی و انتزاعی از دامنه ساخته میشود. در دورهای بعدی، این دایره تنگتر شده و وارد جزئیات بیشتری میشویم. این مدلسازی لایهلایه، کمک میکند پیچیدگیها را بهتر درک کرده و رفتارهای تکرارشونده را بشناسیم.
✨ یکی از ویژگیهای کلیدی EDD، روایت معکوس (Backward Storytelling) است — یعنی بهجای اینکه با «از کجا شروع کنیم؟» آغاز کنیم، میپرسیم: «ته داستان چیست؟». این دیدگاه باعث میشود روابط علت و معلولی واضحتر و دقیقتر دیده شوند.
🧩 در EDD ما با سه ابزار اصلی کار میکنیم:
🟦 مفهوم Domain Concept: هر مفهوم کلیدی که در دامنه وجود دارد را روی یک کارت مینویسیم.
🔄 مفهوم Relation : رابطهی بین این مفاهیم را مشخص میکنیم، از انتها به ابتدا.
📝 مفهوم Example : برای هر مفهوم، یک نمونه واقعی و قابل لمس مینویسیم تا فهم مشترک بین افراد تیم شکل بگیرد.
🎯 مثال کاربردی:
فرض کنید در حال تحلیل یک سیستم حقوق و دستمزد هستید.
از سؤال «ته داستان چیست؟» شروع میکنیم: مثلاً صدور فیش حقوقی خروجی نهایی است. آن را روی یک کارت مفهومی (domain concept) یادداشت میکنیم. سپس یک گام به عقب: فیش حقوقی حاصل محاسبهی فرمولهای حقوق است. این فرمولها هم بر اساس کارکرد ماهانهی کارمند محاسبه میشوند.
با همین روال، مفاهیم را از پایان به ابتدا کشف و یادداشت میکنیم. سپس روابط میان آنها را (باز هم از انتها به ابتدا) ثبت میکنیم. در پایان، برای هر مفهوم یک مثال واقعی (concrete example) مینویسیم تا از درستی و شفافیت مدل اطمینان حاصل شود.
🧠 فلسفهی EDD:
• بهرهگیری از تفکر سیستماتیک و روایتمحور
• تمرکز بر کشف تدریجی و دید کلنگر به دامنه
• مدلسازی چرخشی برای کشف رفتارهای تکرارشونده دامنه
🔁 الگوهای رایج (Patterns):
• چرخههای زمانی مثل حقوق ماهیانه یا فرایند رزرو
• مفهوم کلیدی (Main Point) که سایر اجزای دامنه حول آن شکل میگیرند
• روایت معکوس برای کشف روابط علت و معلولی
✅ در نهایت اینکه:
EDD ابزارهای سادهای داره — مثل کارتهای مفهومی و مثال — اما قدرتش در طرز فکر پشتشه: اینکه قبل از ورود به طراحی یا کدنویسی، دقیقاً بفهمیم چه چیزی را طراحی میکنیم و چرا.
📎 اطلاعات بیشتر:
https://exploratorydomaindiscovery.com
-انجمن DDD ایران
@DDD_Iran
رویکرد EDD روشی است برای کشف و درک عمیقتر مسئله، پیش از آنکه وارد طراحی یا توسعه نرمافزار شویم. برخلاف بسیاری از روشهای رایج که از ابتدا به دنبال جزئیات میروند، EDD از پایان آغاز میکند — جایی که نتیجه یا خروجی مورد انتظار سیستم قرار دارد — و با نگاهی معکوس، به عقب بازمیگردد تا مفاهیم پنهان و ساختارهای بنیادین دامنه را آشکار کند.
این رویکرد، ریشه در تفکر سیستماتیک و روایتمحور دارد. درست مثل یک فیلم یا رمان که همهی اتفاقات برای انتقال یک پیام اصلی طراحی شدهاند، در دامنهی یک نرمافزار هم بیشتر اجزای سیستم در خدمت یک «مفهوم کلیدی» یا همان Main Point هستند؛ چیزی که بدون آن، کل ساختار بیمعنا میشود. در EDD ما تلاش میکنیم این نقطهی مرکزی را پیدا کرده و روابط علّی و ساختارهای اطراف آن را کشف کنیم.
🌀 فرآیند اکتشاف در EDD بهصورت چرخشی (Iterative) و عرضی (Breadth-First) انجام میشود. فرض کنید Main Point در مرکز یکسری دایرهی هممرکز قرار دارد. در دور اول، تصویری کلی و انتزاعی از دامنه ساخته میشود. در دورهای بعدی، این دایره تنگتر شده و وارد جزئیات بیشتری میشویم. این مدلسازی لایهلایه، کمک میکند پیچیدگیها را بهتر درک کرده و رفتارهای تکرارشونده را بشناسیم.
✨ یکی از ویژگیهای کلیدی EDD، روایت معکوس (Backward Storytelling) است — یعنی بهجای اینکه با «از کجا شروع کنیم؟» آغاز کنیم، میپرسیم: «ته داستان چیست؟». این دیدگاه باعث میشود روابط علت و معلولی واضحتر و دقیقتر دیده شوند.
🧩 در EDD ما با سه ابزار اصلی کار میکنیم:
🟦 مفهوم Domain Concept: هر مفهوم کلیدی که در دامنه وجود دارد را روی یک کارت مینویسیم.
🔄 مفهوم Relation : رابطهی بین این مفاهیم را مشخص میکنیم، از انتها به ابتدا.
📝 مفهوم Example : برای هر مفهوم، یک نمونه واقعی و قابل لمس مینویسیم تا فهم مشترک بین افراد تیم شکل بگیرد.
🎯 مثال کاربردی:
فرض کنید در حال تحلیل یک سیستم حقوق و دستمزد هستید.
از سؤال «ته داستان چیست؟» شروع میکنیم: مثلاً صدور فیش حقوقی خروجی نهایی است. آن را روی یک کارت مفهومی (domain concept) یادداشت میکنیم. سپس یک گام به عقب: فیش حقوقی حاصل محاسبهی فرمولهای حقوق است. این فرمولها هم بر اساس کارکرد ماهانهی کارمند محاسبه میشوند.
با همین روال، مفاهیم را از پایان به ابتدا کشف و یادداشت میکنیم. سپس روابط میان آنها را (باز هم از انتها به ابتدا) ثبت میکنیم. در پایان، برای هر مفهوم یک مثال واقعی (concrete example) مینویسیم تا از درستی و شفافیت مدل اطمینان حاصل شود.
🧠 فلسفهی EDD:
• بهرهگیری از تفکر سیستماتیک و روایتمحور
• تمرکز بر کشف تدریجی و دید کلنگر به دامنه
• مدلسازی چرخشی برای کشف رفتارهای تکرارشونده دامنه
🔁 الگوهای رایج (Patterns):
• چرخههای زمانی مثل حقوق ماهیانه یا فرایند رزرو
• مفهوم کلیدی (Main Point) که سایر اجزای دامنه حول آن شکل میگیرند
• روایت معکوس برای کشف روابط علت و معلولی
✅ در نهایت اینکه:
EDD ابزارهای سادهای داره — مثل کارتهای مفهومی و مثال — اما قدرتش در طرز فکر پشتشه: اینکه قبل از ورود به طراحی یا کدنویسی، دقیقاً بفهمیم چه چیزی را طراحی میکنیم و چرا.
📎 اطلاعات بیشتر:
https://exploratorydomaindiscovery.com
-انجمن DDD ایران
@DDD_Iran
Exploratorydomaindiscovery
Exploratory Domain Discovery | The art of Strategic Decision-Making
Exploratory Domain Discovery is yet another collaborative modelling and designing tool, that
helps a team be on the same page about the complex domain being modelled. It helps you with a
model that can back your strategic decision making.
helps a team be on the same page about the complex domain being modelled. It helps you with a
model that can back your strategic decision making.
👍1
بالاخره فهمیدم که Monad اونقدرها هم وحشتناک نیست! 🤔
به بیان ساده، Monad یک الگوی طراحی هست که از Category Theory وام گرفته شده و در برنامهنویسی، به خصوص در زبانهای functional، برای ترکیب عملیاتی که نیاز به تغییر state دارند (و به عبارت دیگه دارای side effects هستند) به یک روش predictable، clear و declarative استفاده میشود.
مونادها به ما این امکان رو میدن که عملیاتها رو به راحتی پشت هم بچینیم، بدون اینکه نگران خطاها یا مشکلات اجرایی باشیم.
حالا سوال اینه که Monads چطور کمک میکنه؟ 🤔
به زبان ساده، Monad یک ساختار دادهای هست که میتونه مقادیر رو در خودش نگه داره و به طور امن و مرتب عملیاتهای مختلف رو روش انجام بده. مهمتر از همه، اینکه میتونه با خطاها یا کارهای asynchronous به شکل ساده برخورد کنه. ⚡
ویژگیهای اصلی Monad ✨
یک Monad معمولاً سه ویژگی اساسی دارد:
1- ویژگی return یا unit یا construct: این متد یک مقدار رو به نوع Monadic تبدیل میکنه. به عبارت دیگه، اگر شما یک مقدار ساده (مثل یک عدد یا رشته) داشته باشید، با استفاده از این متد میتونید آن رو در یک Monad قرار بدید.
2- ویژگی bind یا flatMap: این متد به شما این امکان رو میده که عملیاتهایی رو روی مقدار داخل Monad انجام بدید. bind تضمین میکنه که نتیجه هر عملیات همچنان یک Monad باقی میمونه و میتونید آن رو به راحتی به عملیاتهای بعدی وصل کنید.
3- ترکیب آسان با سایر عملیاتها: Monads به شما این امکان رو میدهند که چندین عملیات رو به شکلی صاف و بدون نیاز به نوشتن کد پیچیده ترکیب کنید. این امکان بهویژه در asynchronous programming و side effects بسیار مفید است. ⚙️
در واقع، Monads ساختارهایی هستند که میتونند مقادیر رو توی خودشون نگه دارند و عملیاتهای مختلف رو بر روی آن مقادیر انجام بدهند، به طوری که میتوان از آنها در شرایط مختلف مانند side effects، asynchronous بودن، و مدیریت خطاها استفاده کرد.
یه مثال ساده
فرض کنید داریم یک سفارش آنلاین میگیریم. اول باید چک کنیم که آیا موجودی داریم یا نه، بعد پرداخت رو انجام بدیم، و در نهایت وضعیت سفارش رو به روز کنیم. اگر هرکدوم از این مراحل با مشکلی مواجه بشه (مثلاً موجودی کافی نباشه یا پرداخت شکست بخوره)، باید خطا رو مدیریت کنیم.
پیادهسازی مثال بالا در Haskell:
به بیان ساده، Monad یک الگوی طراحی هست که از Category Theory وام گرفته شده و در برنامهنویسی، به خصوص در زبانهای functional، برای ترکیب عملیاتی که نیاز به تغییر state دارند (و به عبارت دیگه دارای side effects هستند) به یک روش predictable، clear و declarative استفاده میشود.
مونادها به ما این امکان رو میدن که عملیاتها رو به راحتی پشت هم بچینیم، بدون اینکه نگران خطاها یا مشکلات اجرایی باشیم.
حالا سوال اینه که Monads چطور کمک میکنه؟ 🤔
به زبان ساده، Monad یک ساختار دادهای هست که میتونه مقادیر رو در خودش نگه داره و به طور امن و مرتب عملیاتهای مختلف رو روش انجام بده. مهمتر از همه، اینکه میتونه با خطاها یا کارهای asynchronous به شکل ساده برخورد کنه. ⚡
ویژگیهای اصلی Monad ✨
یک Monad معمولاً سه ویژگی اساسی دارد:
1- ویژگی return یا unit یا construct: این متد یک مقدار رو به نوع Monadic تبدیل میکنه. به عبارت دیگه، اگر شما یک مقدار ساده (مثل یک عدد یا رشته) داشته باشید، با استفاده از این متد میتونید آن رو در یک Monad قرار بدید.
2- ویژگی bind یا flatMap: این متد به شما این امکان رو میده که عملیاتهایی رو روی مقدار داخل Monad انجام بدید. bind تضمین میکنه که نتیجه هر عملیات همچنان یک Monad باقی میمونه و میتونید آن رو به راحتی به عملیاتهای بعدی وصل کنید.
3- ترکیب آسان با سایر عملیاتها: Monads به شما این امکان رو میدهند که چندین عملیات رو به شکلی صاف و بدون نیاز به نوشتن کد پیچیده ترکیب کنید. این امکان بهویژه در asynchronous programming و side effects بسیار مفید است. ⚙️
در واقع، Monads ساختارهایی هستند که میتونند مقادیر رو توی خودشون نگه دارند و عملیاتهای مختلف رو بر روی آن مقادیر انجام بدهند، به طوری که میتوان از آنها در شرایط مختلف مانند side effects، asynchronous بودن، و مدیریت خطاها استفاده کرد.
یه مثال ساده
فرض کنید داریم یک سفارش آنلاین میگیریم. اول باید چک کنیم که آیا موجودی داریم یا نه، بعد پرداخت رو انجام بدیم، و در نهایت وضعیت سفارش رو به روز کنیم. اگر هرکدوم از این مراحل با مشکلی مواجه بشه (مثلاً موجودی کافی نباشه یا پرداخت شکست بخوره)، باید خطا رو مدیریت کنیم.
پیادهسازی مثال بالا در Haskell:
data Order
= Order { orderId :: Int, product :: String, quantity :: Int }
checkStock:: Order -> Maybe Order
checkStock
order
| quantity order > 0 = Justorder
| otherwise = Nothing
processPayment
:: Order -> Maybe Order
processPayment
order = Just order
updateOrder:: Order -> Maybe Order
updateOrder
order = Just order
processOrder
:: Order -> Maybe Order
processOrderorder = do
stockChecked <- checkStock
order
paymentProcessed <-processPayment stockChecked
updateOrder paymentProcessed
main :: IO ()
main = do
let order = Order { orderId = 1,product = "Laptop", quantity = 5 }
case processOrder order of
Just o -> putStrLn $ "Order processed:
" ++ show o
Nothing -> putStrLn"Order failed"
به نظرتون شما در زبانهایی مثل C# یا Java چطور میتونید از این ویژگی استفاده کنید؟👍3
کانال مکتبخانه DDD
بالاخره فهمیدم که Monad اونقدرها هم وحشتناک نیست! 🤔 به بیان ساده، Monad یک الگوی طراحی هست که از Category Theory وام گرفته شده و در برنامهنویسی، به خصوص در زبانهای functional، برای ترکیب عملیاتی که نیاز به تغییر state دارند (و به عبارت دیگه دارای side effects…
یکی از بهترین تعاریف و توضیحات در مورد مفهوم Monad قطعا این ویدئوی فوقالعاده Brian Beckman هست. پیشنهاد میکنم این ویدئو ارزشمند رو از دست ندید
https://www.youtube.com/watch?v=ZhuHCtR3xq8
https://www.youtube.com/watch?v=ZhuHCtR3xq8
YouTube
Brian Beckman: Don't fear the Monad
Cross posted from msdn's channel 9.
Functional programming is increasing in popularity these days given the inherent problems with shared mutable state that is rife in the imperative world. As we march on to a world of multi and many-core chipsets, software…
Functional programming is increasing in popularity these days given the inherent problems with shared mutable state that is rife in the imperative world. As we march on to a world of multi and many-core chipsets, software…
🔁 در پست قبلی گفتیم Monad چیه و چطور میتونه به ما کمک کنه که عملیاتهای پیچیده رو به صورت امن، خوانا و قابل پیشبینی اجرا کنیم—حتی وقتی با چیزهایی مثل async، side effect یا خطا سروکار داریم.
👨💻 حالا میتونیم یه ابزار واقعی رو ببینیم که برای همین موضوع توسعه دادم و این مفاهیم رو توی c# پیادهسازی کردم!
📦 کتابخونهی Quantum.MonadicTasks یه لایبرری مینیمال و تمیز برای کار با Task<T> به شکل Monadic هست. باهاش میتونی:
✅ ملیاتهای async رو زنجیرهای و functional ترکیب کنی
✅ از متدهایی مثل .Bind(), .Map(), .Fail() و .Tap() استفاده کنی
✅ بدون try/catch شلوغ، خطاها رو مدیریت کنی
✅ کدت رو مثل do notation در Haskell بنویسی
✅ کدی قابل تست، قابل خواندن، و قابل توسعه بنویسی
📌 چند تا از امکانات مهمش:
• .Bind() برای زنجیره کردن عملیات async
• .Map() برای تغییر نتیجه بدون await دستی
• .Fail() برای تولید خطا بهصورت monadic
• .PerformSideEffect() برای side effectهایی مثل log یا metric
• .Sequence() برای اجرای چند عملیات async باهم
• .GetResultAsync() برای گرفتن نتیجه یا throw کردن خطا
📁 یه مثال واقعی از سفارش آنلاین: بررسی موجودی، انجام پرداخت، و آپدیت سفارش… همه توی یه زنجیرهی امن، بدون کد اضافی یا if تو در تو!
📍 این لایبرری برای پروژههای واقعی و مقیاسپذیر طراحی شده و توی Benchmark هم عملکرد قابل قبولی از خودش نشون داده.
🔗 کدش اینجاست، خوشحال میشم ببینی و نظرت رو بگی:
👉 https://github.com/Quantum-Space-Org/MonadicTasks
مکتبخانه DDD
@DomainDrivenDesign_ir
👨💻 حالا میتونیم یه ابزار واقعی رو ببینیم که برای همین موضوع توسعه دادم و این مفاهیم رو توی c# پیادهسازی کردم!
📦 کتابخونهی Quantum.MonadicTasks یه لایبرری مینیمال و تمیز برای کار با Task<T> به شکل Monadic هست. باهاش میتونی:
✅ ملیاتهای async رو زنجیرهای و functional ترکیب کنی
✅ از متدهایی مثل .Bind(), .Map(), .Fail() و .Tap() استفاده کنی
✅ بدون try/catch شلوغ، خطاها رو مدیریت کنی
✅ کدت رو مثل do notation در Haskell بنویسی
✅ کدی قابل تست، قابل خواندن، و قابل توسعه بنویسی
📌 چند تا از امکانات مهمش:
• .Bind() برای زنجیره کردن عملیات async
• .Map() برای تغییر نتیجه بدون await دستی
• .Fail() برای تولید خطا بهصورت monadic
• .PerformSideEffect() برای side effectهایی مثل log یا metric
• .Sequence() برای اجرای چند عملیات async باهم
• .GetResultAsync() برای گرفتن نتیجه یا throw کردن خطا
📁 یه مثال واقعی از سفارش آنلاین: بررسی موجودی، انجام پرداخت، و آپدیت سفارش… همه توی یه زنجیرهی امن، بدون کد اضافی یا if تو در تو!
await MonadicTask<Order>.Return(order)
.Bind(CheckStockAsync)
.PerformSideEffect(LogStockChecked)
.Bind(ProcessPaymentAsync)
.PerformSideEffect(LogPaymentSuccess)
.Bind(UpdateOrderStatusAsync)
.GetResultAsync();
📍 این لایبرری برای پروژههای واقعی و مقیاسپذیر طراحی شده و توی Benchmark هم عملکرد قابل قبولی از خودش نشون داده.
🔗 کدش اینجاست، خوشحال میشم ببینی و نظرت رو بگی:
👉 https://github.com/Quantum-Space-Org/MonadicTasks
مکتبخانه DDD
@DomainDrivenDesign_ir
GitHub
GitHub - Quantum-Space-Org/MonadicTasks
Contribute to Quantum-Space-Org/MonadicTasks development by creating an account on GitHub.
👍1
💡 مقایسهی پارادایمهای برنامهنویسی — از Flow-Based تا State-Centric
در مسیر تحول برنامهنویسی، از تفکر flow-based با تکیه بر functionها، رفتیم به سمت ساختارهای state-centric و assignment-driven — و در این بین، شاید چیزی مهم مثل وضوح جریان داده رو از دست دادیم.
۱- Functional Programming (FP) — function-driven، flow-based
✅ توابع هستهی اصلی محاسبات هستن.
✅ توابع بهعنوان داده در نظر گرفته میشه؛ میتونه ترکیب بشه.
✅ تمرکز روی جریان صریح داده بین functionهاست.
✅ ساده، قابل پیشبینی، بدون state پنهان.
⚠️ مدلسازی سیستمهای واقعی و stateful در این پارادایم محدودتره.
۲- Object-Oriented Programming (OOP) — state-centric، assignment-driven
✅ توابع مرتبط بههمراه state مشترک در قالب objectها قرار میگیرن.
✅ باعث modularity و استفادهی مجدد از کد میشه.
⚠️ ولی جریان هندل کردن یک سناریو implicit میشه — توی methodها و تغییرات داخلی state پنهانه.
⚠️ منطق حول assign و تغییر وضعیت- change state- میچرخه، نه حول جریان.
۳- Actor Model — agent-centric، message-driven
✅ پارادایم OOP رو یه قدم جلوتر میبره: objectها به agentهای مستقل تبدیل میشن.
✅ این agentها فقط با پیامهای async با هم حرف میزنن.
✅ برای سیستمهای concurrent و توزیعشده عالیه.
⚠️ اما باز هم جریان داده پراکنده و پنهانه — در زنجیرههای پیام و actorهای جدا.
--------------------------------------
👉 در این مسیر، از flow-based logic به سمت ساختار و مقیاسپذیری رفتیم — ولی اغلب با هزینهی از دست دادن وضوح جریان داده.
🧭 آیا میتونیم دوباره بین اینها تعادل ایجاد کنیم؟
در مسیر تحول برنامهنویسی، از تفکر flow-based با تکیه بر functionها، رفتیم به سمت ساختارهای state-centric و assignment-driven — و در این بین، شاید چیزی مهم مثل وضوح جریان داده رو از دست دادیم.
۱- Functional Programming (FP) — function-driven، flow-based
✅ توابع هستهی اصلی محاسبات هستن.
✅ توابع بهعنوان داده در نظر گرفته میشه؛ میتونه ترکیب بشه.
✅ تمرکز روی جریان صریح داده بین functionهاست.
✅ ساده، قابل پیشبینی، بدون state پنهان.
⚠️ مدلسازی سیستمهای واقعی و stateful در این پارادایم محدودتره.
۲- Object-Oriented Programming (OOP) — state-centric، assignment-driven
✅ توابع مرتبط بههمراه state مشترک در قالب objectها قرار میگیرن.
✅ باعث modularity و استفادهی مجدد از کد میشه.
⚠️ ولی جریان هندل کردن یک سناریو implicit میشه — توی methodها و تغییرات داخلی state پنهانه.
⚠️ منطق حول assign و تغییر وضعیت- change state- میچرخه، نه حول جریان.
۳- Actor Model — agent-centric، message-driven
✅ پارادایم OOP رو یه قدم جلوتر میبره: objectها به agentهای مستقل تبدیل میشن.
✅ این agentها فقط با پیامهای async با هم حرف میزنن.
✅ برای سیستمهای concurrent و توزیعشده عالیه.
⚠️ اما باز هم جریان داده پراکنده و پنهانه — در زنجیرههای پیام و actorهای جدا.
--------------------------------------
👉 در این مسیر، از flow-based logic به سمت ساختار و مقیاسپذیری رفتیم — ولی اغلب با هزینهی از دست دادن وضوح جریان داده.
🧭 آیا میتونیم دوباره بین اینها تعادل ایجاد کنیم؟
👍3
Loop vs Recursion.pdf
330.4 KB
🎯 درک عمیق control flow یکی از پایههای اصلی برنامهنویسیه. در این مقاله به بررسی تفاوتهای بین loop و recursion پرداختم و نشون دادم که چرا این انتخابها فراتر از syntax ساده هستن و به mental models ما برمیگردن.
اگه شما هم تجربهای در این زمینه دارید یا سوالی براتون پیش اومده، حتماً تو کامنتها باهام به اشتراک بذارید. خوشحال میشم نظر شما رو هم بدونم .
اگه شما هم تجربهای در این زمینه دارید یا سوالی براتون پیش اومده، حتماً تو کامنتها باهام به اشتراک بذارید. خوشحال میشم نظر شما رو هم بدونم .