Anuncio de la prueba beta de Dart de seguridad nula. Iniciar el proceso de migración de paquetes a un estado seguro y protegido





Por supuesto, la seguridad nula es un paso importante en el desarrollo del lenguaje. ¡El equipo de Dart ha anunciado una versión beta de la versión de seguridad nula! Hemos traducido al ruso las noticias sobre este lanzamiento, en el que aprenderá cómo migrar a nuevas versiones, qué beneficios obtendrá y cuál es el beneficio de la seguridad nula para todos nosotros.



Hoy anunciamos que está disponible una versión beta confiable de seguridad nula para Dart y Flutter. La seguridad nula es nuestro último gran avance para ayudarlo a evitar errores de referencia nula, una clase de errores que a menudo son difíciles de detectar. Este video explica en términos generales el motivo de nuestra alegría:





Con el cambio a la versión beta con seguridad nula, es hora de migrar los miles de paquetes disponibles en pub.dev . Hemos portado las bibliotecas centrales de Dart, el marco de trabajo Flutter y más de 40 paquetes de Dart y Flutter. Dicho esto, esperamos que la comunidad acepte la seguridad nula al migrar sus paquetes.







Con la versión beta, también estamos entrando en la recta final antes de que se lance la versión estable de seguridad nula. Esperamos que aproveche esta funcionalidad y nos haga saber si podemos mejorarla y hacer que los mensajes de la interfaz de usuario y la documentación sean más claros. Esperamos sus comentarios .



Elegir seguridad nula



Antes de discutir la migración a seguridad nula, queremos reiterar que (como se indica en nuestras pautas de seguridad nula ) tiene la posibilidad de elegir cuándo iniciar la migración. Las aplicaciones y paquetes solo funcionarán con seguridad nula si su límite mínimo de SDK de Dart es al menos la versión preliminar de Dart 2.12:



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


