سلامة لاغية في دارت

مرحبا هبر! أقدم انتباهكم إلى ترجمة مقال "الإعلان عن سلامة الصوت لاغية" لفيليب هراسك مع تعليقاتي:



سلامة لاغية - عمل آمن مع روابط فارغة. علاوة على ذلك ، في النص ، للإيجاز وبسبب ثبات المصطلح ، سيتم استخدام الاسم الإنجليزي لاغ ، لاغية أمان. وترجمة "انعدام الأمن" تؤدي إلى أفكار معاكسة تمامًا.

الصوت - في هذا السياق (السلامة الخالية من الصوت) يمكن ترجمتها على أنها "موثوقة".

إذا كانت لديك اقتراحات لتحسين الترجمة أو تم العثور على أخطاء - اكتبها بشكل شخصي ، وسنحاول إصلاحها.
لقد أتت خطوة مهمة لفريق Dart من خلال تقديمهم لمعاينة فنية لتطورات السلامة الفارغة. تتجنب السلامة الفارغة فئة كاملة من الأخطاء التي يصعب غالبًا اكتشافها ، وكمكافأة توفر عددًا من تحسينات الأداء. في الوقت الحالي ، أصدرنا معاينة فنية أولية وننتظر تعليقاتك.



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

تم تقديم النسخة الموصوفة في 10 يونيو 2020.

ما هو السلامة؟



Dart هي لغة من النوع الآمن. هذا يعني أنه عندما تحصل على متغير من نوع ما ، يمكن للمترجم أن يضمن أنه ينتمي إليه. لكن نوع الأمان وحده لا يضمن أن المتغير ليس فارغًا.



الأخطاء الفارغة شائعة. يعثر البحث على GitHub على آلاف التقارير (المشكلات) التي تسببها القيم الفارغة في رمز Dart ، وحتى المزيد من الالتزامات التي تحاول حل هذه المشكلات.



حاول اكتشاف مشكلة الارتباط الفارغ في المثال التالي:



void printLengths(List<File> files) {
  for (var file in files) {
    print(file.lengthSync());
  }
}


ستفشل هذه الوظيفة بالتأكيد إذا تم استدعاؤها بمعامل صفري ، ولكن هناك حالة ثانية يجب مراعاتها:



void main() {
  // Error case 1: passing a null to files.
  printLengths(null);
 
  // Error case 2: passing list of files, containing a null item.
  printLengths([File('filename1'), File('filename2'), null]);
}


يعمل الأمان



صورة



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

لكي نكون صادقين تمامًا ، لا يزال التنفيذ الحالي يترك العديد من الفرص للقبض على أخطاء فارغة في وقت التنفيذ ، والمزيد منها لاحقًا.

صوت (موثوق) لاغية السلامة



تنفيذ Dart للسلامة الفارغة سليم. إذا قمت بتحليله باستخدام المثال أعلاه ، فهذا يعني أن برنامج التحويل البرمجي Dart متأكد بنسبة 100 ٪ من أن مجموعة الملفات والعناصر الموجودة فيها لا يمكن أن تكون خالية. عندما يحلل مترجم Dart الكود الخاص بك ويحدد أن المتغير ليس فارغًا ، فسيكون لهذا المتغير دائمًا قيمة: إذا قمت بفحص الكود القابل للتنفيذ في مصحح الأخطاء ، فسترى أنه ببساطة لا توجد إمكانية للتصفير في وقت التشغيل. هناك تطبيقات غير "موثوقة" لا تزال بحاجة إلى إجراء عمليات التحقق من وجود قيمة في وقت التشغيل. على عكس اللغات الأخرى ، تشارك Dart موثوقية التنفيذ مع Swift.

, , , null safety . Swift, Kotlin Dart. .
هذا التنفيذ القوي للسلامة الفارغة في Dart له نتيجة لطيفة أخرى: فهو يعني أن برامجك يمكن أن تكون أصغر وأسرع. نظرًا لأن Dart يتأكد حقًا من أنه لا يمكن إبطال المتغيرات أبدًا ، يمكن لـ Dart تحسين نتيجة التجميع. على سبيل المثال ، يمكن لمترجم AOT إنشاء كود أصلي أصغر وأسرع لأنه لا يحتاج إلى إضافة تدقيقات للمراجع الفارغة.



لقد رأينا بعض النتائج الأولية الواعدة للغاية. على سبيل المثال ، رأينا تحسنًا في الأداء بنسبة 19٪ في علامة القياس الدقيقة التي تحاكي أنماط العرض النموذجية في إطار عمل Flutter.



المبادئ الأساسية



قبل الشروع في التصميم التفصيلي للسلامة الفارغة ، حدد فريق Dart ثلاثة مبادئ أساسية:



عدم الإبطال افتراضيًا. / ** غالبًا ما يُنظر إليه على أنه اختصار لـ NNBD في المستندات ** / إذا لم تخبر Dart صراحة أنه يمكن إبطال متغير ما ، فسوف تعتبره غير قابل للإلغاء. لقد اخترنا هذا كقيمة افتراضية لأننا وجدنا أن القيمة غير الصفرية هي الأكثر شيوعًا في واجهة برمجة التطبيقات. / ** ربما يكون هذا إعادة صياغة لواجهة Flutter API الحالية ** / .



قابلية التطبيق على مراحل... نحن ندرك أنه يجب أن تكون هناك إمكانية للانتقال التدريجي إلى سلامة لاغية خطوة بخطوة. في الواقع ، يجب أن يكون لديك رمز أمان لاغٍ وغير صالح في نفس المشروع. لهذا ، نخطط لتوفير أدوات للمساعدة في ترحيل التعليمات البرمجية.



الموثوقية الكاملة (الصوت). كما ذكر أعلاه ، فإن السلامة الفارغة في Dart آمنة. بمجرد تحويل مشروعك بالكامل وتبعياتك إلى أمان فارغ ، ستحصل على جميع مزايا الموثوقية.



التصريح عن المتغيرات بسلامة لاغية



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



// In null-safe Dart, none of these can ever be null.
var i = 42;
final b = Foo();
String m = '';


ستحرص Dart على عدم تعيين قيمة خالية أبدًا لأي من المتغيرات المذكورة أعلاه. إذا حاولت تنفيذ i = null حتى بعد مرور ألف سطر ، فستحصل على خطأ تحليل ثابت وخطوط متعرجة حمراء - سيرفض برنامجك التجميع.



إذا كنت تريد أن يكون المتغير الخاص بك غير صالح ، يمكنك استخدام "؟" مثله:



// These are all nullable variables.
int? j = 1;  // Can be null later.
final Foo? c = getFoo();  // Maybe the function returns null.
String? n;  // Is null at first. Can be null at any later time, too


المتغيرات المذكورة أعلاه تتصرف تمامًا مثل جميع المتغيرات في الإصدار الحالي من Dart.



يمكن أيضًا استخدام '؟' في أماكن أخرى:



// In function parameters.
void boogie(int? count) {
  // It's possible that count is null.
}
// In function return values.
Foo? getFoo() {
  // Can return null instead of Foo.
}
// Also: generics, typedefs, type checks, etc.
// And any combination of the above.


لكن مرة أخرى ، أتمنى ألا تضطر أبدًا إلى استخدام "؟". الغالبية العظمى من المتغيرات الخاصة بك ستكون غير قابلة للإلغاء.



مما يسهل استخدام الأمان الفارغ



يعمل فريق Dart بجد لجعل استخدام "أمان null" سهل الاستخدام قدر الإمكان. على سبيل المثال ، ألق نظرة على هذا الكود ، والذي يستخدم إذا كنت تريد اختبار القيمة الخالية:



void honk(int? loudness) {
  if (loudness == null) {
    // No loudness specified, notify the developer
    // with maximum loudness.
    _playSound('error.wav', volume: 11);
    return;
  }
  // Loudness is non-null, let's just clamp it to acceptable levels.
  _playSound('honk.wav', volume: loudness.clamp(0, 11));
}


لاحظ أن Dart ذكي بما يكفي لإدراك أن ارتفاع الصوت لا يمكن أن يكون فارغًا بحلول الوقت الذي نمرر فيه عبارة if. وهكذا يسمح لنا Dart باستدعاء طريقة clamp () دون الرقص غير الضروري باستخدام الدف. يتم توفير هذه الراحة من خلال ما يسمى بتحليل التدفق: ينظر محلل Dart إلى التعليمات البرمجية الخاصة بك كما لو كانت تقوم بتنفيذها ، ويكتشف تلقائيًا المزيد من المعلومات حول التعليمات البرمجية الخاصة بك.

Flow analysis, Dart, , , . null safety, :
foo(dynamic str) {
  if (str is String) {
    // dynamic   length,   
    //      String
    print(str.length);  
  }
}


, Dart , null, :
int sign(int x) {
  // The result is non-nullable.
  int result;
  if (x >= 0) {
    result = 1;
  } else {
    result = -1;
  }
  // By this point, Dart knows the result cannot be null.
  return result;
}


- (, result = -1;), Dart , result — , .
يعمل تحليل التدفق داخل الوظائف فقط. إذا كان لديك متغير عام أو حقل فئة ، فلا يمكن أن تضمن Dart أنه سيتم تخصيص قيمة لها. لا يمكن لـ Dart نمذجة تدفق تنفيذ التطبيق بأكمله. لهذا السبب ، يمكنك استخدام الكلمة الأساسية المتأخرة الجديدة إذا كنت تعلم أنه سيتم تهيئة المتغير عند الوصول إليه لأول مرة ، لكن لا يمكنك تهيئته عند الإعلان عنه.



class Goo {
  late Viscosity v;
 
  Goo(Material m) {
    v = m.computeViscosity();
  }
}


لاحظ أن v لا يمكن صفيرها ، على الرغم من أنها غير ذات صلة في البداية. يعتقد Dart أنك لن تحاول قراءة v حتى يتم تعيين قيمة غير صفرية لها ويتم تجميع التعليمات البرمجية بدون أخطاء.

— .



, . , . Dart , , , , , Kotlin .



— Swift- , , force unwrap Dart.

void main() {
  String? t;
  print(t!.length);
}


( late ‘!’) .



late , - Dart. ‘required’ . ‘@required’, .
class Temp {
  String str;
  Temp({required this.str});
  
  //   
  Temp.alt({strAtr}) : this.str = strAtr;
}




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



تم تحديث مكتبات Dart الأساسية مؤخرًا بسلامة فارغة. كمثال توضيحي للتوافق مع الإصدارات السابقة ، تم استبدال المكتبات الأساسية الحالية دون اختبار واحد فاشل وبدون أخطاء في تطبيقات الاختبار التي تعمل على بيئات اختبار Dart و Flutter. حتى تحديث المكتبات الأساسية للعديد من عملاء Google الداخليين قد توقف دون حدوث أي عوائق. نخطط لإعادة تصميم جميع حزمنا وتطبيقاتنا لاستخدام الأمان الفارغ بعد الإصدار ، ونأمل أن تفعل الشيء نفسه. ولكن يمكنك القيام بذلك على وتيرتك الخاصة ، دفعة تلو الأخرى ، تطبيق تلو الآخر.

هذه الكلمات ، نعم لمطوري Swift ، وخاصة الإصدار الثالث ...

ولكن حتى هنا كل شيء ليس ورديًا جدًا ، يقول المطورون أنفسهم أنه عند الجمع بين رمز الأمان الفارغ والرمز "القديم" في مشروع واحد ، لا يمكنهم ضمان السلامة اكتب الأنظمة.

خطة عمل أخرى



