Annonce du test bĂȘta de Dart Ă  sĂ©curitĂ© nulle. DĂ©marrez le processus de migration des packages vers un Ă©tat sĂ»r et sĂ©curisĂ©





Bien entendu, null-safety est une Ă©tape importante dans le dĂ©veloppement du langage. L'Ă©quipe Dart a annoncĂ© une version bĂȘta de la version null-safety! Nous avons traduit en russe l'actualitĂ© de cette version, dans laquelle vous apprendrez comment migrer vers de nouvelles versions, quels avantages vous en tirerez et quels sont les avantages de la sĂ©curitĂ© nulle pour nous tous.



Aujourd'hui, nous annonçons qu'une version bĂȘta fiable de sĂ©curitĂ© nulle est disponible pour Dart et Flutter. Null-safety est notre derniĂšre avancĂ©e majeure pour vous aider Ă  Ă©viter les bogues de rĂ©fĂ©rencement nul, une classe de bogues souvent difficiles Ă  dĂ©tecter. Cette vidĂ©o explique en termes gĂ©nĂ©raux la raison de notre joie:





Avec le passage Ă  la version bĂȘta avec null-safety, il est temps de migrer les milliers de packages disponibles sur pub.dev . Nous avons portĂ© les bibliothĂšques principales de Dart, le framework Flutter et plus de 40 packages Dart et Flutter. Cela Ă©tant dit, nous espĂ©rons que la communautĂ© acceptera null-safety lors de la migration de ses paquets.







Avec la version bĂȘta, nous entrons Ă©galement dans la derniĂšre ligne droite avant la sortie de la version stable Ă  sĂ©curitĂ© nulle. Nous espĂ©rons que vous profiterez de cette fonctionnalitĂ© et que vous nous indiquerez si elle peut ĂȘtre amĂ©liorĂ©e et rendre les messages et la documentation de l'interface utilisateur plus clairs. Nous attendons vos commentaires avec impatience .



Choisir null-safety



Avant de discuter de la migration vers null-safety, nous souhaitons réitérer que (comme indiqué dans nos directives de null-safety ) vous avez la possibilité de choisir exactement quand démarrer la migration. Les applications et les packages ne fonctionneront avec la sécurité nulle que si leur limite minimale du SDK Dart est au moins la version préliminaire de Dart 2.12:



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


Pour l'essayer, essayez de créer une petite application Hello de sécurité nulle (par exemple avec dart create) contenant le code comme indiqué ci-dessous. Ensuite, vous pouvez essayer d'exécuter l'application avant et aprÚs la modification de la limite du SDK et la lancer dart pub getet voir comment le comportement du programme change. (Assurez-vous de vous dart --versionrenvoyer exactement 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;
        	^


Passer à la sécurité nulle



Pour migrer un package (ou une application simple) vers le mode de sécurité nul, suivez ces cinq étapes, qui sont détaillées dans le guide de migration de dart.dev.



Étape 1: vĂ©rifiez si vos dĂ©pendances sont prĂȘtes



Nous vous recommandons fortement de déplacer le code dans l'ordre, en commençant par les «feuilles» du graphe de dépendances. Par exemple, si C dépend de B, qui dépend de A, migrez d'abord vers la sécurité nulle A, puis B, puis C. Cet ordre s'applique que A, B et C soient des bibliothÚques, des packages ou des applications.







Pourquoi l'ordre est-il si important? Vous pouvez progresser dans la migration de votre code avant de migrer vos dépendances, mais vous courez le risque d'avoir à réexécuter si vos dépendances modifient leurs interfaces pendant la migration. Si certaines de vos dépendances ne sont pas null-safety, envisagez de contacter les éditeurs de packages en utilisant les coordonnées répertoriées pour chaque package sur pub.dev.



VĂ©rifier si les dĂ©pendances sont prĂȘtes



Pour vĂ©rifier si votre application ou package est prĂȘt Ă  dĂ©marrer la migration, vous pouvez exĂ©cuter dart pub outdateden mode de sĂ©curitĂ© nul. L'exemple ci - dessous montre que l'application est prĂȘte pour la migration si elle met Ă  jour ses dĂ©pendances path, processet pedanticĂ , les versions prĂ©liminaires figurant dans la rĂ©soluble colonne .







Si la prise en charge de la sécurité nulle est disponible dans les versions mineures plus récentes, vous les verrez dans la colonne Mise à jour . La prise en charge de la sécurité nulle sera souvent disponible dans les nouvelles versions majeures; dans ce cas, vous verrez les versions répertoriées dans la section Résoluble dans la sortie de l'utilitaire obsolÚte. Pour basculer vers eux, modifiez le fichier pubspec.yamlpour autoriser ces versions principales. Par exemple, vous pouvez changer