Para probarlo, intente crear una pequeña aplicación de saludo de seguridad nula (por ejemplo, con dart create) que contenga el código como se muestra a continuación. A continuación, puede intentar ejecutar la aplicación antes y después de cambiar el límite del SDK y ejecutarla dart pub gety ver cómo cambia el comportamiento del programa. (Asegúrese de dart --versiondevolverle exactamente 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;
        	^


Pasando a la seguridad nula



Para migrar un paquete (o una aplicación simple) al modo de seguridad nula, siga estos cinco pasos, que se detallan en la guía de migración de dart.dev.



Paso 1: compruebe si sus dependencias están listas



Recomendamos encarecidamente que mueva el código en orden, comenzando con las "hojas" del gráfico de dependencia. Por ejemplo, si C depende de B, que depende de A, migre primero a la seguridad nula A, luego a B y luego a C. Este orden se aplica si A, B y C son bibliotecas, paquetes o aplicaciones.







¿Por qué es tan importante el orden? Puede hacer algún progreso en la migración de su código antes de migrar sus dependencias, pero existe el riesgo de tener que volver a ejecutarlo si sus dependencias cambian sus interfaces durante la migración. Si algunas de sus dependencias no son de seguridad nula, considere ponerse en contacto con los editores del paquete utilizando los datos de contacto que figuran para cada paquete en pub.dev.



Comprobando si las dependencias están listas



Para comprobar si su aplicación o paquete está listo para comenzar a migrar, puede ejecutarlo dart pub outdateden modo de seguridad nula. El siguiente ejemplo muestra que la aplicación estará listo para la migración si se actualiza sus dependencias a path, processy pedantica, las versiones preliminares enumerados en la resoluble columna .







Si el soporte de seguridad nula está disponible en versiones menores más recientes, las verá en la columna Actualizable . El soporte de seguridad nula a menudo estará disponible en las principales versiones nuevas; en este caso, verá las versiones enumeradas en la sección Resoluble en la salida de la utilidad desactualizada. Para cambiar a ellos, edite el archivo pubspec.yamlpara permitir estas versiones principales. Por ejemplo, puede cambiar

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



También puede encontrar paquetes con soporte de seguridad nula en pub.dev utilizando las nuevas etiquetas de seguridad nula en las páginas del paquete (por ejemplo, colección 1.15 ) y la nueva opción de búsqueda avanzada de seguridad nula.







Paso 2: transferir usando la herramienta de migración



Una vez que las dependencias estén listas, puede comenzar a migrar su aplicación o paquete usando la herramienta de migración dart migrate.



La herramienta de migración es interactiva, por lo que puede ver las propiedades de seguridad nula inferidas por esta herramienta. Si no está de acuerdo con algún resultado de la herramienta, puede agregar sugerencias nulas para cambiarlo. Agregar solo algunas sugerencias puede tener un gran impacto en la calidad de su migración.







Varios autores de paquetes de Dart han probado las migraciones utilizando compilaciones de seguridad nula precompiladas y sus comentarios han sido alentadores. La guía de migración tiene consejos adicionales para usar la herramienta de migración.



Paso 3: análisis estático del código portado



Actualice los paquetes usando pub get en su IDE o línea de comandos. Luego use un IDE o línea de comando para realizar un análisis estático en su código de Dart:



$ dart pub get
$ dart analyze




O en código Flutter:



$ flutter pub get
$ flutter analyze


Paso 4: asegúrese de que las pruebas pasen



Ejecute pruebas y asegúrese de que pasen de forma segura. Es posible que deba actualizar las pruebas que esperan un valor nulo si cambia el código de su paquete para no permitir valores nulos.



Paso 5: publique su paquete de seguridad nula



Después de completar la migración y ejecutar las pruebas, puede publicar su paquete como Presentación. A continuación, se muestra un resumen de las mejores prácticas:



  • Actualice la versión a la siguiente versión principal (por ejemplo, de 2.3.xa 3.0.0). Esto asegura que los usuarios de su paquete no lo actualicen hasta que estén listos para usar la seguridad nula. Esto le da la libertad de refactorizar su API para hacer el mejor uso de la seguridad nula.
  • Traduzca y publique su paquete como vista previa en pub.dev . (Por ejemplo, use 3.0.0-nullsafety.0y no 3.0.0).


Para obtener más información sobre migración y control de versiones, consulte la guía de migración .



Beneficios de la seguridad nula garantizada



Nuestras publicaciones anteriores sobre avances técnicos de seguridad nula en Dart y Flutter discutieron los beneficios de estos cambios usando varios ejemplos. Ahora que la seguridad nula está a punto de completarse, estamos viendo varios ejemplos del mundo real de este beneficio.



Código más seguro



Recientemente, descubrimos un error en la rama principal de Flutter que provocó que varios comandos de herramientas se bloqueen flutteren ciertas configuraciones de la máquina con un error nulo : The method '>=' was called on null. El problema principal fue una solicitud de extracción reciente para agregar soporte para la detección de Android Studio 4.1. Esta solicitud de extracción agregó un código como este:



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


¿Puedes encontrar un error? Dado que la versión puede ser nula, tanto la versión principal como la secundaria también pueden ser nulas. Este error puede parecer fácil de encontrar aquí de forma aislada, pero en la práctica, este tipo de código se desliza todo el tiempo, incluso con el riguroso proceso de revisión de código utilizado en el repositorio de Flutter. Con seguridad nula, el análisis estático detecta este problema de inmediato :







fue un error bastante simple. En los primeros días del uso de la seguridad nula en el código interno de Google, vimos cuántos errores más complejos se detectaban y luego se resolvían mediante la seguridad nula. Aquí hay unos ejemplos:



  • , 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 fiabilidad de seguridad nula de Dart también es importante: los compiladores de Dart pueden aprovechar la información de seguridad nula. Puede hacer que sus programas sean más pequeños y rápidos. Hasta ahora, no tenemos muchas aplicaciones reales completamente traducidas a seguridad nula (después de todo, recién ahora estamos comenzando a migrar el ecosistema de paquetes de los que estas aplicaciones dependen para su confiabilidad), pero estamos viendo resultados muy alentadores del marco principal.



Recientemente, realizamos una recopilación de prueba de la muestra hello_world para medir el impacto de la seguridad nula en el tamaño de la aplicación. Este es un ejemplo mínimo que solo muestra "hola mundo". Al comparardel tamaño total del código compilado, el tamaño del código sin comprimir (instalado en el dispositivo) se redujo en un 3.5% sin ninguna acción más que la recompilación con seguridad nula confiable. Esto fue posible a pesar del hecho de que toda la aplicación constaba de 10 líneas de código, porque se redujo el tamaño del código de todas las bibliotecas incluidas; por ejemplo, el propio marco Flutter ( package:flutter) se ha reducido en un 3,9%.



En términos de velocidad del código, tener que hacer cumplir un sistema de tipo de datos confiable aumenta potencialmente la sobrecarga. Sin embargo, menos comprobaciones de nulo también aceleran potencialmente su código. El análisis inicial de los puntos de referencia muestra que el rendimiento está a la par con las versiones anteriores, y la nueva información de tipo adicional nos brinda la posibilidad de encontrar nuevas formas de mejorar el rendimiento en el futuro. Planeamos escribir más sobre esto en futuras publicaciones.



En algunos casos, ya hemos visto cómo la seguridad nula condujo a ganancias de rendimiento cuando la transición reveló una falla en la lógica del código. Por ejemplo, encontramos un problema en la caché de posicionamiento de texto de la web Flutter. Esta caché usó una clave anulable y luego, de acuerdo con la lógica dada, usóTextAlign.startcuando es nulo. Esta lógica arrojaba un error de caché donde los elementos parecían haber cambiado, aunque todavía tenían un valor predeterminado. Como resultado, a menudo hubo llamadas improductivas al caché. Al agregar un getter textAlignque no permite nulos, se ayuda a corregir el error de almacenamiento en caché, lo que resulta en un mayor rendimiento de representación del texto 14 veces en los casos de texto en caché.



¡Empiece hoy!



Las versiones beta de Dart y Flutter que contienen seguridad nula están listas. Si está escribiendo en Flutter, puede cambiar a beta con flutter channel betay luego flutter upgrade. Y si no está utilizando Flutter, puede obtener el SDK de Dart independiente del archivo del SDK de Dart .



Si está desarrollando paquetes, le recomendamos leer nuestra guía de migración y planificar su migración. Por favor, háganos saber acerca de cualquier problema o sugerencia que tenga.



Si es un desarrollador de aplicaciones, puede posponer el puerto hasta que la función aparezca en nuestras versiones estables. Planeamos responder rápidamente a los comentarios de la versión beta y solucionar los problemas restantes. Es difícil dar una línea de tiempo específica para cuándo se lanzará la seguridad nula en una versión estable, pero estamos pensando en principios del próximo año.



¡Gracias por su apoyo y comentarios! Estamos trabajando para hacer de Dart un lenguaje más robusto y Flutter un marco más poderoso.



Michael Thomsen, director de producto de Dart y Flutter, publicó este artículo en el blog oficial de Dartlang. Si desea escuchar la charla de Michael e interactuar con él en persona, venga a DartUP 2020 Online el 4 y 5 de diciembre y discuta las últimas actualizaciones de idiomas con el equipo de Dart y la comunidad.



All Articles