فصل 40 از 40 درس 1 از 1

پروژه نهایی C#

پروژه نهایی C#

بخشی از آموزش جامع C# و .NET 10

محتوای درس پروژه نهایی C#

پروژه نهایی مجموعه مفاهیم دوره را در یک سناریوی منسجم ترکیب می‌کند. هدف، طراحی یک برنامه Console چندلایه برای مدیریت فروشگاه است که مدل دامنه، Collection، LINQ، فایل JSON، Exception، Async و Test را در کنار هم استفاده کند.

۱. دامنه پروژه

سیستم شامل Product، Category، Customer، Order و OrderItem است. هر Entity باید State و رفتار مرتبط خود را به‌صورت کنترل‌شده نگه دارد.

مثال

record Product(Guid Id,string Name,decimal Price,int Stock);

در این مثال، مفهوم «دامنه پروژه» در یک قطعه کد مستقل نمایش داده شده است. مقدارها و نام‌ها عمداً ساده انتخاب شده‌اند تا رفتار اصلی قابل مشاهده باشد؛ در پروژه واقعی همین الگو با مدل دامنه، اعتبارسنجی و مدیریت خطای متناسب ترکیب می‌شود.

۲. معماری پیشنهادی

پروژه را به پوشه‌های Domain، Application، Infrastructure و Presentation تقسیم کنید تا مسئولیت‌ها از هم جدا باشند.

مثال

interface IRepository<T>{Task<IReadOnlyList<T>> GetAllAsync();}
         class CatalogService{/* depends on IRepository<Product> */}

در این مثال، مفهوم «معماری پیشنهادی» در یک قطعه کد مستقل نمایش داده شده است. مقدارها و نام‌ها عمداً ساده انتخاب شده‌اند تا رفتار اصلی قابل مشاهده باشد؛ در پروژه واقعی همین الگو با مدل دامنه، اعتبارسنجی و مدیریت خطای متناسب ترکیب می‌شود.

۳. مدیریت داده

Repository Generic ساده می‌تواند داده را در حافظه مدیریت و یک Storage JSON آن را در فایل Persist کند.

مثال

var products=new List<Product>(); products.Add(new(Guid.NewGuid(),"Mouse",900000m,10));

در این مثال، مفهوم «مدیریت داده» در یک قطعه کد مستقل نمایش داده شده است. مقدارها و نام‌ها عمداً ساده انتخاب شده‌اند تا رفتار اصلی قابل مشاهده باشد؛ در پروژه واقعی همین الگو با مدل دامنه، اعتبارسنجی و مدیریت خطای متناسب ترکیب می‌شود.

۴. سرویس سفارش

OrderService مسئول ساخت سفارش، اعتبارسنجی موجودی، محاسبه مبلغ و تغییر State سفارش است.

مثال

class Order{private readonly List<(Product p,int q)> _items=new(); public void Add(Product p,int q)=>_items.Add((p,q));}

در این مثال، مفهوم «سرویس سفارش» در یک قطعه کد مستقل نمایش داده شده است. مقدارها و نام‌ها عمداً ساده انتخاب شده‌اند تا رفتار اصلی قابل مشاهده باشد؛ در پروژه واقعی همین الگو با مدل دامنه، اعتبارسنجی و مدیریت خطای متناسب ترکیب می‌شود.

۵. LINQ و گزارش

گزارش فروش بر اساس محصول، مشتری و بازه زمانی با LINQ تولید شود.

مثال

var top=products.Where(p=>p.Stock>0).OrderByDescending(p=>p.Price).Take(3);

در این مثال، مفهوم «LINQ و گزارش» در یک قطعه کد مستقل نمایش داده شده است. مقدارها و نام‌ها عمداً ساده انتخاب شده‌اند تا رفتار اصلی قابل مشاهده باشد؛ در پروژه واقعی همین الگو با مدل دامنه، اعتبارسنجی و مدیریت خطای متناسب ترکیب می‌شود.

۶. Async I/O

ذخیره و بازیابی JSON با APIهای Async انجام شود و CancellationToken در مسیرهای مناسب پذیرفته شود.

مثال

await File.WriteAllTextAsync("products.json","[]");

