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

المنشئات الثابتة

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

يُنشئ المنشئ الثابت (constant constructor) كائنات ثابتة في وقت التصريف (compile-time). فعندما تقوم بإنشاء كائنات بنفس القيم باستخدام منشئ const، يعيد Dart استخدام نفس المثيل في الذاكرة، مما يحسن الأداء.

لإنشاء منشئ ثابت (constant constructor)، أضف الكلمة الأساسية const قبل اسم المنشئ، وتأكد من أن جميع متغيرات النسخة (instance variables) هي final:

class Color {
  final int red;
  final int green;
  final int blue;

  const Color(this.red, this.green, this.blue);
}

const white = Color(255, 255, 255);
const alsoWhite = Color(255, 255, 255);

print(identical(white, alsoWhite)); // true

يشير كل من white و alsoWhite إلى نفس الكائن تماماً في الذاكرة لأنهما أُنشئا بقيم متطابقة باستخدام منشئ ثابت (const constructor).

يمكنك أيضاً استخدام منشئات const بدون الكلمة المفتاحية const، مما يؤدي إلى إنشاء مثيلات عادية (غير ثابتة):

var red = Color(255, 0, 0);       // مثيل عادي
const blue = Color(0, 0, 255);    // مثيل ثابت

تُستخدم المنشئات الثابتة (Constant constructors) بشكل شائع لكائنات التكوين غير القابلة للتغيير، والقيم المحددة مسبقاً مثل الألوان أو الأحجام، وفي أي مكان تريد فيه ضمان عدم قابلة الكائن للتغيير مع تحسين استخدام الذاكرة.

challenge icon

التحدي

سهل

لنقم ببناء نظام تهيئة للعبة بسيطة تستخدم منشئات ثابتة (constant constructors) لتعريف إعدادات غير قابلة للتغيير وقابلة لإعادة الاستخدام.

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

  • difficulty.dart: قم بتعريف فئة Difficulty التي تمثل إعدادات صعوبة اللعبة. يجب أن تحتوي الفئة الخاصة بك على:
    • ثلاثة حقول final: وهي name (String)، و enemyCount (int)، و playerLives (int)
    • منشئ ثابت (constant constructor) يقوم بتهيئة جميع الحقول الثلاثة
    • دالة display() تقوم بطباعة معلومات الصعوبة
  • main.dart: قم باستيراد فئة الصعوبة الخاصة بك وأنشئ ثلاثة إعدادات مسبقة للصعوبة كثوابت:
    • easy بالاسم 'Easy'، و 5 أعداء، و 5 أرواح
    • medium بالاسم 'Medium'، و 10 أعداء، و 3 أرواح
    • hard بالاسم 'Hard'، و 20 عدوًا، و 1 حياة واحدة
    قم بإنشاء الثلاثة جميعاً كثوابت وقت التجميع (compile-time constants) باستخدام الكلمة المفتاحية const. ثم استدعِ display() على كل منها بالترتيب المذكور أعلاه. وأخيرًا، تحقق مما إذا كان كائنان من نوع const Difficulty('Easy', 5, 5) متطابقين باستخدام identical() واطبع النتيجة.

يجب أن تقوم دالة display() بالطباعة بهذا التنسيق تماماً:

[name]: [enemyCount] enemies, [playerLives] lives

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

Easy: 5 enemies, 5 lives
Medium: 10 enemies, 3 lives
Hard: 20 enemies, 1 lives
true

ورقة مرجعية

يقوم المنشئ الثابت (constant constructor) بإنشاء كائنات ثابتة في وقت التصريف (compile-time). عندما يتم إنشاء كائنات بقيم متطابقة باستخدام منشئ ثابت، تعيد Dart استخدام نفس المثيل في الذاكرة.

لإنشاء منشئ ثابت، أضف الكلمة المفتاحية const قبل اسم المنشئ وتأكد من أن جميع متغيرات المثيل هي final:

class Color {
  final int red;
  final int green;
  final int blue;

  const Color(this.red, this.green, this.blue);
}

يؤدي إنشاء مثيلات ثابتة بقيم متطابقة إلى الحصول على نفس الكائن في الذاكرة:

const white = Color(255, 255, 255);
const alsoWhite = Color(255, 255, 255);

print(identical(white, alsoWhite)); // true

يمكن أيضاً استخدام المنشئات الثابتة بدون الكلمة المفتاحية const لإنشاء مثيلات عادية:

var red = Color(255, 0, 0);       // مثيل عادي
const blue = Color(0, 0, 255);    // مثيل ثابت

تُعد المنشئات الثابتة مفيدة لكائنات التكوين غير القابلة للتغيير، والقيم المحددة مسبقاً، وتحسين استخدام الذاكرة.

جرّب بنفسك

import 'difficulty.dart';

void main() {
  // TODO: قم بإنشاء ثلاثة إعدادات مسبقة ثابتة للصعوبة باستخدام الكلمة المفتاحية const:
  // - easy: الاسم 'Easy'، 5 أعداء، 5 أرواح
  // - medium: الاسم 'Medium'، 10 أعداء، 3 أرواح
  // - hard: الاسم 'Hard'، 20 عدوًا، حياة واحدة
  
  // TODO: قم باستدعاء display() لكل مستوى صعوبة بالترتيب: easy، medium، hard
  
  // TODO: تحقق مما إذا كان كائنان من نوع const Difficulty('Easy', 5, 5) متطابقين
  // باستخدام identical() واطبع النتيجة
}
quiz iconاختبر نفسك

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

جميع دروس Object Oriented Programming