Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

دوال الـ Getters والـ Setters

جزء من قسم Object Oriented Programming في رحلة Dart على Coddy — الدرس 21 من 110.

توفر دوال الجلب (Getters) والتعيين (Setters) طريقة للوصول إلى حقول الفئة (class fields) وتعديلها من خلال طرق خاصة تبدو وكأنها خصائص عادية. فبدلاً من كشف الحقول مباشرة، يمكنك التحكم في كيفية قراءة القيم وكتابتها.

يتم تعريف الـ getter باستخدام الكلمة المفتاحية get وتُرجع قيمة محسوبة أو مخزنة:

class Rectangle {
  double width;
  double height;
  
  Rectangle(this.width, this.height);
  
  double get area => width * height;
  double get perimeter => 2 * (width + height);
}

Rectangle rect = Rectangle(5, 3);
print(rect.area);      // 15.0
print(rect.perimeter); // 16.0

لاحظ أن area و perimeter يتم الوصول إليهما كحقول، ولكن يتم حسابهما في كل مرة. لا حاجة للأقواس.

تستخدم دالة التعيين setter الكلمة المفتاحية set وتسمح لك بالتحكم في كيفية تعيين القيمة:

class Temperature {
  double _celsius;
  
  Temperature(this._celsius);
  
  double get celsius => _celsius;
  set celsius(double value) {
    if (value >= -273.15) {
      _celsius = value;
    }
  }
  
  double get fahrenheit => _celsius * 9 / 5 + 32;
  set fahrenheit(double value) {
    celsius = (value - 32) * 5 / 9;
  }
}

Temperature temp = Temperature(25);
print(temp.fahrenheit);  // 77.0
temp.fahrenheit = 100;
print(temp.celsius);     // 37.78

تقوم دالة التعيين (setter) بالتحقق من صحة المدخلات قبل تخزينها، ويمكنها حتى التحويل بين الوحدات. يمنحك هذا تحكماً في بياناتك مع الحفاظ على صيغة برمجية نظيفة تشبه الخصائص لمستخدمي الفئة (class) الخاصة بك.

challenge icon

التحدي

سهل

لنقم ببناء متتبع نقاط للعبة يستخدم الـ getters والـ setters لإدارة إحصائيات اللاعب مع التحقق من الصحة والقيم المحسوبة.

ستقوم بتنظيم الكود الخاص بك في ملفين:

  • player.dart: قم بتعريف فئة Player التي تتبع أداء اللاعب في اللعبة. يجب أن تحتوي الفئة الخاصة بك على:
    • حقل String name لاسم اللاعب
    • حقل int _score خاص يبدأ بـ 0
    • حقل int _lives خاص يبدأ بـ 3
    • منشئ (constructor) يأخذ اسم اللاعب
    • getter باسم score يعيد النتيجة الحالية
    • setter باسم score يقبل فقط القيم التي تساوي 0 أو أكبر (تجاهل القيم السالبة)
    • getter باسم lives يعيد عدد الأرواح الحالية
    • setter باسم lives يقبل فقط القيم بين 0 و 5 شاملة (تجاهل القيم خارج هذا النطاق)
    • getter باسم level يحسب مستوى اللاعب بناءً على النتيجة: النتيجة مقسومة على 100 (قسمة أعداد صحيحة)، زائد 1
    • getter باسم isAlive يعيد true إذا كان عدد الأرواح أكبر من 0
    • طريقة displayStatus() تطبع حالة اللاعب الحالية
  • main.dart: استورد فئة اللاعب الخاصة بك واستعرض الـ getters والـ setters:
    • أنشئ لاعباً باسم 'Alex'
    • قم بتعيين النتيجة إلى 250 واستدعِ displayStatus()
    • حاول تعيين النتيجة إلى -50 (يجب تجاهلها) واستدعِ displayStatus()
    • قم بتعيين الأرواح إلى 1 واستدعِ displayStatus()
    • حاول تعيين الأرواح إلى 10 (يجب تجاهلها) واستدعِ displayStatus()

يجب أن تطبع الطريقة displayStatus() بهذا التنسيق الدقيق:

[name] | Score: [score] | Level: [level] | Lives: [lives] | Alive: [isAlive]

المخرجات المتوقعة:

Alex | Score: 250 | Level: 3 | Lives: 3 | Alive: true
Alex | Score: 250 | Level: 3 | Lives: 3 | Alive: true
Alex | Score: 250 | Level: 3 | Lives: 1 | Alive: true
Alex | Score: 250 | Level: 3 | Lives: 1 | Alive: true

ورقة مرجعية

توفر دوال الجلب (Getters) والتعيين (Setters) وصولاً متحكماً فيه إلى حقول الفئة (class fields) من خلال طرق خاصة تبدو مثل الخصائص العادية.

Getter (دالة الجلب) - تُعرّف باستخدام الكلمة المفتاحية get، وتُرجع قيمة محسوبة أو مخزنة:

class Rectangle {
  double width;
  double height;
  
  Rectangle(this.width, this.height);
  
  double get area => width * height;
  double get perimeter => 2 * (width + height);
}

Rectangle rect = Rectangle(5, 3);
print(rect.area);      // 15.0 - يتم الوصول إليها كحقل، بدون أقواس
print(rect.perimeter); // 16.0

Setter (دالة التعيين) - تستخدم الكلمة المفتاحية set، وتتحكم في كيفية تعيين القيم:

class Temperature {
  double _celsius;
  
  Temperature(this._celsius);
  
  double get celsius => _celsius;
  set celsius(double value) {
    if (value >= -273.15) {
      _celsius = value;
    }
  }
  
  double get fahrenheit => _celsius * 9 / 5 + 32;
  set fahrenheit(double value) {
    celsius = (value - 32) * 5 / 9;
  }
}

Temperature temp = Temperature(25);
print(temp.fahrenheit);  // 77.0
temp.fahrenheit = 100;
print(temp.celsius);     // 37.78

يمكن لدوال التعيين التحقق من صحة المدخلات والتحويل بين الوحدات مع الحفاظ على بناء جملة نظيف يشبه الخصائص.

جرّب بنفسك

import 'player.dart';

void main() {
  // TODO: أنشئ لاعباً باسم 'Alex'

  // TODO: اضبط الـ score على 250 واستدعِ displayStatus()

  // TODO: حاول ضبط الـ score على -50 (يجب تجاهله) واستدعِ displayStatus()

  // TODO: اضبط lives على 1 واستدعِ displayStatus()

  // TODO: حاول ضبط lives على 10 (يجب تجاهله) واستدعِ displayStatus()
}
quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس Object Oriented Programming