Logo

المعمل 1: مقدمة في لغة Dart

7 دقائق قراءة
شرائح الدرس
1 / 13

المعمل الأول: مقدمة في برمجة Dart

المتغيرات، والتحكم في التدفق، والدوال، والبرمجة كائنية التوجه في Dart - اللغة التي يقوم عليها Flutter

مرحبًا بكم في أول جلسة معملية لمقرر نظم التشغيل 2. يقدم هذا المعمل لغة Dart، وهي لغة البرمجة التي يقوم عليها إطار عمل Flutter. سوف تتعلم في هذا المعمل المفاهيم البرمجية الأساسية، بما في ذلك المتغيرات، وهياكل التحكم، والدوال، والبرمجة كائنية التوجه (Object-Oriented Programming).


جدول المحتويات

  1. المتطلبات الأساسية والإعداد
  2. مقدمة في Dart
  3. المتغيرات وأنواع البيانات
  4. اتخاذ القرار والحلقات التكرارية
  5. الدوال
  6. البرمجة كائنية التوجه
  7. تمارين المعمل
  8. مصادر إضافية

المتطلبات الأساسية والإعداد

قبل البدء في البرمجة بلغة Dart، عليك إعداد بيئة التطوير الخاصة بك.

الخيار الأول: استخدام DartPad (عبر الإنترنت - بدون تثبيت)

أسهل طريقة للبدء هي استخدام DartPad، وهو محرر Dart يعمل عبر المتصفح مباشرة.

  1. افتح المتصفح وانتقل إلى https://dartpad.dev
  2. يمكنك البدء فورًا في كتابة وتشغيل كود Dart
  3. مثالي للتجارب السريعة والتعلم

المزايا:

  • لا يحتاج إلى أي تثبيت
  • يعمل على أي جهاز يحتوي على متصفح
  • تنفيذ فوري للكود

القيود:

  • إمكانيات محدودة مقارنة ببيئة تطوير متكاملة (IDE)
  • لا يدعم إدارة المشاريع

الخيار الثاني: التثبيت المحلي (موصى به)

للحصول على تجربة تطوير متكاملة، قم بتثبيت Dart ومحرر أكواد على جهازك مباشرة.

الخطوة 1: تثبيت Dart SDK

نظام Windows:

  1. حمّل حزمة Dart SDK من https://dart.dev/get-dart
  2. أو يمكنك استخدام مدير الحزم Chocolatey:
    choco install dart-sdk
  3. تحقق من نجاح التثبيت:
    dart --version

نظام macOS:

  1. استخدم Homebrew:
    brew tap dart-lang/dart
    brew install dart
  2. تحقق من نجاح التثبيت:
    dart --version

نظام Linux (Debian/Ubuntu):

  1. التثبيت عبر apt-get:
    sudo apt-get update
    sudo apt-get install apt-transport-https
    wget -qO- https://dl-ssl.google.com/linux/linux_signing_key.pub | sudo gpg --dearmor -o /usr/share/keyrings/dart.gpg
    echo 'deb [signed-by=/usr/share/keyrings/dart.gpg arch=amd64] https://storage.googleapis.com/download.dartlang.org/linux/debian stable main' | sudo tee /etc/apt/sources.list.d/dart_stable.list
    sudo apt-get update
    sudo apt-get install dart
  2. تحقق من نجاح التثبيت:
    dart --version

الخطوة 2: تثبيت محرر أكواد

Visual Studio Code (موصى به):

  1. حمّله من https://code.visualstudio.com/download
  2. ثبّت إضافة Dart:
    • افتح VS Code
    • اذهب إلى Extensions (Ctrl+Shift+X أو Cmd+Shift+X)
    • ابحث عن "Dart" وثبّت الإضافة الرسمية من Dart Code

Android Studio (بديل):

  1. حمّله من https://developer.android.com/studio
  2. ثبّت إضافة Dart:
    • اذهب إلى File > Settings > Plugins
    • ابحث عن "Dart" وقم بتثبيتها

إنشاء أول مشروع Dart

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

