Dart: مقدمة لغة Dart — من النشأة إلى النظام البيئي
Dart — لغة وُلدت لتعدد المنصات، من Flutter إلى CLI، من الويب إلى الخادم، قاعدة كود واحدة تعمل في كل مكان.
1. ما ستتعلمه
- خلفية نشأة Dart والموقع الاستراتيجي من Google
- الفروق الجوهرية بين Dart و JavaScript / TypeScript / Kotlin
- ركائز Dart 3 الثلاث: أمان القيم الفارغة / مطابقة الأنماط / الأصناف المختومة
- مشهد النظام البيئي لـ Dart: pub.dev / Flutter / جانب الخادم / CLI
- نظرة عامة على مشروع Bob DataPipeline وخارطة طريق التعلم
2. قصة مطور حقيقي
(1) نقطة الألم: كابوس تجزئة تطوير المنصات المتعددة
Bob مطور متكامل المسؤول عن منتج SaaS لتحليل بيانات التجارة الإلكترونية. يحتاج إلى صيانة واجهة ويب (JavaScript) وتطبيقات جوالة (Kotlin + Swift) وخدمات خلفية (Go) وأدوات CLI (Python) في نفس الوقت. أربع لغات، أربع سلاسل أدوات، أربع قواعد كود — إصلاح خطأ واحد يتطلب تغييرات في أربعة أماكن. عندما طلب مدير المنتج "لوحة معلومات في الوقت الفعلي"، كان على Bob أن يوازن مرارًا وتكرارًا بين Flutter والتطوير الأصلي، مع ارتفاع تكاليف التواصل بين الفريق إلى 20 ساعة أسبوعيًا.
(2) حل Dart
يوفر Dart حزمة تقنية موحدة: لغة واحدة تغطي الواجهة الأمامية (Flutter Web) والجوال (Flutter Mobile) والخلفية (Dart shelf) و CLI (dart:io). أعاد Bob كتابة المشروع بالكامل بـ Dart، ولم تعد هناك حاجة لكتابة منطق الأعمال الأساسي إلا مرة واحدة.
// كود Dart واحد - يعمل على Android و iOS والويب وسطح المكتب والخادم
import 'package:flutter/material.dart';
import 'package:shelf/shelf.dart';
class DataProcessor {
// منطق الأعمال الأساسي - يتشاركه جميع المنصات
Future<Report> generate(User user, DateRange range) async {
final raw = await fetchRawData(user.id, range);
return Report(clean(raw), analyze(raw));
}
}
(3) النتيجة: 4 قواعد كود → 1 قاعدة كود، وقت الإصدار من 3 أيام إلى 4 ساعات
أعاد Bob كتابة المنتج بالكامل بـ Dart في 3 أسابيع. كانت النتيجة: 4 قواعد كود → 1 قاعدة كود (تقليل سطور الكود بنسبة 60%)، ووقت الإصدار من 3 أيام إلى 4 ساعات (تحسن 18 مرة)، وانخفاض تكاليف اتصال الفريق من 20 ساعة/أسبوع إلى ساعتين/أسبوع.
قبل Dart: 4 لغات، 4 قواعد كود، 3 أيام/إصدار، 20 ساعة/أسبوع للتواصل
بعد Dart: 1 لغة، 1 قاعدة كود، 4 ساعات/إصدار، 2 ساعة/أسبوع للتواصل
ROI: 18 مرة تحسن في سرعة الإصدار، 60% تقليل في الكود
3. خلفية Dart: من "استبدال JavaScript" إلى "ملك التطوير متعدد المنصات"
(1) النشأة (2011-2017): استبدال JavaScript الذي فشل
بدأت Google في تطوير Dart في عام 2011، بهدف أن تكون "لغة ويب منظمة تحل محل JavaScript". ومع ذلك، رفض مجتمع الويب التوحيد المقترح في عام 2014، ودخلت Dart في فترة برود. في عام 2017، حددت Google اتجاهًا جديدًا لـ Dart — التركيز على أجهزة Flutter للجوال، والتخلي عن استبدال JS.
| الفترة | الموقع | الحدث الرئيسي |
|---|---|---|
| 2011-2013 | بديل JS | إصدار 1.0، ترويج مواصفات ECMAScript |
| 2014-2016 | فترة برود | رفض التوحيد، تحطم المعنويات |
| 2017-2018 | ولادة Flutter | Flutter 1.0، إعادة تحديد الموقع |
| 2018-2020 | اختراق Flutter | Flutter يحتل المرتبة الثانية في تطوير الجوال |
| 2020-2022 | ما بعد Flutter | Dart 2.12 أمان القيم الفارغة، توسيع النظام البيئي للخادم |
| 2023+ | Dart 3 | الركائز الثلاث الكبرى: أمان القيم الفارغة + مطابقة الأنماط + الأصناف المختومة |
(2) نظام Dart 3: ثلاث ركائز كبرى
Dart 3 ليس "Dart 2.15 المُرقَّم"، بل إعادة تصميم كاملة. الركائز الثلاث:
العمود الأول: أمان سليم للقيم الفارغة (Sound Null Safety)
// Dart 3 — لا يمكن أن يكون Null ضمنيًا، يجب التصريح به صراحةً
String name = 'Bob'; // ✅ نوع غير قابل للفراغ
String? nickname; // ✅ نوع قابل للفراغ، يتطلب ?
// String name = null; // ❌ خطأ في وقت الترجمة: لا يمكن تعيين null لغير قابل للفراغ
void greet(String? name) {
print('Hello, ${name?.toUpperCase() ?? "stranger"}!');
// ^؟ عامل أمان القيم الفارغة: name قد يكون null
// ^? ?? توفير null
}
العمود الثاني: مطابقة الأنماط (Pattern Matching)
// Dart 3 — مطابقة أنماط قوية + تفكيك الكائنات
String describe(Object obj) => switch (obj) {
[int n] when n > 0 => 'positive integer $n',
[int n] => 'non-positive integer $n',
[String s] => 'string "$s"',
[List l] => 'list of ${l.length} items',
_ => 'unknown',
};
العمود الثالث: الأصناف المختومة (Sealed Classes)
// Dart 3 — تعداد شامل مغلق لزمن الترجمة
sealed class Result<T> {}
class Success<T> extends Result<T> { final T value; Success(this.value); }
class Failure<T> extends Result<T> { final String error; Failure(this.error); }
String handle(Result<int> r) => switch (r) {
Success(:final value) => 'Got $value',
Failure(:final error) => 'Error: $error',
};
// المحول البرمجي يضمن: تم تغطية جميع الفروع الفرعية ✅
▶ مثال: نظام الرسم البياني للأنواع من Dart 2 إلى Dart 3
graph LR
A[Dart 2.x<br/>null يمكن أن تكون في أي مكان] -->|Dart 2.12<br/>Null Safety| B[يجب التصريح صراحةً بـ null]
B -->|Dart 3.0<br/>الركيزة الأولى| C[تغطية كاملة لأنواع null]
C -->|Dart 3.0<br/>الركيزة الثانية| D[مطابقة الأنماط]
C -->|Dart 3.0<br/>الركيزة الثالثة| E[الأصناف المختومة + switch شامل]
D --> F[Dart 3.4<br/>تعبيرات مُختومة + أنماط]
E --> F
> **الإخراج:** هذا الرسم البياني يُظهر تطور نظام أنواع Dart من Dart 2.x (حيث يمكن أن يكون null في أي مكان) إلى Dart 2.12 (Null Safety) إلى Dart 3.0 (الركائز الثلاث الكبرى) وأخيراً Dart 3.4 (التعبيرات المُختومة).
4. Dart vs JavaScript / TypeScript / Kotlin: الاختلافات الجوهرية
(1) جدول المقارنة
| البُعد | Dart | JavaScript | TypeScript | Kotlin |
|---|---|---|---|---|
| نظام الأنواع | ثابت مع استنتاج | ديناميكي | ثابت تدريجي | ثابت |
| وقت التشغيل | Dart VM / V8 / AOT | V8 / JIT | نفس V8 | JVM / Native |
| هدف واحد متعدد المنصات | ✅ (Flutter) | ❌ | ❌ | ❌ (KMP قيد التطوير) |
| معالجة null | آمنة افتراضيًا | ⚠️ null/undefined | ⚠️ strictNullChecks اختياري | ⚠️ اختياري |
| نموذج التزامن | Future/Stream أصلي | Promise/async | نفس Promise | Coroutine |
| نظام البناء | pub | npm/yarn | npm/yarn | Gradle |
| سرعة البدء | ⚡ سريع | ⚡ سريع | ⚠️ بطيء (tsc) | ⚠️ بطيء (Gradle) |
(2) الكود يخبر القصة: نفس المهمة في 4 لغات
// JavaScript: متكرر، فحص null يدوي في كل مكان
async function processUser(user) {
if (!user) return null;
if (!user.name) return null;
return user.name.toUpperCase();
}
// TypeScript: يحل مشاكل النوع، ولكن null لا يزال فخًا
async function processUser(user: User | null): Promise<string | null> {
if (!user?.name) return null;
return user.name.toUpperCase();
}
// Dart: التحقق من null في وقت الترجمة، لا حاجة لفحص يدوي
Future<String?> processUser(User? user) async {
return user?.name.toUpperCase();
// ^؟ المحول البرمجي يضمن: إذا كان user أو name null، النتيجة null
// ^ آمن — ?. عامل أمان القيم الفارغة + نوع الإرجاع String?
}
// Kotlin: مشابه لـ Dart، ولكن النظام البيئي أصغر
suspend fun processUser(user: User?): String? {
return user?.name?.uppercase()
}
الإخراج:
TEXT 📖 للعرض فقطDart و Kotlin كلاهما آمنان افتراضيًا، لكن نظام Dart البيئي (Flutter + pub.dev) أكثر اكتمالًا في المنصات المتعددة. TypeScript يحل النوع ولكن null لا يزال يتطلب فحصًا يدويًا. JavaScript به أكبر مخاطرة.
5. مشهد النظام البيئي لـ Dart: من الأدوات إلى التطبيقات
(1) الخريطة البيئية
graph TB
DART[Dart SDK<br/>لغة + أدوات] --> FLUTTER[Flutter<br/>UI متعدد المنصات]
DART --> SERVER[خادم Dart<br/>shelf / Aqueduct]
DART --> CLI[أداة CLI<br/>dart:io]
DART --> WEB[ويب Dart<br/>dart:html]
FLUTTER --> ANDROID[Android]
FLUTTER --> IOS[iOS]
FLUTTER --> WEB2[الويب]
FLUTTER --> DESKTOP[سطح المكتب<br/>Windows/macOS/Linux]
SERVER --> BACKEND[خدمة خلفية API]
CLI --> SCRIPT[نص معالجة البيانات]
WEB --> WEBAPP[تطبيق ويب]
DART --> PUB[pub.dev<br/>35,000+ حزمة]
(2) مشهد pub.dev (اعتبار 2024)
| الفئة | عدد الحزم | الأكثر شيوعًا |
|---|---|---|
| طلب HTTP | 200+ | dio, http, chopper |
| إدارة الحالة | 150+ | provider, riverpod, bloc |
| التسلسل | 80+ | json_serializable, freezed |
| التخزين المحلي | 100+ | shared_preferences, hive, drift |
| التوجيه | 50+ | go_router, auto_route |
| الترجمة | 40+ | intl, easy_localization |
| أدوات الاختبار | 100+ | mockito, test, integration_test |
▶ مثال: استعلام pub.dev
# تثبيت حزمة HTTP الأكثر شيوعًا
dart pub add dio
# عرض إحصائيات الحزمة
$ curl https://pub.dev/api/packages/dio
{
"name": "dio",
"version": "5.4.0",
"downloads30Days": 1200000,
"likes": 8500,
"points": 180
}
الإخراج:
TEXT 📖 للعرض فقطdio: 1.2 مليون تنزيل شهريًا — المعيار الواقعي لطلبات HTTP في Dart.
6. نظرة عامة على مشروع Bob DataPipeline
سيرافقك هذا المسار التعليمي من خلال بناء نظام خط أنابيب بيانات كامل، DataPipeline، خلال 24 درسًا:
graph LR
L1[01-08<br/>أساسيات اللغة] --> L2[09-12<br/>أنواع متقدمة]
L2 --> L3[13-16<br/>ميزات Dart 3]
L3 --> L4[17-18<br/>البرمجة المتقدمة]
L4 --> L5[19-22<br/>النظام البيئي والأدوات]
L5 --> L6[23-24<br/>مشروع كامل]
L1 -.Bob DataPipeline.-> L6
| المرحلة | الدروس | المحتوى الأساسي | الإخراج |
|---|---|---|---|
| أساسيات اللغة | 01-08 | القواعد + المتغيرات + هياكل التحكم + الوظائف + الأصناف | سكريبت CLI واحد |
| الأنواع المتقدمة | 09-12 | المجموعات + الأدوية العامة + التعدادات + أمان null | أداة معالجة البيانات |
| ميزات Dart 3 | 13-16 | Future/Stream + العزلات + الميزات الجديدة | خدمة متزامنة |
| النظام البيئي والأدوات | 17-22 | حزم + اختبار + توليد الكود | SDK كامل |
| المشروع | 23-24 | تصميم + تحسين + نشر خط أنابيب البيانات | مشروع الإنتاج |
▶ مثال: معاينة كود DataPipeline — ما ستبنيه في نهاية المسار
> **الإخراج:** شغّل في DartPad محلي أو باستخدام `dart run`. جميع الأمثلة في دورة Dart مبنية على Dart 3.x / Flutter 3.x، وقد تختلف النتائج قليلاً مع إصدار SDK.
: معاينة كود DataPipeline
// معاينة DataPipeline - ما ستبنيه
void main() {
// الخطوة 1: تحديد مصدر البيانات
final source = ApiSource('https://api.example.com/orders');
// الخطوة 2: إنشاء خط أنابيب
final pipeline = DataPipeline(
name: 'E-Commerce Analytics',
maxRecords: 1200000,
);
// الخطوة 3: المعالجة والإخراج
print(pipeline.summary);
// الإخراج: E-Commerce Analytics: capacity 1200000 records
}
الإخراج: شغّل في DartPad محلي أو باستخدام
dart run. جميع الأمثلة في دورة Dart مبنية على Dart 3.x / Flutter 3.x، وقد تختلف النتائج قليلاً مع إصدار SDK.
E-Commerce Analytics: capacity 1200000 records
7. ملخص نقاط المعرفة الأساسية لهذا الدرس
| # | المفهوم | المستوى | الأهمية |
|---|---|---|---|
| 1 | Dart = لغة من Google مصممة لتعدد المنصات | مبتدئ | ⭐⭐⭐⭐⭐ |
| 2 | Dart 3 = ركائزه الثلاث: أمان القيم الفارغة / مطابقة الأنماط / الأصناف المختومة | متوسط | ⭐⭐⭐⭐⭐ |
| 3 | نظام Dart البيئي Flutter + pub.dev + جانب الخادم + CLI | متوسط | ⭐⭐⭐⭐ |
| 4 | أمان null: String غير قابل للفراغ، String? قابل للفراغ |
مبتدئ | ⭐⭐⭐⭐⭐ |
| 5 | مطابقة الأنماط والأصناف المختومة تجعل switch شاملاً في وقت الترجمة | متوسط | ⭐⭐⭐⭐ |
| 6 | مقارنة Dart مع JS / TS / Kotlin تساعد في تحديد موعد اختياره | متوسط | ⭐⭐⭐ |
❓ أسئلة شائعة
StatelessWidget) أنظف بكثير.? الاختياري، يجب استخدام القيمة الافتراضية ③ بناء الجملة القديم لتفكيك النوع as محذوف، استخدم تحويل النمط. الأداة dart fix يمكنها أتمتة معظم ترقيات البنية.📖 ملخص
- Dart = لغة Google متعددة المنصات: ولدت في عام 2011 لاستبدال JS (فشلت)، ثم نجحت من خلال Flutter
- Dart 3 ركائزه الثلاث: أمان القيم الفارغة + مطابقة الأنماط + الأصناف المختومة، تصميم حديث في وقت الترجمة
- Dart vs JS/TS/Kotlin: نظام أنواع أقوى، أمان null افتراضيًا، نظام بيئي أكثر اكتمالًا لتعدد المنصات
- النظام البيئي: Flutter (الجوال/الويب/سطح المكتب) + pub.dev (35000+ حزمة) + جانب الخادم + CLI
- خارطة طريق التعلم: 8 دروس أساسية + 4 دروس أنواع متقدمة + 4 دروس ميزات Dart 3 + 6 دروس بيئية + 2 دروس مشروع
📝 تمارين
- أساسي (الصعوبة ⭐): ثبّت Dart SDK (الإصدار 3.0+)، وأنشئ مشروع
hello_dartباستخدامdart create، وعدّلbin/main.dartلإخراج "Hello, Dart 3!"، ثم شغّله باستخدامdart run. تلميح: راجع خطوات التثبيت في القسم 5. - متوسط (الصعوبة ⭐⭐): في مشروع Bob DataPipeline، استخدم Dart 3's sealed class لتعريف
DataResult<T>الذي يحتوي على ثلاث حالات:Success<T>(value)وLoading<T>(previous)وError<T>(message). اكتب دالةhandleتتعامل مع جميع الفروع الفرعية (المحول البرمجي يضمن عدم تفويت أي حالة). تلميح: راجع مثال النمط المختوم في القسم 3. - تحدٍّ (الصعوبة ⭐⭐⭐): قارن الفروق بين Dart و JavaScript من جوانب: نظام الأنواع، نموذج التزامن، أداء وقت التشغيل، وتعدد المنصات. أنشئ جدول مقارنة (في مشروعك الخاص)، وقم بترميز نفس المهمة (مثل استدعاء API + معالجة null) في كلتا اللغتين، واختبر التحويلات البرمجية لـ TS + Dart عبر
tsc --noEmitوdart analyzeللتحقق من أن Dart يلتقط المزيد من أخطاء null في وقت الترجمة. تلميح: راجع مثال المقارنة في القسم 4.
← السابق: فهرس الدورة | التالي: تركيب بيئة التطوير والأدوات →