Interface در برنامه نویسی شی گرا چیست ؟



visibility  
mode_comment   ۶

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

Interface چیست

اینترفیس (Interface) مفهومی مشابه کلاس است با این تفاوت که نمی توان در آن متدی را پیاده سازی است. در واقع اینترفیس فقط مجموعه ای از قراردادها یا contract ها است. این قراردادها همه کلاس هایی را که اینترفیس را پیاده سازی یا Implement کرده اند ملزم می کند تک تک توابع آن را پیاده سازی کنند. اینترفیس با این کار از به هم ریختگی جلوگیری و کار تیمی را منظم و مشخص می کند. فراموش نکنید که هر کلاس می تواند بیشتر از یک اینترفیس را پیاده سازی کند. به عنوان مثال در کد PHP زیر یک اینترفیس به نام شکل یا Shape را پیاده سازی کرده ایم:

این به آن معنی است که از این پس هر کلاسی که اینترفیس Shape را پیاده سازی کند ملزم به پیاده سازی متد getArea() در خود است. در کد زیر دو کلاس Square یا مربع و Rectangle یا مستطیل اینترفیس Shape را پیاده کرده اند:

 

ممکن است این سوال برایتان پیش بیاید که چرا در این مثال از Interface استفاده کردیم؟ در حالی که می توانستیم به راحتی کلاسی به نام Shape داشته باشیم که طول و عرض هر شکل را در سازنده یا Constructor خود دریافت کرده و سپس در متد getArea() پیاده سازی کند. در این حالت کافی بود بقیه کلاس ها از آن به ارث ببرند و بر اساس قانون وراثت صاحب تمام متد ها و اتریبیوت های Shape شوند. در آن صورت کلاس Shape و کلاس های فرزند آن به این شکل نوشته می شد:

فرض کنید می خواهیم کلاسی به نام Circle یا دایره را در مجموعه کلاس های اشکال خود داشته باشیم. همانطور که می دانید مساحت دایره برخلاف مستطیل و مربع بر اساس طول و عرض نیست بلکه بر اساس شعاع آن است. در حالی که متد getArea() در کلاس والد آن یعنی Shape بر اساس طول و عرض پیاده سازی شده است! بنابراین می بینید که بهترین گزینه برای این مثال استفاده از اینترفیس بوده است. با استفاده از اینترفیس کلاس Circle به راحتی به صورت زیر پیاده می شود:

پس از پیاده سازی اینترفیس Shape در صورتی که تمام متدهای آن را در کلاس پیاده سازی کننده پیاده سازی نکنیم، یک خطای مهلک یا fatal error دریافت می کنیم و برنامه متوقف می شود.

یک مثال کاربردی از Interface

بهترین روش پیاده سازی اتصال به پایگاه داده در هر برنامه ای روشی است که وابسته به نوع پایگاه داده و نوع پیاده سازی اتصال به آن نباشد. با این جملات احتمالا به راحتی متوجه به اهمیت و کاربرد اینترفیس در این مثال شده اید. در این مثال با استفاده از اینترفیس تمام پیاده کننده ها یا درایور های پایگاه داده مثل mySQL و SQLServer را ملزم به داشتن متد های connect و query می کنیم. در واقع با استفاده از اینترفیس در این نمونه دیگر فرقی نمی کند که بعدها از چه روشی برای اتصال به پایگاه داده استفاده می شود. روش دسترسی به داده ها همیشه یکی است!

حال برای استفاده از پایگاه داده کافی است یک کلاس واسط مثل DatabaseConsumer داشته باشیم و شی درایور پایگاه داده مورد نظر خود را به آن پاس دهیم تا همه چیز به صورت اتوماتیک انجام شود:

در مثال بالا در متد سازنده یا __construct() شی SQLDriver که در واقع همان شی درایور پاس داده شده به DatabaseConsumer است، در اتریبیوت provider این کلاس ذخیره می شود. با این کار از این پس به تمام متدهای  publicدرایور مورد نظر دسترسی داریم. حال کافی است برای راه اندازی پایگاه داده در متد سازنده با استفاده از متد connect درایور مورد نظر، به آن متصل شویم. سایر متد های کلاس واسط نیز با اتصال به متد های متناسب در کلاس درایور داده شده، عمل درخواست شده را انجام می دهند. حال در خارج از کلاس، برای استفاده از پایگاه داده کافی است یک شی از کلاس درایور مورد نظر خودمان را ایجاد کرده و به سازنده کلاس DatabaseConsumer پاس دهیم!

متخصص PHP
اگر دوست داری برنامه نویسی PHP رو حرفه ای یاد بگیری آیا می دانید بیش از ۸۰% وب سایت های موجود در ایران از جمله لیدرهای بازار وب (اسنپ، اسنپ فود، نت برگ، دیجیکالا، الوپیک و ... ) زبان برنامه نویسی PHP را به عنوان زبان اصلی برای پیاده سازی امکانات سمت سرور خود انتخاب کردند! متخصص PHP arrow_back
7Learn Experts
comment دیدگاه کاربران
امیر حسین عزیزیان replyپاسخ

خیلی مهمه که درباره یه موضوع ، مفهوم ، مسئله یا هر چیزی که اسمشو میذارید تر و تمیز توضیح داده بشه . ب نظرم این مطلب این ویژگی رو داشت

زهرا فرحمند

سلام خوشحالم که استفاده کردید 🙂

امیرحسین ضیایی replyپاسخ

مرسی از مقالتون

زهرا فرحمند

مرسی از همراهی شما آقای ضیایی عزیز 🙂

ایلیا replyپاسخ

پیاده سازی پایگاه داده اخرش چه جالب بود
نمیشه کاری کرد که کلاس DatabaseConsumer خودش شی از کلاس درایور بسازه و کارا اتوماتیک شه؟

زهرا فرحمند

سلام ایلیای عزیز.
کلاس DatabaseConsumer رو برای رسیدن به اصل OpenClosed در سالید نوشتیم پس دستکاری کلاس برای تغییر درایور از دیدگاه سالید غیر قانونیه. پس به هر حال درایور باید از بیرون کلاس بهش پاس داده بشه. اگر با اصول SOLID آشنا نیستید می تونید مقالات بعدی در این مورد رو مطالعه کنید. ممنونم از توجهتون 🙂

add_circle ارسال دیدگاه

خوشحال میشیم دیدگاه و یا تجربیات خودتون رو با ما در میون بذارید :