در این مثال، مفهوم «Async I/O» در یک قطعه کد مستقل نمایش داده شده است. مقدارها و نام‌ها عمداً ساده انتخاب شده‌اند تا رفتار اصلی قابل مشاهده باشد؛ در پروژه واقعی همین الگو با مدل دامنه، اعتبارسنجی و مدیریت خطای متناسب ترکیب می‌شود.

۷. تست

قواعد محاسبه مبلغ، تخفیف، موجودی و State Transition با xUnit پوشش داده شوند.

مثال

// Assert.Equal(expected, actual);
         Console.WriteLine("Test domain logic without file I/O");

در این مثال، مفهوم «تست» در یک قطعه کد مستقل نمایش داده شده است. مقدارها و نام‌ها عمداً ساده انتخاب شده‌اند تا رفتار اصلی قابل مشاهده باشد؛ در پروژه واقعی همین الگو با مدل دامنه، اعتبارسنجی و مدیریت خطای متناسب ترکیب می‌شود.

۸. خروجی نهایی

برنامه باید منوی Console روشن، Validation ورودی، پیام خطای قابل فهم و داده نمونه برای اجرای سریع داشته باشد.

مثال

Console.WriteLine("StoreApp ready");

در این مثال، مفهوم «خروجی نهایی» در یک قطعه کد مستقل نمایش داده شده است. مقدارها و نام‌ها عمداً ساده انتخاب شده‌اند تا رفتار اصلی قابل مشاهده باشد؛ در پروژه واقعی همین الگو با مدل دامنه، اعتبارسنجی و مدیریت خطای متناسب ترکیب می‌شود.

۹. مثال‌های عملی

public sealed class OrderItem
         {
             public Product Product { get; }
             public int Quantity { get; }
             public decimal LineTotal => Product.Price * Quantity;
         
             public OrderItem(Product product, int quantity)
             {
                 ArgumentNullException.ThrowIfNull(product);
                 if (quantity <= 0)
                     throw new ArgumentOutOfRangeException(nameof(quantity));
         
                 Product = product;
                 Quantity = quantity;
             }
         }

این نمونه عملی چند مفهوم فصل را در کنار هم قرار می‌دهد و برای مشاهده رفتار واقعی کد قابل اجرا و تغییر است.

public decimal Total => Items.Sum(item => item.LineTotal);

این نمونه عملی چند مفهوم فصل را در کنار هم قرار می‌دهد و برای مشاهده رفتار واقعی کد قابل اجرا و تغییر است.

public async Task SaveAsync<T>(string path, T data, CancellationToken ct = default)
         {
             string json = JsonSerializer.Serialize(data, _options);
             await File.WriteAllTextAsync(path, json, ct);
         }

این نمونه عملی چند مفهوم فصل را در کنار هم قرار می‌دهد و برای مشاهده رفتار واقعی کد قابل اجرا و تغییر است.

۱۰. خطاهای رایج

• قرار دادن همه منطق در Program.cs

• وابستگی Domain Model به Console و File I/O

• نداشتن Validation و تست برای قواعد اصلی

۱۱. نکات اجرایی

• نام‌ها، Typeها و Methodها را متناسب با مفهوم دامنه و بدون ابهام انتخاب کنید.

• هشدارهای کامپایلر و Nullable را بدون بررسی خاموش نکنید.

• منطق هر بخش را تا حد امکان کوچک، قابل تست و مستقل از I/O غیرضروری نگه دارید.

۱۲. تمرین عملی

پروژه را به‌صورت کامل پیاده‌سازی کنید، حداقل ۱۰ محصول نمونه بسازید، چند سفارش ثبت کنید، گزارش فروش تولید کنید و حداقل ۱۰ Unit Test برای قوانین اصلی بنویسید.

۱۳. جمع‌بندی

در این فصل، مبانی «پروژه نهایی C#» با تمرکز بر ساختارهای اصلی زبان، الگوهای صحیح استفاده و خطاهای رایج بررسی شد. تسلط بر این مفاهیم زمینه لازم برای اتصال موضوع به فصل‌های بعدی و طراحی کدهای خواناتر، قابل نگهداری و قابل تست را فراهم می‌کند.