تطبیق الگوی در C# 8. 0

ساخت وبلاگ

با گذشت سالها ، ما یک تن از ویژگی ها را در C# مشاهده کرده ایم که نه تنها عملکرد کد ما بلکه از همه مهمتر خوانایی آن را بهبود می بخشد. با توجه به سرعت سریع صنعت نرم افزار ، مطمئناً این زبان باید با پایگاه کاربر خود ادامه یابد و تکامل یابد. چیزی که به طور گسترده در زبانهای مختلف برنامه نویسی مورد استفاده قرار می گیرد ، مانند F#، Swift یا Kotlin گاهی اوقات راه خود را به C#پیدا می کند. یکی از این موارد مطابق با الگوی است - مفهومی که مدتهاست در آن وجود دارد ، و چیزی که برای آن بسیاری از توسعه دهندگان در فضای C# مدتها منتظر مانده اند.

از C# 7. 0 ، توسعه دهندگان طعم قدرتی را که با تطبیق الگوی همراه است ، گرفتند. ما الگویی را دیدیم که شروع به شکل گیری می کند ، که بعداً به یک زبان بسیار قدرتمند و جالب تبدیل شده است. درست همانطور که سایر ویژگی های زبان به طرز چشمگیری شیوه نوشتن نرم افزار خود را تغییر داده اند ، انتظار دارم که تطبیق الگوی در C# اثر مشابهی داشته باشد.

آیا ما واقعاً به ویژگی زبان دیگری احتیاج داریم؟آیا نمی توانیم فقط از رویکردهای سنتی استفاده کنیم؟البته ما می توانیم. اگرچه یک تطابق الگوی اضافی به طور قطع شیوه ای را که بسیاری از ما برای نوشتن کد خود انتخاب می کنیم ، تغییر می دهد ، اما می توان همین سؤال را برای سایر ویژگی های زبانی که در طول سالها معرفی شده است ، گفت.

یکی که زبان C# را به شدت تغییر داد ، معرفی پرس و جو یکپارچه زبان (LINQ) بود. امروزه هنگام پردازش داده ها ، مردم انتخاب می کنند که کدام شخصاً دوست دارند. برخی از آنها استفاده از LINQ را انتخاب می کنند ، که در بعضی موارد کد کمتری را ایجاد می کند ، در حالی که برخی دیگر از حلقه های سنتی انتخاب می کنند. من انتظار دارم که جذب مشابه برای تطبیق الگوی باشد ، زیرا عملکرد جدید نحوه کار توسعه دهندگان را با دور شدن از رویکردهای کلامی تر تغییر می دهد. توجه داشته باشید ، رویکردهای سنتی به جایی نمی روند ، زیرا بسیاری از توسعه دهندگان تصمیم می گیرند با راه حل های آزمایش شده و واقعی استفاده کنند. اما ویژگی های اضافی زبان باید به جای کاهش کد فعلی ، راهی برای تکمیل پروژه های کد C# ارائه دهد.

معرفی الگوی تطبیق

اگر تا به حال زبانهایی مانند F# یا Kotlin را امتحان کرده اید ، احتمالاً نمونه هایی از تطبیق الگوی را در عمل مشاهده کرده اید. این بسیار معمولاً در بین بسیاری از زبان های مختلف برنامه نویسی در بازار مورد استفاده قرار می گیرد - البته ، البته ، این کد را کمی خواندنی تر می کند. بنابراین تطبیق الگوی چیست؟

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

تمایز بین نوع میوه و ویژگی میوه دقیقاً همان چیزی است که الگوی مربوط به آن است. توسعه دهندگان روش های مختلفی برای بیان خود هنگام شناسایی این موضوع دارند.

به طور سنتی ، من می توانم همه اینها را با استفاده از یک شرایط ساده بررسی کنم. اما اگر بخواهم صریح از سیب استفاده کنم ، چه می شود؟من در شرایطی قرار می گیرم که ابتدا باید نوع ، ویژگی را تأیید کنم و سپس به یک سیب بازی کنم. این کد به سرعت کمی کثیف به پایان می رسد و صریحاً مستعد خطا است.

در اینجا مثالی آورده شده است که من نوع خاصی از میوه را به عنوان سیب اعتبار می دهم. من یک محدودیت ویژگی را اعمال می کنم ، و سپس برای استفاده از آن باید آن را ریخته ام ، مانند این:

رویکرد دیگری که می توانم از آن استفاده کنم استفاده از کلمه کلیدی است که انعطاف پذیری کمی به من می دهد. بر خلاف مثال قبلی ، کلمه کلیدی IS نیز روی سیب های مشتق شده مطابقت خواهد داشت:

در این حالت ، اگر میوه نوعی سیب مشتق شده باشد ، من می توانم یک پای سیب را از آن درست کنم. در حالی که در مثال قبلی ، باید یک نوع خاص از سیب باشد.