الخطوة 1: إنشاء مشروع جديد

dart create my_first_dart_project

الخطوة 2: الانتقال إلى مجلد المشروع

cd my_first_dart_project

الخطوة 3: تشغيل البرنامج الافتراضي

dart run

فهم هيكل المشروع

بعد إنشاء المشروع، ستجد هيكل المجلدات التالي:

graph TD
    A[my_first_dart_project/] --> B[bin/]
    A --> C[lib/]
    A --> D[test/]
    A --> E[pubspec.yaml]
    B --> F[my_first_dart_project.dart]
    C --> G[كود المكتبة]
    D --> H[ملفات الاختبار]
    E --> I[التبعيات والبيانات الوصفية]
    
    style A fill:#e1f5ff
    style B fill:#fff4e1
    style C fill:#fff4e1
    style D fill:#fff4e1
    style E fill:#e8f5e9

تفصيل المجلدات:

  • bin/: يحتوي على الملف التنفيذي الرئيسي (نقطة الدخول إلى التطبيق)
  • lib/: يُستخدم لكود المكتبة القابل لإعادة الاستخدام
  • test/: يحتوي على اختبارات الوحدة (Unit Tests) الخاصة بالكود
  • pubspec.yaml: ملف إعدادات المشروع (التبعيات والبيانات الوصفية)

تشغيل كود Dart

توجد عدة طرق لتنفيذ برامج Dart:

الخيار الأول: تشغيل المشروع بالكامل

dart run

الخيار الثاني: تشغيل ملف محدد

dart run bin/my_first_dart_project.dart

الخيار الثالث: تنفيذ ملف Dart مستقل

dart path/to/file.dart

مقدمة في Dart

Dart هي لغة برمجة عامة الأغراض ذات صياغة (syntax) على طراز لغة C. وهي تدعم المفاهيم البرمجية الحديثة مثل:

  • الأصناف (Classes) والواجهات (Interfaces)
  • الأنماط العامة (Generics)
  • البرمجة غير المتزامنة (Asynchronous Programming)
  • الأنواع الصارمة (Strong Typing) مع الاستدلال التلقائي على النوع (Type Inference)

ميزة أساسية: لا تدعم Dart المصفوفات (Arrays) التقليدية. بل تستخدم بدلًا منها المجموعات (Collections) مثل القوائم (Lists) والخرائط (Maps) والمجموعات (Sets) لإدارة هياكل البيانات.

أول برنامج لك بلغة Dart

نقطة الدخول لأي تطبيق Dart هي دالة main():

void main() {
    print("Dart language is easy to learn");
}

الشرح:

  • void: الدالة لا تُرجع قيمة
  • main(): دالة نقطة الدخول
  • print(): تطبع نصًا في وحدة التحكم (Console)

المتغيرات وأنواع البيانات

في Dart، المتغيّر (Variable) هو موقع تخزين له اسم، بينما أنواع البيانات (Data Types) تحدد حجم ونوع البيانات التي يمكن تخزينها.

تعريف المتغيرات

var name = "Dart";        // استدلال تلقائي على النوع
int age = 25;             // نوع صريح
dynamic data = 100;       // يمكن أن يتغير نوعه أثناء التشغيل

الثوابت

استخدم final أو const لتعريف قيم لا تتغير.

الفرق بينهما:

  • final: تُحدَّد قيمته أثناء التشغيل (يمكن أن تكون ناتج حساب)
  • const: تُحدَّد قيمته وقت الترجمة (Compile-time) (يجب أن تكون تعبيرًا ثابتًا)
void main() {
    final a = 12;
    const pi = 3.14;
    print(a);
    print(pi);
}

أنواع البيانات المدعومة

تدعم Dart أنواعًا مختلفة من البيانات المضمّنة (Built-in):

