با ظهور نسخه های جدیدتر دات نت، توسعه دهندگان سی شارپ با ویژگی فوق العاده قدرتمندی به نام Pattern Matching یا تطبیق الگو آشنا شدند. این ویژگی، با الهام از پارادایم های functional programming ، روشی جدید و گویا برای نوشتن عبارات شرطی در اختیار توسعه دهندگان قرار می دهد و در نتیجه کد آنها را خواناتر، قابل نگهداری و کارآمدتر می کند. در این مقاله، Pattern Matching یا تطبیق الگو در دات نت 7 را بررسی میکنیم، کاربردهای عملی آن را با مثالهای دقیق بررسی میکنیم و مزایای استفاده از تطبیق الگو در معماری تمیز را مورد بحث قرار میدهیم.
Pattern Matching یا تطبیق الگو چیست؟
تطبیق الگو یا Pattern Matching یک ویژگی ضروری در برنامه نویسی تابعی است که به سی شارپ راه پیدا کرده است. با معرفی دات نت 7، این ویژگی با قابلیت های جدید گسترش یافته است و روشی واضح تر و مختصرتر برای تست و استخراج داده ها از یک شی ارائه می دهد.
زبان های برنامه نویسی شی گرا سنتی از type checking و casting برای تست و دستکاری یک شی استفاده می کنند. با این حال، تطبیق الگو در net7 رویکرد گویاتری را ارائه می دهد. Pattern Matching به شما امکان میدهد شکل دادهها را به جای نوع آن تست کنید، که منجر به کد واضح و خواناتر میشود.
object o = "Hello, world!";
if (o is string s)
{
Console.WriteLine(s.ToUpper()); // Output: HELLO, WORLD!
}
در مثال بالا، کلمه کلیدی is بررسی می کند که آیا شی o یک رشته است. اگر چنین باشد، o را به رشته s فرستاده و بلوک کد اجرا می شود. این یک نمایش ساده و در عین حال قدرتمند از قابلیت های تطبیق الگو در net7 است.
تکنیک های Pattern Matching پیشرفته در NET 7
دات نت 7 تکنیک های تطبیق الگوی قوی تری را معرفی می کند، مانند الگوهای نوع(type pattern)، الگوهای موقعیتی(positional pattern)، الگوهای ویژگی(property pattern)، الگوهای رابطه ای(Relational Pattern)، الگوهای منطقی(Logical Pattern) و الگوهای تاپل(tuple pattern).
الگوهای نوع یا type pattern ها:
type pattern در.net7 توسعه دهندگان را قادر می سازد تا عملیات بررسی نوع و casting را در یک مرحله ترکیب کنند. مثال زیر این موضوع را نشان می دهد:
public static void PrintDetails(object o)
{
switch (o)
{
case int i:
Console.WriteLine($"Integer: {i}");
break;
case string s:
Console.WriteLine($"String: {s}");
break;
default:
Console.WriteLine("Unknown type");
break;
}
}
در این مثال، دستور switch از الگوهای نوع برای مدیریت انواع مختلف داده استفاده می کند.
الگوهای موقعیتی یا positional pattern ها:
از positional pattern ها در دات نت 7 می توان برای deconstruct کردن یک شی و بررسی مقادیر تجزیه شده استفاده کرد. برای این امر باید شی دارای متد Deconstruct باشد. به مثال زیر توجه کنید:
public class Point
{
public int X { get; }
public int Y { get; }
public Point(int x, int y) => (X, Y) = (x, y);
public void Deconstruct(out int x, out int y) => (x, y) = (X, Y);
}
public static void PrintPointDetails(object o)
{
if (o is Point(var x, var y))
{
Console.WriteLine($"Point at ({x}, {y})");
}
}
متد Deconstruct در کلاس Point امکان استفاده از الگوهای موقعیتی در دستور if را می دهد.
الگوهای ویژگی یا property pattern ها:
از property pattern ها در دات نت 7 می توان برای مطابقت با مقدار ویژگی یک شی استفاده کرد. یک مثال در زیر آمده است:
public class Employee
{
public string Department { get; set; }
public int Salary { get; set; }
}
public static void PrintEmployeeDetails(Employee e)
{
if (e is { Department: "Sales", Salary: var s })
{
Console.WriteLine($"Salesperson's Salary: {s}");
}
}
در اینجا، دستور if از property pattern برای تطبیق ویژگی Department با مقدار "Sales" و استخراج ویژگی Salary استفاده می کند.
الگوهای رابطه ای یا Relational Pattern ها:
الگوهای رابطه ای یکی دیگر از موارد هیجان انگیز دیگر برای تطبیق الگو در دات نت 7 است. آنها به شما اجازه می دهند مقادیر را با عملگرهای رابطه ای مقایسه کنید، مانند کمتر، بزرگتر، کمتر یا مساوی، یا بزرگتر از یا مساوی. الگوهای رابطه ای کد مختصر و گویا را برای مقایسه مقادیر و انجام اقدامات مناسب بر اساس نتیجه امکان پذیر می کنند. این ویژگی به ویژه در هنگام برخورد با range ها یا مقایسه عددی مفید است. به مثال زیر توجه کنید:
public static string GetGrade(int score)
{
return score switch
{
< 60 => "F",
>= 60 and < 70 => "D",
>= 70 and < 80 => "C",
>= 80 and < 90 => "B",
>= 90 => "A",
};
}
در این مثال، ما روشی به نام GetGrade داریم که یک پارامتر به عنوان امتیاز دانش آموز می گیرد و بر اساس امتیاز، نمره مربوطه را با استفاده از الگوهای رابطه ای برمی گرداند.
الگوهای منطقی یا Logical Pattern ها:
در NET 7، الگوهای منطقی با ترکیب الگوهای متعدد با عملگرهای منطقی، بیان بهتری را ارائه می دهند. اکنون می توانید تطبیق الگو را بر اساس شرایط پیچیده شامل عملیات منطقی AND، OR و NOT انجام دهید. این اضافه کدی را که قبلاً به چند شرط if-else تودرتو نیاز داشت، ساده می کند. با الگوهای منطقی، می توانید سناریوهای تطبیق پیچیده را به طور مختصر و شهودی بیان کنید. به مثال زیر توجه کنید:
public static string GetWeatherDescription(int temperature, bool isRaining)
{
return (temperature, isRaining) switch
{
(>= 30, _) => "It's hot outside.",
(< 10, _) => "It's cold outside.",
(_, true) => "It's raining.",
(_, false) => "The weather is pleasant."
};
}
در این مثال، روشی به نام GetWeatherDescription داریم که دو پارامتر دما و isRaining را می گیرد. بر اساس این پارامترها، توصیف آب و هوا را با استفاده از الگوهای منطقی برمی گرداند.
الگوهای تاپل یا tuple pattern ها:
از tuple pattern ها در .net7 می توان برای مطابقت با مقادیر tuple ها استفاده کرد. به مثال زیر توجه کنید:
public static string GetDirection((int dx, int dy) vector)
{
return vector switch
{
(1, 0) => "East",
(0, 1) => "North",
(-1, 0) => "West",
(0, -1) => "South",
_ => "Unknown"
};
}
در اینجا، دستور switch از الگوهای تاپل برای مطابقت با جهات مختلف استفاده می کند.
Pattern Matching در معماری تمیز
بیان و انعطاف پذیری Pattern Matching، آن را به ابزاری عالی در clean architecture تبدیل کرده است. Pattern Matching به توسعه دهندگان اجازه می دهد تا با کاهش نیاز به بررسی type و casting ، کد قابل خواندن و نگهداری بیشتری ایجاد کنند، که منجر به کدهای تمیزتر و ساده تر می شود.
به عنوان مثال، یک وضعیت معمولی در معماری تمیز را در نظر بگیرید که در آن انواع مختلف کاربران مجوزهای متفاوتی دارند. رویکردهای سنتی شامل عبارات متعددی هستند که نوع کاربر را بررسی میکنند و بر این اساس مجوزها را اعطا میکنند. با تطبیق الگو، این فرآیند ساده می شود:
public string GetUserPermissions(User user)
{
return user switch
{
Administrator _ => "Full access",
Guest _ => "Limited access",
RegisteredUser { Subscription: Premium } => "Premium access",
RegisteredUser { Subscription: Basic } => "Basic access",
_ => "Unknown user type"
};
}
این رویکرد در هم ریختگی کد را کاهش می دهد و خوانایی را افزایش می دهد. صورت واضح و سادگی، تطبیق الگو را به ابزاری قدرتمند برای معماری تمیز تبدیل می کند.
مزایای Pattern Matching با تطبیق الگو در Net7
افزایش خوانایی:
تطبیق الگو، منطق شرطی پیچیده را ساده می کند و کد را خواناتر و قابل فهم تر می کند. ویژگیهای تطبیق الگوی پیشرفته در NET 7، مانند الگوهای نوع(type pattern)، الگوهای موقعیتی(positional pattern)، الگوهای ویژگی(property pattern)، الگوهای رابطه ای(Relational Pattern)، الگوهای منطقی(Logical Pattern) و الگوهای تاپل(tuple pattern) وضوح کد را با ارائه نحو بصری و قابلیتهای بیانی افزایش میدهند.
بهره وری بهبود یافته:
با استفاده از ویژگیهای تطبیق الگوی پیشرفته، توسعهدهندگان میتوانند کد مختصر و کارآمدتری بنویسند. تطبیق الگو نیاز به گزارههای تکراری if-else و موارد سوئیچ را از بین میبرد و بهره وری را افزایش میدهد. توانایی بیان سناریوهای تطبیق پیچیده با الگوهای منطقی باعث صرفه جویی در زمان توسعه می شود.
تجزیه و تحلیل داده های پیشرفته:
تطبیق الگو در هنگام برخورد با تجزیه و تحلیل و پردازش داده ها ارزشمند است. با ویژگی های جدید در دات نت 7، توسعه دهندگان می توانند به راحتی داده ها را بر اساس الگوهای خاص استخراج و دستکاری کنند. الگوهای ویژگی امکان استخراج کارآمد مقادیر از اشیاء را فراهم می کنند، در حالی که الگوهای رابطه ای امکان مقایسه عددی ساده را فراهم می کنند. این قابلیت ها توسعه دهندگان را قادر می سازد تا داده ها را به شیوه ای انعطاف پذیرتر و ساختارمندتر مدیریت کنند.
نتیجه گیری
Pattern Matching یا تطبیق الگو در NET 7 یک ویژگی قدرتمند و گویا است که از پارادایم های functional programming الهام گرفته شده و به سی شارپ اضافه شده است. توانایی آن برای تست شکل داده ها به جای نوع آن باعث می شود کدی خوانا، قابل نگهداری و کارآمدتری داشته باشیم. ادغام آن با اصول معماری تمیز منجر به کد ظریفتر و سادهتر میشود و در نتیجه طراحی و کیفیت کلی نرمافزار را بهبود میبخشد. به عنوان یک توسعه دهنده دات نت، آشنایی با این ویژگی برای نوشتن کد بهتر و تمیزتر ضروری است.
منبع: medium
برای ثبت نظر باید در سایت ثبت نام یا ورود نمایید