خوشبختانه ، راه بهتری وجود دارد. همانطور که اشاره کردم ، زبانهایی مانند Swift و Kotlin به شما امکان می دهند از تطبیق الگوی استفاده کنید. C# 7. 0 به نوبه خود نسخه ای سبک از تطبیق الگوی را معرفی کرد که می تواند مفید باشد ، اگرچه فاقد بسیاری از ویژگی های خوب موجود در زبان های دیگر است. شما می توانید عبارت قبلی را در کد C# 7. 0 که در زیر آمده است ، مجدداً تغییر دهید و این به شما امکان می دهد از یک سوئیچ برای مطابقت با الگوهای مختلف خود استفاده کنید. این عالی نیست ، اما در مورد آنچه قبلاً در دسترس بود بهبود می یابد. در اینجا کد وجود دارد:

چند مورد در اینجا جالب است. اول ، توجه کنید که من یک نوع بازیگر در هیچ کجای این کد ندارم ، و همچنین می توانم از اپل که فقط در متن مورد هماهنگ شده است استفاده کنم. دقیقاً مانند کلمه کلیدی IS ، این با سیب های مشتق شده نیز مطابقت خواهد داشت.

این کد C# 7. 0 نیز بهتر می خواند ، و مکالمات بسیار ساده تر از کد مشابه در C# 6. 0 است. این کد فقط می گوید ، "بر اساس این واقعیت که میوه یک سیب است ، من می خواهم از این سیب استفاده کنم."هر مورد می تواند بر روی نوعی مطابقت داشته باشد که دارای صفات مشابه باشد ، به این معنی که آنها از همان کلاس به ارث می برند ، به عنوان مثال ، یا همان رابط را پیاده سازی می کنند. در این حالت ، یک سیب ، گلابی و موز همه میوه هستند.

آنچه از دست رفته است راهی برای فیلتر کردن سیب های سبز است. آیا فیلترهای استثنا را دیده اید؟این یک ویژگی معرفی شده در C# 6. 0 است که به شما امکان می دهد استثنائات خاصی را فقط در صورت برآورده شدن شرایط خاص بدست آورید. این ویژگی کلمه کلیدی را که در تطبیق الگوی نیز کاربرد دارد ، معرفی کرد. من می توانم با استفاده از تطبیق الگوی اپل مطابقت داشته باشم و فقط در صورت برآورده شدن شرایط وارد پرونده شوید. شکل 1 این را نشان می دهد.

شکل 1 استفاده از فیلتر با استفاده از کلمه کلیدی هنگام

همانطور که شکل 1 نشان می دهد ، سفارش اهمیت دارد. من ابتدا به دنبال یک سیب با رنگ سبز هستم ، زیرا این ویژگی برای من مهمترین است. اگر رنگ دیگری وجود داشته باشد ، بگذارید قهوه ای بگوییم ، این نشان می دهد که سیب من بد شده است و من می خواهم آن را بیرون بیاورم. در مورد همه سیب های دیگر ، من آنها را در پای نمی خواهم ، بنابراین فقط آنها را می خورم. الگوی نهایی سیب "همه چیز" برای همه سیب هایی است که نه رنگ سبز دارند و نه رنگ قهوه ای.

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

هر چیز دیگری مانند سوئیچ عادی که از C# 1. 0 استفاده کرده اید کار می کند. این مثال به طور کامل در C# 7. 0 نوشته شده است ، بنابراین سؤال این است که آیا جایی برای بهبود وجود دارد؟من چنین می گویمکد هنوز هم کمی در سمت بیان است و با بهبود روش الگوهای قابل خواندن ، قابل خواندن تر است. همچنین ، این امر به داشتن روش های دیگر برای بیان محدودیت در برابر آنچه داده های من "به نظر می رسد" کمک می کند. بیایید اکنون به C# 8. 0 بپردازیم و به تغییراتی که معرفی شده است برای آسانتر کردن زندگی ما نگاه کنیم.

تکامل تطبیق الگوی در C# 8. 0

آخرین نسخه C#، که در حال حاضر در پیش نمایش است ، برخی از پیشرفت های مهم تطبیق الگوی را معرفی می کند. برای امتحان کردن C# 8. 0 ، باید از پیش نمایش Visual Studio 2019 استفاده کنید ، یا ویژگی های زبان پیش نمایش را در Visual Studio 2019 فعال کنید. در دسترس بودن عمومی C# 8. 0 در اواخر سال جاری است ، انتظار می رود در همان زمان کشتی های NET Core 3. 0. چگونه می توانیم روش های جدیدی برای بیان محدودیت در مورد خواص یک نوع پیدا کنیم؟چگونه می توانیم بیان الگوهای بلوک را بصری تر و خواندنی تر کنیم؟در C# 8. 0 این زبان قدم دیگری به جلو می برد تا راهی برای کار با الگوهای ارائه شود که باید برای کسانی که به زبانهایی مانند کوتلین کار کرده اند بسیار آشنا باشد. اینها همه اضافات فوق العاده ای است که باعث می شود کد قابل خواندن و حفظ باشد.

