دوال setter و getter في Dart 14 - Programmer Tech
Dart and flutter

دوال setter و getter في Dart 14

دوال setter و getter

دوال setter و getter في Dart

دوال Getter و setter هي طرق الكلاس المستخدمة لمعالجة بيانات حقول الكلاس و تستخدم Getter في الحصول على بيانات حقل الكلاس بينما تستخدم setter لتعيين بيانات حقل الكلاس إلى بعض المتغيرات.

في لغة Dart، يمكنك استخدام الدوال المعروفة باسم “setter” و “getter” لتعيين والحصول على قيمة متغير داخل الكلاس. لتعريف setter و getter في Dart، يجب أن تبدأ الدالة بكلمة “set” أو “get” تليها اسم المتغير الذي ترغب في تعيينه أو الحصول عليه.

إليك مثال بسيط يوضح كيفية استخدام setters و getters في Dart:

class Person {
  String _name; // المتغير الخاص بالاسم
  
  // setter لتعيين الاسم
  set name(String name) {
    _name = name;
  }
  
  // getter للحصول على الاسم
  String get name {
    return _name;
  }
}

void main() {
  var person = Person();
  
  // تعيين الاسم باستخدام setter
  person.name = 'John';
  
  // الحصول على الاسم باستخدام getter
  print(person.name); // سيطبع: John
}

في المثال أعلاه، لدينا الكلاس Person الذي يحتوي على متغير _name الخاص بالاسم. لتعيين القيمة، نستخدم setter set name(String name) الذي يقوم بتعيين القيمة الممررة إلى المتغير _name. للحصول على القيمة، نستخدم getter String get name الذي يعيد قيمة المتغير _name.

تُلاحظ أننا استخدمنا الشرطة المنخفضة (_) قبل اسم المتغير _name في الكلاس. هذا يشير إلى أن المتغير _name خاص بالكلاس وليس مرئيًا خارج الكلاس، وهو يستخدم عادة لتحقيق التغليف (encapsulation) وإخفاء تفاصيل التنفيذ الداخلية.

طريقة Getter في Dart

يتم استخدامها من اجل استرداد حقل كلاس معين وحفظه في متغير كما انه تحتوي جميع الكلاسات على طريقة getter افتراضية ولكن يمكن تجاوزها بشكل صريح و يمكن تعريف طريقة getter باستخدام الكلمة الأساسية get على النحو التالي:

return_type get field_name{
    ...
}

يجب ملاحظة أنه يتعين علينا تحديد نوع الإرجاع ولكن ليست هناك حاجة لتحديد الباراميترات في الطريقة أعلاه.

طريقة getter في دارت

يتم استخدامها من اجل تعيين البيانات داخل متغير تم استلامه من getter و جميع الكلاسات لها طريقة ضبط افتراضية ولكن يمكن تجاوزها بشكل صريح, و يمكن تحديد طريقة getter باستخدام الكلمة الأساسية المحددة على النحو التالي:

set field_name{
    ...
}

مثال: استخدام طريقة Getter and Setter

class Gfg {
String programmerName;
String get getName {
	return programmerName;
}
set setName(String name) {
	programmerName = name;
}
}
void main() {
Gfg tech = Gfg();
tech.setName = "ProgrammerTech";
print("Welcome to ${tech.getName}");
}

الاخراج

.
welcome to ProgrammerTech

هل يمكنني استخدام setters و getters في أي نوع من المتغيرات؟

نعم، يمكنك استخدام setters و getters في أي نوع من المتغيرات في لغة Dart. يمكنك تعريف setters و getters للمتغيرات الأساسية مثل الأعداد الصحيحة (int) والأعداد العشرية (double)، والسلاسل (String)، والقوائم (List)، والمجموعات (Set)، والخرائط (Map)، وغيرها.

إليك مثال يوضح كيفية استخدام setters و getters مع أنواع متغيرات مختلفة:

class Circle {
  double _radius; // المتغير الخاص بنصف القطر

  // setter لتعيين نصف القطر
  set radius(double radius) {
    if (radius > 0) {
      _radius = radius;
    } else {
      throw Exception('نصف القطر يجب أن يكون أكبر من صفر.');
    }
  }

  // getter للحصول على نصف القطر
  double get radius {
    return _radius;
  }
}

void main() {
  var circle = Circle();

  // تعيين نصف القطر باستخدام setter
  circle.radius = 5.0;

  // الحصول على نصف القطر باستخدام getter
  print(circle.radius); // سيطبع: 5.0
}

في المثال أعلاه، لدينا الكلاس Circle الذي يحتوي على المتغير _radius الخاص بنصف القطر. تم تعريف setter set radius(double radius) للتحقق من أن قيمة نصف القطر أكبر من صفر قبل تعيينها في المتغير _radius. إذا كانت القيمة غير صالحة، سيتم رمي استثناء (Exception). ثم تم تعريف getter double get radius لإرجاع قيمة المتغير _radius.

