از طریق منوی جستجو مطلب مورد نظر خود در وبلاگ را به سرعت پیدا کنید
الگوی طراحی روش قالب در پایتون
سرفصلهای مطلب
معرفی
مهندسی نرم افزار process اغلب عناصر زائد زیادی را در داخل ساختار و کد نرم افزار ما آشکار می کند. با دانستن این موضوع، برخی از مسئولیت های اصلی یک توسعه دهنده نوشتن است به راحتی قابل درک است و قابل نگهداری کد – نه فقط راه حل.
با این حال، پروژهها اغلب با گذشت زمان پیچیدهتر میشوند و ساختار نرمافزار اولیه را به عنصری حیاتی تبدیل میکنند که باید از همان ابتدا به خوبی فکر شده و پیادهسازی شود.
الگوهای طراحی برای حل این موضوع در نظر گرفته شده است.
الگوهای طراحی مجموعه ای از استانداردها هستند که برای بهینه سازی وظایف خاص مرتبط با پارادایم برنامه نویسی شی گرا (OOP) استفاده می شوند. هدف آنها کاهش تعداد کلی خطوط کد، بهینه سازی ساختارها و استانداردسازی معماری نرم افزار است.
این برنامه نویسی شی گرا پارادایم یک ساختار مبتنی بر ارائه می دهد روی کلاسها، که در آن هر کلاس طرحی را برای یک نشان میدهد هدف – شی (نمونه ای از آن کلاس) که ویژگی ها و متدهای خاص خود را دارد. این کلاسها به هم مرتبط هستند و وابستگیها، ترکیبها، وراثت و غیره خاص خود را دارند. تبدیل مشکلات و ساختارهای واقعی به راهحلهای نرمافزاری، انگیزه اولیه برای پیادهسازی این ساختار است.
در این راهنما، یکی از این موارد را بررسی خواهیم کرد الگوهای طراحی رفتاری و پیاده سازی آن در پایتون: the روش قالب.
این الگوی طراحی یک روش کلی متشکل از چند مرحله را به ما ارائه می دهد. کلاس های مربوط به کلاس متد الگوی ما می توانند این مراحل را به صورت جداگانه فراخوانی کنند یا آنها را بازنویسی کنند.
علاوه بر این، روش استفاده از آن را یاد خواهیم گرفت کتابخانه ABC در پایتون، که یک رابطه وراثت را برای کلاس های پایه انتزاعی (ABC) تعریف می کند. ما از این کتابخانه برای ایجاد یک مثال روش الگوی ساده استفاده خواهیم کرد.
الگوهای طراحی رفتاری
این روش قالب هست یک الگوی طراحی رفتاری. الگوی طراحی رفتاری دقیقا چیست؟
سه الگوی طراحی نرم افزار شناخته شده وجود دارد: خلاقانه، ساختاری، و رفتاری.
-
الگوهای طراحی خلاقانه در نظر گرفته شده است که ایجاد اشیاء را در حالی که منطق ایجاد شیء را انتزاع/پنهان می کند، ایجاد می کند. از الگوهای طراحی خلاقیت برای ارائه برنامه های انعطاف پذیری بیشتر در انتخاب اشیاء مورد نظر برای هر مورد استفاده استفاده می شود.
-
الگوهای طراحی سازه برای مدیریت ترکیب اشیاء و کلاس ها با تکیه در نظر گرفته شده اند روی وراثت برای کنترل روش ایجاد اشیاء و دادن عملکردها.
-
الگوهای طراحی رفتاری متمرکز هستند روی ارتباطی که بین اشیا اتفاق می افتد، کنترل روش حرکت داده ها بین اشیا، و توزیع رفتار بین کلاس ها.
روش الگو متمرکز است روی توزیع توابع و متدها در بین کلاسها
الگوی طراحی روش الگو
الگوی طراحی روش قالب به ما امکان می دهد یک کلاس پایه ایجاد کنیم که شامل تعدادی از مراحل مورد نیاز برای تکمیل یک است process. هنگامی که این مراحل را با یک الگوی تعریف می کنید ، ایجاد یک یا چند کلاس بتونی و بازنویسی مراحل الگوی امکان پذیر می شود. این به شما امکان می دهد بسته به برخی یا تمام مراحل را پیاده سازی کنید روی کلاس بتونی ، بدون اینکه کل را بازنویسی کند process.
برای استفاده از روش الگو ، به یک کلاس انتزاعی احتیاج داریم. کلاس انتزاعی اساساً یک رشته است process به مراحل کوچکتر یا فرآیندهای جزئی تقسیم می شود. به عبارت دیگر ، کلاس انتزاعی از روش الگوی استفاده می کند (عمده process) و در داخل الگوی ما به مراحل جزئی که رشته اصلی را تکمیل می کنند ، پیدا خواهیم کرد process. این فرآیندهای جزئی روشها و کارکردهایی خواهند بود که کلاسهای بتونی می توانند با آنها تماس بگیرند.
استفاده از یک کلاس انتزاعی به این معنی است که برای دسترسی به مراحل تعریف شده با روش الگوی ، لازم نیست کل کلاس پایه را فوری کنیم. درعوض ، ما می توانیم زیر کلاسهای انتزاعی را ایجاد کنیم و فقط مراحل مورد نیاز خود را در زیر کلاسهای فردی بازنویسی کنیم.
هنگامی که کلاس انتزاعی را تعریف می کنیم، می توانیم کلاس های مشخصی ایجاد کنیم که مراحل مورد نیاز ما را بازنویسی می کند. برای رسیدن به این هدف از رابطه ارثی استفاده خواهیم کرد. بسته به روی زمینه کلاس بتونی ، ما تمام مراحل یا فقط برخی از آنها را بازنویسی خواهیم کرد.
ما می توانیم ساختار روش الگوی را با یک نمودار کلاس مانند این ، مطابق با الگوی OOP نشان دهیم:
در اینجا می توانید ببینید که ما با ایجاد یک کلاس انتزاعی با یک روش الگوی متشکل از چندین مرحله/عملکرد شروع می کنیم. از این کلاس انتزاعی ، ما دو کلاس بتونی ایجاد می کنیم که از مراحل مختلف روش الگو استفاده می کنند.
روش الگو در مقابل روش کارخانه
در مورد تفاوتهای بین الگوی روش الگو و الگوی روش کارخانه، سردرگمی وجود دارد. این به این دلیل است که ساختار آنها مشابه است، اگرچه آنها یکسان نیستند. روش کارخانه ای است الگوی خلاقیت برای ایجاد اشیاء از یک سوپرکلاس استفاده می شود. در مقابل، روش قالب هست یک الگوی رفتاری برای تعریف یک روش کلی متشکل از مراحلی که میتوانند توسط زیرکلاسهای کلاس انتزاعی، حاوی متد الگو، اصلاح شوند، استفاده میشود.
به عبارت دیگر، در حالی که Factory Method اشیا را ایجاد می کند، روش الگو، قابلیتهای اصلی/پایه را بازنویسی میکند process.
اکنون که تفاوت بین این الگوها را روشن کردیم، میتوانیم روش پیادهسازی آن را بررسی کنیم الگوی طراحی روش قالب در پایتون.
توجه داشته باشید: پایتون از کلاس های انتزاعی بدون استفاده از یک کتابخانه خاص پشتیبانی نمی کند. برای استفاده از انجمن های کلاسی انتزاعی، نیاز داریم import را ABC کتابخانه
کتابخانه ABC
کتابخانه ABC زیرساختی را برای مدیریت کلاس های پایه انتزاعی در پایتون فراهم می کند. این بدان معناست که ما میتوانیم روابط کلاسی مانند وراثت یا پیادهسازی برای کلاسهای انتزاعی ایجاد کنیم – چیزی که برای اجرای بیشتر الگوهای طراحی لازم است و به ویژه در روش قالب مورد.
چه زمانی از الگوی روش الگو استفاده کنیم؟
شما می خواهید از آن استفاده کنید روش قالب زمانی که شما نیاز به استفاده یا اصلاح برخی یا همه مراحل یک الگوریتم دارید. در این موارد، شما باید مراحل الگوریتم خود را متمایز کنید یا process، آنها را به صورت جداگانه از طریق وراثت یا پیاده سازی در دسترس قرار می دهد.
بیایید به یک مثال عملی نگاهی بیندازیم:
ما دو گروه محقق داریم، یکی از دانشگاه A و دیگری از دانشگاه ب. این دو گروه در حال بررسی اثرات قرنطینه هستند که توسط دولت ها در پاسخ به این قرنطینه اجرا می شود SARS-CoV-2 پاندمی. هر دو گروه تحقیقات پایه یکسانی دارند process. تحقیق پایه process الگویی است که دو گروه تحقیقاتی می توانند از آن برای ادامه تحقیقات خود استفاده کنند. با این حال گروه های تحقیقاتی می توانند تحقیق را سفارشی کنند process به لحاظ:
- کدام مراحل در طول تحقیق انجام می شود.
- روش انجام هر مرحله تحقیق
بیایید قبل از ایجاد مدل با کد پایتون، این تحقیق را با یک نمودار کلاس نشان دهیم.
دستورالعمل تحقیق از 4 مرحله تشکیل شده است:
- دانشگاه A تصمیم می گیرد 2 مرحله از 4 مرحله (2 و 3) را اعمال کند.
- دانشگاه B 3 مرحله (1، 3 و 4) را اعمال می کند.
- هر دو گروه تمام مراحل انتخاب شده را اصلاح کردند.
- در نهایت مرحله شماره 3 باید برای هر دو گروه اعمال شود زیرا اجباری است.
ما قبلاً کلاس نمودار خود را داریم، فقط باید آن را تغییر دهیم تا با مشکل ما مطابقت داشته باشد.
با به روز رسانی نمودار برای تناسب با شرایطی که مشخص کردیم، به مدل زیر می رسیم:
پیاده سازی الگوی طراحی روش الگو در پایتون
اکنون که طرح کلی کلاس های انتزاعی و ملموس خود را داریم، بیایید آنها را در پایتون پیاده سازی کنیم.
بیایید با کلاس انتزاعی خود شروع کنیم – researchGuideline.py
، که حاوی ما خواهد بود روش های قالب با چهار مرحله اصلی برای تحقیق.
اول، ما import را کتابخانه ABC. این کتابخانه شامل کلاسی به نام است ABC
و ما از آن به عنوان یک ابرکلاس برای الگوی تحقیقاتی خود استفاده می کنیم و آن را به یک کلاس پایه انتزاعی تبدیل می کنیم.
در مرحله بعد، مراحل خود را به عنوان متدهای کلاس تعریف می کنیم. این متدها فعلا خالی خواهند بود، اما وقتی زیر کلاس ها را تعریف می کنیم – مراحل را بازنویسی می کنند:
from abc import ABC, abstractmethod
class ResearchGuideline(ABC):
def templateMethod(self):
self.step1()
self.step2()
self.step3()
self.step4()
def step1(self):
pass
def step2(self):
pass
@abstractmethod
def step3(self):
pass
def step4(self):
pass
توجه کنید که چگونه ما را اضافه کردیم @abstractmethod
decorator به مرحله 3. این نشان می دهد که زیر کلاس های یک کلاس انتزاعی باید همیشه آن متد را بازنویسی کنند. ما باید این دکوراتور را در واردات بگنجانیم، زیرا آن نیز بخشی از کتابخانه ABC است.
بیایید کلاس های بتن خود را اکنون تعریف کنیم. ما در مورد آن صحبت می کنیم دانشگاه های A و B، با مراحل مربوطه خود. ما یک زیر کلاس برای هر دو دانشگاه با استفاده از ResearchGuideline
قالب.
برای هر دو کلاس، ما باید import را ResearchGuideline
کلاس و ارثی بین superclass و subclass ایجاد کنید. این به ما امکان می دهد از مراحلی که در دستورالعمل/الگو تعریف کرده ایم استفاده کنیم و آنها را بازنویسی کنیم. استفاده از مراحل یک ورود ساده خواهد بود/print در این مورد.
بیایید با زیر کلاس اول شروع کنیم:
from researchGuideline import ResearchGuideline
class UniversityA(ResearchGuideline):
def step2(self):
print("Step 2 - Applied by University A")
def step3(self):
print("Step 3 - Applied by University A")
ما این را در یک فایل پایتون به نام ذخیره می کنیم universityA
. حالا بیایید زیر کلاس دوم را تنظیم کنیم:
from researchGuideline import ResearchGuideline
class UniversityB(ResearchGuideline):
def step1(self):
print("Step 1 - Applied by University B")
def step3(self):
print("Step 3 - Applied by University B")
def step4(self):
print("Step 4 - Applied by University B")
ما این را در یک فایل پایتون به نام ذخیره می کنیم universityB
.
توجه داشته باشید که ما مشخص کرده ایم که کدام دانشگاه چه مراحلی را اعمال می کند. این به ما کمک می کند تا تفاوت بین دو کلاس بتن را درک کنیم.
مدل متد قالب ما شامل کلاس انتزاعی و کلاس های بتن، انجام شده است! حالا بیایید اسکریپت مشتری خود را ایجاد کنیم تا بتوانیم مدل را اعمال کنیم.
اول، اجازه دهید import کلاس های ما. این شامل وارد کردن کلاس انتزاعی و دو کلاس مشخص است. سپس، تابعی ایجاد می کنیم که a را دریافت می کند ResearchGuideline
شی به عنوان یک پارامتر، که کلاس قالب/انتزاعی ما است.
زیبایی رابطه وراثت در اینجاست – زیرا کلاسهای دانشگاه زیر کلاسهایی هستند ResearchGuideline
آنها به اشتراک می گذارند نوع شی.
ما می توانیم هر دو را پاس کنیم UniversityA
یا UniversityB
شیء به عنوان آرگومان در تابع ما که متد الگو را فراخوانی می کند (این است client_call()
در زیر)، و مراحل بازنویسی شده توسط کلاس بتن، روش اجرای متد الگو را تغییر خواهد داد.
در اینجا ما از هر دو کلاس استفاده می کنیم، بنابراین می توانیم خروجی ها را با هم مقایسه کنیم:
from researchGuideline import *
from universityA import UniversityA
from universityB import UniversityB
def client_call(research_guideline: ResearchGuideline):
research_guideline.templateMethod();
if __name__ == '__main__':
print("University A:")
client_call(UniversityA())
print("University B:")
client_call(UniversityB())
با اجرای این کد، خروجی زیر را بدست می آوریم:
University A:
Step 2 - Applied by University A
Step 3 - Applied by University A
University B:
Step 1 - Applied by University B
Step 3 - Applied by University B
Step 4 - Applied by University B
نتیجه
متد قالب روشی موثر برای توزیع وظایف بین کلاسها، تعریف مجدد فرآیندها و کاهش کد است. استفاده از این الگوی طراحی برای یک الگوریتم یا راه حل می تواند به شما کمک کند از روش های اضافی اجتناب کنید و فرآیندهای اجرایی طولانی تر را ساده کنید.
روش الگو نیز نمونه ای از استفاده صحیح از پارادایم OOP است. این مدل را نمی توان در همه موارد به کار برد، بنابراین قبل از استفاده حتماً نیازهای پروژه خود را درک کنید.
(برچسبها به ترجمه)# python
منتشر شده در 1403-01-10 10:42:05