در حال بارگذاری

0 %
بهنام سلطانی
توسعه دهنده اپلیکیشن موبایل
فلاتر | Flutter
  • مدرک تحصیلی:
    کارشناسی ارشد
  • رشته تحصیلی:
    مهندسی کامپیوتر
  • وضعیت سربازی:
    پایان خدمت
  • وضعیت تاهل:
    متاهل
  • تاریخ تولد:
    1374
  • شماره تماس:
    09373732307
ترکی
فارسی
انگلیسی
فلاتر
  • لینوکس (اوبونتو)
  • اندروید استودیو

اکستنشن متود – Extension Method

آبان ۲۶, ۱۴۰۲

اکستنشن متود (extension-methods) قابلیتی هست که در زبان دارت نسخه 2.7 بوجود اومد. به کمک این روش ما میتونیم کتابخانه‌های موجود رو بدون استفاده از وراثت گسترش دهیم. به طوری که توسعه دهندگان می توانند عملکرد یک کلاس را بدون تغییر خود کلاس گسترش دهند.

ساختار اکستنشن متد

ساختار کلی اکستنشن متد به این صورت هست:

extension <extension name> on <type> {
  (<member definition>)*
}

در این سینتکس موارد زیر را خواهیم داشت :

  • extension name بیانگر نام دلخواه انتخابی برای اکستنشن نوشته شده است.
  • type بیانگر نام کلاسی است که قصد توسعه آن را دارید.
  • member definition بدنه متدی است که آن را نوشته و قصد فراخوانی آن را دارید.

یک نمونه ساده از اکستنشن متد طراحی شده مطابق با سینتکس بالا:

extension Greeting on Person { 
    String greet() { 
        return 'Hello, ${this.name}!'; 
    } 
} 

در این سینتکس بر روی کلاس Person خود یک اکستنشن متدی طراحی کردیم که با فراخوانی متد greet اقدام به خوش آمد گویی به کاربر را خواهد داشت. حال کافی است اکستنشن نوشته شده را در جای مناسب فراخونی کنیم.

void main() { 
    Person person = Person('John'); 
    print(person.greet()); 
} 

// This code will output: Hello, John!

در این مثال خیلی ساده متد greet عضوی از کلاس Person نیست، اما می توان آن را روی یک شی Person فراخوانی کرد زیرا ما آن را به عنوان یک اکستنشن متد اضافه کرده ایم.

مزایای اکستنشن متد

اکستنشن متد چندین مزیت را ارائه می دهند، از جمله:

  • سازماندهی بهتر: این روش به صورت خیلی مختصر و تمیز قابلیت این رو میده که عملکردهای جدید را به کلاس های خود بدون دستکاری آن ها اعمال کنیم.
  • عدم نیاز به زیر کلاس: در این روش، برای افزودن قابلیت به کلاس موجود، نیازی به ایجاد یک زیر کلاس جدید ندارید. این کار نگهداری کد را بسیار ساده تر می کند.
  • استفاده آسان: این روش افزودن قابلیت به یک کلاس و استفاده از آن مانند سایر متدهای کلاس را آسان می کند.
  • قابلیت استفاده مجدد کد: با استفاده از این روش می توان اکستنشن متدهای طراحی شده را در چندین پروژه و کتابخانه استفاده کرد و آنها را به ابزاری ارزشمند برای استفاده مجدد از کد تبدیل کرد.

مثال در دنیای واقعی

مثال اول: اگر در مورد ویجت Visibility توی فلاتر اطلاع داشته باشید این ویجت کارش اینه که فرزند (child) خودش رو مرئی یا نامرئی بکنه.(مثل همون کاری که قبلا در اندروید روی view ها به سه حالت View.VISIBLE، View.GONEو View.INVISIBLE داشتیم )

Visibility({
  Key? key, 
  required Widget child, 
  Widget replacement = const SizedBox.shrink(), 
  bool visible = true, 
  bool maintainState = false, 
  bool maintainAnimation = false, 
  bool maintainSize = false, 
  bool maintainSemantics = false, 
  bool maintainInteractivity = false
})

خب حالا اگه قرار باشه که یک ویجت رو مخفی یا نمایان کنیم بایستی داخل ویجت Visibility و به عنوان child اش قرار بدیم. یعنی به ساده ترین شکل ممکن با چنین چیزی طرف خواهیم شد که با تنظیم visible: true قابل نمایش و با تنظیم visible: false مخفی خواهد شد.

Visibility(
  visible: true|false,
  child: Image.asset("assets/logo.png",
    height: 350,
    fit: BoxFit.contain,
  ),
),

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

extension Visibility on Widget {
  Widget visible(bool visibility) {
    return visibility ? this : SizedBox.shrink();
  }
}

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

widget.visible(TRUE/FALSE);

این یک نمونه مثال کوچک از کاربرد اکستنشن متد هست که مشاهده کردید. در مثال دوم در فلاتر متدی نداریم که کد hex بصورت رشته رو تبدیل بکنه به یک شیء از نوع Color بخاطر همین متدش رو در قالب یک اکستنشن متد میتونیم بنویسیم.

extension StringUtil on String {
  Color toColor() {
    return new Color(int.parse(this.substring(1, 7), radix: 16) + 0xFF000000);
  }
}

خلاصه که پیشنهاد میکنم تا جایی که میشه ازشون استفاده کنید 🙂 خیلی کاربردی و خیلی جذابن!

پست شده در دارتبرچسب‌ها:
نوشتن یک دیدگاه