۲۰ آبان ۱۴۰۳

Techboy

اخبار و اطلاعات روز تکنولوژی

نحوه اجرای قوانین معماری در سی شارپ

از مزایای NetArchUnit برای اجرای قوانین معماری در برنامه خود و اطمینان از ثبات کیفیت و استانداردها استفاده کنید.

از مزایای NetArchUnit برای اجرای قوانین معماری در برنامه خود و اطمینان از ثبات کیفیت و استانداردها استفاده کنید.

آزمایش واحد به این صورت است که چگونه اطمینان حاصل کنیم که بلوک‌های کدی که می‌نویسیم همان کاری را انجام می‌دهند که می‌خواهیم انجام دهند. برخی از فریم ورک های منبع باز برای آزمایش واحدهای برنامه های کاربردی دات نت وجود دارد، یعنی NUnit و xUnit.Net. همیشه باید تست واحد را در گردش کار توسعه نرم افزار خود بگنجانید تا خطاها را در برنامه های خود کاهش یا حذف کنید.

شما همچنین ممکن است از چارچوب هایی مانند ArchUnit یا NetArchTest برای نوشتن تست های واحد که می تواند به اجرای قوانین معماری کمک کند. NetArchTest بن موریس با الهام از ArchUnit برای جاوا، یک چارچوب ساده است که می تواند برای اجرای قوانین معماری در NET Framework یا NET Core و همچنین در پروژه های NET 6.

استفاده شود.

این مقاله در مورد اهمیت اجرای قوانین معماری و نحوه استفاده از NetArchTest برای دستیابی به آن صحبت می کند. برای کار با نمونه کدهای ارائه شده در این مقاله، باید Visual Studio 2022 را در سیستم خود نصب کنید. اگر قبلاً نسخه‌ای ندارید، می‌توانید Visual Studio 2022 را از اینجا بارگیری کنید.

نیاز به اجرای قوانین معماری

فریم‌ورک‌ها و ابزارهای تحلیل کد استاتیک زیادی برای بررسی کیفیت کد در NET، .NET Core یا NET 6 وجود دارد. دو ابزار محبوب SonarQube و NDepend. تحلیل کد استاتیک نیز به عنوان بخشی از ویژوال استودیو در دسترس است.

با این حال، تعداد کمی از این ابزارها به شما کمک می کنند تا الگوهای طراحی معماری را حفظ کنید یا قوانین معماری را در کد منبع خود اعمال کنید. و اگر به طور منظم این قوانین را تأیید یا اجرا نکنید، طراحی یا معماری برنامه شما به مرور زمان کاهش می یابد. در نهایت متوجه خواهید شد که حفظ پایگاه کد به یک کار دلهره آور تبدیل شده است.

در حالی که ابزارهای تجزیه و تحلیل کد ایستا به شما کمک می‌کنند تا بهترین شیوه‌های عمومی را تأیید یا اجرا کنید، می‌توانید از NArchTest برای ایجاد تست‌های واحدی استفاده کنید که قوانین معماری را در برنامه‌های NET، .NET Core و NET. 6 شما اجرا می‌کند. این شامل قراردادهایی برای طراحی کلاس، نام‌گذاری و وابستگی در پایگاه‌های کد شما می‌شود.

Kotlin 1.9.0 دارای نسخه بتا کامپایلر پیشرفته K2 است

می‌توانید از NArchTest در روش‌های تست واحد خود استفاده کنید و سپس این روش‌های آزمایشی را در خط لوله ساخت و انتشار بگنجانید تا قوانین معماری به‌طور خودکار با هر بار ورود تأیید شوند.

یک پروژه Unit Test در Visual Studio 2022 ایجاد کنید