process: ^3.0.13en process: ^4.0.0-nullsafety.



Vous pouvez également trouver des packages avec prise en charge de la sécurité nulle sur pub.dev en utilisant les nouvelles balises de sécurité Null sur les pages des packages (par exemple, collection 1.15 ) et la nouvelle option de recherche avancée de sécurité nulle.







Étape 2: transfert à l'aide de l'outil de migration



Une fois les dĂ©pendances prĂȘtes, vous pouvez commencer Ă  migrer votre application ou package Ă  l'aide de l'outil de migration dart migrate.



L'outil de migration est interactif, vous pouvez donc afficher les propriĂ©tĂ©s de sĂ©curitĂ© nulles dĂ©duites par cet outil. Si vous n'ĂȘtes pas d'accord avec un rĂ©sultat de l'outil, vous pouvez ajouter des indices nuls pour le modifier. L'ajout de quelques conseils peut avoir un impact considĂ©rable sur la qualitĂ© de votre migration.







Plusieurs auteurs de packages Dart ont testé les migrations à l'aide des premiÚres versions de pré-build null-safety, et leurs commentaires ont été encourageants. Le guide de migration contient des conseils supplémentaires sur l'utilisation de l'outil de migration.



Étape 3: analyse statique du code portĂ©



Mettez Ă  jour les packages Ă  l'aide de pub get dans votre IDE ou en ligne de commande. Ensuite, utilisez un IDE ou une ligne de commande pour effectuer une analyse statique sur votre code Dart:



$ dart pub get
$ dart analyze




Ou en code Flutter:



$ flutter pub get
$ flutter analyze


Étape 4: assurez-vous que les tests rĂ©ussissent



ExĂ©cutez les tests et assurez-vous qu'ils rĂ©ussissent en toute sĂ©curitĂ©. Vous devrez peut-ĂȘtre mettre Ă  jour les tests attendus null si vous modifiez le code de votre package pour ne pas autoriser les valeurs nulles.



Étape 5: publier votre package null-safety



AprÚs avoir terminé la migration et exécuté les tests, vous pouvez publier votre package en tant qu'avant-premiÚre. Voici un résumé des meilleures pratiques:



  • Mettez Ă  niveau la version vers la prochaine version majeure (par exemple, de 2.3.xĂ  3.0.0). Cela garantit que les utilisateurs de votre package ne mettent pas Ă  niveau vers celui-ci tant qu'ils ne sont pas prĂȘts Ă  utiliser null-safety. Cela vous donne la libertĂ© de refactoriser votre API pour tirer le meilleur parti de la sĂ©curitĂ© nulle.
  • Traduisez et publiez votre package en aperçu sur pub.dev . (Par exemple, utilisez 3.0.0-nullsafety.0et non 3.0.0.)


Pour plus d'informations sur la migration et la gestion des versions, consultez le guide de migration .



Avantages de la sécurité nulle garantie



Nos articles précédents sur les aperçus techniques de sécurité nulle dans Dart et Flutter ont discuté des avantages de ces changements à l'aide d'un certain nombre d'exemples. Maintenant que la sécurité nulle est en voie d'achÚvement, nous voyons plusieurs exemples concrets de cet avantage.



Code plus sécurisé



Nous avons récemment découvert un bug sur la branche principale de Flutter qui a provoqué diverses commandes d'outils pour flutterécraser sur certaines configurations de la machine avec une valeur nulle: erreur The method '>=' was called on null. Le problÚme principal était une demande d'extraction récente pour ajouter la prise en charge de la détection Android Studio 4.1. Cette demande d'extraction a ajouté un code comme celui-ci:



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) {
    ...


Pouvez-vous trouver un bug? Étant donnĂ© que la version peut ĂȘtre nulle, les versions majeures et mineures peuvent Ă©galement ĂȘtre nulles. Ce bogue peut sembler facile Ă  trouver ici isolĂ©ment, mais en pratique, ce type de code se glisse tout le temps, mĂȘme avec le processus rigoureux de rĂ©vision de code utilisĂ© dans le rĂ©fĂ©rentiel Flutter. Avec la sĂ©curitĂ© nulle, l'analyse statique rattrape ce problĂšme immĂ©diatement :







c'était une erreur assez simple. Au début de l'utilisation de la sécurité nulle dans le code interne de Google, nous avons vu à quel point des erreurs plus complexes étaient détectées puis résolues par la sécurité nulle. Voici quelques exemples:



  • , 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



La sécurité nulle de Dart est également importante: les compilateurs Dart peuvent utiliser des informations de sécurité nul. Cela peut rendre vos programmes plus petits et plus rapides. Jusqu'à présent, nous n'avons pas beaucoup d'applications réelles entiÚrement traduites en null-safety (aprÚs tout, nous commençons tout juste à migrer l'écosystÚme de packages dont ces applications dépendent pour la fiabilité), mais nous voyons des résultats trÚs encourageants du cadre principal.