يمكنك تعريف setters و getters في أي نوع من المتغيرات واستخدامها لتحقيق العمليات الإضافية أو التحقق من القيم الممررة قبل تعيينها أو استرجاعها.

هل يمكنني استخدام setters و getters في الكلاسات الأخرى أيضًا؟

نعم، يمكنك استخدام setters و getters في الكلاسات الأخرى أيضًا في لغة Dart. يمكنك تعريف setters و getters في أي كلاس ترغب فيه لتعيين والحصول على قيم المتغيرات المرتبطة به.

في الأمثلة السابقة، قمنا بتعريف setters و getters داخل الكلاس نفسه. ومع ذلك، يمكنك أيضًا تعريف setters و getters في كلاس آخر، وذلك بتعريف المتغيرات كـ private واستخدام setters و getters للوصول إليها.

إليك مثال يوضح كيفية استخدام setters و getters في كلاس آخر:

class Rectangle {
  double _width; // المتغير الخاص بالعرض
  double _height; // المتغير الخاص بالارتفاع

  // setters و getters للعرض
  set width(double width) {
    _width = width;
  }

  double get width {
    return _width;
  }

  // setters و getters للارتفاع
  set height(double height) {
    _height = height;
  }

  double get height {
    return _height;
  }
}

class Shape {
  Rectangle _rectangle; // المتغير الخاص بالمستطيل

  Shape() {
    _rectangle = Rectangle();
  }

  // setter و getter للمستطيل
  set rectangle(Rectangle rectangle) {
    _rectangle = rectangle;
  }

  Rectangle get rectangle {
    return _rectangle;
  }
}

void main() {
  var shape = Shape();

  // تعيين العرض والارتفاع للمستطيل باستخدام setters
  shape.rectangle.width = 10.0;
  shape.rectangle.height = 5.0;

  // الحصول على العرض والارتفاع للمستطيل باستخدام getters
  print(shape.rectangle.width); // سيطبع: 10.0
  print(shape.rectangle.height); // سيطبع: 5.0
}

في المثال أعلاه، لدينا الكلاس Rectangle و Shape. تم تعريف setters و getters للعرض والارتفاع في الكلاس Rectangle. ثم تم تعريف setters و getters للمتغير _rectangle في الكلاس Shape، والذي يمثل مستطيل.

باستخدام setters و getters في الكلاس Shape، يمكننا تعيين والحصول على العرض والارتفاع للمستطيل عبر كائن shape.rectangle.

بالتالي، يمكنك استخدام setters و getters في الكلاسات الأخرى لتعيين والحصول على قيم المتغيرات المرتبطة بها.

هل يمكنني استخدام setters و getters للتحقق من صحة القيمة المدخلة؟

نعم، يمكنك استخدام setters و getters للتحقق من صحة القيمة المدخلة قبل تعيينها أو استرجاعها. يمكنك إضافة الشروط والتحققات التي ترغب فيها داخل setters للتحقق من صحة القيمة المدخلة وتنفيذ إجراءات إضافية إذا لزم الأمر.

في المثال التالي، سنستخدم setters للتحقق من صحة قيمة المتغير _age والتأكد من أنها غير سالبة:

class Person {
  int _age; // المتغير الخاص بالعمر

  // setter لتعيين العمر
  set age(int age) {
    if (age >= 0) {
      _age = age;
    } else {
      throw Exception('العمر يجب أن يكون غير سالب.');
    }
  }

  // getter للحصول على العمر
  int get age {
    return _age;
  }
}

void main() {
  var person = Person();

  // تعيين العمر باستخدام setter
  person.age = 25;

  // الحصول على العمر باستخدام getter
  print(person.age); // سيطبع: 25

  // محاولة تعيين قيمة سلبية للعمر
  try {
    person.age = -5;
  } catch (e) {
    print(e); // سيطبع: العمر يجب أن يكون غير سالب.
  }
}

في المثال أعلاه، لدينا الكلاس Person الذي يحتوي على المتغير _age الخاص بالعمر. تم تعريف setter set age(int age) للتحقق من أن قيمة العمر غير سالبة قبل تعيينها في المتغير _age. إذا كانت القيمة غير صالحة، سيتم رمي استثناء (Exception). ثم تم تعريف getter int get age لإرجاع قيمة المتغير _age.

باستخدام setter في هذا المثال، يتم التحقق من صحة القيمة المدخلة قبل تعيينها، وفي حالة عدم تطابق الشروط المحددة، يتم رمي استثناء. يمكنك إجراء التحققات المطلوبة داخل setters للتحقق من صحة القيمة المدخلة وتنفيذ الإجراءات اللازمة وفقًا لذلك.

شاهد الدرس فيديو من خلال تشغيل الفيديو الاتي

////

Ahmedkaissar

من مصر من محافظة الجيزة مبرمج ويب و خبير أمن معلومات محب للتقنية و الأمن المعلوماتي مدرب للغات "Python,html, css, php, js, laravel"
زر الذهاب إلى الأعلى