المتغيرات – Variables

المتغيرات في لغة Dart

المتغيرات (Variables) هي أماكن تخزين تستخدم لحفظ البيانات داخل الذاكرة أثناء تشغيل البرنامج. في لغة Dart، يمكن تعريف المتغيرات باستخدام عدة كلمات مفتاحية مثل var، final، const، أو تحديد النوع مباشرة مثل int و String.

🔹 أنواع المتغيرات في Dart

هناك عدة طرق لتعريف المتغيرات، وكل طريقة لها استخدام معين:

1️⃣ استخدام var (تحديد النوع تلقائيًا)

عند استخدام var، تقوم Dart بتحديد نوع المتغير تلقائيًا بناءً على القيمة المسندة له.

مثال:
void main() {
  var name = "ياسين";  // نوع المتغير String
  var age = 25;        // نوع المتغير int
  var price = 19.99;   // نوع المتغير double
  var isActive = true; // نوع المتغير bool

  print("الاسم: $name, العمر: $age, السعر: $price, نشط: $isActive");
}
Dart

📌 ملاحظة: بعد إسناد قيمة إلى var، لا يمكن تغييره إلى نوع آخر.

2️⃣ استخدام dynamic (متغير ديناميكي)

عند استخدام dynamic، يمكن تغيير نوع البيانات أثناء تشغيل البرنامج.

مثال:
void main() {
  dynamic variable = "مرحبا";
  print(variable); // طباعة: مرحبا

  variable = 42;
  print(variable); // طباعة: 42

  variable = true;
  print(variable); // طباعة: true
}
Dart

📌 متى نستخدم dynamic؟
عندما نحتاج إلى متغير يمكنه الاحتفاظ بأنواع بيانات مختلفة خلال تنفيذ البرنامج.

3️⃣ استخدام final و const (متغيرات ثابتة)

عندما نريد تعريف متغير لا يمكن تغيير قيمته بعد إسنادها، نستخدم final أو const.

