ورود و عضویت
0
سبد خرید شما خالی است
0
سبد خرید شما خالی است

آشنایی با مفهوم Mixin در زبان برنامه نویسی دارت

2 دیدگاه
5 دقیقه برای مطالعه

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

در این مقاله نگاهی به مفهوم و نحوه استفاده از Mixin میپردازیم.

Mixin چیست؟

علت کاربردی بودن Mixin حل یک سری از مشکلات و پیچیدگی های ارث بری در برنامه نویسی شی گرایی میباشد. با استفاده از آنها امکان استفاده از کدهای نوشته شده چندبرابر میشود و دلیل آن این است که نیازی به ارث بری کامل از یک کلاس را نخواهیم داشت.

به بیان ساده Mixin کلاسی است که دیگر کلاس ها بدون ارث بری از آن میتوانند به متدها و ویژگی های این کلاس دسترسی داشته باشند.

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

اما بیاید نگاهی دقیق تر داشته باشیم به این که چه مشکلی در این حالت قرار است که حل شود.

چرا از Mixins استفاده میکنیم؟

سه نوع پرنده مختلف را فرض کنید که دارای ویژگی های مشتری مثل بال زدن و آواز خواندن هستند. در این حالت برا ی مدلسازی مسئله به شکل شی گرایی معمولا یک کلاس والد ایجاد میکنیم و کلاس های هر پرنده از آن ارث بری میکند.

طبیعتا این روش منطقی است که هر سه پرنده از یک کلاس ارث بری کنند. اما اگر به تصویر زیر دقت کنید یکی از پرنده ها قابلیتی دیگر نیز دارد و آن هم متد write() است.

برنامه نویسی فلاتر

بعد از طراحی کلاس های بالا با موجودی به نام پشه روبرو میشویم که دارای ویژگی های نسبتا مشترکی با پرندگان هست. برای مثال یک پشه همانند آنها امکان پرواز کردن دارد اما در دسته پرندگان قرار نمیگرد بنابراین نمیتواند از کلاس Bird ارث بری کند.

برای حل این مشکل هم یک کلاس جدید به نام FlyingAnimal ایجاد میکنیم و کلاس های اصلی پرنده و حشره از آن ارث بری میکنند. بنابراین انواع پرندگان و حشرات را نیز با ارث بری از آنها مدلسازی کنیم.

شی گرایی

کلاس Insect مربوط به حشرات که قابلیت پرواز کردن دارند و کلاس Bird نیز مربوط به پرندگان است که قابلیت پرواز و آواز خواندن دارند است.

پیدایش مشکل

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

برای پیاده سازی این بخش دیاگرام و به شکل زیر تغییر میدهیم.

دارت Mixin

در این حالت یک مشکلی داریم, ما نیاز داریم که تمام کلاس ها بتوانند از سه متد flutter(), chirp() و write() استفاده کنند اما در مبحث شی گرایی فقط به ویژگی های کلاس والد دسترسی داریم. در اینجا امکان استفاده دوباره از کدها را نداریم.

اگر بخواهیم متد write() را به کلاس Creature اضافه کنیم تمام حشرات و پرندگان نیز این قابلیت را دریافت خواهند کرد. اما فقط انسان و QuickBird این قابلیت را نیاز دارند.

اگر یک کلاس جدید به نام BlogWriter ایجاد کنیم که این دو کلاس از آن ارث بری کنند در این حالت دیگر QuickBird به ویژگی های کلاس پرندگان دسترسی نخواهد داشت.

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

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

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

پیاده سازی Mixins

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

در ادامه سعی میکنیم دیاگرام بالا را بازنویسی کنیم. برای این کار FlutterMixin را ایجاد میکنیم که قابلیت پرواز را فراهم میکند. کلاسهای Mosquito و Bird از آن استفاده میکند.

همچنین ChirpMixin را تعریف میکنیم که فقط کلاس Bird از آن استفاده میکند.

در قدم سوم WriteMixin را تعریف کرده و کلاس های QuickBird و Human را با آن مرتبط میکنیم.

برای تعریف فایل های گفته شده هم میتوانیم از کلمه کلیدی mixin استفاده کنیم و هم به شکل عادی یک کلاس ایجاد کنیم.

mixin FlutterMixin on Creature {
  int height = 0;

  void flutter() {
    height++;
  }
}

در مثال بالا کلمه کلیدی on مشخص میکند که چه ساختار ارث بری کلاسی میتواند از این متدها و ویژگی ها استفاده کند.

در این کد FlutterMixin فقط در کلاس Creatures امکان استفاده شدن را دارد.

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

برای استفاده از قابلیت های Mixin در کلاس مورد نظر از کلمه کلیدی with استفاده میکنیم.

class Bird extends Creature with FlutterMixin, ChirpMixin {}

class QuickBird extends Bird with WriteMixin {}

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

void main(String[] args) {
  final quickBird = QuickBird();

  quickBird.flutter(); // inherited from Bird which includes the FlutterMixin 
  quickBird.chirp();   // inherited from Bird which includes the ChirpMixin 
  quickBird.write();   // directly mixed-in via WriteMixin
}

نتیجه گیری

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

class Creature with FlutterMixin, SailMixin, ReadMixin, EatMixin,....

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

2 پاسخ به “آشنایی با مفهوم Mixin در زبان برنامه نویسی دارت”

  1. محسن گفت:

    سلام
    خیلی ممنون بابت توضیح خوبتون اما تفاوت Mixin با abstract class در چی هست؟

    • Hesam گفت:

      سلام
      همونطور که گفته شد با استفاده از Mixin میشه از چند کلاس ارث بری کرد. abstract class مثل اینترفیس عمل میکنه فقط مشخص کننده این هست که یک کلاس چه قابلیت هایی میتونه داشته باشه و هیچ پیاده سازی انجام نمیشه در سطح خود همون کلاس.

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

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

Hesam
04 آگوست 2022
آموزش فارسی فلاتر
آموزش فارسی flutter