graph TD
    A[أنواع بيانات Dart] --> B[الأرقام]
    A --> C[النصوص]
    A --> D[القيم المنطقية]
    A --> E[المجموعات]
    A --> F[Dynamic]
    
    B --> B1[int - قيم صحيحة]
    B --> B2[double - قيم عشرية]
    
    E --> E1[List - مجموعة مرتّبة]
    E --> E2[Map - أزواج مفتاح-قيمة]
    E --> E3[Set - قيم فريدة]
    
    style A fill:#4A90E2,color:#fff
    style B fill:#7ED321
    style C fill:#F5A623
    style D fill:#BD10E0
    style E fill:#50E3C2
    style F fill:#B8E986

1. الأرقام (Numbers)

تدعم Dart نوعين من الأرقام:

int count = 10;           // عدد صحيح
double price = 99.99;     // عدد عشري (Floating-point)

2. النصوص (Strings)

سلسلة من المحارف (Characters) محاطة بعلامات اقتباس مفردة أو مزدوجة:

String message = "Hello, Dart!";
String name = 'Student';

دمج النصوص (String Interpolation):

String name = "Ahmed";
print("Hello, $name!");              // الناتج: Hello, Ahmed!
print("Next year I'll be ${25 + 1}"); // الناتج: Next year I'll be 26

3. القيم المنطقية (Booleans)

تمثّل true أو false:

bool isStudent = true;
bool hasPassed = false;

4. القوائم (Lists)

مجموعة مرتّبة من العناصر (تشبه المصفوفات):

void main() {
    var list = [1, 2, 3, 4, 5];
    print(list);              // الناتج: [1, 2, 3, 4, 5]
    print(list[0]);           // الناتج: 1
}

5. الخرائط (Maps)

مجموعة من أزواج المفتاح والقيمة:

void main() {
    var mapping = {'id': 1, 'name': 'Dart'};
    print(mapping);           // الناتج: {id: 1, name: Dart}
    print(mapping['name']);   // الناتج: Dart
}

6. النوع الديناميكي (Dynamic)

إذا لم تحدد نوعًا، تستخدم Dart النوع dynamic:

void main() {
    dynamic name = "Dart";
    print(name);
    
    name = 100;  // يمكن أن يتغير النوع
    print(name);
}

اتخاذ القرار والحلقات التكرارية

تسمح لك جُمل التحكم في تدفق البرنامج (Control Flow) بتنفيذ كود بناءً على شروط معينة، أو تكرار كتل من الكود.

جُمل اتخاذ القرار

تدعم Dart جُمل الشرط التالية:

  • if
  • if-else
  • else-if
  • switch

مثال:

void main() {
    int score = 85;
    
    if (score >= 90) {
        print("Excellent");
    } else if (score >= 75) {
        print("Good");
    } else {
        print("Needs Improvement");
    }
}

الحلقات التكرارية (Loops)

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

مخطط تدفق الحلقة التكرارية:

flowchart TD
    A[بدء الحلقة] --> B{الشرط محقّق؟}
    B -->|نعم| C[تنفيذ كتلة الكود]
    C --> D[تحديث العدّاد]
    D --> B
    B -->|لا| E[الخروج من الحلقة]
    
    style A fill:#4A90E2,color:#fff
    style B fill:#F5A623,color:#fff
    style C fill:#7ED321
    style E fill:#D0021B,color:#fff

أنواع الحلقات التكرارية

1. حلقة for:

for (var i = 1; i <= 5; i++) {
    print(i);
}

2. حلقة for-in:

var list = [1, 2, 3];
for (var item in list) {
    print(item);
}

3. حلقة while:

int i = 1;
while (i <= 5) {
    print(i);
    i++;
}

4. حلقة do-while:

int i = 1;
do {
    print(i);
    i++;
} while (i <= 5);

مثال: طباعة الأعداد الزوجية

الكود التالي يطبع الأعداد الزوجية من 1 إلى 10:

void main() {
    for(var i = 1; i <= 10; i++) {
        if (i % 2 == 0) {
            print(i);
        }
    }
}

الناتج:

2
4
6
8
10

الدوال (Functions)

الدالة (Function) هي مجموعة من الجُمل البرمجية التي تنفذ مهمة محددة. تساعد الدوال على تنظيم الكود وتعزيز إمكانية إعادة استخدامه.

