Design Pattern, Swift, کد نویسی

Swift Design pattern (Chain Of Responsibility)

در این مبحث نگاهی اجمالی به مدل زنجیره مسولیت مدل کد نویسی زبان برنامه نویسی سویفت داریم .

 

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

الگوریتم زنجیره مسئولیت برای درخواست های مختلفی استفاده می شود که هر کدام از آن ها ممکن است توسط یک handler مورد بررسی قرار بگیرند

مشکل :

همه افراد یکسان نیستند . برخی با تجربه تر هستند و می توانند بیشتر از دیگران کار انجام دهند. ما به یک سیستم نیاز داریم که در آن از فردی با کمترین تجربه بیشترین کارایی را دریافت کنیم. به این ترتیب فردی که تجربه بیشتری را دارد نباید درگیر کارهایی کنیم که مربوط به فردی تازه کار است.

راه حل :

فرض را بر این میگیرم که افراد مورد نظر ما مکانیک هستند و آنها را به چهار دسته تقسیم می کنیم :

  • تعویض کار روغن
  • مکانیک تازه کار
  • مکانیک
  • مکانیک ارشد

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

خب بهتره که شروع کنیم :

در این قسمت ما مجموعه مهارت های قابل شمارشی را تعریف می کنیم :

در مرحله بعد اهداف شغلی مان را تعریف می کنیم :

 

آبجکت شغل دارای سه خصوصیت می باشد : حداقل مهارت مورد نیاز که ما قبلا تعریف کردیم , که این حداقل سطح مورد نیاز مهارت برای مکانیک مورد نظر ما می باشد که می تواند این کار را انجام دهد.ما همچنین یک نام برای نامگذاری وظیفه محوله و و پرچم تکمیل کار را نیاز داریم که مشخص کنیم که نشان دهنده تکمیل بودن یا نبودن وظیفه محوله ما خواهد بود . خب حالا ما حداقل مهارت مورد نیاز و نام  آن را در init تعیین می کنیم

در مرحله بعد آبجکت مکانیک هایمان را تعریف می کنیم :

کلاس مکانیک ما پیچیده نیست . مکانیک دارای چهار خصوصیت مهارتی است که نشان دهنده توانایی مکانیک است. که هر کدام نامی دارند . چون همه مکانیک های ما یک نام دارند و در نهایت یک پرچم که نشان می دهد آیا مکانیک برای انجام این کار در دسترس است یا خیر . ما مجموعه مهارت و نام مکانیک را مقدار دهی اولیه می کنیم و پرچم isBusy خود را به طور پیش فرض با false مقدار دهی می کنیم

کلاس mechanicما همچنین دارای یک متد performJob است که با یک پارامتر کار می کند.

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

به خاطر همین می توانیم با اطمینان بگوییم قبل از واگذاری یک وظیفه به یک مکانیک  می توان مشخص کرد که وظیفه با مهارت مکانیک سازگار نیست یا مکانیک مشغول است

یک روش بهتر برای تایید این موضوع قبل از ورود به متد performJob برای اینکه استثنا هایی از قبیل مشغول بودن مکانیک یا عدم مهارت کافی مکانیک داریم.

متد perform job خیلی ساده است . مکانیک را مشغول می کند و کار را به اتمام می رساند

بعد ما قصد تعریف یک شی از mechanicSkillGroup داریم این کلاس شامل فهرستی از تمام مکانیک ها در مهارت های خود و یک لینک به MechanicSkillGroup یا همان مکانیک سطح بعدی است

این کلاس به عنوان یک طرف برای تمام مکانیک هایی که سطح مهارت یکسان دارند می باشد.

نمونه کد زیر این موضوع را پیاده سازی می کند :

بهتر است گام به گام جلو برویم تا بهتر درک کنید :

کلاس MechaniSkillGoup ما سه ویژگی دارد . اول ما مکانیکی هایی از همه مجموعه مکانیک هایی داریم که مجموعه مهارت یا مهارت خود را به اشتراک می گذارند.

