إعلان عن اختبار بيتا Null-Safety Dart. ابدأ عملية ترحيل الحزم إلى حالة آمنة ومأمونة





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



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





مع الانتقال إلى الإصدار التجريبي من null-safety ، حان الوقت لترحيل آلاف الحزم المتوفرة على pub.dev . لقد نقلنا مكتبات Dart الأساسية وإطار عمل Flutter وأكثر من 40 حزمة Dart و Flutter. ومع ذلك ، نأمل أن يقبل المجتمع "null-safety" من خلال ترحيل حزمهم.







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



اختيار خالية من السلامة



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



environment:
 sdk: ">=2.12.0-0 <3.0.0"


لتجربتها ، حاول إنشاء تطبيق hello صغير للأمان فارغ (على سبيل المثال dart create) يحتوي على الكود كما هو موضح أدناه. يمكنك بعد ذلك محاولة تشغيل التطبيق قبل وبعد تغيير حد SDK dart pub getوبدء التشغيل ومعرفة كيف يتغير سلوك البرنامج. (تأكد من dart --versionإرجاع 2.12 بالضبط إليك).



bin/hello.dart:
...
void main() {
  var hello = 'Hello Dart developers';
  if (someCondition) {
	hello = null;
  }
  print(hello);
}
 
Before changing the SDK constraint:
$ dart run
 
null
 
After changing the SDK constraint (and running dart pub get):

$ dart run
 
bin/hello.dart:6:13: Error: Null can't be assigned to a variable of 
type 'String' because 'String' is not nullable.
 
	hello = null;
        	^


الانتقال إلى خالية من الأمان



لترحيل حزمة (أو تطبيق بسيط) إلى وضع الأمان الفارغ ، اتبع هذه الخطوات الخمس ، والتي تم تفصيلها في دليل ترحيل dart.dev.



الخطوة 1: تحقق مما إذا كانت تبعياتك جاهزة



نوصي بشدة بتحريك الشفرة بالترتيب ، بدءًا من "أوراق" الرسم البياني للتبعية. على سبيل المثال ، إذا كانت C تعتمد على B ، والتي تعتمد على A ، فانتقل أولاً إلى Null-safety A ، ثم B ، ثم C. ينطبق هذا الترتيب سواء أكانت A و B و C مكتبات أو حزم أو تطبيقات.







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



التحقق مما إذا كانت التبعيات جاهزة



للتحقق مما إذا كان التطبيق أو الحزمة الخاصة بك جاهزة لبدء الترحيل ، يمكنك التشغيل dart pub outdatedفي وضع "خالية من الأمان". المثال التالي يبين أن تطبيق سيكون جاهزا للهجرة إذا فإنه يقوم بتحديث تبعيات ل path، processو pedanticإلى، إصدارات ما قبل الإفراج المدرجة في حله العمود .







إذا كان دعم الأمان الفارغ متاحًا في الإصدارات الثانوية الأحدث ، فسوف تراها في العمود القابل للترقية . غالبًا ما يتوفر دعم Null-Safety في الإصدارات الجديدة الرئيسية ؛ في هذه الحالة ، سترى الإصدارات المدرجة في القسم القابل للحل في إخراج الأداة المساعدة القديمة. للتبديل إليها ، قم بتحرير الملف pubspec.yamlللسماح بهذه الإصدارات الرئيسية. على سبيل المثال ، يمكنك التغيير

process: ^3.0.13إلى process: ^4.0.0-nullsafety.



يمكنك أيضًا العثور على حزم مع دعم null-safety على pub.dev باستخدام علامات الأمان Null الجديدة على صفحات الحزمة (مثل المجموعة 1.15 ) وخيار البحث المتقدم الجديد عن الأمان الفارغ.







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



بمجرد أن تصبح التبعيات جاهزة ، يمكنك البدء في ترحيل التطبيق أو الحزمة الخاصة بك باستخدام أداة الترحيل dart migrate.



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







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



الخطوة 3: التحليل الثابت للكود المنقول



تحديث الحزم باستخدام pub get في IDE الخاص بك أو سطر الأوامر. ثم استخدم IDE أو سطر أوامر لإجراء تحليل ثابت على كود Dart الخاص بك:



$ dart pub get
$ dart analyze




أو في كود Flutter:



$ flutter pub get
$ flutter analyze


الخطوة 4: تأكد من اجتياز الاختبارات



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



الخطوة 5: انشر حزمة السلامة الفارغة الخاصة بك



بعد الانتهاء من الترحيل وتشغيل الاختبارات ، يمكنك نشر الحزمة الخاصة بك كإصدار أولي. فيما يلي ملخص لأفضل الممارسات:



  • قم بترقية الإصدار إلى الإصدار الرئيسي التالي (على سبيل المثال ، من 2.3.xإلى 3.0.0). يضمن ذلك عدم قيام مستخدمي الحزمة الخاصة بك بالترقية إليها حتى يكونوا مستعدين لاستخدام أمان فارغ. يمنحك هذا حرية إعادة تشكيل واجهة برمجة التطبيقات الخاصة بك لتحقيق أقصى استفادة من الأمان الفارغ.
  • ترجمة ونشر الحزمة الخاصة بك كمعاينة في pub.dev . (على سبيل المثال ، استخدم 3.0.0-nullsafety.0بدلاً من 3.0.0.)