🔹 الفرق بين final و const
الكلمة المفتاحيةالتغيير مسموح؟يتم تعيين القيمة أثناء التشغيل أم الترجمة؟
final❌ لا يمكن تغييرهأثناء التشغيل (Runtime)
const❌ لا يمكن تغييرهأثناء الترجمة (Compile-time)
مثال على final
void main() {
  final String city = "القاهرة";
  print(city);

  // city = "الإسكندرية"; // ❌ خطأ: لا يمكن إعادة تعيين قيمة لمتغير final
}
Dart
مثال على const
void main() {
  const double pi = 3.14159;
print(pi); // pi = 3.14; // ❌ خطأ: لا يمكن تغيير قيمة const<br>}<br></code>
Dart

📌 متى نستخدم final و const؟

  • نستخدم final عندما نحتاج إلى تعيين قيمة ثابتة ولكن قد يتم حسابها أثناء التشغيل.
  • نستخدم const عندما تكون القيمة معروفة أثناء الترجمة ولا تتغير مطلقًا.
4️⃣ تحديد نوع البيانات صراحةً

يمكننا تحديد نوع المتغير بشكل صريح مثل int، double، String، bool، List، إلخ.

أمثلة:
void main() {
  int age = 30;
  double price = 49.99;
  String message = "مرحبا بكم في Dart!";
  bool isStudent = false;

  print("العمر: $age، السعر: $price، الرسالة: $message، طالب: $isStudent");
}
Dart

🔹 المتغيرات المتعددة (Multiple Variables)

يمكنك تعريف عدة متغيرات بنفس النوع في سطر واحد.

مثال:
void main() {
  int x = 10, y = 20, z = 30;
  print("x: $x, y: $y, z: $z");
}
Dart

🔹 المتغيرات غير القابلة للتعيين (late)

عند تعريف متغير ولكن لا تريد تعيين قيمة له فورًا، يمكنك استخدام late.

مثال:
void main() {
  late String welcomeMessage;
  
  welcomeMessage = "أهلا وسهلا!";
  print(welcomeMessage);
}
Dart

📌 متى نستخدم late؟
عندما يكون المتغير غير ثابت (final) ولكن سيتم تعيين قيمته لاحقًا في وقت التشغيل.


🔹 المتغيرات داخل الدوال (Local Variables)

يمكن تعريف متغير داخل دالة واستخدامه فقط ضمن تلك الدالة.

مثال:
void greet() {
  var name = "ياسين"; // متغير محلي
  print("مرحبا $name!");
}

void main() {
  greet(); 
  // print(name); // ❌ خطأ: لا يمكن الوصول إلى المتغير خارج الدالة
}
Dart

🔹 المتغيرات العامة (Global Variables)

يمكن تعريف متغير خارج جميع الدوال ليكون متاحًا في جميع أنحاء الملف.

مثال:
String globalMessage = "هذه رسالة عامة";

void printMessage() {
  print(globalMessage);
}

void main() {
  printMessage(); 
}
Dart

🔹 الخلاصة
الكلمة المفتاحيةالوصف
varتعريف متغير دون تحديد النوع، ويحدد Dart نوعه تلقائيًا.
dynamicمتغير يمكن تغيير نوعه أثناء التشغيل.
finalمتغير ثابت لا يمكن تغييره بعد تعيينه، يتم تحديد قيمته أثناء التشغيل.
constمتغير ثابت لا يمكن تغييره بعد تعيينه، يتم تحديد قيمته أثناء الترجمة.
lateمتغير لا يتم تهيئته فورًا ولكنه يجب أن يتم تهيئته قبل الاستخدام.
int, String, double, boolتحديد نوع المتغير صراحةً.

بهذا الشرح، لديك الآن فهم شامل لكيفية التعامل مع المتغيرات في Dart مع أمثلة عملية. 😊🚀

شروط تسمية المتغيرات في Dart

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

🔹 1️⃣ يجب أن تبدأ بحرف أو علامة _ (Underscore)
  • يمكن أن تبدأ التسمية بحرف (a-z أو A-Z) أو بالرمز _، ولكن لا يمكن أن تبدأ برقم.
أمثلة صحيحة:
dartCopyEditvar name = "ياسين";  
var _privateVar = 42;
var userAge = 25;
أمثلة خاطئة:
dartCopyEditvar 1name = "محمد";  // ❌ خطأ: لا يمكن أن يبدأ المتغير برقم

🔹 2️⃣ يمكن أن تحتوي على الحروف، الأرقام، والرمز _ فقط
  • لا يمكن استخدام الرموز الخاصة مثل @, #, !, %, & في أسماء المتغيرات.
مثال صحيح:
dartCopyEditvar user_name = "أحمد";  
var student123 = "محمود";  
مثال خاطئ:
dartCopyEditvar user-name = "خالد";  // ❌ خطأ: لا يمكن استخدام `-`  
var @email = "[email protected]"; // ❌ خطأ: لا يمكن استخدام `@`

🔹 3️⃣ لا يمكن استخدام الكلمات المحجوزة في Dart
  • لا يمكنك تسمية المتغير باسم كلمة محجوزة في اللغة مثل int، var، class، final، إلخ.
مثال خاطئ:
dartCopyEditvar class = "Web Design";  // ❌ خطأ: `class` كلمة محجوزة  
var final = 100;  // ❌ خطأ: `final` كلمة محجوزة  

📌 🔗 الكلمات المحجوزة في Dart:

javascriptCopyEditabstract, as, async, await, break, case, catch, class, const, continue,  
default, do, else, enum, export, extends, external, factory, false,  
final, finally, for, Function, get, hide, if, implements, import,  
in, interface, is, late, library, mixin, new, null, on, operator,  
part, required, return, set, show, static, super, switch, sync,  
this, throw, true, try, typedef, var, void, while, with, yield

🔹 4️⃣ حساسة لحالة الأحرف (Case-Sensitive)
  • لغة Dart تفرق بين الأحرف الكبيرة والصغيرة، لذا username و UserName يعتبران متغيرين مختلفين.
مثال صحيح:
dartCopyEditvar username = "Ali";  
var UserName = "Omar";  

print(username);  // طباعة: Ali  
print(UserName);  // طباعة: Omar  

🔹 5️⃣ يجب أن تكون الأسماء واضحة ومعبرة
  • يفضل اختيار أسماء تعبر عن محتوى المتغير بدلاً من استخدام أسماء عشوائية.
مثال جيد:
dartCopyEditvar studentName = "سارة";  // ✔️ واضح ومعبر  
var totalPrice = 150.75;  // ✔️ يعبر عن سعر إجمالي  
مثال سيئ:
dartCopyEditvar x = "سارة";  // ❌ غير واضح  
var tp = 150.75; // ❌ لا يوضح الغرض منه

🔹 6️⃣ لا يمكن استخدام المسافات في الأسماء
  • لا يمكن استخدام المسافات داخل أسماء المتغيرات، ولكن يمكن استخدام _ أو CamelCase بدلاً منها.

مثال صحيح:

dartCopyEditvar student_name = "أحمد";  // ✔️ استخدام `_`
var studentName = "علي";  // ✔️ استخدام CamelCase  

مثال خاطئ:

dartCopyEditvar student name = "أحمد";  // ❌ خطأ: لا يمكن وجود مسافة  

🔹 7️⃣ يفضل استخدام أسلوب التسمية CamelCase أو Snake_Case
  • يفضل استخدام CamelCase (بداية كل كلمة بحرف كبير عدا الأولى) أو Snake_Case (استخدام _ بين الكلمات).
أمثلة صحيحة:
dartCopyEditvar studentName = "فاطمة";  // ✔️ CamelCase  
var student_name = "خالد";  // ✔️ Snake_Case  
أمثلة خاطئة:
dartCopyEditvar studentname = "عمر";  // ❌ غير واضح  
var STUDENTNAME = "يحيى";  // ❌ غير مفضل في المتغيرات  

🔹 الخلاصة
القاعدة✅ صحيح❌ خطأ
يجب أن يبدأ بحرف أو _var name = "أحمد";var 1name = "أحمد";
لا يحتوي على رموز خاصةvar user_name = "علي";var user-name = "علي";
لا يحتوي على مسافاتvar userName = "سارة";var user Name = "سارة";
لا يكون كلمة محجوزةvar studentCount = 10;var class = 10;
حساسة لحالة الأحرفvar myVar = 5; var MyVar = 10;
يفضل أن يكون واضحًاvar totalPrice = 200;var tp = 200;

🎯 نصيحة عملية

اتبع دائمًا أسلوب CamelCase أو Snake_Case في التسمية واجعل الأسماء واضحة لتعزيز قابلية القراءة والفهم.

🚀 الآن لديك فهم كامل لشروط تسمية المتغيرات في Dart! 🎯