بعد ما nextlevel را داریم که یک refrence اختیاری به MechanicSkillGroup دیگری است.

این اشاره گر سطح بعدی mechanicSkillGroup را مشخص می کند.

این خصیصه به این دلیل اختیاری است که زمانی که ما به انتهای زنجیره می رسیم و در انتهای زنجیره قرار می گیریم دیگر mechanicSkillGroup دیگری وجود نخواهد داشت.

در نهایت ما خصوصیت های مهارتی خواهیم داشت که به آنچه mechanicSkillGroup مورد نظر برای آن تنظیم شده است خواهد شد.

این مقدار ها را در Init  مقدار دهی می کنیم

در مرحله بعد یک تابع به نام execJobOrPasstUpرا در کلاس mechanicSkillGroup تعریف خواهیم کرد

متد performJobOrPassItUp یکی از پارامتر های شغل را به عنوان یک آرگومان ورودی می گیرد و یک مقدار boolean باز می گرداند که نشان دهد آیا این شغل قادر خواهد بود وظیفه مربوطه را انجام دهد یا نه .

اول بررسی می کنیم که آیا حداقل نیاز به مهارت شغلی بیشتر از آنچه که ما در MechanicSkillGroup فعلی تعریف کرده ایم می تواند انجام دهد یا نه , و یا انکه مکانیکی در MechanicSkillGroup فعلی ما در دسترس نیست .

اگر  این شروط در دسترس نباشد مکانیک این MechanicSkillGroup نمی تواند این کار را انجام دهد و باید در زنجیره مسولیتمان به دنبال افراد با سطح بالاتری باشیم .

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

در نهایت یک شی فروشگاه تعریف می کنیم که به عنوان مدیر برای MechanicSkillGroup رفتار خواهد کرد

این کلاس یک private property به نام firstMechanics خواهد داشت . که اشاره به آغاز زنجیره مسٔولیت ما خواهد داشت . اینها مکانیک هایی با کمترین تجربه ما خواهند بود.

در مرحله بعد ما یک تابع به نام performJob تعریف می کنیم که شروع فرایندش با فراخوانی performJobOrPassItUp در MechanicSkillGroup ما در زنجیره مسولیت , فرایند ما را آغاز خواهد کرد.

در این قسمت ما تمام قطعات مورد نیاز برای راه اندازی و اجرای زنجیره مسیولیت خود را اجرا می کنیم . نگاهی داریم به یک نمونه از این موضوع

خب بریم سراغ بخش به بخش و اینکه چطور همه چیز را تنظیم کنیم

خب ما با تنظیمات مکانیک ارشدمان این موضوع را شروع می کنیم

ما چهار مکانیک تعریف می کنیم . نام آنها و سطح مهارت آنها را تعیین می کنیم . در مرحله بعد ما ظرف MechanicSkillGroup را برای مکانیک ارشدمان ایجاد می کنیم . ما MasterMechanic را به عنوان مجموعه مهارت های این گروه منتقل می کنیم , یک آرایه از مهارت های مانیک ها را ایجاد و مرحله بعد را با nil مقدار دهی می کنیم .

ما روش مشابهی برای تولید apprenticeMechanics و juniorMechanics و oilChangeOnlys انجام می دهیم

در مرحله بعد فروشگاه و شغل را تعریف می کنیم:

ما یک نمونه از فروشگاه را ایجاد می کنیم و این شروع زنجیره مسولیت های ما با OilChangeOnly خواهد بود در مرحله بعد ما آرایه از مشاغل با minimumSkillSet های مختلف تعریف خواهیم کرد.

و در پایان ما از طریق زنجیره ما هر کاری را انجام می دهیم :

در پایان نتیجه ای مشابه زیر خواهید داشت :

 

موفق و پیروز باشید .

3 دیدگاه در “Swift Design pattern (Chain Of Responsibility)

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد.