تعتبر Type Promotion في لغة Dart من المفاهيم المهمة لفهم كيفية تحويل القيم من نوع إلى آخر. تقوم Dart بتنفيذ Type Promotion تلقائيًا عندما تكون على دراية بنوع محدد للقيمة. تعزز هذه الميزة من قدرة المطورين على الوصول إلى خصائص ووظائف محددة لأنواع البيانات المعينة وتحسن من أمان التطبيقات. في هذه المقالة، سنتعرف على كيفية عمل Type Promotion في Dart ونقدم بعض الأمثلة لتوضيح ذلك.
مثال 1: الترقية من الأنواع العامة إلى الأنواع الفرعية المحددة
في هذا الجزء، سنتعلم كيفية ترقية القيم من أنواع عامة إلى أنواع فرعية محددة. يتم ذلك عن طريق تحديد النوع المحدد في بنية التحكم المناسبة. دعونا نلقي نظرة على الكود التالي الذي يوضح ذلك:
void main() { Object name = "John"; if (name is String) { // تم ترقية القيمة من Object إلى String print("اسم المستخدم: $name"); print("طول الاسم: ${name.length}"); } }
نتيجة الكود:
اسم المستخدم: John طول الاسم: 4
في هذا المثال، قمنا بتعريف متغير name
من نوع Object
وتم تعيين قيمة “John” له. ثم نستخدم بنية التحكم if
للتحقق مما إذا كانت القيمة تمثل نوع String
أم لا. إذا تم التحقق بنجاح، يتم ترقية القيمة من Object
إلى String
ويمكننا الوصول إلى خصائص النص مثل length
.
مثال 2: الترقية من nullable إلى non-nullable
في هذا الجزء، سنتعلم كيفية الترقية من nullable إلى non-nullable. يتم ذلك بشكل تلقائي عندما يتم تعيين قيمة non-nullable للمتغير. دعونا نلقي نظرة على الكود التالي:
void main() { String? result; if (DateTime.now().hour < 12) { result = "صباح الخير"; } else { result = "مساء الخير"; } print("النتيجة: $result"); print("طول النتيجة: ${result.length}"); }
ناتج الكود:
النتيجة: مساء الخير طول النتيجة: 10
في المثال الثاني، نقوم بتوضيح كيفية ترقية القيم من nullable إلى non-nullable في Dart.
نقوم بتعريف متغير result
من نوع String?
، حيث العلامة الاستفهام تشير إلى أن القيمة nullable (قد تكون null
).
بعد ذلك، نستخدم بنية التحكم if
لفحص الوقت الحالي. إذا كانت قيمة الساعة أقل من 12، نقوم بتعيين قيمة “صباح الخير” للمتغير result
، وإلا فإننا نعيّن قيمة “مساء الخير”.
بعد ذلك، نقوم بطباعة قيمة المتغير result
باستخدام الدالة print
. ومن ثم، نقوم بطباعة طول النص في المتغير result
باستخدام الخاصية length
.
مثال 3: الترقية من nullable إلى non-nullable
دعونا نلقي نظرة على الكود التالي:
// طريقة لطباعة طول النص void printLength(String? text) { if (text == null) { throw Exception("النص فارغ"); } print("طول النص: ${text.length}"); } void main() { printLength("مرحبا"); }
ناتج الكود:
طول النص: 5
في هذا المثال، قمنا بتعريف دالة printLength
التي تأخذ معامل من نوع String?
وهو nullable. في حالة أن القيمة تكون null
، فإننا نقوم بإلقاء استثناء يشير إلى أن النص فارغ. وفي حالة أن القيمة غير null
، يتم طباعة طول النص.
مثال 4: الترقية من nullable إلى non-nullable
دعونا نلقي نظرة على الكود التالي:
import 'dart:math'; class DataProvider { String? getStringOrNull() { return Random().nextBool() ? "مرحبا" : null; } void myMethod() { String? value = getStringOrNull(); if (value is String) { print("طول القيمة: ${value.length}"); } else { print("القيمة ليست من نوع نص"); } } } void main() { DataProvider().myMethod(); }
ناتج الكود:
طول القيمة: 5
في هذا المثال، لدينا كلاس DataProvider
الذي يحتوي على الدالة getStringOrNull
التي تقوم بإرجاع قيمة من نوع String
أو null
بشكل عشوائي. ثم نستخدم بنية التحكم if
للتحقق مما إذا كانت القيمة تمثل نوع String
أم لا. في حالة التحقق الناجح، يتم طباعة طول القيمة، وإلا يتم طباعة رسالة تشير إلى أن القيمة ليست من نوع نص.
إن فهم مفهوم الـ Type Promotion في لغة دارت يعتبر أمرًا حاسمًا لتحسين جودة الأكواد وتسهيل عملية تطوير التطبيقات. يتيح لك هذا المفهوم القوي الوصول إلى قوة التحويل الأوتوماتيكي للأنواع دون الحاجة إلى تكرار الاختبارات والتحويلات اليدوية. بفهمك الجيد لهذا المفهوم، ستتمكن من بناء تطبيقات دارت أكثر فعالية وأمانًا.