اول ، ما اکنون گزینه ای برای استفاده از چیزی به نام بیان سوئیچ داریم ، به جای بیانیه سنتی سوئیچ که توسعه دهندگان از زمان C# 1. 0 از آن استفاده کرده اند. در اینجا نمونه ای از بیان سوئیچ در C# 8. 0 وجود دارد:

همانطور که مشاهده می کنید ، به جای اینکه بخواهم برای هر مسابقه مختلف به نوشتن و استراحت بپردازم ، به سادگی از یک الگوی و یک عبارت استفاده می کنم. هنگامی که من برای یک میوه مطابقت دارم ، زیربنایی (_) به این معنی است که من به میوه واقعی که در آن مطابقت داشتم اهمیتی نمی دهم. در واقع ، لازم نیست یک نوع میوه اولیه باشد. این موضوع نیز با NULL مطابقت خواهد داشت. این را به سادگی مطابق با نوع خاص فکر کنید. وقتی این اپل را پیدا کردم ، یک رشته را با استفاده از یک عبارت برگشتم-مانند اعضای بیان شده ای که در C# 6. 0 معرفی شده اند.

این چیزی بیش از صرفه جویی در شخصیت ها است. امکانات را در اینجا تصور کنید. به عنوان مثال ، من اکنون می توانم یک عضو با بیان بیان را معرفی کنم که شامل یکی از این عبارات سوئیچ است ، که همچنین قدرت تطبیق الگوی را نیز به دست می آورد ، مانند این:

این می تواند واقعاً جالب و قدرتمند باشد. کد زیر نشان می دهد که چگونه می توانید این الگوی را به روش سنتی انجام دهید. نگاهی بیندازید و تصمیم بگیرید که کدام یک را ترجیح می دهید:

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

در حالی که این یک خوش آمدید به زبان است ، لطفاً در برابر اصرار به استفاده از عبارات سوئیچ برای هر شرایط IF/Else مقاومت کنید. برای نمونه ای از کارهایی که نباید انجام ندهید ، کد زیر را بررسی کنید:

این کد نشان می دهد که شما می توانید چهار مورد برای یک بولی قابل تهی داشته باشید ، که البته شما نمی توانید. فقط در مورد نحوه استفاده از عبارات سوئیچ توجه داشته باشید و از نحو سوء استفاده نکنید ، دقیقاً همانطور که می خواهید با هر ویژگی زبانی دیگر.

من قبلاً این واقعیت را پوشش داده ام که عبارات سوئیچ می توانند مقدار کدی را که می نویسید کاهش داده و همچنین آن کد را خواندنی کند. این نیز هنگام افزودن محدودیت به انواع شما صادق است. هنگامی که به ترکیب Tuples ، ساختارشکنی و آنچه که به عنوان الگوهای بازگشتی شناخته می شود ، تغییر در تطبیق الگوی در C# 8. 0 واقعاً برجسته است.

الگوهای بیان

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

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

شکل 2 نمونه ای از ساختار

ممکن است تعجب کنید که روش ساختارشکنی در شکل 2 چیست. این امکان را به من می دهد تا مقادیر یک نمونه را در متغیرهای جدید خارج از کلاس "استخراج کنم". معمولاً همراه با تطبیق الگوی و تاپل ها استفاده می شود ، همانطور که در یک لحظه کشف خواهید کرد.

بنابراین ، من در اصل سه روش جدید برای بیان الگوی در C# 8. 0 دارم که همه آنها یک مورد استفاده خاص دارند. آن ها هستند:

  • الگوی موقعیت
  • الگوی خاص
  • الگوی توت

نگران نباشید ، اگر نحو سوئیچ عادی را ترجیح می دهید ، می توانید از این پیشرفت های تطبیق الگوی با آن استفاده کنید! این تغییرات و اضافات در زبان از نظر تطبیق الگوی معمولاً به عنوان الگوهای بازگشتی گفته می شود.

الگوی مثبت از روش ساختارشکنی که در کلاس خود دارید استفاده می کند. می توانید الگویی را بیان کنید که با مقادیری که از ساختارشکنی خارج می شوید مطابقت داشته باشد. با توجه به این واقعیت که شما راهی تعریف شده اید که مستطیل را تجزیه کنید ، می توانید الگویی را بیان کنید که از موقعیت خروجی مانند آنچه در شکل 3 می بینید ، استفاده می کند.

شکل 3 الگوی موقعیتی