ابتدا، اجازه دهید پروژه Unit Test را در Visual Studio 2022 با استفاده از الگوی xUnit Test Project ایجاد کنیم. با دنبال کردن این مراحل، یک پروژه واحد تست جدید در Visual Studio 2022 ایجاد می شود:

  1. Visual Studio 2022 IDE را راه اندازی کنید.
  2. روی “ایجاد پروژه جدید” کلیک کنید.
  3. در پنجره “ایجاد پروژه جدید”، “xUnit Test Project” را از لیست الگوهای نمایش داده شده انتخاب کنید.
  4. بعدی را کلیک کنید.
  5. در پنجره “پیکربندی پروژه جدید خود”، نام و مکان پروژه جدید را مشخص کنید.
  6. به صورت اختیاری، بسته به تنظیمات برگزیده خود، کادر انتخاب «قرار دادن راه حل و پروژه در یک فهرست راهنمای» را علامت بزنید.
  7. بعدی را کلیک کنید.
  8. در پنجره “اطلاعات اضافی” نشان داده شده در ادامه، .NET 6.0 را به عنوان چارچوب هدف از لیست کشویی در بالا انتخاب کنید. “نوع احراز هویت” را به عنوان “هیچ” (پیش‌فرض) بگذارید.
  9. مطمئن شوید که چک باکس‌های «Enable Docker»، «Configure for HTTPS» و «Enable Open API Support» علامت نخورده باشند زیرا ما در اینجا از هیچ یک از این ویژگی‌ها استفاده نخواهیم کرد.
  10. روی ایجاد کلیک کنید.

این یک پروژه xUnit جدید در Visual Studio 2022 ایجاد می‌کند. ما از این پروژه در بخش‌های بعدی این مقاله استفاده خواهیم کرد.

یک پروژه Class Library در Visual Studio 2022 ایجاد کنید

بیایید اکنون یک پروژه کتابخانه کلاس در ویژوال استودیو ۲۰۲۲ ایجاد کنیم. با دنبال کردن این مراحل یک پروژه کتابخانه کلاسی جدید در ویژوال استودیو ۲۰۲۲ ایجاد می شود:

  1. Visual Studio 2022 IDE را راه اندازی کنید.
  2. روی “ایجاد پروژه جدید” کلیک کنید.
  3. در پنجره «ایجاد پروژه جدید»، «کتابخانه کلاس» را از لیست الگوهای نمایش داده شده انتخاب کنید.
  4. بعدی را کلیک کنید.
  5. در پنجره “پیکربندی پروژه جدید خود”، نام و مکان پروژه جدید را مشخص کنید.
  6. بعدی را کلیک کنید.
  7. در پنجره “اطلاعات اضافی” نشان داده شده در ادامه، .NET 6.0 را به عنوان چارچوب هدف از لیست کشویی در بالا انتخاب کنید.
  8. روی ایجاد کلیک کنید.

این یک پروژه جدید Class Library در Visual Studio 2022 ایجاد می‌کند. ما از این پروژه در بخش‌های بعدی این مقاله استفاده خواهیم کرد.

نحوه استفاده از لانچر پایتون برای ویندوز

کلاس های مدل را در NET 6 ایجاد کنید

فرض کنید نام پروژه Class Library Core.Infrastructure است. در پنجره Solution Explorer، این پروژه را انتخاب کنید و سپس روی “Add -> New Folder” کلیک کنید تا یک پوشه راه حل جدید به پروژه اضافه شود. مدل ها باید همان نام پوشه راه حل خود را داشته باشند.

اکنون یک کلاس به نام BaseModel در پوشه Models solution ایجاد کنید و کد زیر را وارد کنید:

public abstract class BaseModel
    {
        public int Id { get; set; }
    }

دو کلاس مدل دیگر به نام‌های Product و Customer ایجاد کنید. هر یک از این دو کلاس باید طبق شکل زیر کلاس BaseModel را گسترش دهند.

public class Product: BaseModel
{
    public string Name { get; set; }
    public decimal Price { get; set; }
}
public class Customer: BaseModel
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

کلاس های سرویس را در NET 6 ایجاد کنید

پوشه راه حل دیگری را در همان پروژه ایجاد کنید و نام آن را Services بگذارید. یک رابط به نام IBaseService در داخل این پوشه راه حل ایجاد کنید و کد زیر را به آن بدهید:

public interface IBaseService
{
    public void Initialize();
}

متد Initialize باید توسط تمام کلاس هایی که این رابط را پیاده سازی می کنند پیاده سازی شود. کلاس های ProductService و CustomerService رابط IBaseService را همانطور که در قطعه کد زیر نشان داده شده است پیاده سازی می کنند.