صياغة الدالة

returnType functionName(parameters) {
    // جسم الدالة
    return value;
}

مثال: دالة جمع

void main() {
    add(3, 4);
}
 
void add(int a, int b) {
    int c;
    c = a + b;
    print(c);
}

الناتج:

7

دالة تُرجع قيمة

int multiply(int a, int b) {
    return a * b;
}
 
void main() {
    int result = multiply(5, 3);
    print("Result: $result");  // الناتج: Result: 15
}

البرمجة كائنية التوجه (Object-Oriented Programming)

Dart لغة برمجة كائنية التوجه (OOP). تستخدم الأصناف (Classes) كقوالب لإنشاء الكائنات (Objects).

مكوّنات الصنف

يتضمن الصنف عادة:

  1. الحقول (Fields) (المتغيرات)
  2. الدوال المسترجعة والمحدِّدة (Getters and Setters) (دوال الوصول)
  3. الباني (Constructors) (التهيئة)
  4. الطُرق (Methods) (الدوال)

مخطط بنية الصنف

classDiagram
    class Employee {
        -String name
        +String emp_name
        +void set emp_name(String)
        +String get emp_name()
        +void result()
    }
    
    class Main {
        +void main()
    }
    
    Main ..> Employee : ينشئ

مثال: صنف Employee

class Employee {
    String name;
    
    // دالة Getter
    String get emp_name {
        return name;
    }
    
    // دالة Setter
    void set emp_name(String name) {
        this.name = name;
    }
    
    // تعريف دالة
    void result() {
        print(name);
    }
}
 
void main() {
    // إنشاء كائن
    Employee emp = new Employee();
    emp.name = "employee1";
    emp.result();  // الناتج: employee1
}

الشرح:

  • Employee: اسم الصنف
  • name: حقل (متغيّر خاص بالكائن)
  • emp_name: دالتا Getter و Setter لحقل الاسم
  • result(): طريقة (Method) لطباعة اسم الموظف
  • new Employee(): تنشئ كائنًا (Instance) من صنف Employee

تمارين المعمل

التمرين 1: آلة حاسبة

اكتب برنامج Dart يقوم بـ:

  1. أخذ عددين ورمز عملية حسابية (+, -, *, /) كمدخلات
  2. استخدام جملة switch لتنفيذ العملية
  3. طباعة النتيجة

مثال على الناتج المتوقع:

Enter first number: 10
Enter second number: 5
Enter operator (+, -, *, /): *
Result: 50

التمرين 2: FizzBuzz

اكتب برنامجًا يطبع الأعداد من 1 إلى 20 بحيث:

  • إذا كان العدد قابلاً للقسمة على 3، اطبع "Fizz"
  • إذا كان العدد قابلاً للقسمة على 5، اطبع "Buzz"
  • إذا كان قابلاً للقسمة على 3 و5 معًا، اطبع "FizzBuzz"
  • وإلا، اطبع العدد نفسه

الناتج المتوقع:

1
2
Fizz
4
Buzz
Fizz
7
8
Fizz
Buzz
11
Fizz
13
14
FizzBuzz
...

التمرين 3: نظام إدارة الطلاب

أنشئ صنف Student يحتوي على:

  • الحقول: name (نص)، id (عدد صحيح)، gpa (عدد عشري)
  • طريقة: isHonors() تُرجع true إذا كان المعدل التراكمي (GPA) أكبر من أو يساوي 3.5
  • طريقة: displayInfo() تطبع بيانات الطالب

داخل دالة main():

  1. أنشئ 3 كائنات طلاب على الأقل
  2. اعرض بياناتهم
  3. اطبع ما إذا كان كل طالب من طلاب مرتبة الشرف أم لا

التمرين 4: التحقق من الأعداد الأولية

اكتب دالة isPrime(int number) تقوم بـ:

  • إرجاع true إذا كان العدد أوليًا
  • إرجاع false في غير ذلك

اختبر دالتك على الأعداد: 2, 7, 15, 23, 30


مصادر إضافية


نهاية المعمل 1