خب، یه مثال خیلی پیچیده از کد داشتیم، درسته؟ جایی که سرورهای پرداخت رو داشتیم.
پردازشگر PayPal رو داشتیم که در واقع یه AI payment processor بود یا اون رو پیاده‌سازی می‌کرد.
برای پردازشگر کارت اعتباری هم همین‌طور.
بعدش هم یه AI payment processor داشتیم و بعد بحث چندریختی یا polymorphism پیش اومد.
و همه اینا با هم ترکیب شدن و واقعاً... وای، خیلی سنگین شد!
فکر کنم از نظر حجم مفاهیم، اون سخت‌ترین ویدیو تا الان بود.
پس بیایم حالا به‌صورت تصویری درکش کنیم.
باشه؟
بیایم دقیق‌تر بازش کنیم و ببینیم این اجزا چطور به هم وصل شدن.
ما اینجا interfaceها و polymorphism رو توی فرآیند پرداخت داریم.
پس سه بخش داریم.
یه interface به نام AI payment processor داریم.
یه کلاس به نام payment service داریم و یه کلاس program.
پس بیایم به AI payment processor نگاه کنیم.
ما از AI payment processor استفاده کردیم و دو کلاس براش ساختیم، یا دو کلاسی که اون رو پیاده‌سازی کردن.
یکی credit card processor هست که پرداخت با کارت اعتباری رو پردازش می‌کنه.
و یکی PayPal processor که پرداخت‌های PayPal رو انجام میده.
بعد یه payment service داریم که از AI payment processor برای انجام پرداخت استفاده می‌کنه.
اون AI payment processor همین اینجاست، درسته؟
همین‌جا.
اون اهمیتی نمیده که چه نوع AI payment processorی بهش داده میشه.
یعنی می‌تونه credit card processor باشه یا PayPal processor.
و کاری که می‌کنه اینه که پرداخت سفارش‌ها رو پردازش می‌کنه.
پس در واقع کار رو به AI payment processor می‌سپره.
یعنی اجرای واقعی پرداخت توسط payment service انجام نمیشه، بلکه
توسط کلاسی که AI payment processor رو پیاده‌سازی کرده انجام میشه.
پس payment service خودش کاری نداره، فقط بهش می‌گه "پرداخت رو انجام بده".
و براش مهم نیست کدوم یکی از اون دوتاست.
بعد هم یه کلاس program داریم که این payment service رو می‌سازه و استفاده می‌کنه،
همین یکی اینجا.
و بعد فرآیند پرداخت رو با پردازشگرهای مختلف راه می‌ندازه.
یعنی یا با credit card processor یا با PayPal processor.
این یه تصویر کلی از چیزیه که داخل پروژه ما اتفاق میفته.
ما یه AI payment processor داریم که میگه خب ببین،
اگه می‌خوای منو پیاده‌سازی کنی، باید از یه چارچوب خاصی پیروی کنی و متدهایی با ساختار مشخص داشته باشی.
مثلاً یه متد که چیزی برنمی‌گردونه و یه عدد اعشاری (decimal) می‌گیره.
پس هر کلاسی که این interface رو پیاده‌سازی کنه، باید اون متد رو هم پیاده‌سازی کنه.
ولی به روش خودش.
ما دوتا نوع ازش داریم.
PayPal processor و credit card processor که هر دوشون AI payment processor رو پیاده‌سازی کردن.
بعد یه payment service داریم که خیلی مهمه.
درسته؟
چون یه فیلد خصوصی و فقط‌خواندنی داره که مطمئن میشه ما یه AI payment processor گرفتیم.
و اون از طریق constructor داده میشه.
پس هر وقت یه کلاس پیاده‌سازی‌شده از AI payment processor بهش بدیم،
براش مهم نیست که اون کدومه — PayPal یا credit card یا هر نوع دیگه.
مهم اینه که اون interface رو پیاده‌سازی کرده.
چون در اون صورت مطمئنه که اون کلاس می‌تونه پرداخت رو انجام بده.
انگار یه قرارداد امضا کرده.
یعنی هر کسی که این interface رو پیاده‌سازی کنه، متعهد شده که متد مربوط به پرداخت رو داشته باشه.
پس payment service فقط به اون اعتماد می‌کنه.
اون خودش کاری انجام نمیده، فقط مسئولیت رو می‌سپره به processor.
و می‌دونه هر کسی که اون interface رو پیاده‌سازی کرده، طبق قرارداد باید درست کار کنه.
و این‌طوری مشخص میشه که پرداخت چطور انجام میشه.
بعد هم یه متد داریم به نام process order payments که یه مقدار اعشاری می‌گیره.
ولی نحوه واقعی پردازش پرداخت
به processor سپرده میشه، ما خودمون انجامش نمی‌دیم.
فقط می‌گیم: "هی processor! می‌دونم یه متدی داری به نام process payment."
و حالا بسته به نوع processor — چه PayPal چه credit card — خودش می‌دونه چطور انجام بده.
ما فقط مقدار مورد نیازش رو (یعنی amount) می‌فرستیم و اون بقیه رو خودش انجام میده.
پس حالا شاید این ساختار انتزاعی به‌نظر بیاد،
ولی در عوض بهمون اجازه میده از polymorphism استفاده کنیم.
اینجاست که چندریختی وارد ماجرا میشه.
اینجا خط مربوط به polymorphism ماست.
جایی که با credit card processor مثل یه AI payment processor رفتار می‌کنیم،
چون اون interface رو پیاده‌سازی کرده.
همین کلاس، credit card processor.
مثل مثالی که قبلاً با animal و dog داشتیم.
اونجا dog از animal ارث‌بری می‌کرد.
اینجا credit card processor ارث‌بری نمی‌کنه، بلکه interface رو پیاده‌سازی می‌کنه.
و بعد می‌تونیم اون رو به payment service پاس بدیم که فقط یه AI payment processor می‌خواست.
اونم داخل constructor خودش وقتی object ساخته میشه.
پس وقتی از این کلاس یه object ساخته میشه، فقط کار رو می‌سپره به کسی که می‌دونه باید چی کار کنه.
که توی یه حالت credit card processor هست و در حالت دیگه PayPal processor.
توضیحش از خود کد نوشتن طولانی‌تر شد، ولی اشکالی نداره چون این موضوع خیلی مهمه.
خود منم اولش سخت درکش می‌کردم چون مفهومی انتزاعی و پیشرفته‌ست.
خب،
همین برای این ویدیو کافیه.
می‌بینمتون تو ویدیوی بعدی.