OOZOU
تواصلوا معنا
العودة إلى المدونة

مطوّر Kotlin يتعلم Dart

نظرة مطوّر Android إلى لغة Dart.

24 يوليو 2020
5 دقائق للقراءة
مطوّر Kotlin يتعلم Dart

قررت أن أدرس Flutter، وبدأت أتابع دروس App brewery في الدورة المسماة "The Introduction to Flutter Development with Dart". وبعد أن أنهيت جزء التثبيت، رأيت أنني سأتقدم أسرع إذا فهمت صياغة Dart قبل متابعة بقية الدروس. سأركّز في هذا المقال على اللغة وصياغتها. يقول فريق تطوير Dart إن هذه اللغة مُحسَّنة لبناء واجهات المستخدم، لكنني لن أتعمق في المترجم (compiler) وطبقاته الداخلية، لأنني لم أدرس Dart بما يكفي للحديث عن ذلك بعد.

الصياغة

كنت أطوّر تطبيقات Android بلغة Java قبل عدة سنوات، وأستخدم اليوم Kotlin لغةً رئيسية. لذلك أشعر بألفة كبيرة مع الصياغة. وفي رأيي تبدو Dart أقرب إلى Java منها إلى Kotlin، فأسلوب صياغتها يقع في مكان ما بين اللغتين. فلا يزال عليكم وضع الفاصلة المنقوطة في الكود، وهذا لا يزعجني كثيرًا.

ما ينقص Dart مقارنةً بـ Kotlin

أظن أن الوقت الحالي مناسب لتعلم Dart أكثر مما كان قبل عدة سنوات. فالإصدار الحالي من Dart هو 2.8، وقد تحسّن كثيرًا عن الإصدار 1.x، ومن ذلك إضافة extension methods. ومع أن ميزة null safety غير موجودة في الإصدار 2.8، فإنها باتت قريبة. وإليكم بعض ما في Kotlin ولا يوجد في Dart 2.8.

  • لا توجد أنواع آمنة من القيم الفارغة (null-safe types): في Kotlin نستخدم ? لتحديد ما إذا كان المتغير يقبل القيمة null أم لا. أما حاليًا في Dart فتحتاجون إلى جهد إضافي للتحقق من القيم الفارغة عند التعامل مع أي متغير. لكن كما ذكرت، أوشكت ميزة null-safe types على الصدور، ويُتوقع أن تُضاف خلال الإصدارات القليلة القادمة.
  • غياب data classes: في Dart، حين تتعاملون مع أصناف الـ model، تحتاجون إلى إعادة تعريف equals وtoString وhashcode بأنفسكم، بخلاف Kotlin حيث تتولى data class ذلك تلقائيًا.
  • Sealed classes: هذه ميزة رائعة في لغة Kotlin، إذ يمكنكم حصر الأنواع المسموح بها داخل الصنف. إنها أشبه بصنف enum يملك قوى خارقة. وإذا استخدمتموها فستلاحظون كم هي عملية. لكنكم تفقدون هذه الميزة حين تنتقلون إلى Dart.

ومقارنة Dart بـ Kotlin نقطةً بنقطة لن تكون منصفة، فـ Dart لا تحاول أن تكون Kotlin 2، وكل ما أريده هو التعبير عن أفكاري من منظور مطوّر Kotlin.

أمثلة من اللغة

سأتناول في هذا القسم القواعد البسيطة للغة Dart من منظور مطوّر Kotlin. ولن أتطرق إلى عبارات التحكم في التدفق مثل if وfor وwhile، لأنها تشبه عبارات التحكم المعتادة.

المتغيراتمثل Kotlin، تتميز Dart بأمان الأنواع (type-safe). وتدعم Dart استنتاج النوع (type inference)، فلا يحتاج المتغير إلى تصريح صريح بنوعه. ولتعريف متغير يُستنتج نوعه تلقائيًا استخدموا var.

var platform = 'Android';

ويمكن أن يكون المتغير في Dart من النوع الديناميكي. ولتعريف متغير ديناميكي استخدموا الكلمة المفتاحية dynamic.

dynamic platform = 'Android';

ويمكنكم أيضًا تحديد النوع صراحةً.

String platform = 'Android';

ولا يوجد في Dart مفهوم val وvar كما في Kotlin. ولإنشاء متغير لا يتغير استخدموا الكلمتين المفتاحيتين const أو final.

final platform = 'Android';
const version = '1.0';

ويمكن استخدام الكلمة المفتاحية const أيضًا لتعريف قيمة ثابتة.

var array = const []

محددات الوصول (Visibility Modifier)

بخلاف Java وKotlin، لا تحتوي Dart على الكلمات المفتاحية public وprotected وprivate. ولتعريف متغير خاص (private) استخدموا الشرطة السفلية (_) كبادئة لاسم المتغير.

الدوال

تشبه الدوال في Dart دوال Java كثيرًا، لكن يمكنكم حذف نوع القيمة المُعادة.

bool isAndroidVersion(String atomicNumber) {  return _androidVersions[atomicNumber] != null;}
isAndroidVersion(String atomicNumber) {  return _androidVersions[atomicNumber] != null;}

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

