دیزاین پترن ها در پایتون - پیش نیازها - قسمت 1

توی حالت کلی،‌ interface ها به ما این قابلیت رو میدن که ما خودمون رو از شر وابستگی به یک کلاس خاص رها کنیم و صرفا وابستگی رو به متدهاشون و پراپرتی هاشون نگه داریم. حالا منظور من چیه؟

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

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

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

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

برای ساخت اینترفیس ها در پایتون، ما باید یه سری کلاس ابسترکت ایجاد کنیم. برای اینکار میتونیم از کلاس ABC یا همون abstract base class استفاده کنیم. این کلاس ها به کلاس هایی گفته میشه که کلاس های والدی که از اون ها ارث بری کردن حتما باید متدهاشون رو پیاده سازی کنن.

به عنوان نمونه فرض کنید ما اپلیکیشینی داریم که قراره دیتا رو از منابع مختلفی دریافت کنه و اون رو در قالب فرمت خاصی در بیاره و به ما بر گردونه. ولی هر کدوم از منابع گفته شده دیتا رو توی فرمت خاصی به ما میدن. برای مثال اولین منبع دیتا رو به این شکل بر میگردونه:



و دیتای دوم هم به شکل زیر:



حالا تمام اطلاعاتی که ما از کاربر نیاز داریم اسم کاملش و سنش هست. خب این رو چجوری میشه پیاده سازی کرد؟

اول از همه بیاید کلاس interface اون رو ایجاد کنیم:



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


خب تا اینجای کار، کاری که انجام دادیم به نظر ساده میاد. نمیتونستیم همین رو بدون استفاده از ابسترکت کلاس ایجاد کنیم؟ بیاید با هم یه کلاس سوم بسازیم و این بار متد fetchData رو داخلش ایجاد نکنیم.

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


وقتی این کار رو بکنیم ارور زیر بهمون نمایش داده میشه. اینجاست که میتونیم بفهمیم مزیت استفاده از این کلاس چیه.

TypeError: Can't instantiate abstract class SourceThreeDataFetcher with abstract methods fetchData


کد نهایی: