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

متغيرات Late

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

تخبر الكلمة الأساسية late لغة Dart أن المتغير غير القابل للقيمة الخالية سيتم تهيئته قبل استخدامه، حتى لو لم يتم تعيين قيمة له على الفور. هذا مفيد عندما لا يمكنك تهيئة حقل في التصريح أو المنشئ، ولكنك متأكد من أنه سيكون له قيمة قبل الوصول إليه.

class User {
  late String username;
  
  void initialize(String name) {
    username = name;
  }
  
  void greet() {
    print('Hello, $username!');
  }
}

User user = User();
user.initialize('Alice');
user.greet();  // مرحباً، Alice!

بدون late، سيشتكي Dart من أن username لم يتم تهيئته. يَعِدُ المُعدِّل late بأنك ستقوم بتعيين قيمة قبل قراءتها.

فائدة أخرى لـ late هي التهيئة الكسولة (lazy initialization). فالمتغير المعرف بـ late مع قيمة ابتدائية لن يقوم بحساب قيمته حتى يتم الوصول إليه لأول مرة:

class Config {
  late String settings = loadSettings();
  
  String loadSettings() {
    print('Loading...');
    return 'default';
  }
}

Config config = Config();
print('Config created');
print(config.settings);  // "Loading..." تُطبع هنا، ثم "default"

تعمل الطريقة loadSettings() فقط عند الوصول إلى settings لأول مرة، وليس عند إنشاء الكائن. لكن كن حذرًا - فالوصول إلى متغير late قبل تهيئته يؤدي إلى حدوث خطأ في وقت التشغيل (runtime error).

challenge icon

التحدي

سهل

لنقم ببناء مدير اتصال بقاعدة بيانات يوضح كلاً من التهيئة المؤجلة (deferred initialization) والتهيئة الكسولة (lazy initialization) باستخدام متغيرات late.

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

  • database.dart: قم بتعريف فئة Database تحاكي الاتصال بقاعدة البيانات. يجب أن تحتوي الفئة الخاصة بك على:
    • متغير late String connectionString سيتم تعيينه بعد إنشاء الكائن
    • متغير late String status مع تهيئة كسولة (lazy initializer) تطبع Checking connection... وتعيد 'Connected'
    • دالة connect(String connStr) تقوم بتعيين connectionString وتطبع Connection configured: [connectionString]
    • دالة query(String sql) تطبع Executing on [connectionString]: [sql]
    • دالة checkStatus() تطبع Status: [status] (سيؤدي هذا إلى تشغيل التهيئة الكسولة عند الاستدعاء الأول)
  • main.dart: قم باستيراد فئة قاعدة البيانات الخاصة بك واستعرض كلا استخدامي late:
    • إنشاء مثيل (instance) من Database
    • طباعة Database object created
    • استدعاء connect() مع سلسلة الاتصال 'localhost:5432/mydb'
    • استدعاء query() مع 'SELECT * FROM users'
    • استدعاء checkStatus() لتشغيل التهيئة الكسولة

لاحظ كيف يتم تعيين connectionString يدويًا بعد إنشاء الكائن، بينما يحسب status قيمته فقط عند الوصول إليه لأول مرة.

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

Database object created
Connection configured: localhost:5432/mydb
Executing on localhost:5432/mydb: SELECT * FROM users
Checking connection...
Status: Connected

ورقة مرجعية

تسمح لك الكلمة المفتاحية late بتصريح متغيرات غير قابلة للقيمة الخالية (non-nullable) سيتم تهيئتها لاحقاً، قبل استخدامها:

class User {
  late String username;
  
  void initialize(String name) {
    username = name;
  }
}

User user = User();
user.initialize('Alice');

التهيئة الكسولة (Lazy Initialization): يقوم المتغير المسبوق بكلمة late والذي يحتوي على قيمة ابتدائية بحساب قيمته فقط عند الوصول إليه لأول مرة:

class Config {
  late String settings = loadSettings();
  
  String loadSettings() {
    print('Loading...');
    return 'default';
  }
}

Config config = Config();  // لم يتم استدعاء loadSettings() بعد
print(config.settings);     // يتم استدعاء loadSettings() هنا

تحذير: الوصول إلى متغير late قبل تهيئته يؤدي إلى حدوث خطأ وقت التشغيل (runtime error).

جرّب بنفسك

import 'database.dart';

void main() {
  // TODO: إنشاء مثيل لقاعدة البيانات
  
  // TODO: طباعة 'Database object created'
  
  // TODO: استدعاء connect() مع 'localhost:5432/mydb'
  
  // TODO: استدعاء query() مع 'SELECT * FROM users'
  
  // TODO: استدعاء checkStatus() لتفعيل التهيئة المتأخرة (lazy initialization)
}
quiz iconاختبر نفسك

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

جميع دروس Object Oriented Programming