<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"><channel><title>نوشته های Bamirno</title><link>https://virgool.ir/feed/@Bamirno</link><description>برنامه نویس بلند پروازی که لذت میبره از تجربه های جدید</description><language>fa</language><pubDate>2026-11-11 13:28:04</pubDate><image><url>https://files.virgool.ir/upload/users/193905/avatar/61Gs3Q.jpg</url><title>Bamirno</title><link>https://virgool.ir/@Bamirno</link></image><item><title>انواع متغیر ها در C# به تفکیک حافظه</title><link>https://virgool.ir/@Bamirno/انواع-متغیر-ها-در-c-به-تفکیک-حافظه-c43ic66iwcs8</link><description>در C#، متغیرها به طور عمده به دو دسته تقسیم می‌شوند: متغیرهای Compile-Time و متغیرهای Run-Time. تفاوت اصلی بین این دو نوع در زمانی است که حافظه برای آنها اختصاص داده می‌شود:متغیرهای Compile-Time (زمان کامپایل): این نوع متغیرها به طور کامل در زمان کامپایل مقداردهی می‌شوند و حافظه برای آنها در این مرحله تخصیص داده می‌شود. این متغیرها به طور استاتیک تعریف می‌شوند و مقدار آنها ثابت و پیش‌فرض است.مثال:int x = 10; // متغیر Compile-Time&#xA;const int y = 20; // متغیر Compile-Time با مقدار ثابتدر این مثال، متغیرهای x و y به طور کامل در زمان کامپایل مقداردهی می‌شوند.متغیرهای Run-Time (زمان اجرا): این نوع متغیرها در زمان اجرا مقداردهی می‌شوند. حافظه برای آنها در زمان اجرا تخصیص داده می‌شود و مقدار آنها معمولاً توسط کاربر یا برنامه در زمان اجرا تعیین می‌شود.مثال:int z = 0; // متغیر Run-Time&#xA;string name = Console.ReadLine(); // متغیر Run-Time با مقداری که در زمان اجرا توسط کاربر وارد می‌شوددر این مثال، متغیر z در زمان اجرا مقداردهی می‌شود، و متغیر name نیز در زمان اجرا مقداری که توسط کاربر وارد می‌شود را دریافت می‌کند.به طور کلی، متغیرهای Compile-Time اطلاعات ثابت و پیش‌فرض را نمایان می‌کنند و متغیرهای Run-Time اطلاعات متغیر و ممکن است در زمان اجرا تغییر کنند.باشد که رستگار شوید ...</description><category>Bamirno</category><author>Bamirno</author><pubDate>Sat, 09 Sep 2023 17:44:15 +0330</pubDate></item><item><title>کار با توابع در C# - چطوری به function پارامتر بدیم ؟</title><link>https://virgool.ir/@Bamirno/کار-با-توابع-در-c-چطوری-به-function-پارامتر-بدیم-hygfxsfch88c</link><description>در زبان C#، پارامترها به توابع به چند روش مختلف انتقال می‌یابند. در  ادامه به انواع انتقال پارامترها و ارائه کد مثال برای هر یک از این روش‌ها  می‌پردازیم:پارامترهای ارسالی (Value Parameters): این نوع پارامترها  به صورت پیش‌فرض در C# استفاده می‌شوند. مقدار متغیرهای ارسالی به تابع به  صورت کپی فرستاده می‌شوند و تغییرات داخل تابع تاثیری بر روی متغیر اصلی  ندارند.void UpdateValue(int num)&#xA;{&#xA;    num = num * 2;&#xA;}&#xA;&#xA;int number = 10;&#xA;UpdateValue(number);&#xA;Console.WriteLine(number); // این خروجی 10 خواهد بودپارامترهای مرجع (Reference Parameters): از کلمه کلیدی ref برای انتقال پارامترهای به عنوان مرجع استفاده می‌شود. این نوع پارامترها توسط تابع تغییر مقداری در متغیر اصلی ایجاد می‌کنند.void UpdateReference(ref int num)&#xA;{&#xA;    num = num * 2;&#xA;}&#xA;&#xA;int number = 10;&#xA;UpdateReference(ref number);&#xA;Console.WriteLine(number); // این خروجی 20 خواهد بودپارامترهای خروجی (Output Parameters): از کلمه کلیدی out برای پارامترهای خروجی استفاده می‌شود. این نوع پارامترها برای انتقال مقدار از تابع به خارج از تابع به کار می‌روند.void GetOutput(out int result)&#xA;{&#xA;    result = 42;&#xA;}&#xA;&#xA;int number;&#xA;GetOutput(out number);&#xA;Console.WriteLine(number); // این خروجی 42 خواهد بودپارامترهای آرایه (Array Parameters): می‌توانید پارامترهای تابع را به صورت آرایه ارسال کنید. در این صورت تغییرات در آرایه داخل تابع نیز تاثیر می‌گذارد.void UpdateArray(int[] arr){    for (int i = 0; i &lt; arr.Length; i++)&#xA;    {&#xA;        arr[i] *= 2;&#xA;    }&#xA;}&#xA;&#xA;int[] numbers = { 1, 2, 3, 4 };&#xA;UpdateArray(numbers);&#xA;foreach (int num in numbers)&#xA;{&#xA;    Console.WriteLine(num); // این خروجی 2 4 6 8 خواهد بود&#xA;}پارامترهای آرایه با تعداد متغیر (Variable-Length Parameter Arrays): با استفاده از params، می‌توانید تعداد متغیری از پارامترها به تابع ارسال کنید. این پارامترها به صورت یک آرایه در تابع قابل دسترسی هستند.void VariableLengthParams(params int[] values)&#xA;{&#xA;    foreach (int val in values)&#xA;    {&#xA;        Console.WriteLine(val);&#xA;    }&#xA;}&#xA;&#xA;VariableLengthParams(1, 2, 3, 4, 5);&#xA;// این خروجی 1 2 3 4 5 خواهد بودامیدوارم مفید باشه ....</description><category>Bamirno</category><author>Bamirno</author><pubDate>Sat, 09 Sep 2023 16:30:31 +0330</pubDate></item><item><title>شبیه ولی متفاوت مثل Abstract و Interface</title><link>https://virgool.ir/@Bamirno/شبیه-ولی-متفاوت-مثل-abstract-و-interface-om3nfdn7ll2e</link><description>کلاس Abstract و Interface دو ویژگی مهم در زبان C# هستند که به شما اجازه  می‌دهند تا عقب‌نشینی (abstraction) و پلی‌مورفیسم را در برنامه‌نویسی  شیء‌گرا پیاده‌سازی کنید، اما دارای تفاوت‌های مهمی هستند:abstraction چیست ؟ در مهندسی نرم‌افزار و برنامه‌نویسی، &#34;Abstraction&#34; به معنای فرآیند تخصیص نمایی از جزئیات یک شیء یا یک نظام است تا فقط جوانب مهم و معنادار آن نمایش داده شود. این اصل برنامه‌نویسی به برنامه‌نویسان این امکان را می‌دهد که به شکل مفهومی و انتزاعی به مسائل نگاه کنند و جزئیات پیچیده را مخفی کنند. Abstraction یکی از اصول مهم معماری نرم‌افزار و برنامه‌نویسی شیء‌گرا است.در Abstraction، ما فقط به نکات مهم و اساسی یک موضوع توجه می‌کنیم و جزئیات پیچیده و مبهم را مخفی می‌کنیم. این به ما این امکان را می‌دهد که مفهومی از یک شیء یا نظام را تعریف کرده و با آن کار کنیم، بدون نگرانی از پیچیدگی داخلی یا جزئیات پیاده‌سازی.برای مثال، در برنامه‌نویسی شیء‌گرا، یک کلاس می‌تواند از Abstraction بهره ببرد. می‌توانید یک کلاس به عنوان یک مدل از یک مفهوم ایجاد کنید و جزئیات داخلی و پیچیدگی‌های پیاده‌سازی را مخفی کنید. سپس با استفاده از شیء ایجاد شده از این کلاس، می‌توانید با مفهوم انتزاعی کار کنید بدون آنکه نیاز به دانستن همه جزئیات داخلی کلاس داشته باشید.Abstraction یکی از اصول اصلی معماری نرم‌افزار است و به ما کمک می‌کند کد منظم‌تری بنویسیم، قابلیت تعمیر و تغییر را افزایش دهیم و تجزیه‌تحلیل و طراحی موثرتری داشته باشیم. این اصل به ما این امکان را می‌دهد که با پیچیدگی‌های مسائل برنامه‌نویسی به شکل موثرتری برخورد کنیم و برنامه‌های بهتری ایجاد کنیم.پلی‌مورفیسم چیست ؟لی‌مورفیسم یکی از مفاهیم کلیدی در برنامه‌نویسی شیء‌گرا است و به معنای &#34;بیشتر از یک شکل&#34; (Poly + Morphism) است. این مفهوم به معنای توانایی ایجاد یک رفتار یا عملکرد متفاوت در یک شیء در زمان اجرا اشاره دارد. با استفاده از پلی‌مورفیسم، می‌توانید کد خود را به شکلی نوشته و طراحی کنید که بتواند با انواع مختلفی از شیء‌ها به منظور انجام عملیات متفاوت کار کند.دو نوع پلی‌مورفیسم وجود دارد:پلی‌مورفیسم کامپایلری (Compile-time Polymorphism یا Static Polymorphism): در این نوع پلی‌مورفیسم، تصمیمات مرتبط با انتخاب تابع مناسب در زمان کامپایل اتخاذ می‌شود. این به معنای استفاده از توابع اضافی یا اورلود (Overload) و تعداد ثابت و معلومی از پارامترها می‌باشد. برای مثال، در زبان‌های برنامه‌نویسی مانند C++ و C#, می‌توانید چندین نسخه از یک تابع با نام یکسان اما با تعداد و نوع پارامترهای مختلف ایجاد کنید و در زمان کامپایل تصمیم بگیرید که کدام نسخه از تابع باید صدا زده شود.پلی‌مورفیسم اجرایی (Run-time Polymorphism یا Dynamic Polymorphism): در این نوع پلی‌مورفیسم، تصمیمات مرتبط با انتخاب تابع مناسب در زمان اجرا (runtime) اتخاذ می‌شود. این نوع پلی‌مورفیسم معمولاً با استفاده از ارث‌بری و اجرای متدها در کلاس‌های مشتق شده از یک کلاس پایه (که به عنوان والدین شناخته می‌شود) تحقق می‌یابد. در اینجا، یک شیء از نوع کلاس والدین ایجاد می‌شود و تابع مناسب به توجه به نوع واقعی شیء در زمان اجرا اجرا می‌شود.مزیت اصلی پلی‌مورفیسم این است که کد قابلیت انعطاف بیشتری دارد و به برنامه‌نویس این امکان را می‌دهد که با استفاده از یک رابط مشترک برای اشیاء مختلف، عملکرد مشابه را برای همه آنها فراهم کند. این به بهبود قابلیت تعمیر و نگهداری کد، کاهش تکرار کد، و ایجاد ساختارهای کد مرتبط با منطقی و تعاملی کمک می‌کند.در زبان‌های برنامه‌نویسی متفاوت، پلی‌مورفیسم به شکل‌های مختلفی معمولاً با استفاده از مفاهیم مانند اورلود (Overloading) و اوررایدینگ (Overriding) پیاده‌سازی می‌شود.کلاس Abstract:یک کلاس Abstract یک کلاس پایه (Base Class) است که از آن نمی‌توان شیء ایجاد کرد. به عبارت دیگر، این کلاس به تنهایی نیاز به یک کلاس فرزند (Concrete Class) دارد که از آن ارث‌بری می‌کند و تمامی عضوهای کلاس پایه را پیاده‌سازی می‌کند.یک کلاس Abstract می‌تواند شامل عضوهای داده‌ای و عضوهای عملیاتی (متدها) باشد.یک کلاس Abstract می‌تواند دارای متدهای Abstract باشد. متدهای Abstract هستند که فقط امضا آنها در کلاس پایه تعریف می‌شود و پیاده‌سازی آنها در کلاس‌های فرزند انجام می‌شود.مثال کلاس Abstract در C#:public abstract class Shape{    // متدهای Abstract    public abstract class Shape&#xA;{&#xA;    // متدهای Abstract&#xA;    public abstract double CalculateArea();&#xA;    public abstract double CalculatePerimeter();&#xA;}&#xA;&#xA;public class Circle : Shape&#xA;{&#xA;    private double radius;&#xA;&#xA;    public Circle(double radius)&#xA;    {&#xA;        this.radius = radius;&#xA;    }&#xA;&#xA;    public override double CalculateArea()&#xA;    {&#xA;        return Math.PI * radius * radius;&#xA;    }&#xA;&#xA;    public override double CalculatePerimeter()&#xA;    {&#xA;        return 2 * Math.PI * radius;&#xA;    }&#xA;}کلاس Abstract و Interface دو ویژگی مهم در زبان C# هستند که به شما اجازه می‌دهند تا عقب‌نشینی (abstraction) و پلی‌مورفیسم را در برنامه‌نویسی شیء‌گرا پیاده‌سازی کنید، اما دارای تفاوت‌های مهمی هستند:کلاس Abstract:یک کلاس Abstract یک کلاس پایه (Base Class) است که از آن نمی‌توان شیء ایجاد کرد. به عبارت دیگر، این کلاس به تنهایی نیاز به یک کلاس فرزند (Concrete Class) دارد که از آن ارث‌بری می‌کند و تمامی عضوهای کلاس پایه را پیاده‌سازی می‌کند.یک کلاس Abstract می‌تواند شامل عضوهای داده‌ای و عضوهای عملیاتی (متدها) باشد.یک کلاس Abstract می‌تواند دارای متدهای Abstract باشد. متدهای Abstract هستند که فقط امضا آنها در کلاس پایه تعریف می‌شود و پیاده‌سازی آنها در کلاس‌های فرزند انجام می‌شود.مثال کلاس Abstract در C#:csharppublic abstract class Shape&#xA;{&#xA;    // متدهای Abstract&#xA;    public abstract double CalculateArea();&#xA;    public abstract double CalculatePerimeter();&#xA;}&#xA;&#xA;public class Circle : Shape&#xA;{&#xA;    private double radius;&#xA;&#xA;    public Circle(double radius)&#xA;    {&#xA;        this.radius = radius;&#xA;    }&#xA;&#xA;    public override double CalculateArea()&#xA;    {&#xA;        return Math.PI * radius * radius;&#xA;    }&#xA;&#xA;    public override double CalculatePerimeter()&#xA;    {&#xA;        return 2 * Math.PI * radius;&#xA;    }&#xA;}Interface:یک Interface یک قرارداد بیرونی است که تعیین می‌کند که چه عضوهای عملکردی (متدها) باید یک کلاس آن را پیاده‌سازی کند. از یک Interface نمی‌توان شیء ایجاد کرد و برخلاف کلاس Abstract، هیچ امکان پیاده‌سازی بدنه متد در اینترفیس وجود ندارد.یک کلاس می‌تواند از چندین Interface به عنوان پایه ارث‌بری کند، اما از تنها یک کلاس ارث‌بری می‌کند.مثال Interface در C#:public interface IShape&#xA;{&#xA;    double CalculateArea();&#xA;    double CalculatePerimeter();&#xA;}&#xA;&#xA;public class Circle : IShape&#xA;{&#xA;    private double radius;&#xA;&#xA;    public Circle(double radius)&#xA;    {&#xA;        this.radius = radius;&#xA;    }&#xA;&#xA;    public double CalculateArea()&#xA;    {&#xA;        return Math.PI * radius * radius;&#xA;   }&#xA;&#xA;    public double CalculatePerimeter()&#xA;    {&#xA;        return 2 * Math.PI * radius;&#xA;    }&#xA;}در مثال بالا، ما از یک Interface به نام IShape برای تعیین قرارداد متدهای CalculateArea و CalculatePerimeter استفاده کردیم و سپس کلاس Circle این قرارداد را پیاده‌سازی کرد. توجه کنید که متدهای Interface بدون کلمه کلیدی override اجرا می‌شوند.برای انتخاب بین استفاده از کلاس Abstract و Interface، باید موارد مورد نیاز پروژه و معماری برنامه‌ی شما را در نظر بگیرید. اگر شما نیاز به یک قالب عمومی دارید که تعدادی عضوهای داده‌ای و عملیاتی (متدها) دارد و از آن برای ساخت کلاس‌های فرزند استفاده خواهید کرد، از کلاس Abstract استفاده کنید. اگر شما فقط می‌خواهید تعیین کنید که کلاس‌ها باید چه متدهای عملکردی را پیاده‌سازی کنند، از Interface استفاده کنید. همچنین، در C# یک کلاس می‌تواند از چندین Interface به عنوان پایه ارث‌بری کند، اما از تنها یک کلاس ارث‌بری می‌کند.توجه کنید که در کلاس های Abstract شما نمیتونید برای توابع بدنه تعریف کنید و صرفا یک امضا دارن . سوال اینه که پس اگه نمیشه توی کلاس های Abstract هم بدنه تعریف کرد پس فرقش با Interface چیه ؟ خب داخل C# ما نمیتونیم از چند تا کلاس ارث بری کنیم ولی میشه از چند تا Interface ارث بری کرد ، جالب این که کلاس های Abstract میتونن از هم ارث بری کنند پس مزیت Interface چیه واقعا ؟ در C#، یک کلاس می‌تواند از تنها یک کلاس پایه (Abstract یا Concrete) به عنوان پایه ارث‌بری کند، اما از چندین Interface به عنوان پایه ارث‌بری کند. این امکان به برنامه‌نویس این امکان را می‌دهد که ویژگی‌های مختلف را از چندین منبع (Interface) ترکیب کند و از تمام آنها در کلاس جدید استفاده کند. این یکی از مزایای کار با Interface در مقایسه با کلاس‌های Abstract است.در مقابل، یک کلاس Abstract به عنوان کلاس پایه ارث‌بری می‌شود و از این نظر محدودتر است. این به این معناست که اگر یک کلاس از یک کلاس Abstract ارث‌بری کند، نمی‌تواند از یک کلاس Abstract دیگر به عنوان پایه همزمان استفاده کند.به عبارت دیگر، وقتی از یک کلاس Abstract به عنوان پایه استفاده می‌شود، مشترک بودن بخشی از پیاده‌سازی از کلاس پایه در کلاس فرزند انتظار می‌رود. اما وقتی از چندین Interface به عنوان پایه استفاده می‌شود، هیچ ارتباط وابستگی به پیاده‌سازی مشترک وجود ندارد و کلاس فرزند می‌تواند ویژگی‌های مختلفی را از اینترفیس‌ها به شکل مستقل پیاده‌سازی کند.صحیح است که اگر یک کلاس Abstract از یک کلاس Abstract دیگر ارث‌بری کند، به نظر می‌آید تفاوت معنی‌داری با ارث‌بری از چندین Interface وجود ندارد، از نظر توانایی پیاده‌سازی متدها. اما اینجا چند نکته وجود دارد که نیاز به استفاده از Interface را متمایز می‌کند:پلی‌مورفیسم چندگانه (Multiple Inheritance): در C#, یک کلاس نمی‌تواند از چندین کلاس پایه (Concrete یا Abstract) به عنوان پایه ارث‌بری کند. اما یک کلاس می‌تواند از چندین Interface به عنوان پایه ارث‌بری کند. این ویژگی به برنامه‌نویس این امکان را می‌دهد که ویژگی‌های مختلفی را از منابع متفاوت (Interface‌ها) به کلاس خود اضافه کند و از آنها استفاده کند.ساختار زبانی: استفاده از Interface معمولاً منطقی‌تر است زیرا برای تعیین قرارداد‌های عمومی و ویژگی‌های مشترک، زبان‌های برنامه‌نویسی از Interface به عنوان ابزار معمولی استفاده می‌کنند. این شیوه کار باعث می‌شود که کد شما بیشتر خواناتر و قابل‌فهم‌تر باشد.قابلیت جدایی و تعامل پویا: با استفاده از Interface، می‌توانید تعامل‌پذیری بیشتری در کد خود ایجاد کنید. به عبارت دیگر، شما می‌توانید شیء‌ها را بر اساس قراردادها (Interface) تعامل دهید بدون اینکه به اطلاعات دقیقی در مورد نوع واقعی شیء نیاز داشته باشید. این قابلیت اهمیت بسیاری در طراحی و توسعه برنامه‌های بزرگ دارد.**قابلیت تست و نگهداری: ** از آنجا که Interface‌ها به عنوان قراردادهای عمومی عمل می‌کنند، می‌توانند به سادگی تست و نگهداری کد را تسهیل کنند. به عنوان مثال، می‌توانید موک‌ها (Mocks) را برای تست‌های واحد (Unit Testing) با استفاده از Interface ایجاد کنید.از آنجا که C# از مفهوم ارث‌بری چندگانه (Multiple Inheritance) برای کلاس‌ها پشتیبانی نمی‌کند، استفاده از Interface یک راه منطقی برای به اشتراک گذاری ویژگی‌ها و متدهای مشترک بین کلاس‌ها در C# است. در مقابل، کلاس‌های Abstract به عنوان کلاس‌های پایه برای ایجاد سلسله مراتب از کلاس‌ها با عملکرد مشابه به کار می‌روند اما محدودیت‌هایی دارند که با استفاده از Interface قابل پوشش هستند.امیدوارم که مفید باشه ...</description><category>Bamirno</category><author>Bamirno</author><pubDate>Sat, 09 Sep 2023 16:06:40 +0330</pubDate></item><item><title>CRM - ERP - BPMS قلمبه سلمبه های ساده</title><link>https://virgool.ir/@Bamirno/crm-erp-bpms-قلمبه-سملبه-های-ساده-ebmrgegesyg4</link><description>CRM (Customer Relationship Management):مخاطبان اصلی: CRM به مدیریت ارتباط با مشتریان اختصاص دارد. این نرم‌افزار به کسب و کارها کمک می‌کند تا اطلاعات مشتریان را مدیریت کرده و ارتباطات با آن‌ها را بهبود ببخشند.عملیات اصلی: از جمله عملیات معمول در CRM مدیریت مخاطبین، ثبت تماس‌ها و تعاملات با مشتریان، مدیریت فرصت‌های فروش، و مدیریت خدمات پس از فروش است.نتیجه: هدف اصلی CRM افزایش رضایت مشتریان، افزایش فروش، و بهبود ارتباط با مشتریان است.ERP (Enterprise Resource Planning):مخاطبان اصلی: ERP به مدیریت منابع و فرآیندهای داخلی سازمان اختصاص دارد. این نرم‌افزار به کسب و کارها کمک می‌کند تا فرآیندهای مالی، تدارکات، تولید، انبارداری و مدیریت منابع انسانی را یکپارچه کنند.عملیات اصلی: به عنوان مثال، ERP می‌تواند امور مالی از جمله حسابداری عمومی و مدیریت حسابها، تدارکات و مدیریت زنجیره تأمین، مدیریت تولید و انبارداری را بهبود بخشد.نتیجه: هدف اصلی ERP بهینه‌سازی فرآیندهای داخلی سازمان، کاهش هدر رفت منابع، افزایش بهره‌وری و ارتقاء مدیریت است.BPMS (Business Process Management System):مخاطبان اصلی: BPMS به مدیریت و بهبود فرآیندهای کسب و کار اختصاص دارد. این نرم‌افزار به کسب و کارها کمک می‌کند تا فرآیندهای خود را مدیریت، بهینه‌سازی و پیگیری کنند.عملیات اصلی: BPMS از جمله ویژگی‌های اصلی مدیریت فرآیندها، ایجاد و اجرای فرآیندهای کسب و کار، پیگیری عملکرد فرآیندها، و بهبود مستمر فرآیندها استفاده می‌کند.نتیجه: هدف اصلی BPMS بهبود بهره‌وری، کاهش هدر رفت منابع، افزایش کیفیت فرآیندها، و پیگیری بهبودهای مستمر است.به طور خلاصه، CRM بر روی ارتباط با مشتریان تمرکز دارد، ERP بر روی مدیریت منابع داخلی سازمان متمرکز است، و BPMS بر روی مدیریت و بهبود فرآیندهای کسب و کار تمرکز دارد. این سه نوع نرم‌افزار می‌توانند به کسب و کارها در بهبود عملکرد و افزایش بهره‌وری کمک کنند، اما هر یک دارای تمرکز و کاربردهای خود هستند.</description><category>Bamirno</category><author>Bamirno</author><pubDate>Sat, 09 Sep 2023 14:56:25 +0330</pubDate></item><item><title>آنچه باید در مورد Design Patterns بدونیم</title><link>https://virgool.ir/@Bamirno/آنچه-باید-در-مورد-design-patterns-بدونیم-yvbifiugtwfy</link><description>الگوهای طراحی (Design Patterns) در زبان‌های برنامه‌نویسی به عنوان رویکردهای مشترک و بهینه برای حل مشکلات معمول در طراحی نرم‌افزارها شناخته می‌شوند. این الگوها توسط توسعه‌دهندگان نرم‌افزار در طول زمان شناسایی شده‌اند و به عنوان روش‌های مورد تایید برای ایجاد ساختارها و تعاملات میان اجزای یک سیستم نرم‌افزاری مورد استفاده قرار می‌گیرند. الگوهای طراحی به توسعه‌دهندگان کمک می‌کنند تا کد قابل نگهداری، قابلیت افزایش‌پذیری و قابلیت تغییرپذیری داشته باشد. در ادامه به توضیح و معرفی معروف ترین Design Pattern ها میپردازیم ، نمونه ها با زبان C# بیان میشوند . Singleton Pattern:    این الگو برای اطمینان از اینکه یک کلاس تنها یک نمونه دارد و دسترسی به آن نمونه را به صورت گلوبال ارائه می‌دهد، استفاده می‌شود. این الگو به صورت خاص در مواقعی که نیاز به ایجاد یک نمونه از یک کلاس در سراسر برنامه داریم مفید است.    Factory Method Pattern:    این الگو به تولید نمونه‌های متنوع از یک کلاس برای یک خانواده کلاس‌ها کمک می‌کند. با استفاده از این الگو، تصمیم گیری در مورد اینکه کدام نوع از کلاس‌ها ایجاد شود به کلاس‌های فرزند تعیین می‌شود.    Observer Pattern:    این الگو برای پیاده‌سازی مکانیزم اطلاع‌رسانی از تغییرات در یک شیء به شیء‌های دیگر استفاده می‌شود. این الگو به تعامل بین اجزای مختلف نرم‌افزار کمک می‌کند و اجازه می‌دهد تا شیء‌ها بر اساس تغییرات در یکدیگر واکنش نشان دهند.    Strategy Pattern:    این الگو به تعیین یک مجموعه از الگوریتم‌ها و قابلیت تعویض آنها در زمان اجرا برای انجام یک وظیفه خاص کمک می‌کند. این الگو اجازه می‌دهد تا یک کلاس تغییرات در رفتار خود را در زمان اجرا اعمال کند بدون اینکه نیاز به تغییر در کد مشترک داشته باشد.    Decorator Pattern:    این الگو برای افزودن عملکرد به یک شیء به صورت پویا استفاده می‌شود. این الگو امکان می‌دهد تا بدون تغییر در ساختار کلاس اصلی، ویژگی‌ها و عملکردهای آن را توسعه دهیم.این الگوها تنها نمونه‌هایی از الگوهای طراحی در C# هستند و هنوز الگوهای دیگری نیز وجود دارند که برای حل مسائل خاصی طراحی شده‌اند. استفاده از الگوهای طراحی به توسعه‌دهندگان کمک می‌کند تا کد خود را سازماندهی کرده و مشکلات رایج در طراحی نرم‌افزارها را به بهترین نحو حل کنند.در ادامه توضیحات بیشتری در خصوص هر یک از Design Pattern های معرفی شده ارائه میکنیم .Singleton Pattern:الگوی Singleton یک الگوی طراحی در برنامه‌نویسی است که به تنهایی یک نمونه از یک کلاس را ایجاد می‌کند و اجازه نمی‌دهد که سایر کلاس‌ها به این نمونه دسترسی مستقیم داشته باشند. این الگو برای مواقعی مناسب است که فقط یک نمونه از یک کلاس در برنامه نیاز دارید، مثلاً برای مدیریت تنظیمات یا اتصال به پایگاه داده.در زیر، یک مثال از الگوی Singleton در C# نمایش داده شده است:public class Singleton&#xA;{&#xA;  // این متغیر private و استاتیک برای ذخیره نمونه ایجاد شده از کلاس Singleton است.&#xA;    private static Singleton instance;&#xA;   // متغیرهای دیگر می‌توانند اضافه شوند.&#xA;    public string SomeData { get; set; }&#xA;    // کانستراکتور خصوصی تا از ایجاد نمونه‌های جدید جلوگیری کند.&#xA;    private Singleton()&#xA;    {&#xA;        SomeData = &#34;Initial data&#34;&#xA;        }&#xA;&#xA;    // متد استاتیک برای ایجاد یک نمونه از کلاس Singleton.&#xA;    public static Singleton GetInstance()&#xA;    {&#xA;        if (instance == null)&#xA;        {&#xA;            instance = new Singleton();&#xA;        }&#xA;        return instance;&#xA;    }&#xA;}ر این مثال، کلاس Singleton دارای یک متغیر استاتیک به نام instance است که نمونه‌ی واحد از کلاس را نگهداری می‌کند. کانستراکتور کلاس خصوصی  است، بنابراین نمی‌توان از خارج از کلاس نمونه‌های دیگری از آن ایجاد کرد.  متد GetInstance نمونه ایجاد شده را برمی‌گرداند، و اگر نمونه‌ای وجود نداشته باشد، یک نمونه جدید ایجاد می‌کند.به عنوان مثال فرض کنید میخواید یک کلاس Logger داشته باشید برای ثبت لاگ های سیستمتون ، میاید از این الگو استفاده میکنید.Factory Method Pattern:الگوی Factory Method یکی از الگوهای طراحی نرم‌افزار است که در دنیای برنامه‌نویسی مورد استفاده قرار می‌گیرد. این الگو به شما این امکان را می‌دهد که یک روش (معمولاً به نام Factory Method) در یک کلاس تعریف کنید که مسئول ایجاد نمونه‌های یک کلاس دیگر (یا زیرکلاس‌های آن) باشد. به این ترتیب، شما از ایجاد مستقیم نمونه‌ها در کد خود جلوگیری می‌کنید و تغییرات در ایجاد نمونه‌ها را به سادگی اعمال می‌کنید.در زیر، یک مثال ساده از Factory Method Pattern در C# ارائه می‌شود:using System;&#xA;&#xA;// این کلاس اصلی است که نمونه‌های آن را ایجاد می‌کنیم.&#xA;public abstract class Product&#xA;{&#xA;   public abstract void ShowInfo();&#xA;}&#xA;&#xA;// کلاس‌های زیرکلاس برای ایجاد نمونه‌های مختلف محصول&#xA;public class ConcreteProductA : Product&#xA;{&#xA; public override void ShowInfo()&#xA; {&#xA; Console.WriteLine(&#34;Product A is created.&#34;);&#xA; }}&#xA;&#xA;public class ConcreteProductB : Product&#xA;{&#xA;  public override void ShowInfo()&#xA; {&#xA; Console.WriteLine(&#34;Product B is created.&#34;);&#xA; }&#xA;}&#xA;&#xA;// Factory Method که توسط کلاس‌های زیرکلاس پیاده‌سازی می‌شود&#xA;public abstract class Creator&#xA;{&#xA; public abstract Product FactoryMethod();&#xA;}&#xA;&#xA;public class ConcreteCreatorA : Creator&#xA;{&#xA;public override Product FactoryMethod()&#xA;{&#xA;return new ConcreteProductA();&#xA; }&#xA;}&#xA;&#xA;public class ConcreteCreatorB : Creator&#xA;{&#xA;public override Product FactoryMethod()&#xA;{&#xA;return new ConcreteProductB();&#xA;}&#xA;}&#xA;&#xA;class Program&#xA;{&#xA;static void Main(string[] args)&#xA; {&#xA;// استفاده از Factory Method برای ایجاد نمونه‌های محصول&#xA;Creator creatorA = new ConcreteCreatorA();&#xA;Product productA = creatorA.FactoryMethod();&#xA; productA.ShowInfo();&#xA;&#xA; Creator creatorB = new ConcreteCreatorB();&#xA; Product productB = creatorB.FactoryMethod();&#xA;productB.ShowInfo();&#xA; }&#xA;}در این مثال، الگوی Factory Method برای ایجاد نمونه‌های دو محصول مختلف (Product A و Product B) استفاده شده است. Creator و ConcreteCreator کلاس‌ها مسئول ایجاد نمونه‌ها هستند و با فراخوانی Factory Method، نمونه‌های مختلف Product ایجاد می‌شوند.یک مثال واقعی از استفاده از Factory Method Pattern می‌تواند در فریمورک‌های متعددی که از این الگو استفاده می‌کنند، مانند ASP.NET یا Entity Framework، مشاهده شود. به عنوان مثال، در ASP.NET، وقتی که یک درخواست HTTP وارد می‌شود، یک Factory Method برای ایجاد نمونه‌های کنترلر‌ها (Controller) استفاده می‌شود تا منطق مربوط به پردازش درخواست را ایجاد و مدیریت کند.Observer Pattern:لگوی Observer یکی از الگوهای طراحی مهم در برنامه‌نویسی است که به شما امکان مشاهده تغییرات در یک شیء را می‌دهد و سایر شیء‌ها را از تغییرات مطلع می‌کند. این الگو به شما این امکان را می‌دهد که اشیاء مختلفی را به یک شیء مشاهده‌کننده (Observer) متصل کنید تا هنگامی که تغییرات در شیء مشاهده‌شونده (Subject) رخ دهد، اطلاع رسانی شوند.در زبان C#، می‌توانیم الگوی Observer را با استفاده از ویژگی‌ها و رویدادها (Events) پیاده‌سازی کنیم. در ادامه یک مثال ساده از الگوی Observer در C# ارائه می‌دهم:using System;&#xA;using System.Collections.Generic;&#xA;&#xA;// مشاهده‌کننده&#xA;public interface IObserver&#xA;{&#xA;    void Update(string message);&#xA;}&#xA;&#xA;// مشاهده‌شونده&#xA;public class Subject&#xA;{&#xA;    private List&lt;IObserver&gt; observers = new List&lt;IObserver&gt;();&#xA;    private string message;&#xA;&#xA;    public void Attach(IObserver observer)&#xA;    {&#xA;        observers.Add(observer);&#xA;    }&#xA;&#xA;    public void Detach(IObserver observer)&#xA;    {&#xA;        observers.Remove(observer);&#xA;    }&#xA;&#xA;    public void SetMessage(string message)&#xA;    {&#xA;        this.message = message;&#xA;        NotifyObservers();&#xA;    }&#xA;&#xA;    private void NotifyObservers()&#xA;    {&#xA;        foreach (var observer in observers)&#xA;        {&#xA;           observer.Update(message);&#xA;       }&#xA;    }&#xA;}&#xA;// مشاهده‌کننده اول&#xA;public class ConcreteObserver1 : IObserver&#xA;{&#xA;    public void Update(string message)&#xA;    {&#xA;       Console.WriteLine(&#34;مشاهده‌کننده 1: &#34; + message);&#xA;    }&#xA;}&#xA;&#xA;// مشاهده‌کننده دوم&#xA;public class ConcreteObserver2 : IObserver&#xA;{&#xA;    public void Update(string message)&#xA;    {&#xA;        Console.WriteLine(&#34;مشاهده‌کننده 2: &#34; + message);&#xA;    }&#xA;}&#xA;&#xA;class Program&#xA;{&#xA;    static void Main()&#xA;    {&#xA;   // ایجاد یک شیء مشاهده‌شونده&#xA;        var subject = new Subject();&#xA;&#xA;       // ایجاد دو مشاهده‌کننده&#xA;        var observer1 = new ConcreteObserver1();&#xA;        var observer2 = new ConcreteObserver2();&#xA;&#xA;      // اتصال مشاهده‌کننده‌ها به شیء مشاهده‌شونده&#xA;        subject.Attach(observer1);&#xA;        subject.Attach(observer2);&#xA;&#xA;        // تنظیم پیام و اعلام به مشاهده‌کننده‌ها&#xA;        subject.SetMessage(&#34;پیام جدید!&#34;);&#xA;&#xA;        // حذف یکی از مشاهده‌کننده‌ها&#xA;        subject.Detach(observer1);&#xA;&#xA;        // تنظیم پیام دیگر و اعلام به مشاهده‌کننده‌ها (بدون مشاهده‌کننده 1)&#xA;        subject.SetMessage(&#34;پیام دیگر!&#34;);&#xA;    }&#xA;}در این مثال، ما یک شیء مشاهده‌شونده (Subject) و دو مشاهده‌کننده (ConcreteObserver1 و ConcreteObserver2)  ایجاد کرده‌ایم. مشاهده‌کننده‌ها به شیء مشاهده‌شونده متصل می‌شوند و  هنگامی که پیامی تنظیم می‌شود، تغییرات به تمام مشاهده‌کننده‌ها اعلام  می‌شود. همچنین، می‌توانیم مشاهده‌کننده‌ها را از شیء مشاهده‌شونده حذف  کنیم. در نهایت، اجرای این برنامه نمونه نحوه کارکرد الگوی Observer را  نشان می‌دهد.Strategy Pattern:الگوی استراتژی (Strategy Pattern) یکی از الگوهای طراحی مهم در برنامه‌نویسی است که به شما امکان انتخاب یکی از چند روش (استراتژی) برای انجام یک عملیات خاص را می‌دهد و این انتخاب را در زمان اجرا انجام می‌دهد. این الگو به شما این امکان را می‌دهد که رفتارهای مختلف را در یک کلاس اصلی تعریف کرده و از آنها به عنوان یک استراتژی جداگانه استفاده کنید.در زبان C#، می‌توانیم الگوی استراتژی را با استفاده از اشیاء و اینترفیس‌ها پیاده‌سازی کنیم. در ادامه، یک مثال از الگوی استراتژی در C# ارائه می‌دهم:using System;&#xA;&#xA;// اینترفیس استراتژی&#xA;public interface IStrategy&#xA;{&#xA;    void Execute();&#xA;}&#xA;&#xA;// استراتژی اول&#xA;public class ConcreteStrategy1 : IStrategy&#xA;{&#xA;    public void Execute()&#xA;    {&#xA;        Console.WriteLine(&#34;استراتژی اول را اجرا می‌کند.&#34;);&#xA;    }&#xA;}&#xA;&#xA;// استراتژی دوم&#xA;public class ConcreteStrategy2 : IStrategy&#xA;{&#xA;    public void Execute()&#xA;    {&#xA;        Console.WriteLine(&#34;استراتژی دوم را اجرا می‌کند.&#34;);&#xA;    }&#xA;}&#xA;&#xA;// کلاس محیط&#xA;public class Context&#xA;{&#xA;    private IStrategy strategy;&#xA;&#xA;    public Context(IStrategy strategy)&#xA;    {&#xA;        this.strategy = strategy;&#xA;    }&#xA;&#xA;    public void ExecuteStrategy()&#xA;    {&#xA;        strategy.Execute();&#xA;    }&#xA;}&#xA;&#xA;class Program&#xA;{&#xA;    static void Main()&#xA;    {&#xA;        // ایجاد یک محیط با استفاده از استراتژی اول&#xA;        var context1 = new Context(new ConcreteStrategy1());&#xA;        context1.ExecuteStrategy();&#xA;&#xA;        // ایجاد یک محیط با استفاده از استراتژی دوم&#xA;        var context2 = new Context(new ConcreteStrategy2());&#xA;        context2.ExecuteStrategy();&#xA;    }&#xA;}در این مثال، ما دو استراتژی (ConcreteStrategy1 و ConcreteStrategy2) ایجاد کرده‌ایم، هرکدام از این استراتژی‌ها یک روش Execute را پیاده‌سازی می‌کنند. سپس یک کلاس محیط (Context) ایجاد می‌کنیم که یک شیء از یک استراتژی را دریافت می‌کند و این استراتژی را در زمان اجرا اجرا می‌کند.در داخل تابع Main، ما دو محیط ایجاد می‌کنیم و به هر یک از آنها یک استراتژی مخصوص می‌دهیم و سپس این محیط‌ها را فرا می‌خوانیم. به این ترتیب، ما می‌توانیم رفتارهای مختلف را در زمان اجرا انتخاب کنیم (استراتژی مورد استفاده) و به اجرای آنها بپردازیم. این نحوه عملکرد الگوی استراتژی را نمایش می‌دهد.Decorator Pattern:الگوی Decorator یکی از الگوهای طراحی ساختاری است که به شما امکان افزودن عملکرد به یک شیء بدون تغییر کد آن شیء را می‌دهد. این الگو از ارث‌بری (Inheritance) جلوگیری کرده و به شما امکان انعطاف‌پذیری بیشتر در افزودن ویژگی‌ها و عملکردها به یک شیء را می‌دهد.در زبان C#، الگوی Decorator را معمولاً با استفاده از ارث‌بری از یک رابط یا کلاس پایه (Base Class) پیاده‌سازی می‌کنیم. سپس کلاس‌های مختلفی را برای افزودن ویژگی‌های جدید به شیء اصلی ایجاد می‌کنیم. در ادامه یک مثال از الگوی Decorator در C# ارائه می‌دهم:using System;&#xA;&#xA;// رابط کلاس پایه (Component)&#xA;public interface ICoffee&#xA;{&#xA;    string GetDescription();&#xA;    double GetCost();&#xA;}&#xA;&#xA;// کلاس پایه (Concrete Component)&#xA;public class SimpleCoffee : ICoffee&#xA;{&#xA;    public string GetDescription()&#xA;    {&#xA;        return &#34;قهوه ساده&#34;&#xA;    }&#xA;&#xA;    public double GetCost()&#xA;    {&#xA;        return 2.0;&#xA;    }&#xA;}&#xA;&#xA;// کلاس Decorator انتزاعی (Decorator)&#xA;public abstract class CoffeeDecorator : ICoffee&#xA;{&#xA;    protected ICoffee _coffee;&#xA;&#xA;    public CoffeeDecorator(ICoffee coffee)&#xA;    {&#xA;        _coffee = coffee;&#xA;    }&#xA;&#xA;    public virtual string GetDescription()&#xA;    {&#xA;        return _coffee.GetDescription();&#xA;    }&#xA;&#xA;    public virtual double GetCost()&#xA;    {&#xA;        return _coffee.GetCost();&#xA;    }&#xA;}&#xA;&#xA;// کلاس‌های Decorator ویژگی‌ها را اضافه می‌کنند&#xA;public class MilkDecorator : CoffeeDecorator&#xA;{&#xA;    public MilkDecorator(ICoffee coffee) : base(coffee)&#xA;    {&#xA;    }&#xA;&#xA;    public override string GetDescription()&#xA;    {&#xA;        return base.GetDescription() + &#34;, با شیر&#34;&#xA;    }&#xA;&#xA;    public override double GetCost()&#xA;    {&#xA;        return base.GetCost() + 1.0;&#xA;    }&#xA;}&#xA;&#xA;public class SugarDecorator : CoffeeDecorator&#xA;{&#xA;    public SugarDecorator(ICoffee coffee) : base(coffee)&#xA;    {&#xA;    }&#xA;&#xA;    public override string GetDescription()&#xA;    {&#xA;        return base.GetDescription() + &#34;, با قند&#34;&#xA;    }&#xA;&#xA;    public override double GetCost()&#xA;    {&#xA;        return base.GetCost() + 0.5;&#xA;    }&#xA;}&#xA;&#xA;class Program&#xA;{&#xA;    static void Main()&#xA;    {&#xA;        // ایجاد یک قهوه ساده&#xA;        ICoffee coffee = new SimpleCoffee();&#xA;        Console.WriteLine(&#34;توضیحات: &#34; + coffee.GetDescription());&#xA;        Console.WriteLine(&#34;قیمت: &#34; + coffee.GetCost());&#xA;&#xA;        // افزودن شیر به قهوه&#xA;        coffee = new MilkDecorator(coffee);&#xA;        Console.WriteLine(&#34;توضیحات: &#34; + coffee.GetDescription());&#xA;        Console.WriteLine(&#34;قیمت: &#34; + coffee.GetCost());&#xA;        // افزودن قند به قهوه&#xA;        coffee = new SugarDecorator(coffee);&#xA;        Console.WriteLine(&#34;توضیحات: &#34; + coffee.GetDescription());&#xA;        Console.WriteLine(&#34;قیمت: &#34; + coffee.GetCost());&#xA;    }&#xA;}در این مثال، ما یک کلاس پایه به نام SimpleCoffee داریم که ICoffee را پیاده‌سازی می‌کند. سپس دو کلاس Decorator به نام‌های MilkDecorator و SugarDecorator را ایجاد می‌کنیم که از CoffeeDecorator ارث‌بری می‌کنند و ویژگی‌های اضافی به قهوه اضافه می‌کنند.در تابع Main، ابتدا یک قهوه ساده ایجاد می‌کنیم و سپس با استفاده از Decoratorها، شیر و قند به قهوه اضافه می‌کنیم. از طریق Decoratorها، می‌توانیم به شیء اصلی (قهوه) ویژگی‌های جدید (شیر و قند) اضافه کنیم بدون ایجاد تغییر در کد اصلی قهوه. این نحوه عملکرد الگوی Decorator را نمایش می‌دهد.امید وارم مفید بوده باشه ....</description><category>Bamirno</category><author>Bamirno</author><pubDate>Sat, 09 Sep 2023 12:46:36 +0330</pubDate></item></channel></rss>