لمزيد من المعلومات حول الترحيل والإصدار ، راجع دليل الترحيل .



فوائد السلامة المضمونة



ناقشت منشوراتنا السابقة حول المعاينات الفنية للسلامة الخالية في Dart و Flutter فوائد هذه التغييرات باستخدام عدد من الأمثلة. الآن بعد أن اقترب مفهوم السلامة الفارغة من الاكتمال ، فإننا نشهد العديد من الأمثلة الواقعية لهذه الميزة.



كود أكثر أمانًا



اكتشفنا مؤخرًا خطأً في فرع Flutter الرئيسي تسبب في flutterتعطل أوامر الأداة المختلفة في تكوينات معينة للجهاز مع وجود خطأ فارغ The method '>=' was called on null. كانت المشكلة الرئيسية هي طلب سحب حديث لإضافة دعم لاكتشاف Android Studio 4.1. تمت إضافة رمز طلب السحب هذا مثل هذا:



final int major = version?.major;
final int minor = version?.minor;
if (globals.platform.isMacOS) {
  /// plugin path of Android Studio changed after version 4.1.
  if (major >= 4 && minor >= 1) {
    ...


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







لقد كان خطأ بسيطًا إلى حد ما. في الأيام الأولى لاستخدام null-safety في التعليمات البرمجية الداخلية لـ Google ، رأينا مقدار الأخطاء الأكثر تعقيدًا التي تم اكتشافها ثم حلها من خلال "null-safety". وهنا بعض الأمثلة:



  • , null , null-safety null. , protobuf, , , null. , , - null .
  • Google Pay Flutter, - Flutter State Widget. null-safety null ; null-safety , null, .
  • Flutter , - Flutter , null scene Window.render(). null-safety , Scene , , null.


null-safety



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



أجرينا مؤخرًا اختبارًا لإعادة تجميع عينة hello_world لقياس تأثير السلامة الصفرية على حجم التطبيق. هذا مثال بسيط يعرض فقط "hello world". عند المقارنةمن الحجم الإجمالي للشفرة المترجمة ، تم تقليل حجم الشفرة غير المضغوطة (المثبتة على الجهاز) بنسبة 3.5٪ دون أي إجراءات بخلاف إعادة التجميع بسلامة خالية موثوقة. كان هذا ممكنًا على الرغم من حقيقة أن التطبيق بأكمله يتكون من 10 أسطر من التعليمات البرمجية ، لأنه تم تقليل حجم الشفرة لجميع المكتبات المدرجة ؛ على سبيل المثال ، package:flutterتقلص إطار عمل Flutter ( ) نفسه بنسبة 3.9٪.



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



في بعض الحالات ، رأينا بالفعل كيف أدت السلامة الفارغة إلى مكاسب في الأداء عندما وجد الانتقال عيبًا في منطق الكود. على سبيل المثال ، وجدنا مشكلة في ذاكرة التخزين المؤقت لتحديد موضع النص في Flutter. استخدمت ذاكرة التخزين المؤقت هذه مفتاحًا قابلاً للقيمة nullable ثم ، وفقًا للمنطق المحدد ، تم استخدامهTextAlign.startعندما لاغية. ألقى هذا المنطق خطأ في ذاكرة التخزين المؤقت حيث بدت العناصر وكأنها قد تغيرت ، على الرغم من أنها لا تزال تحتوي على قيمة افتراضية. نتيجة لذلك ، غالبًا ما كانت هناك مكالمات غير منتجة إلى ذاكرة التخزين المؤقت. عند إضافة أداة getter textAlignلا تسمح بالقيم الفارغ ، يتم المساعدة في تصحيح الخطأ في التخزين المؤقت ، مما يؤدي إلى زيادة أداء عرض النص 14 مرة في حالات النص المخزن مؤقتًا.



ابدأ اليوم!



إصدارات بيتا من Dart و Flutter التي تحتوي على سلامة خالية جاهزة. إذا كنت تكتب في Flutter ، فيمكنك التبديل إلى الإصدار التجريبي باستخدام flutter channel betaثم flutter upgrade. وإذا كنت لا تستخدم Flutter ، فيمكنك الحصول على Dart SDK المستقل من أرشيف Dart SDK .



إذا كنت تقوم بتطوير حزم ، فإننا نوصي بقراءة دليل الترحيل الخاص بنا والتخطيط لترحيلك. الرجاء إخبارنا بأي مشاكل أو اقتراحات لديك.



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



شكرا لدعمك وردود الفعل! نحن نعمل على جعل Dart لغة أكثر قوة و Flutter إطار عمل أكثر قوة.



نشر مايكل تومسن ، مدير المنتج في Dart and Flutter ، هذا المقال على مدونة Dartlang الرسمية. إذا كنت ترغب في الاستماع إلى حديث مايكل والتفاعل معه شخصيًا ، تعال إلى DartUP 2020 Online في 4 و 5 ديسمبر وناقش آخر تحديثات اللغة مع فريق Dart والمجتمع.



All Articles