تدعم Dart أيضًا تمرير الدوال المجهولة (anonymous functions) كمعاملات. ومقارنةً بـ Kotlin، تتغير الصياغة المختصرة من -> إلى =>.

var androidVerions = ['Cupcake', 'Donut', 'Eclair', 'Froyo', 'Gingerbread', 'Honeycomb', 'Ice Cream Sandwich', 'Jelly Bean', 'Kitkat', 'Lollipop', 'Marshmallow'];
androidVersions.where((name) => name.contains('lol')).forEach(print);

الأصناف (Classes)

كل صنف في Dart هو نسخة من Object. ولا يوجد فرق كبير بين الأصناف في لغات البرمجة كائنية التوجه الأخرى والأصناف في Dart. والشيء الوحيد الجديد عليّ في Dart هو الـ constructor المسمّى (named constructor). ففي Kotlin نستخدم عادةً الـ constructor الأساسي، ونادرًا ما نستخدم الـ constructor الثانوي. أما في Dart فيمكننا كتابة عدة constructors ومنح كل منها اسمًا.

class Point {
  double x, y;

  Point(this.x, this.y);

  // Named constructor
  Point.origin() {
    x = 0;
    y = 0;
  }
}

Extension methods

كما في extension function في Kotlin، توجد في Dart extension methods. ويمكن القول إنكم ما إن تبدأوا باستخدام extension functions في Kotlin حتى لا تستطيعوا الاستغناء عنها، ولكان من المؤسف ألا تتوفر هذه الميزة في Dart. وتختلف طريقة تعريف extension method قليلًا عن Kotlin. وإليكم مثالًا مأخوذًا من الموقع الرسمي.

extension NumberParsing on String {
  int parseInt() {
    return int.parse(this);
  }

  double parseDouble() {
    return double.parse(this);
  }
}

الخلاصة

هذا ملخص مقارنتي بين Dart وKotlin. قد لا يغطي كل النقاط، لكنني حاولت فقط أن أشير إلى أول ما خطر في بالي حين بدأت أتعرّف على صياغة Dart. ولم أتناول البرمجة غير المتزامنة (asynchronous programming) في Dart، لأنها تستحق مقالًا مستقلًا في المستقبل. وأظن أنني أستطيع العمل بلغة Dart بإنتاجية جيدة بعد هذه الجولة السريعة في اللغة.

المصادر

- https://dart.dev/guides/language/language-tour#classes - https://dart.dev/samples

Related Articles

كيف أصمّم برمجيات؟ دليل المبتدئين لأصحاب الأعمال

كيف أصمّم برمجيات؟ دليل المبتدئين لأصحاب الأعمال

تصميم البرمجيات عملية ممتعة لكنها معقدة، تتطلب الإبداع والتفكير المنطقي ومهارات حل المشكلات.

اقرأوا المزيد
مستقبل الحوسبة الطرفية: ما تحتاج الشركات إلى معرفته

مستقبل الحوسبة الطرفية: ما تحتاج الشركات إلى معرفته

يتطور المشهد الرقمي بسرعة، وعلى الشركات أن تتكيّف لتواكب الطلب المتزايد على السرعة والكفاءة والمعالجة في الوقت الفعلي.

اقرأوا المزيد
مستقبل قطاع التجزئة: الذكاء الاصطناعي والواقع المعزّز واتجاهات التحوّل الرقمي

مستقبل قطاع التجزئة: الذكاء الاصطناعي والواقع المعزّز واتجاهات التحوّل الرقمي

يتطور قطاع التجزئة بوتيرة غير مسبوقة بفضل الذكاء الاصطناعي (AI) والواقع المعزّز (AR) وتقنيات التحوّل الرقمي. فلم تعد المتاجر التقليدية مجرد أماكن لبيع المنتجات، بل أصبحت متاجر ذكية وتفاعلية.

اقرأوا المزيد

Have a Project in Mind?

Let's discuss how we can help bring your ideas to life with our expertise in web and mobile development.

ابدأوا المحادثةhello@oozou.com
OOZOU Logo

بانكوك · سنغافورة · هونغ كونغ

X
Facebook
Instagram
LinkedIn
OOZOU Co., Ltd.
548 One City Centre
Ploenchit Road
Bangkok 10330
Thailand
+66 2544 0000
hello@oozou.com

الخدمات

  • تطوير الويب
  • وكلاء الذكاء الاصطناعي والذكاء الاصطناعي التوليدي
  • تطوير تطبيقات الجوال
  • تحليلات البيانات وهندستها
  • تصميم تجربة المستخدم وواجهته (UX/UI) وتصميم المنتجات
  • التحوّل الرقمي

الشركة

  • من نحن
  • الوظائف
  • المدونة
  • دراسات الحالة
  • عروض حية
  • تعلّمت اليوم
  • تواصل معنا

المزيد

  • القطاعات
  • شبكة الشركاء
© 2026 OOZOU. جميع الحقوق محفوظة.
سياسة الخصوصيةمدونة قواعد السلوكسياسة مكافحة الرشوة والفساد