Nous avons rĂ©cemment exĂ©cutĂ© une recompilation de test de l'exemple hello_world pour mesurer l'impact de la sĂ©curitĂ© nulle sur la taille de l'application. Ceci est un exemple minimal qui affiche simplement "bonjour le monde". Lors de la comparaisonde la taille totale du code compilĂ©, la taille du code non compressĂ© (installĂ© sur l'appareil) a Ă©tĂ© rĂ©duite de 3,5% sans aucune action autre que la recompilation avec une sĂ©curitĂ© nulle fiable. Cela Ă©tait possible malgrĂ© le fait que toute l'application se composait de 10 lignes de code, car la taille du code de toutes les bibliothĂšques incluses Ă©tait rĂ©duite; par exemple, le framework Flutter ( package:flutter) lui-mĂȘme a diminuĂ© de 3,9%.



En termes de vitesse du code, la nécessité d'appliquer un systÚme de type de données de confiance augmente potentiellement la surcharge. Cependant, moins de vérifications nulles peuvent également accélérer votre code. L'analyse initiale des benchmarks montre que les performances sont comparables à celles des versions précédentes et que de nouvelles informations de type supplémentaires nous donnent le potentiel de nouvelles façons d'améliorer les performances à l'avenir. Nous prévoyons d'écrire plus à ce sujet dans de futures publications.



Dans certains cas, nous avons dĂ©jĂ  vu comment la sĂ©curitĂ© nulle a conduit Ă  des gains de performances lorsque la transition a trouvĂ© une faille dans la logique du code. Par exemple, nous avons trouvĂ© un problĂšme dans le cache de positionnement de texte du Web Flutter. Ce cache utilisait une clĂ© nullable puis, selon la logique donnĂ©e, utilisĂ©TextAlign.startquand nul. Cette logique provoquait une erreur de cache oĂč les Ă©lĂ©ments semblaient avoir changĂ©, mĂȘme s'ils avaient toujours une valeur par dĂ©faut. En consĂ©quence, il y avait souvent des appels improductifs vers le cache. L'ajout de getter textAlignqui n'autorise pas la valeur null, permet de corriger la mise en cache des erreurs, ce qui entraĂźne une augmentation des performances de rendu du texte 14 fois dans les cas de texte mis en cache.



Commencer aujourd'hui!



Les versions bĂȘta de Dart et Flutter contenant null-safety sont prĂȘtes. Si vous Ă©crivez en Flutter, vous pouvez passer en version bĂȘta avec flutter channel betaet ensuite flutter upgrade. Et si vous n'utilisez pas Flutter, vous pouvez obtenir le SDK Dart autonome Ă  partir de l' archive Dart SDK .



Si vous développez des packages, nous vous recommandons de lire notre guide de migration et de planifier votre migration. Veuillez nous faire part de vos problÚmes ou suggestions.



Si vous ĂȘtes un dĂ©veloppeur d'applications, vous pouvez reporter le portage jusqu'Ă  ce que la fonctionnalitĂ© arrive dans nos versions stables. Nous prĂ©voyons de rĂ©pondre rapidement aux commentaires de la version bĂȘta et de rĂ©soudre les problĂšmes restants. Il est difficile de nommer un calendrier prĂ©cis pour le moment oĂč null-safety sera publiĂ© dans une version stable, mais nous pensons au dĂ©but de l'annĂ©e prochaine.



Merci pour votre soutien et vos commentaires! Nous travaillons Ă  faire de Dart un langage plus robuste et Flutter un framework plus puissant.



Michael Thomsen, chef de produit pour Dart et Flutter, a publié cet article sur le blog officiel de Dartlang. Si vous souhaitez écouter le discours de Michael et interagir avec lui en personne, venez à DartUP 2020 Online les 4 et 5 décembre et discutez des derniÚres mises à jour linguistiques avec l'équipe de Dart et la communauté.



All Articles