//ProductService.cs
using Core.Infrastructure.Models;
namespace Core.Infrastructure.Services
{
    public sealed class ProductService: IBaseService
    {
        public void Initialize()
        {
            //Write your implementation here
        }
        public List<Product> GetProducts()
        {
            return new List<Product>();
        }
    }
}

//CustomerService.cs
using Core.Infrastructure.Models;
namespace Core.Infrastructure.Services
{
    public sealed class CustomerService: IBaseService
    {
        public void Initialize()
        {
            //Write your implementation here
        }
        public List<Customer> GetCustomers()
        {
            return new List<Customer>();
        }
    }
}

توجه داشته باشید که برای اهداف این پیاده سازی ساده، متد Initialize هم کلاس ProductService و هم کلاس CustomerService خالی گذاشته شده است. می توانید پیاده سازی خود را برای این موارد بنویسید.

بسته NetArchTest.Rules NuGet را نصب کنید

تا اینجا خیلی خوبه. اکنون بسته NetArchTest.Rules NuGet را به پروژه خود اضافه کنید. برای انجام این کار، پروژه را در پنجره Solution Explorer انتخاب کنید و کلیک راست کرده و “Manage NuGet Packages” را انتخاب کنید. در پنجره NuGet Package Manager، بسته NetArchTest.Rules را جستجو کرده و آن را نصب کنید.

نحوه ارزیابی ابزارهای مدیریت دارایی نرم افزار

از طرف دیگر، می‌توانید بسته را از طریق کنسول NuGet Package Manager با وارد کردن خط نشان داده شده در زیر نصب کنید.

PM> Install-Package NetArchTest.Rules

تست های واحد معماری را در NET 6 بنویسید

در آخر، باید تست‌های واحد معماری را بنویسید تا بررسی کنید که آیا کد منبع تحت آزمایش با استانداردهای شما مطابقت دارد یا خیر. توجه داشته باشید که اصطلاح “استانداردها” در اینجا نسبی است، و ممکن است فرض کنید که این استانداردها توسط شما تعریف شده است.

روش آزمایش زیر تأیید می‌کند که کلاس‌های سرویس شما نامی با پسوند Service دارند.

[Fact]
public void ServiceClassesShouldHaveNameEndingWithService()
{
    var result = Types.InCurrentDomain()
                 .That().ResideInNamespace(("Core.Infrastructure.Services"))
                 .And().AreClasses()
                 .Should().HaveNameEndingWith("Service")
                 .GetResult();
    Assert.True(result.IsSuccessful);
}

می‌توانید قانون دیگری داشته باشید که تأیید می‌کند همه کلاس‌های سرویس شما رابط IBaseService را پیاده‌سازی می‌کنند. روش تست زیر نشان می دهد که چگونه می توان به این امر دست یافت.

[Fact]
public void ServiceClassesShouldImplementIBaseServiceInterface()
{
   var result = Types.InCurrentDomain()
                .That().ResideInNamespace(("Core.Infrastructure.Services"))
                .And().AreClasses()
                .Should().ImplementInterface(typeof(IBaseService))
                .GetResult();
   Assert.True(result.IsSuccessful);
}

همچنین می‌توانید قانونی داشته باشید که تأیید کند کلاس‌های سرویس عمومی هستند و مهر و موم نشده‌اند. اگر این کلاس‌ها مهر و موم شده باشند، نمی‌توانید آنها را بیشتر گسترش دهید.

[Fact]
public void ServiceClassesShouldBePublicAndNotSealed ()
{
    var result = Types.InCurrentDomain()
                .That().ResideInNamespace(("Core.Infrastructure.Services"))
                .Should().BePublic().And().NotBeSealed()
                .GetResult();
    Assert.True(result.IsSuccessful);
}

وقتی این روش‌های تست را اجرا می‌کنید، باید متوجه شوید که همه آن‌ها موفق می‌شوند، یعنی موفقیت آمیز خواهند بود. سعی کنید کد را تغییر دهید و آزمایش ها را مجدداً اجرا کنید تا مطابقت با قوانینی را که در مورد آن صحبت کردیم بررسی کنید.

netarchtest مثال

واحد NetArchTest در حال آزمایش است.

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