
دوال 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 للتحقق من صحة القيمة المدخلة وتنفيذ الإجراءات اللازمة وفقًا لذلك.
شاهد الدرس فيديو من خلال تشغيل الفيديو الاتي
////