نحن نخطط لطرح السلامة الفارغة تدريجياً على ثلاث مراحل:



  1. المعاينة الفنية. تم إطلاقه عند نشر المقال الأصلي (06/10/2020) ومتوفر في فرع التطوير. يجدر الانتباه إلى قسم "ابدأ الآن". لا يزال غير مستقر للغاية وقابل للتغيير ، لذلك لا نوصي باستخدامه في كود الإنتاج حتى الآن. لكننا نحب أن نسمع منك وأن تقدم لنا ملاحظاتك!
  2. النسخة التجريبية. ستتوفر ميزة Null Safety في فرع Dart beta ولن تختبئ بعد ذلك خلف علم تجريبي. سيكون التنفيذ قريبًا من الإصدار النهائي المتوقع. سيكون من الممكن بدء ترحيل حزمك ومكوناتك الإضافية إلى pub.dev ، لكن لا يوصى بنشر هذا التغيير كإصدار ثابت حتى الآن.
  3. نسخة مستقرة. السلامة الفارغة ستكون متاحة للجميع. سيُطلب منك نشر الحزم والإضافات المحدثة كإصدارات ثابتة. يجدر أيضًا ترحيل تطبيقاتك في هذه المرحلة.


إذا سارت الأمور وفقًا للخطة ، فسنصدر إصدارًا ثابتًا من Dart بأمان لاغٍ بحلول نهاية العام. سنقوم من وقت لآخر بإضافة أدوات لمساعدتك على الانتقال إلى الأمان الفارغ. بينهم:



  • أداة ترحيل للمساعدة في أتمتة العديد من الخطوات لتحديث الحزم والتطبيقات الحالية ؛
  • pub.dev, null safety;
  • 'pub outdated' , null safety.




أسرع طريقة لتجربة nullsafety.dartpad.dev اليوم هي إصدار DartPad مع تمكين أمان null. افتح القائمة المنسدلة Learn with Snippets للعثور على سلسلة من البرامج التعليمية التي تغطي بناء الجملة الجديد وأساسيات الأمان الفارغ.



صورة



يمكنك أيضًا تجربة الأمان الفارغ في تطبيقات وحدة التحكم الصغيرة (لم نقم بتحديث أطر عمل أكبر مثل Flutter حتى الآن). أولاً ، تحتاج إلى تنزيل Dart SDK من فرع dev ، ثم يمكنك تنزيل تطبيق وحدة التحكم هذا . يحتوي ملف README على إرشادات لتشغيل التطبيق مع تمكين ميزة الأمان التجريبية الفارغة. توفر الملفات الأخرى في المثال تكوينات تشغيل ستمكّن تصحيح الأخطاء في VS Code و Android Studio.



يمكنك أيضًا قراءة الوثائق (سيظهر المزيد في المستقبل):





محدث: في التعليقات ، اقترحت هذا الرابط فهم السلامة الفارغة


نحن متحمسون جدًا لأن نكون قادرين على تنفيذ السلامة الفارغة في Dart. ستصبح المعالجة الموثوقة والآمنة للروابط الفارغة السمة المميزة لـ Dart لمساعدتك في كتابة الكود الأكثر موثوقية وإنتاجية. نأمل أن تأخذ بعض الوقت لتجربة الإصدار الحالي من الأمان الفارغ وترك تعليقاتك في أداة تعقب الأخطاء. هل لديك كود لطيف!

شكرا لك على القراءة حتى النهاية. تأخرت الترجمة قليلاً ، لكن نأمل أن تكون التعليقات مفيدة للمادة ولم تصبح مجرد ترجمة فردية. أريد أن أضيف أن هذه الميزة هي خطوة مفيدة حقًا إلى الأمام لنظام Flutter البيئي بأكمله. إنني أتطلع إلى استخدامه بالفعل على التطبيقات المباشرة. في غضون ذلك ، كما يقولون بلغة أجنبية ، ترقبوا!



All Articles