ابتدا بیایید با نوع شکل مطابقت داشته باشیم. در این حالت فقط می خواهم آن را در برابر مستطیل مطابقت دهم. الگوی کاربردی دوم ، هنگامی که با یک مستطیل مطابقت داشته باشد ، از روش dreconstruct به همراه نحو Tuple استفاده می کند تا بیان کند که برای هر موقعیت خاص به کدام مقادیر نیاز دارم.

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

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

همانطور که کد زیر توضیح می دهد ، من اهمیتی نمی دهم که کدام نوع را بدست می آورم ، تا زمانی که با یک نوع حاوی یک نقطه مطابقت داشته باشد ، جایی که این نکته دارای مقدار 100 در خاصیت Y است ، مانند این:

مشاهده کنید که کد در واقع مواردی را که شکل تهی است ، یا هنگامی که نقطه اولیه است اما دارای مقدار Y متفاوت از 100 است ، کنترل نمی کند. در این شرایط ، این کد یک استثنا را به وجود می آورد. این می تواند با معرفی پرونده پیش فرض با استفاده از زیرکور حل شود.

همچنین می توانم بگویم که من به این نکته نیاز دارم که ناآگاهانه باشم و فقط آن سناریوهای ناآگاهانه را اداره کنم. این بسیار کمتر از استفاده از الگوهای موقعیتی است و برای موقعیت هایی بسیار خوب کار می کند که نمی توانید یک روش ساختارشکنی را به نوع مورد نظر خود اضافه کنید.

سرانجام ، من الگوی Tuple را دارم که از الگوی موقعیتی استفاده می کند و به من اجازه می دهد تا یک Tuple را تهیه کنم که در آن مسابقه خود را اجرا کنم. من می توانم این موضوع را با سناریویی که در حالت های مختلف فعالیت می کنم ، مانند باز کردن ، بسته شدن و قفل کردن یک درب نشان دهم (شکل 4 را ببینید). بسته به وضعیت فعلی درب ، عملیاتی که می خواهم انجام دهم و کلید دیگری که ممکن است داشته باشم ممکن است یک وضعیت خاص رخ دهد. این نمونه از استفاده از الگوی Tuple برای معرفی یک دستگاه حالت ، معمولاً توسط C# Design Lead Mads Torgersen استفاده می شود. پست Torgersen را ، "با الگوهای C# 8. 0" بیشتر انجام دهید ، در bit. ly/2O2SDQO.

شکل 4 الگوی Tuple

کد موجود در شکل 4 ابتدا یک قطعه جدید حاوی وضعیت فعلی ، عملکرد مورد نظر و بررسی بولی را در صورت داشتن کلید معتبر یا خیر ، ایجاد می کند. این یک سناریوی بسیار ساده است.

بر اساس این مقادیر مختلف ، من می توانم با ساخت تاپ های بیشتر ، همراه با یک الگوی موقعیتی ، در موقعیت های مختلف مطابقت داشته باشم. این الگوی Tuple است. اگر سعی کنم دری را بسته ، اما قفل نشده ، باز کنم ، این باعث می شود که یک کشور جدید به من بگوید که درب اکنون باز است. اگر درب قفل شده باشد و من سعی می کنم آن را با یک کلید نامعتبر باز کنم ، درب قفل خواهد ماند. اگر سعی کنم دری را باز کنم ، یک استثنا دریافت می کنم. شما ایده را دریافت می کنیداین یک روش بسیار انعطاف پذیر و جالب برای نزدیک شدن به وضعیتی است که قبلاً بسیار کلامی و تولید شده بود که بسیار کمتر خواندنی بود.

سخنان پایانی

پیشرفت های تطبیق الگوی در C# 8. 0 ، همراه با بیان سوئیچ ، قطعاً نحوه نوشتن برنامه نویسان برنامه ها را تغییر می دهد. C# تقریباً دو دهه قدیمی است و تکامل یافته است تا نشان دهنده نحوه ساخت برنامه ها باشد. تطبیق الگوی به سادگی آخرین بیان آن تکامل است.

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

Filip Ekberg یک سخنران عمومی ، نویسنده PluralSight ، مشاور اصلی و نویسنده "C# Smorgasbord" (2012) است. اکبرگ تمام راه را از سیدنی تا گوتنبرگ کار کرده است و بیش از یک دهه تجربه با C#دارد. می توانید از طریق توییتر با او تماس بگیرید: fekberg یا از طریق filip@ekberg. dev.

با تشکر از متخصص فنی مایکروسافت زیر برای بررسی این مقاله: بیل واگنر

مدرسه ی فارکس...
ما را در سایت مدرسه ی فارکس دنبال می کنید

برچسب : نویسنده : مینا لاکانی بازدید : 59 تاريخ : سه شنبه 8 فروردين 1402 ساعت: 6:25