<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>نوشته های سعید صفایی| Saeed Safaee</title>
        <link>https://virgool.io/feed/@saeedsafaee</link>
        <description>Senior back-end developer | ProjectManager</description>
        <language>fa</language>
        <pubDate>2026-04-15 09:41:30</pubDate>
        <image>
            <url>https://files.virgool.io/upload/users/237545/avatar/wCaZAS.jpeg?height=120&amp;width=120</url>
            <title>سعید صفایی| Saeed Safaee</title>
            <link>https://virgool.io/@saeedsafaee</link>
        </image>

                    <item>
                <title>یکی از قدرتمندترین و محبوب‌ترین ابزارهای توسعه SQL</title>
                <link>https://virgool.io/codenevis/%DB%8C%DA%A9%DB%8C-%D8%A7%D8%B2-%D9%82%D8%AF%D8%B1%D8%AA%D9%85%D9%86%D8%AF%D8%AA%D8%B1%DB%8C%D9%86-%D9%88-%D9%85%D8%AD%D8%A8%D9%88%D8%A8-%D8%AA%D8%B1%DB%8C%D9%86-%D8%A7%D8%A8%D8%B2%D8%A7%D8%B1%D9%87%D8%A7%DB%8C-%D8%AA%D9%88%D8%B3%D8%B9%D9%87-sql-vijnn7dyla4z</link>
                <description>یکی از قدرتمندترین و محبوب‌ترین ابزارهای توسعه SQL میتوان به Redgate SQL Prompt اشاره کرد از شرکت معروف Redgateکه تجربه کدنویسی را با ویژگی‌های تکمیل هوشمند کد، فرمت‌بندی و اصلاح کد بهبود می‌بخشد. SQL Prompt با هدف افزایش بهره‌وری و کاهش خطاها طراحی شده و به یک ابزار ضروری برای متخصصان پایگاه داده تبدیل شده است.✅ ویژگی‌های کلیدیسابقه کوئری هالیست کوئری هایی که تولید کرده اید را به صورت لیست و قابل جستجو در اختیار شما قرار می دهدتکمیل هوشمند کدبا SQL Prompt با ارائه پیشنهادات هوشمند کد در حین تایپ، نوشتن SQL را تسریع می‌کند. این ابزار به‌طور خودکار کلمات کلیدی، نام اشیا و حتی پیوندها بین جداول را بر اساس ساختار پایگاه داده کامل می‌کند و در نتیجه زمان شما را صرفه‌جویی کرده و خطاهای نحوی را کاهش می‌دهد.فرمت‌بندی کد قابل تنظیمبا SQL Prompt می‌توانید به‌صورت فوری اسکریپت‌های SQL خود را طبق راهنمای سبک تیم‌تان فرمت‌بندی کنید. شما می‌توانید گزینه‌های فرمت‌بندی مانند حالت کلمات کلیدی، تراز، فاصله‌ها و شکست‌های خط را سفارشی کنید. فرمت‌بندی با یک کلیک به حفظ انسجام در بین تیم‌ها و پروژه‌ها کمک می‌کند.قطعه‌های کدبا SQL Prompt از قطعه‌های کد قابل استفاده مجدد پشتیبانی می‌کند که به شما امکان می‌دهد الگوهای رایج SQL یا بلوک‌های کامل کد را با کلمات کلیدی کوتاه به‌سرعت وارد کنید. می‌توانید از قطعه‌های از پیش تعریف شده استفاده کنید یا خودتان آنها را بسازید تا کارهای تکراری را ساده‌تر کنید.ابزارهای اصلاح کداصلاح SQL می‌تواند پرخطر و خسته‌کننده باشد، اما SQL Prompt با ویژگی‌هایی مانند:تقسیم جدول یا تغییر نام هوشمند محصور کردن به‌عنوان رویه ذخیره شده پیدا کردن متغیرها و پارامترهای استفاده‌نشده این کار را آسان‌تر می‌کند. این ابزارها به بهبود خوانایی و نگهداری بدون معرفی خطا کمک می‌کنند.تحلیل کد SQLSQL Prompt شامل مجموعه‌ای از قوانین تحلیل کد ایستا است که مشکلات احتمالی در کد شما را قبل از اجرا شناسایی می‌کند. این قوانین به اجرای بهترین شیوه‌ها، شناسایی الگوهای ضد و اطمینان از کیفیت بالای SQL کمک می‌کنند.ناوبری و جستجو به‌سرعت اشیا را پیدا کنید، مراجع را بیابید یا به تعاریف بروید با ابزارهای ناوبری پیشرفته. SQL Prompt به شما کمک می‌کند تا پایگاه‌های داده بزرگ یا اسکریپت‌های پیچیده را بهتر کاوش کنید.مزایای استفاده از SQL Prompt🚀 افزایش بهره‌وری: زمان کمتری را صرف تایپ کرده و زمان بیشتری را صرف حل مشکلات کنید.✅ خطاهای کمتر: با بررسی نحوی در زمان واقعی و پیشنهادات کد، باگ‌ها را کاهش دهید.🛠️ کد منظم: SQL تمیز و خوانا را در بین تیم‌ها حفظ کنید.💡 توسعه هوشمندتر: از ویژگی‌های پیشرفته‌ای مانند تحلیل کد و اصلاح برای نوشتن SQL بهتر استفاده کنید.موارد استفادهتوسعه‌دهندگان پایگاه داده که روی رویه‌های ذخیره‌شده، توابع و پرس‌وجوها کار می‌کنند.بر ای توسعه دهندگان دیتابیس که اسکریپت‌ها را برای استقرار و نگهداری مدیریت می‌کنند.توسعه‌دهندگان BI که با انبارهای داده و پرس‌وجوهای پیچیده کار می‌کنند.مهندسان DevOps که اسکریپت‌های پایگاه داده را در خطوط CI/CD ادغام می‌کنند.ادغام و سازگاری SQL Prompt به‌طور یکپارچه با:SQL Server Management Studio (SSMS)Visual Studio (با ابزارهای داده SQL Server)Azure SQL Databaseنتیجه‌گیری چه شما یک توسعه‌دهنده انفرادی باشید و چه بخشی از یک تیم بزرگ، Redgate SQL Prompt یک تغییر دهنده بازی برای نوشتن، مدیریت و بازبینی کد SQL است. ترکیب ویژگی‌های هوشمند و ابزارهای متمرکز بر توسعه‌دهنده آن را به یکی از بهترین گزینه‌ها تبدیل کرده است.</description>
                <category>سعید صفایی| Saeed Safaee</category>
                <author>سعید صفایی| Saeed Safaee</author>
                <pubDate>Wed, 28 May 2025 15:03:19 +0330</pubDate>
            </item>
                    <item>
                <title>ساخت برنامه‌های مدرن با Dot NET Core و EF Core</title>
                <link>https://virgool.io/codenevis/%D8%B3%D8%A7%D8%AE%D8%AA-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-%D9%87%D8%A7%DB%8C-%D9%85%D8%AF%D8%B1%D9%86-%D8%A8%D8%A7-dot-net-core-%D9%88-ef-core-zm74fbfqmhtm</link>
                <description>مقدمهدر دنیای امروز توسعه نرم‌افزار، عملکرد، مقیاس‌پذیری و نگهداری اهمیت بالایی دارند. فریم‌ورک منبع باز .NET Core مایکروسافت (که اکنون تحت برند یکپارچه .NET 6/7/8/9 و بالاتر ارائه می‌شود) به همراه Entity Framework Core (EF Core) یک استک قدرتمند و انعطاف‌پذیر برای ساخت برنامه‌های قوی، چندسکویی و آماده برای ابر ارائه می‌دهد. این مقاله به بررسی عمیق چگونگی همکاری .NET Core و EF Core، ویژگی‌های خاص آنها و نحوه استفاده مؤثر از آنها در پروژه‌های واقعی می‌پردازد.چیست؟ NET Core. یک فریم‌ورک منبع باز و چندسکویی برای ساخت برنامه‌های مدرن و با عملکرد بالا است برای:وب (ASP.NET Core)دسکتاپ (از طریق MAUI/WPF)ابر(Cloud)میکروسرویس‌هااینترنت اشیا (IoT)موبایل (از طریق MAUI/Xamarin)معماری ماژولار، پشتیبانی از تزریق وابستگی (DI) و ابزارهای CLI آن را برای توسعه‌دهندگان دوستانه و بسیار قابل سازگاری می‌سازد.چیست؟ EF Core یک ORM (Mapper شی-رابطه‌ای) سبک، قابل گسترش و منبع باز برای .NET Core است. این ابزار به توسعه‌دهندگان این امکان را می‌دهد که:با استفاده از C# به جای SQL با پایگاه‌های داده تعامل داشته باشندعملیات CRUD را با استفاده از LINQ انجام دهندطرح‌های پایگاه داده را از طریق Code-First به‌صورت خودکار تولید کنندمدل‌ها را از طریق Database-First معکوس مهندسی کنندموارد استفاده رایجبرنامه‌های وب با ASP.NET Core + EF Coreمیکروسرویس‌ها با EF Core و Dapper برای دسترسی سبک به پایگاه دادهبرنامه‌های بومی ابری مستقر در Azure یا AWSبرنامه‌های دسکتاپ/موبایل با استفاده از پایگاه داده محلی SQLiteبهترین شیوه‌ها(Best Practices)✅ از Async/Await برای عملیات پایگاه داده استفاده کنید✅ از تزریق وابستگی (DI) برای DbContext بهره‌برداری کنید✅ از مهاجرت‌ها برای تغییرات طرح استفاده کنید✅ مدل‌های دامنه را از DTOها جدا کنید✅ استثناها و لاگ‌گذاری را به‌خوبی مدیریت کنید✅ از گراف‌های بزرگ شیء بارگذاری‌شده مشتاق مگر در صورت نیاز پرهیز کنیداشتباهات رایج❌ کوئری‌گیری از مجموعه‌های داده بزرگ بدون صفحه‌بندی❌ فراموش کردن .Include() برای داده‌های مرتبط❌ استفاده از DbContext به‌عنوان یک singleton❌ اجازه دادن به موجودیت‌ها برای تبدیل شدن به “اشیاء بزرگ”❌ استفاده از EF Core برای گزارش‌گیری پیچیده (به جای آن از رویه‌های ذخیره‌شده یا Dapper استفاده کنید)معماری‌های دنیای واقعیمعماری تمیز: استفاده از EF Core در لایه زیرساختمدل CQRS با MediatR: EF Core به‌ عنوان لایه دسترسی به داده‌های خواندن/نوشتنالگوی مخزن: (Repository) پنهان‌سازی کوئری‌های EF Core برای تست‌پذیرینکات عملکرداز AsNoTracking() هنگام خواندن تنها استفاده کنیدبه‌روزرسانی‌های دسته‌ای را با ExecuteSqlRaw در نظر بگیریداز کوئری‌های کامپایل‌شده برای عملیات تکراری استفاده کنیدباید DbContext را کوتاه‌مدت نگه دارید (محدود به هر درخواست)پشتیبانی چند سکوییفریم ورک EF Core در هر جایی که .NET وجود دارد کار می‌کند:ویندوزلینوکسسیستم عامل macOSکانتینرها (Docker)پلتفرم‌های ابری (Azure، AWS، GCP) نتیجه‌گیری نهاییفریم ورک .NET Core و EF Core یک مسیر مدرن و بهینه برای ساخت برنامه‌های مقیاس‌پذیر و قابل نگهداری با حداقل تشریفات و حداکثر انعطاف‌پذیری ارائه می‌دهند. چه شما در حال کار بر روی یک برنامه monolithic یا میکروسرویس‌ها، برنامه‌های کوچک یا پلتفرم‌های مقیاس بزرگ باشید — EF Core یک ORM توانمند است که به‌طور یکپارچه با اکوسیستم گسترده .NET ادغام می‌شود.نکات مهم فنی:در توسعه نرم‌افزار مدرن، ساخت API‌های تمیز، یکپارچه و قابل پیش‌بینی ضروری است. چه در حال توسعه معماری میکروسرویس‌ها باشید و چه یک سیستم مونو لیتیک، نحوه ارتباط API شما با نتایج — چه موفق و چه خطا — می‌تواند تأثیر زیادی بر قابلیت نگهداری، ادغام کلاینت و اشکال‌زدایی داشته باشداستفاده از یک فرمت پاسخ یکپارچه یکپارچگی به کلاینت‌ها کمک می‌کند تا پاسخ‌ها را به‌طور مؤثر تجزیه و مدیریت کنند. یک ساختار پاسخ استاندارد برای نتایج موفق و خطا تعریف کنید. الگوی رایج استفاده شده به صورت زیر است:public class ApiResponse&lt;T&gt;
{
  public bool Success { get; set; }
   public T? Data { get; set; }
   public string? Message { get; set; }
   public List&lt;string&gt;? Errors { get; set; }
}این الگو به کلاینت‌ها اجازه می‌دهد تا پاسخ‌ها را به‌طور یکنواخت مدیریت کنند، بدون توجه به نقطه پایانی API یا نتیجه.2.  استفاده از کدهای وضعیت HTTP مناسببرای هر پاسخ 200 OK را برنگردانید. پاسخ را با کد وضعیت HTTP مناسب مطابقت دهید: کد وضعیت | معنی | زمان استفاده| 200 OK   | درخواست GET، PUT، DELETE موفق | منبع به‌طور موفقیت‌آمیز واکشی یا به‌روزرسانی شد || 201 Created | منبع به‌طور موفقیت‌آمیز ایجاد شد | با POST برای نشان دادن ایجاد استفاده کنید || 400 Bad Request | ورودی نامعتبر از طرف کلاینت ارسال شده است | خطاهای اعتبارسنجی، JSON بدفرمت و غیره || 401 Unauthorized | احراز هویت لازم است | کاربر احراز هویت نشده است || 403 Forbidden | کاربر احراز هویت شده اما مجاز نیست | دسترسی ناکافی || 404 Not Found | منبع پیدا نشد | منبع وجود ندارد یا نقطه پایانی اشتباه است || 500 Internal Server Error | خطای غیرمنتظره سرور | استثناهای غیرمدیریت‌شده |3. متمرکز کردن مدیریت خطا با میدل‌وراز پراکنده کردن بلوک‌های try/catch خودداری کنید. مدیریت خطا را با استفاده از میدل‌ور سفارشی متمرکز کنید:public class ErrorHandlingMiddleware
{
    private readonly RequestDelegate _next;    private readonly ILogger&lt;ErrorHandlingMiddleware&gt; _logger;    public ErrorHandlingMiddleware(RequestDelegate next, ILogger&lt;ErrorHandlingMiddleware&gt; logger)
   {
        _next = next;
       _logger = logger;
   }    public async Task Invoke(HttpContext context)
   {        try        {
             await _next(context);
        }        catch (Exception ex)        {            _logger.LogError(ex, &amp;quotUnhandled exception&amp;quot);            context.Response.StatusCode = (int)HttpStatusCode.InternalServerError;            context.Response.ContentType = &amp;quotapplication/json&amp;quot            var response = new ApiResponse&lt;string&gt;            {                Success = false,                Message = &amp;quotAn unexpected error occurred.&amp;quot,                Errors = new List&lt;string&gt; { ex.Message }            };            await context.Response.WriteAsJsonAsync(response);        }
   }
}4. اعتبارسنجی مدل و FluentValidation از اعتبارسنجی مدل برای بازگرداندن خطاهای ساختاریافته استفاده کنید:[HttpPost]public IActionResult CreateItem([FromBody] CreateItemRequest request)
{    if (!ModelState.IsValid)
   {
           var errors = ModelState.Values.SelectMany(v =&gt; v.Errors)
                                       .Select(e =&gt; e.ErrorMessage)
                                      .ToList();        return BadRequest(new ApiResponse&lt;object&gt;
       {
            Success = false,
            Message = &amp;quotValidation failed&amp;quot,
            Errors = errors
        });
      }
//continue}5. پاسخ‌های صفحه‌بندی‌شده هنگام بازگرداندن مجموعه‌ها، متادیتا برای صفحه‌بندی را شامل کنید:public class PagedResponse&lt;T&gt; : ApiResponse&lt;List&lt;T&gt;&gt;
{
    public int TotalCount { get; set; }
    public int PageSize { get; set; }
    public int CurrentPage { get; set; }
    public int TotalPages =&gt; (int)Math.Ceiling((double)TotalCount / PageSize);
}تیجه‌گیریمدیریت مؤثر پاسخ‌های API در .NET ارتباط بهتری بین بک‌اند و کلاینت‌ها تضمین می‌کند.با استانداردسازی پاسخ‌ها، استفاده از کدهای وضعیت HTTP مناسب، متمرکز کردن مدیریت خطا و بهبود بازخورد اعتبارسنجی، API‌های شما قوی‌تر، قابل نگهداری‌تر و کاربرپسندتر می‌شوند</description>
                <category>سعید صفایی| Saeed Safaee</category>
                <author>سعید صفایی| Saeed Safaee</author>
                <pubDate>Tue, 27 May 2025 08:22:02 +0330</pubDate>
            </item>
                    <item>
                <title>ویژگی های جدید در C# ۱۲</title>
                <link>https://virgool.io/@saeedsafaee/%D9%88%DB%8C%DA%98%DA%AF%DB%8C-%D9%87%D8%A7%DB%8C-%D8%AC%D8%AF%DB%8C%D8%AF-%D8%AF%D8%B1-c-%DB%B1%DB%B2-ly2n04gt20op</link>
                <description>سی شارپامکان Primary Constructorsمانند رکورد ها که نمونه اولیه می ساختیم :public record Person(string frstName, string fastName);حالا برای کلاس ها هم میتوانیم این امکان را داشته باشیم:public class Person(string frstName, string fastName)امکان Collection expressionsاستفاده از مجوعه ها و ساده سازی کار برنامه نویس در زمان استفاده از مجموعه های مختلف مانند آرایه ها و یا لیست ها و یا غیرهpublic void GetPersons(int[] ids) {}public void GetPeople(List&lt;int&gt; ids) {}در زمان استفاده باید حتما آرایه و لیست به عنوان پارامتر به توابع بالا بدهیم، در غیر این صورت اگر برای لیست آرایه پاس بدهیم خطا میخورد،اما در سی شارپ ۱۲ میتوانیم به شکل زیر عمل کنیمperson.GetPersons([۱,۲,۳,۴])person.GetPeople([۱,۲,۳,۴])امکان Experimentalویژگی جدید که به شما امکان می‌دهد ویژگی را به انواع، متدها یا مجموعه‌های خود اضافه کنید تا نشان دهید که این ویژگی آزمایشی است.با انجام این کار، کامپایلر زمانی که کسی سعی می کند از متد استفاده کند، خطا می دهد و متذکر میشود که این کلاس به صورت موقت است و امکان تغییر یا حذف دارد[Experimental(&quot;TestClass&quot;)]public class Person{}امکان ref readonly parametersبا این امکان نمی‌توان مقداری را که توسط مرجع ارسال می‌شود تغییر داد، زیرا یک &quot;فقط خواندنی&quot; است.public void Persons(ref readonly int number){   Console.WriteLine(&quot;Your number is {number}&quot;);   number++;   این خط خطا میدهد و کامپایلر اجرا نمیشود، چون فقط خواندی است }</description>
                <category>سعید صفایی| Saeed Safaee</category>
                <author>سعید صفایی| Saeed Safaee</author>
                <pubDate>Wed, 06 Mar 2024 14:30:53 +0330</pubDate>
            </item>
                    <item>
                <title>مهندس طراحی(Design engineer)</title>
                <link>https://virgool.io/@saeedsafaee/%D9%85%D9%87%D9%86%D8%AF%D8%B3-%D8%B7%D8%B1%D8%A7%D8%AD%DB%8Cdesign-engineer-j7ifepqzg1vu</link>
                <description>بر کسی پوشیده نیست که طراحان و توسعه دهندگان همیشه یک دید فنی مشترک به محصول ندارند و تمایل به اهداف متفاوتی دارند که تأثیر متفاوتی بر محصول داردچیزی که مهندسان طراحی آن را شکاف(GAP) می نامندطراحانی که کدنویسی را یاد می گیرند، یا توسعه دهندگانی که مهارت های طراحی را یاد  میگیرند کمکی به حل این شکاف نمی کنه، پس این شکاف چیست؟مهندس طراحی:او خلاق است و خروجی طراح را برای کدنویسی، استاندارد سازی میکندمهندس طراح بر فرآيند طراحی مهندسی در هر بخش از یک محصول تمركز دارد.مهارت های مهندس طراحیدرک عالی از طراحی و جزئیات گراشناخت پلتفرم های حوزه کاریمهندس طراحی باید ایده ها و تبدیل آن ایده ها به محصولات واقعی را بررسی و چالش آن را حل کند(نظارت بر فرآیند ساخت تمامی طرح ها)مهندس طراحی فرآیندتحقیق کنید که آیا طراحی کارآمد و مقرون به صرفه خواهد بودجمع آوری و تجزیه و تحلیل داده ها از آزمایشات روی نمونه های اولیهاثرات زیست محیطی محصولات جدید را در نظر بگیریدتوانایی انجام چند کار و مدیریت موثر زمانراهکار جلوگیری از شکافاستخدام تیم تخصصی یوایکس، افرادی که باید طرز فکر انتقادی داشته باشندجدی گرفتن اصول طراحیباید جلسات مکرر بین توسعه دهندگان و طراحان</description>
                <category>سعید صفایی| Saeed Safaee</category>
                <author>سعید صفایی| Saeed Safaee</author>
                <pubDate>Sun, 25 Jun 2023 15:36:02 +0330</pubDate>
            </item>
                    <item>
                <title>ویژگی جدید در C# 11</title>
                <link>https://virgool.io/@saeedsafaee/%D9%88%DB%8C%DA%98%DA%AF%DB%8C-%D8%AC%D8%AF%DB%8C%D8%AF-%D8%AF%D8%B1-c-11-wdliy2dkeyme</link>
                <description>C# 11در سی شارپ 11، میتوانیم با استفاده از کلمه کلیدی مورد نیاز(required)، ویژگی ها را به عنوان مورد نیاز علامت گذاری کنیم:درنسخه های پایین تر، راه خوبی وجود ندارد که بتوانیم به کامپایلر C# بگوییم که یک ویژگی خاص از یک کلاس مورد نیاز است، اما:public class User 
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public required DateTime DateOfBirth { get; set; }
    public required string Email { get; set; }
}اگر می‌خواهیم مطمئن باشیم که ویژگی‌های DateOfBirth و Email همیشه مقدار دهی شده‌اند، باید این کار را به شکل زیر انجام میدهیم:var myUser = new User()
{
    DateOfBirth = new DateTime(2022, 08, 06),
    Email = &amp;quotmyEmail@test.com&amp;quot
}ادامه دارد...</description>
                <category>سعید صفایی| Saeed Safaee</category>
                <author>سعید صفایی| Saeed Safaee</author>
                <pubDate>Sun, 14 Aug 2022 11:25:18 +0430</pubDate>
            </item>
                    <item>
                <title>چرا نیاز به ساختار سازمانی داریم</title>
                <link>https://virgool.io/@saeedsafaee/%DA%86%D8%B1%D8%A7-%D9%86%DB%8C%D8%A7%D8%B2-%D8%A8%D9%87-%D8%B3%D8%A7%D8%AE%D8%AA%D8%A7%D8%B1-%D8%B3%D8%A7%D8%B2%D9%85%D8%A7%D9%86%DB%8C-%D8%AF%D8%A7%D8%B1%DB%8C%D9%85-jzrejh6mgdyo</link>
                <description>این ساختار ها هستند که معین میکنند که گروه ها چگونه تقسیم بندی، هماهنگ و هدایت شوند.انواع ساختار سازمانی:1- ماتریسی2- خطی3- پروژه ای4- ارکانیک(ساده)5- صفی6-  عملکردی7- بخشی8- مجازیبررسی ساختار ماتریسیترکیبی از وظیفه فرد به صورت سنتی و تیم های پروژه است.&quot;مدل رایج در تیم ها&quot;کارکنان از بخش های مختلف تشکیل تیم می‌دهند اما موقعیت قبلی خود را حفظ میکنند، به این علت که تیم ها موقتی هستند و بعد از اتمام پروژه، کار تیم تمام می‌شود.مزایامنابع موثر و مستمر به کار کرفته می شوداطلاعات در کل سازمان در چرخه استارتباط زیاد و موثر بین کارکناناستفاده از مهارت های افراد در زمینه های مختلفمعایتتحت فشار بودن اعضای تیمپیچیده‌‎گی و عدم شفافیتاعضای تیم باید عملکردشان موثر باشدهماهنگی های زیاد و احتمال هرج و مرج</description>
                <category>سعید صفایی| Saeed Safaee</category>
                <author>سعید صفایی| Saeed Safaee</author>
                <pubDate>Sun, 30 May 2021 11:34:10 +0430</pubDate>
            </item>
                    <item>
                <title>تفاوت ساختار ها (struct) و کلاس(class)</title>
                <link>https://virgool.io/coderlife/%D8%AA%D9%81%D8%A7%D9%88%D8%AA-%D8%B3%D8%A7%D8%AE%D8%AA%D8%A7%D8%B1-%D9%87%D8%A7-struct-%D9%88-%DA%A9%D9%84%D8%A7%D8%B3class-lwsrtaz1flzt</link>
                <description>گاهی برنامه نویس باید صدها نمونه از یک شی رو در حافظه ذخیره کند که این کار با استفاده از کلاس یا ساختار(struct) قابل حل است.ساختار:یک ساختار فقط داده را شامل می شود و برخلاف کلاس، فاقد توابع است* برای دسترس عمومی تعریف میشود**اصلا  نمیتواند ارث بری کند***مثال کاربردی و مهم:public class PointClass{    public int X { get; set; }    public int Y { get; set; }}public struct PointStruct{    public int X { get; set; }    public int Y { get; set; }}public class StructWithClassTest{     const int length = 100000;     [Benchmark]     public void ListCalssTest()     {          var items = new List&lt;PointClass&gt;(length);          for (int i = 0; i &lt; length; i++)         {               items.Add(new PointClass() { X = i, Y = i });         }     }    [Benchmark]    public void ListStructTest()    {          var items = new List&lt;PointStruct&gt;(length);         for (int i = 0; i &lt; length; i++)        {            items.Add(new PointStruct() { X = i, Y = i });        }    }همان طور از تصویر پیداست ساختار ها سرعت بیشتری دارندنکته: ساختار value type است، بنابراین سریع تر از یک کلاس است. از ساختارها در مواردی که می خواهید تنها یک داده را ذخیره کنید استفاده کنید</description>
                <category>سعید صفایی| Saeed Safaee</category>
                <author>سعید صفایی| Saeed Safaee</author>
                <pubDate>Sun, 16 May 2021 14:57:42 +0430</pubDate>
            </item>
                    <item>
                <title>محصول چیست و نقش مدیر محصول در نرم افزار</title>
                <link>https://virgool.io/coderlife/%D9%85%D8%AD%D8%B5%D9%88%D9%84-%DA%86%DB%8C%D8%B3%D8%AA-%D9%88-%D9%86%D9%82%D8%B4-%D9%85%D8%AF%DB%8C%D8%B1-%D9%85%D8%AD%D8%B5%D9%88%D9%84-%D8%AF%D8%B1-%D9%86%D8%B1%D9%85-%D8%A7%D9%81%D8%B2%D8%A7%D8%B1-ngbelzjjzicy</link>
                <description>هر محصول اینترنتی باید حداقل پنچ ویژگی هایی داشته باشد:1- تدوین چشم انداز محصول(یک چشم انداز روشن از محصول است)2- تهیه فهرست مخاطبان محصول3- چه نیازی از مخاطب را میخواهیم برطرف کنیم4- شناخت رقبا و استراتژی ما در روند تهیه محصول5- هدف محصول و تهیه پروتوتایپ یا نقشه راهمدیر محصول:کسی است که نقشه راه را درست میکند و تمام تیم هایی که درگیر تولید این محصول هستند را هماهنگ می کند، و باید تلاش کند محصول همان چیزی شود که مشتری از آن رضایت داشته باشد.ویژگی های مدیر محصول:در حوزه هایی که مدیر محصول باید توانایی داشته باشد:1-تحقیق(R&amp;D)          تحقیق و شناخت معماری          توانایی طراحی محصول           شناخت الگوی های طراحی رفتار(سطح پیشرفته)2- تولید           آشنایی با UX           شناخت متدولوژی            آشنایی با مباحث فنی و شناخت تکنولوژی ها3- مارکتینگ         ارتباط با واحد فروش         بررسی اصول قیمت گزاری و برنامه ریزی برای کمیپین ها4- پس از تولید         ارتباط با مشتری         کوتاه کردن اهداف محصول فرایند تولید محصول:(تیم محصول و مدیر محصول)1- برنامه ریزی اولیه:بررسی بازاربررسی رقباتهیه بوم کسب و کارتحلیل نیروی پورتر(در انتهای مقاله توضیحات)تیم سازی برای محصول2- تعریف محصول ارزیابی:دسته بندی مشتریانبررسی Product Market fit3- تولید محصول:تهیه نقشه راه
انتخاب و بررسی متدولوژی
اولویت بندی ها
طراحی محصول4- مارکتینک و فروشاطمینان از محصولتهیه مستندات برای تیم مارکتینگآموزش به تیم  مارکتینگ5- بررسی فیدبک ها و تحلیل داده های مشتریپنج نیروی رقابتی پورترنیروی اول: تهدید‌ تازه‌وارد‌ها (کوتاه بودن دیوارهای ورود) نیروی دوم: قدرت چانه‌زنی مشتریان نیروی سوم: قدرت چانه‌زنی تأمین‌کنندگان نیروی چهارم: تهدید کالا و خدمات جایگزین نیروی پنجم: رقابت میان فعالان فعلی صنعتدیوار های ورود:دیوارهای ورود معیاری است که نشان می‌دهد ورود به یک صنعت برای کسی که پیش از این، در آن صنعت فعالیت نکرده تا چه حد دشوار است، این دشواری ها مانند:سرمایه‌ی مورد نیاز مجوزهای قانونی اعمال فشار از سوی فعالانهر چقدر دیوارهای ورود به صنعت بلندتر – و موانع ورود به آن دشوارتر</description>
                <category>سعید صفایی| Saeed Safaee</category>
                <author>سعید صفایی| Saeed Safaee</author>
                <pubDate>Wed, 05 May 2021 18:07:27 +0430</pubDate>
            </item>
                    <item>
                <title>شروع کننده برنامه یا (ModuleInitializers) در دات نت</title>
                <link>https://virgool.io/@saeedsafaee/%D8%B4%D8%B1%D9%88%D8%B9-%DA%A9%D9%86%D9%86%D8%AF%D9%87-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-%DB%8C%D8%A7-moduleinitializers-%D8%AF%D8%B1-%D8%AF%D8%A7%D8%AA-%D9%86%D8%AA-gjpf9a2em55x</link>
                <description>حتما برای شما پیش آمده که در برنامه بخواهید قبل از اجرا برنامه(قبل از هر کاری) یک متد خاصی را اجرا کنیدفرض کنید برنامه ای دارید که قبل از اجرا شدن باید یک بک آپ از دیتابیس بگیره و بعد اجرا بشهشروع کننده برنامه یا [ModuleInitializers][ModuleInitializers]#tips_dotnetcore#نکات_مهم#کاربردی#ترفند_های_کاربردی</description>
                <category>سعید صفایی| Saeed Safaee</category>
                <author>سعید صفایی| Saeed Safaee</author>
                <pubDate>Thu, 29 Apr 2021 09:46:59 +0430</pubDate>
            </item>
                    <item>
                <title>بدهی فنی در برنامه نویسی</title>
                <link>https://virgool.io/fboard/%D8%A8%D8%AF%D9%87%DB%8C-%D9%81%D9%86%DB%8C-%D8%AF%D8%B1-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-%D9%86%D9%88%DB%8C%D8%B3%DB%8C-zknrp3g9zyek</link>
                <description>بدهی فنی در برنامه نویسی: هزینه دوباره‌کاری‌هایی که اغلب به خاطر انتخاب راه حل های ساده و زود بازده به جای راه حل اصولی(درست) می‌پردازیم.debet techالبته گاهی اوقات به سهوی و گاهی عمدی هست که هردو هم لازمه که معمولا ناشی از بی‌دقتی (عدم تسلط کافی) یا به دلیل آینده نگری است.راه حل که استفاده میکنم برای حل این مشکل: انجام refactor منظم و در دوره های مشخص (همیشه میشه الگوریتم رو بهبود داد)</description>
                <category>سعید صفایی| Saeed Safaee</category>
                <author>سعید صفایی| Saeed Safaee</author>
                <pubDate>Sun, 18 Apr 2021 09:51:43 +0430</pubDate>
            </item>
                    <item>
                <title>راهنمای Minification در ASP.NET Core</title>
                <link>https://virgool.io/@saeedsafaee/%D8%B1%D8%A7%D9%87%D9%86%D9%85%D8%A7%DB%8C-minification-%D8%AF%D8%B1-aspnet-core-zbnbjorgejxm</link>
                <description>هر توسعه دهنده وب باید برنامه های وب سریع و با کارایی بالا ایجاد کند که این کار در بخش های مختلف و تکنیک ها و فریم ورک های مختلفی نیاز است.بسته بندی و کوچک سازی، دو بهینه سازی عملکرد متمایز است که می توانیم در برنامه های وب خود برای بهبود عملکرد برنامه ها و کاهش تعداد درخواست ها از مرورگر به سرور و کاهش حجم داده های منتقل شده از سرور به مرورگر استفاده کنیم.(Minification)فرآیند حذف فضاها و نویسه های اضافی غیرضروری از کد بدون تغییر در عملکرد استابتدا نصب پکیج:Install-Package BuildBundlerMinifier -Version 3.2.449سپس یک فایل جیسون در برنامه درست کنید و الگوی زیر را در ان قرار دهید(bundleconfig.json):[{  &quot;outputFileName&quot;: &quot;wwwroot/css/site.min.css&quot;,  &quot;inputFiles&quot;: [   &quot;wwwroot/lib/bootstrap/dist/css/bootstrap.css&quot;,   &quot;wwwroot/css/site.css&quot; ]},{  &quot;outputFileName&quot;: &quot;wwwroot/js/site.min.js&quot;,   &quot;inputFiles&quot;: [&quot;wwwroot/js/site.js&quot;], &quot;minify&quot;: {    &quot;enabled&quot;: true,   &quot;renameLocals&quot;: true},   &quot;sourceMap&quot;: false  }]حالا وقتی برنامه رو اجرا می کنید فایل های css و js که مشخص کردید Minification  میشونداز این تگ هم استفاده میکنیم برای Release&lt;environment include=&amp;quotDevelopment&amp;quot&gt;
        &lt;link rel=&amp;quotstylesheet&amp;quot href=&amp;quot~/css/site.css&amp;quot asp-append-version=&amp;quottrue&amp;quot /&gt;    &lt;/environment&gt;

&lt;environment exclude=&amp;quotDevelopment&amp;quot&gt;        
      &lt;link rel=&amp;quotstylesheet&amp;quot href=&amp;quot~/css/site.min.css&amp;quot asp-append-version=&amp;quottrue&amp;quot /&gt;    &lt;/environment&gt;</description>
                <category>سعید صفایی| Saeed Safaee</category>
                <author>سعید صفایی| Saeed Safaee</author>
                <pubDate>Mon, 12 Apr 2021 16:23:25 +0430</pubDate>
            </item>
                    <item>
                <title>طراحی خوب و ویژگی طراحان خوب در نرم افزار</title>
                <link>https://virgool.io/@saeedsafaee/%D8%B7%D8%B1%D8%A7%D8%AD%DB%8C-%D8%AE%D9%88%D8%A8-%D9%88-%D9%88%DB%8C%DA%98%DA%AF%DB%8C-%D8%B7%D8%B1%D8%A7%D8%AD%D8%A7%D9%86-%D8%AE%D9%88%D8%A8-%D8%AF%D8%B1-%D9%86%D8%B1%D9%85-%D8%A7%D9%81%D8%B2%D8%A7%D8%B1-qmonklquyobs</link>
                <description>چرا می گوییم طراح خوب!!!!!نیروی تغییر در نرم افزار ها امری اجتناب ناپذیر است و همیشه طراحان نرم افزار با آن مواجه هستندهمیشه تغییر در نرم افزار ها پیامد هایی به دنبال دارد از جمله:1- هزینه       1-1  هزینه های مالی       1-2  هزینه های روانی2- ترس3- استرسطراح خوب کسی است که این پیامد ها را به حداقل برساندویژگی طراحان خوب1- نداشتن تعصب به طرح و مانع نبودن برای تغییر آن2- تجربه کافی در حوزه نرم افزار3- شناخت دامنه کار و اصول طراحی4- نگاه انتقادی به طرح خودش5- خودش را باهوش جلوه ندهدبررسی سه اصل بنیادی طراحیاصل بنیادی  YAGNI(You Aren&#x27;t Gonna Need it)در این اصل مواردی یاد شده که حتما یه طراح خوب به آن مسلط است1- حتما باید نیاز اصلی نرم افزار طراحی شود و احتمالا آینده در وحله اول در طراحی نیست(مطمئن باشید که فیچر مربوطه را لازم دارید)2- حتما دیتای کافی در رابطه با موضوع داشته باشد، اگر فردا دیتای بهتری دارد باید فردا طراحی کند3- داشتن Feedback loopچرا باید احتمالات در وحله اول در نظر گرفته نشود؟در نظر داشته باشید که اگر احتمالی را پیاده سازی کردیم و آن احتمال درست نبود و خلاف تصور ما پیش رفت آن وقت:1- هزینه طراحی فیچیر های احتمالی را باید بپردازیم2- هزینه طراحی های عقب افتاده  در فیچر اصلی 3- هزینه تولید فیچر های احتمالی که اشتباه تولید کردیم و باید عوض کنیماصل سادگیمیل به باهوش جلوه دادن باعث میشود که پیچیده طراحی کنیم(گاهی اوقات تصور ما بر این است که راه حل ساده افتخار آمیز نیست)این موضوع را میتوان با ماشین روب گلدبرگ درک کردروب گلد برگاین پیچیدگی مناسب طراحی نرم افزار نیستطراحی ساده کاملا با مخاطب حرف میزند و تمرکز کاربر را حفظ میکندکم کردن وابستگی ها در اصل سادگی موضوع مهمی به شمار میرود(ارتباط شفاف میان بخش ها یا سایر اجزا یک محصول)طراحی ساده دارای انسجام کافی و مفاهیم مرتبط را کنار هم نشان میدهداصل DRYDon’t Repeat Yourself&quot;خودت را تکرار نکن&quot; یک اصل از توسعه نرم افزار است که با هدف کاهش تکرار اطلاعاتی که احتمال تغییر آنها وجود دارد. جایگزینی آن با انتزاعی هایی است که احتمال تغییر کمتری دارند، یا استفاده از نرمال سازی داده ها که از افزونگی جلوگیری می کند.</description>
                <category>سعید صفایی| Saeed Safaee</category>
                <author>سعید صفایی| Saeed Safaee</author>
                <pubDate>Sun, 14 Mar 2021 11:19:52 +0330</pubDate>
            </item>
                    <item>
                <title>مقایسه StringBuilder با Immutable String</title>
                <link>https://virgool.io/@saeedsafaee/%D9%85%D9%82%D8%A7%DB%8C%D8%B3%D9%87-stringbuilder-%D8%A8%D8%A7-immutable-string-cwidbrl87rot</link>
                <description>بررسی Immutable  بودن string ها در سی شارپ و StringBuilder اختلاف بسیار زیاد، و یه تغییر کوچک باعث میشه که پرفورمنس کلی دست خوش تغییر قرار بگیره استفاده شده از پکیج BenchmarkInstall-Package BenchmarkDotNet -Version 0.12.1using BenchmarkDotNet.Running;using BenchmarkDotNet.Attributes;</description>
                <category>سعید صفایی| Saeed Safaee</category>
                <author>سعید صفایی| Saeed Safaee</author>
                <pubDate>Mon, 08 Mar 2021 09:19:54 +0330</pubDate>
            </item>
                    <item>
                <title>تاثیر استفاده ازfilegroups در کارایی دیتابیس SQLServer</title>
                <link>https://virgool.io/@saeedsafaee/%D8%AA%D8%A7%D8%AB%DB%8C%D8%B1-%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87-%D8%A7%D8%B2filegroups-%D8%AF%D8%B1-%DA%A9%D8%A7%D8%B1%D8%A7%DB%8C%DB%8C-%D8%AF%DB%8C%D8%AA%D8%A7%D8%A8%DB%8C%D8%B3-sqlserver-kaecbxidkvxs</link>
                <description>انواع فایل گروه ها(filegroups) در دیتابیس sql:DataFilegroups  AND FilestreamFilegroupsدلایل استفاده از Filegroups:1- پرفورمنسجدا سازی جداولی که مهم هستند و میزان کارکرد آن ها در یک دیتابیس بیشتر از سایر جداول است و قرار دادن آن در یک هارد دیسک با سرعت بالاتر برای کم کردن میزان IO و بهره بردن از سرعت بیشتر2- بک آپ گرفتن بخش خاصی از دیتابیسدیتابیس بزرگی که شامل چند فایل گروه است و فقط از یک فایل گروه backup میگیریم(backup filegroup)3- فقط خواندنی(readOnly) کردن بخشی از دیتابیس برای بالا بردن پرفورمنسجداولی هستند که ماهیت readOnly دارند و دیتای آن 6 ماه یا سالی یک بار تغییر میکند، آن را در فایل گروه خاصی قرار داده و readOnly میکنیم، دیتابیس درگیر مباحث lock کردن نمی شود و سرعت آن خیلی بالا میرود4- دیتاهای بزرگ(Large Object) blobزمانی که حجم این دیتاها در این نوع دیتاتایپ ها بالا میرد سرعت کم میشود چون در فایل گروه اصلی هستند و عملیات IO را کند میکند، باید فیلدهای blob در هر جدول را در فایل گروه دیگری قرار دهیم انواع Blob:(دیتاهای غیرساخت یافته Unstructured Data)1- xml2- varchar(max)3- varbinary(max)4- تصاویر و filestream5- ...</description>
                <category>سعید صفایی| Saeed Safaee</category>
                <author>سعید صفایی| Saeed Safaee</author>
                <pubDate>Tue, 02 Mar 2021 12:37:17 +0330</pubDate>
            </item>
                    <item>
                <title>یکی از تجربه های مهمِ فنی برنامه نویسی</title>
                <link>https://virgool.io/@saeedsafaee/%DB%8C%DA%A9%DB%8C-%D8%A7%D8%B2-%D8%AA%D8%AC%D8%B1%D8%A8%D9%87-%D9%87%D8%A7%DB%8C-%D9%85%D9%87%D9%85%D9%90-%D9%81%D9%86%DB%8C-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-%D9%86%D9%88%DB%8C%D8%B3%DB%8C-gewpjvft1fpa</link>
                <description>شاید برای شما هم پیش آماده باشه که در زمان کار با دیتابیس و تعداد جداول زیاد، بخواهید دیتا های مختلفی از جدول های متعددی بازیابی کنید.برای این منظور فقط بخواهید که یک کاننکشن باز کنید و از همان برای خواندن از جداول مختلف استفاده کنیدمثلا://Block1
using (EDMX.MyContext dc = new EDMX.MyContext())
{
   var persons = dc.Persons.ToList();
   var tasks = dc.Tasks.ToList();
   ...
}حالا اگر بخواهید که دیتایی را از جدول دیگری که در کلاس ProjectServiceهست بازیابی کنید در همین بلاک اول(Block1)نکته تجربی 
پاس دادن dc در فانکشنمثال://Block2
using (EDMX.MyContext dc = new EDMX.MyContext()) 
{    
  var persons = dc.Persons.ToList();    
  var tasks = dc.Tasks.ToList();    

  //pass database connection onother class
  var projects = Services.ProjectService.GetList(dc);
}نکات مهم:1- اگر در زمان ارسال کاننشن(dc) فقط آن را برای خواندن دیتا استفاده میکنید هیچ مشکلی ندارد.2- اگر در زمان ارسال کاننشن در دیابیس تغییر ایجاد میکند اصلا توصیه نمیشود و راه آن استفاده ازtransaction است.این مسئله برای مدل خاص تولید و تعریف شده است.</description>
                <category>سعید صفایی| Saeed Safaee</category>
                <author>سعید صفایی| Saeed Safaee</author>
                <pubDate>Sat, 27 Feb 2021 14:36:50 +0330</pubDate>
            </item>
                    <item>
                <title>اسکریپت نویسی در سی شارپ</title>
                <link>https://virgool.io/@saeedsafaee/%D8%A7%D8%B3%DA%A9%D8%B1%DB%8C%D9%BE%D8%AA-%D9%86%D9%88%DB%8C%D8%B3%DB%8C-%D8%AF%D8%B1-%D8%B3%DB%8C-%D8%B4%D8%A7%D8%B1%D9%BE-e7eqjnn82lkt</link>
                <description>دوستانی که با زبان های اسکریپتی مانند nodejs کار کردن میدانند که که در CMD می توانند با این دستور شروع به کار کنند و دستورات را بنویسند:node ↵5 * 6 اما در دات نت هم میتوان با امکان CSI این کار کرد یا همان (developer command prompt) که با نصب MSBuild امکان csi هم نصب می شود. هرجا که دات نت هست csi هم نصب میشود.developer command prompt for vs 2019ما میتوانیم یک فایل اسکرپتی بنویسیم مانند زیر و آن را اجرا کنیم:(myfile.csx)Console.WriteLine(DateTime.Now);int a = 0;for(int i = 0; i&lt;=5000; i++){  a = i*2;}Console.WriteLine(DateTime.Now);شما معمولا باید به مسیری که CSI در اون نصب شده برید، مشکل اجرای گلوبال این خط فرمان با کد زیر درست می شود:(کد زیر را در cmd بنویسید)dotnet tool install--global dotnet-scriptحالا در CMD در هر مسیری دستور اجرای اسکریپت تون رو بزنید:dotnet script myFile.csxشما میتوانید هر فایلی که نیاز دارید رو اسکریپت اون رو بنویسید و بعد اجرا کنیدشما همچنین میتوانید این کار را در ویژال اسدتیو انجام دهید از مسیر زیر:View--&gt;OtherWindows--&gt; C# interactive</description>
                <category>سعید صفایی| Saeed Safaee</category>
                <author>سعید صفایی| Saeed Safaee</author>
                <pubDate>Tue, 02 Feb 2021 15:39:43 +0330</pubDate>
            </item>
                    <item>
                <title>بررسی ()ToQueryString.  و ()Include. در Core5</title>
                <link>https://virgool.io/@saeedsafaee/%D8%A8%D8%B1%D8%B1%D8%B3%DB%8C-toquerystring-%D9%88-include-%D8%AF%D8%B1-core5-k7o5tajg4lxa</link>
                <description>یکی از مشکلات EF این بود که دستوراتی که درست میکرد را برنامه نویس نمی توانست ببیند اما...با استفاده از ()ToQueryString. در Entity Framework Core 5.0 که برای برای پرس و جوهای LINQ ارائه می شود، می توانید کوئری که به برای دیتابیس تولید میکند(T-SQL) را مشاهده کنید.بررسی یه مثال:public class Person
{
     [Key]
     public int ID { get; set; }
     public string Name { get; set; }
     public List&lt;PersonChild&gt; Childs { get; set; }
     public List&lt;PersonAddress&gt; Address { get; set; }
}public class PersonChild 
{            
   [Key]            
   public int CildID { get; set; }            
   public string ChildName { get; set; }        
}
public class PersonAddress
{                
   [Key]                
   public int AddressID { get; set; }                
   public string AddressName { get; set; }         
}در بالا کلاس person و Child های آن را ساختیمبا استفاده از دستور زیر می توانیم T-SQL که EF برای ما تولید میکند را ببینیم:var list= db.Persons.Where(r=&gt; r.ID == 1).Include(i =&gt; i.Childs).Include(r =&gt; r.Address).ToQueryString();
دستور بالا یک شخص را با فرزندان و آدرس ها باز می گرداندنتیجه این دستور به شکل کوئری زیر است:SELECT[p].[ID], [p].[Name], [p0].[CildID], [p0].[ChildName], [p0].[PersonID], [p1].[AddressID], [p1].[AddressName], [p1].[PersonID]
FROM[Persons] AS[p]
LEFT JOIN[PersonChild] AS[p0] ON[p].[ID] = [p0].[PersonID]
LEFT JOIN[PersonAddress] AS[p1] ON[p].[ID] = [p1].[PersonID]
WHERE[p].[ID] = 1            
ORDER BY[p].[ID], [p0].[CildID], [p1].[AddressID]این روش مناسبی است چون فقط یک بار به دیتابیس درخواست می دهد، در گذشته برای هر جدول Child و Address یک درخواست جدا ارسال می شد به دیتابیس، اما فقط برای رکورد های کمتر از 10تا، برای رکورد های بیشتر از آن به شدت افت سرعت دارد و بسیار بد است.</description>
                <category>سعید صفایی| Saeed Safaee</category>
                <author>سعید صفایی| Saeed Safaee</author>
                <pubDate>Thu, 14 Jan 2021 13:46:53 +0330</pubDate>
            </item>
                    <item>
                <title>کدام معماری انتخاب درستی برای تجارت شماست Monolithic یا Microservice</title>
                <link>https://virgool.io/@saeedsafaee/%DA%A9%D8%AF%D8%A7%D9%85-%D9%85%D8%B9%D9%85%D8%A7%D8%B1%DB%8C-%D8%A7%D9%86%D8%AA%D8%AE%D8%A7%D8%A8-%D8%AF%D8%B1%D8%B3%D8%AA%DB%8C-%D8%A8%D8%B1%D8%A7%DB%8C-%D8%AA%D8%AC%D8%A7%D8%B1%D8%AA-%D8%B4%D9%85%D8%A7%D8%B3%D8%AA-monolith-%DB%8C%D8%A7-microservice-k30rx7ejqzua</link>
                <description>انتخاب میکروسرویس(Microservice)در واقع، رویکرد خدمات خرد مزایای ملموسی از جمله افزایش مقیاس پذیری، انعطاف پذیری، چابکی و سایر مزایای قابل توجه را دارد.در همین حال، بسیاری از شرکت ها پیروی از این مثال را به عنوان کارآمدترین راه برای رشد تجارت می دانند.انتخاب مدل یکپارچه(Monolith)برعکس، رویکرد یکپارچه یک مدل پیش فرض برای ایجاد یک برنامه نرم افزاری است.روند آن رو به کاهش است زیرا ساخت یک برنامه یکپارچه تعدادی از چالش های مربوط به مدیریت کد، انتخاب یک فناوری جدید، مقیاس گذاری، استقرار، اجرای تغییرات جدید و سایر مشکلات را به وجود می آورد.هرکدام از این دو مدل معاری مزایا و معایبی دارند که نیاز به مطالعه بیشتر در این زمینه است.اما سعی کردم در چند سطر حال و هوای هر کدام از این معماری ها رو توضیح بدم که با توجه به مقایس پروژه و نوع کار کرد و طول عمر و .... انتخاب درستی داشته باشید( قطعا پروژه های بزرگ معماری میکروسرویس خیلی مناسبتر است)معماری میکروسرویس در یک نگاهمیکروسرویس</description>
                <category>سعید صفایی| Saeed Safaee</category>
                <author>سعید صفایی| Saeed Safaee</author>
                <pubDate>Sun, 10 Jan 2021 14:18:36 +0330</pubDate>
            </item>
                    <item>
                <title>قابلیت جدید records در سی شارپ 9</title>
                <link>https://virgool.io/@saeedsafaee/%D9%82%D8%A7%D8%A8%D9%84%DB%8C%D8%AA-%D8%AC%D8%AF%DB%8C%D8%AF-records-%D8%AF%D8%B1-%D8%B3%DB%8C-%D8%B4%D8%A7%D8%B1%D9%BE-9-jf4axjtu38vy</link>
                <description>قابلیت جدید در سی شارپ 9 که باعث می شود مقادیر رو در زمان ایجاد یک آبجک تولید کنیم، که بعد از آن مقدار آن را نمیتوانیم تغییر دهیم.ما در گذشته راه های متفاوتی داشتیم برای مقدار دهی اولیه به پروپرتی های کلاس، مانند زیر:public class person{  public person()// contractor  { Rate = 20;   }  public string Name { get; set; }  public int Rate { get; private set; }OR  public int Rate { get{return 10;} }} کنترل کردن دسترسی یک پروپرتی خیلی مهمهتصور کنید که در زمان انتقال وجه در حساب کاربر مقدار اولیه ای به آن میدهم و در بین جابجایی کلاس ها این پروپرتی تغییر کنه!!!!، این میتونه حساب کاربر رو کاملا متفاوت کنه.اما records کلاس person جدید تولید میکنیم:public record Person{    public int ID { get; init; }    public int Price { get; init; }}شیوه استفاده این به شکل است:var person = new Person { ID= 1, Price = 7000 }; // مقدار دهی اولیه در زمان ایجان نمونه جدیداین مقدار دهی اولیه شد و دیگر تغییر نمی کند.البته حالت استثنا هم هست که هنگام کار با داده های تغییرناپذیر، یک الگوی معمول ایجاد مقادیر جدید از مقادیر موجود برای نشان دادن حالت جدید استبه عنوان مثال، اگر فرد ما بخواهد مقدار Price را تغییر دهد، ما آن را به عنوان یک شی جدید نشان می دهیم که یک کپی از مورد قدیمی است:var otherPerson = person with { Price = 8000 };</description>
                <category>سعید صفایی| Saeed Safaee</category>
                <author>سعید صفایی| Saeed Safaee</author>
                <pubDate>Sun, 27 Dec 2020 17:08:02 +0330</pubDate>
            </item>
                    <item>
                <title>تولید قاعده نام‌گذاری سفارشی در Visual studio</title>
                <link>https://virgool.io/@saeedsafaee/%D8%AA%D9%88%D9%84%DB%8C%D8%AF-%D9%82%D8%A7%D8%B9%D8%AF%D9%87-%D9%86%D8%A7%D9%85%DA%AF%D8%B0%D8%A7%D8%B1%DB%8C-%D8%B3%D9%81%D8%A7%D8%B1%D8%B4%DB%8C-%D8%AF%D8%B1-visual-studio-ojliyvw1gltk</link>
                <description>تصور کنید مدیر پروژه هستید و می خواهید که نیرو های جدید در شرکت شما از قواعد نامگذاری در پروژه پیروی کنند و پروژه از شکل و مسیری که طراحی شده به لحاظ فنی دور نشوند.پس باید قواعد رو بسازید:از منوی Tools --&gt;Options رو انتخاب کنید و مسیر زیر را بروید:سپس برای خود یک Style جدید تعریف کنید مانند تصویر زیر:(ابتدا نام، بعد prefix مورد نظر که من از _(آندرلاین) استفاده کردم برای capitalization Pascal CaseName)حالا باید این مدلی که ایجاد کردید را برای یک Specification خاص استفاده کنید:شما به این راحتی یک قاعده نام گذاری سفارشی تولید کردید.</description>
                <category>سعید صفایی| Saeed Safaee</category>
                <author>سعید صفایی| Saeed Safaee</author>
                <pubDate>Tue, 15 Dec 2020 10:37:44 +0330</pubDate>
            </item>
            </channel>
</rss>