[GO] Pourquoi je suis passé de Java à Dart


Quelqu'un a entendu dire que Migré de JavaScript vers Dart Je suis. Eh bien, mon voyage est un peu différent. J'ai déménagé de Java à Dart. Et une partie de adwords.google.com.

App.java ⇒ app.dart.png

AdWords est le centre des revenus de Google et est maintenant [Réécrit avec Dart](http://news.dartlang.org/ 2016/03 / the-new-adwords-ui-uses-dart-we-ask.html "Dart News & Updates: La nouvelle interface utilisateur AdWords utilise Dart - nous avons demandé pourquoi"). Cependant, la partie d'AdWords pour laquelle je travaille (la partie qui vend des publicités YouTube désactivables) fonctionne déjà sur Dart depuis 2014.

Ce qui est intéressant, c'est que notre équipe n'a pas été instruite ni même invitée à utiliser Dart. Nous avons découvert les capacités de Dart et avons décidé que cela valait la peine d'essayer.

L'important est que nous n'avons pas reconstruit le Garapon. J'avais l'habitude d'utiliser Java / GWT, mais lorsque j'ai migré vers Dart, j'ai pu progressivement intégrer Dart sur le navigateur. Il s'est familiarisé avec Dart et est devenu enthousiasmé par Dart en grandissant, réécrivant finalement presque tous les codes de navigateur de Java / GWT à Dart.

C'est la principale raison pour laquelle Dart est meilleur que Java.

  1. Dart SDK Si vous avez beaucoup d'expérience dans l'écriture de code en Java, la partie la plus frustrante est probablement la bibliothèque standard. La décision clé a été prise il y a longtemps et ne peut plus être annulée. Java Iterable et Dart [Iterable](https :: //api.dartlang.org/stable/1.21.0/dart-core/Iterable-class.html Juste en comparant "Iterable class --dart: core library --Dart API"), combien de progrès le monde a fait Tu peux comprendre.

La meilleure façon de programmer en Java est donc d'utiliser une bibliothèque tierce. Google utilise Guava et c'est plutôt cool. Par exemple, Guava a FluentIterable. Pourtant, il ne fait pas partie du SDK et est toujours un citoyen de seconde zone.

Dart a eu l'occasion de tout recommencer et de le mettre en pratique. Voici un exemple où vous utiliseriez Fluent Iterable en Java.

print(
    [1, 2, 3].where((x) => x.isOdd).map((x) => x + 10));
-->
(11, 13)

Exécuter sur DartPad

2. Rappel, futur, asynchrone / attente

Si vous avez beaucoup d'expérience dans l'écriture de code en Java / GWT, il se peut que vous réagissiez sans le savoir au mot "callback". Vous devriez transpirer simplement en entendant les mots.

Personnellement, j'écris et maintiens un code terrifiant et horrible qui est une liste de rappels pour gérer différents événements dans une série de chaînes RPC.

C'est un exemple relativement bon.

public void getFoo(AsyncCallback<List<String>> callback) {
  getThenFilter("foo", callback);
}

private void getThenFilter(
    final String parameter,
    final AsyncCallback<String> callback) {
  makeRequest(new AsyncCallback<List<String>>() {
    void handle(List<String> values) {
      List<String> filtered = new ArrayList<>();
      for (String value : values) {
        if (value.startsWith(parameter)) {
          filtered.add(value);
        }
      }
      callback.handle(filtered);
  }
}

Dart a Future La bibliothèque standard est conçue et tout est résolu. C'était le moment où Dart m'a parlé. Vous obtenez exactement ce dont vous avez besoin pour une meilleure vie de codage.

Future<List<String>> getFoo() {
  return _getThenFilter('foo');
}

Future<List<String>> _getThenFilter(String parameter) {
  return makeRequest().then((result) =>
      result.where((string) => string.startsWith(parameter))
          .toList());
}

Cela ne s'arrête pas là. L'équipe Dart discutait d'une manière à la mode d'utiliser le mot-clé async / await Future. Écrivez simplement «wait» et vous serez en mesure de procéder au codage asynchrone comme s'il était synchrone, et tout semble être géré dans les coulisses.

Et c'est devenu une réalité. En tant que développeur Java de longue date, c'est à ce moment-là que j'ai commencé à penser que de simples discussions hypothétiques sur le changement de langage n'étaient d'aucune utilité pour mon travail. C'était un délice.

Future<List<String>> getFoo() {
  return _getThenFilter('foo');
}

Future<List<String>> _getThenFilter(String parameter) async {
  var unfiltered = await makeRequest();
  return unfiltered.where(
      (string) => string.startsWith(parameter)).toList();
}

Exécuter sur DartPad

3. Pas de bêtises, pas de plaque chauffante

Lorsque vous passez de Java à Dart, vous rencontrerez tellement de fonctionnalités qui vous faciliteront la vie de codage.

--Public en standard, privé si vous commencez par "_" --Collection Literal (Try it) --Tout est un objet (pas de primitif)

Même un seul fait sourire les programmeurs Java. Je ne peux pas tout supporter en même temps, dans le bon sens.

4. Plus loin

L'évolution de Dart ne s'arrête pas à async / await. [Syntaxe de méthode générique] récemment pris en charge (http://news.dartlang.org/2016/12/dart-121-generic-method-syntax.html "Dart News & Updates: Dart 1.21: Generic Method Syntax") Fait. Des tentatives de type non nul sont également en cours. Le système de type est en cours de rénovation en Mode fort ..

Dart évoluera en profondeur vers une utilisation pratique. Toutes les fonctionnalités sont nécessaires pour fonctionner confortablement dans un code pratique. Ainsi, de nouvelles fonctionnalités continueront d'apparaître, seulement de bonnes.

5. Adéquation du Web

Enfin, Dart dispose d'un framework d'interface utilisateur Web. En fait, nous avons commencé avec Web UI quand Angular Dart n'avait ni ombre ni forme. Après cela, j'ai utilisé Angular Dart, et maintenant c'est Angular Dart 2. Commun à tous, il existe un modèle léger de type HTML.


Rechercher l'invariance des valeurs

La seule chose que je pense que Dart manque de mon point de vue est une collection immuable appropriée et un support immuable. Donc, tout en espérant que quelqu'un écrirait un package qui pourrait être utilisé, nous nous sommes précipités vers quelque chose qui a fonctionné pour notre équipe.

Mais à la fin, j'ai passé beaucoup de temps à créer quelque chose qui pourrait résister à la publication open source. built_collection Et built_value .dart "google / built_value.dart: types de valeurs immuables, classes d'énumération et sérialisation.") Est né.


c'est tout. Dart est prêt pour une apparition aux heures de grande écoute. Vous pouvez créer d'énormes applications Web critiques avec Dart, comme nous l'avons fait avec AdWrod for Video. Ou vous pouvez commencer à développer des applications mobiles pour Android et iOS avec Flutter. De plus, comme dans un article récent que j'ai écrit, Dart côté serveur fonctionne [très bien] avec Dart côté client (https://hackernoon.com/end-to-end-testing-in-one- short-second-with-dart-e699c8146fd6 # .7vxjkync3 "Test de bout en bout en une courte seconde avec Dart")


À propos de ma propre histoire personnelle; peu de temps après avoir joué au Dart Developer Summit, j'ai rejoint l'équipe de Dart. En d'autres termes, j'ai moi-même «migré vers Dart».

Postscript

Quelques notes sur Réaction à cet article sur Reddit ..


En tant que bibliothèque tierce qui complète le SDK, Fluent Iterable, où stream fournit presque les mêmes fonctionnalités dans Java 8, n'était pas un bon exemple. Le prochain exemple de comparaison SDK qui me vient à l'esprit est la lecture de fichiers. Dans Dart, vous pouvez simplement écrire new File ('foo.txt'). ReadAsStringSync (), ou ʻawait new File ('foo.txt'). ReadAsString () ʻsi vous ne voulez pas faire de traitement synchrone. En Java, vous devez toujours rechercher la dernière écriture correcte.

Il est facile de donner un autre exemple, mais ce n’est pas surprenant. Dans le long chemin parcouru par les langages orientés objet, le SDK de Dart a été construit longtemps après la conception de l'API de Java.


Je tiens à souligner que cet article concerne la compilation de Dart vers JS pour les navigateurs. La migration que j'ai effectuée est de Java / GWT vers Dart.


Et enfin, je voudrais mentionner que Java est toujours ma deuxième langue préférée parmi les nombreuses langues avec lesquelles j'ai travaillé.

Recommended Posts

Pourquoi je suis passé de Java à Dart
[Python] Poésie que j'ai commencé & Impression que j'ai passé de Pipenv à la poésie
Je veux utiliser jar de python
Utilisez Python de Java avec Jython. J'étais aussi accro.
Je souhaite me connecter à PostgreSQL à partir de plusieurs langues
Je souhaite envoyer un e-mail depuis Gmail en utilisant Python.
[Python] Je veux gérer 7DaysToDie depuis Discord! 1/3
Somme de 1 à 10
Je veux faire des crises de ma tête
Je veux utiliser le solveur ceres de python
Ce que j'ai fait lors de la mise à jour de Python 2.6 vers 2.7
[Python] Je veux gérer 7DaysToDie depuis Discord! 2/3
Je veux créer du code C ++ à partir de code Python!
Un moyen simple d'appeler Java depuis Python
Je veux voir le nom de fichier de DataLoader
Je veux détecter des images de chats d'Instagram
J'ai essayé de détecter l'iris à partir de l'image de la caméra
Je voulais utiliser la bibliothèque Python de MATLAB
[Deep Learning from scratch] J'ai essayé d'expliquer le décrochage
Photogrammétrie vue d'OpenCV. (Pourquoi les piliers ont tendance à disparaître)
J'ai lu la référence Chainer (mise à jour de temps en temps)
Changements de Python 3.0 à Python 3.5
Changements de Python 2 à Python 3.0
Transition de WSL1 à WSL2
J'ai commencé à analyser
J'ai essayé de déboguer.
De l'édition à l'exécution
Pourquoi j'ai choisi Python
J'ai essayé d'extraire des caractères des sous-titres (OpenCV: édition tesseract-ocr)
J'ai essayé de créer une API list.csv avec Python à partir de swagger.yaml
[Mis à jour de temps en temps] Résumé des modèles de conception en Java
Je veux démarrer beaucoup de processus à partir de python
J'ai créé un outil pour créer un nuage de mots à partir de wikipedia
Je souhaite calculer le temps d'arrêt autorisé à partir du taux de fonctionnement
Je veux installer le package de requirements.txt avec poésie
Je souhaite envoyer un message de Python à LINE Bot
J'ai essayé d'énumérer les différences entre java et python
J'ai essayé de changer le script python de 2.7.11 à 3.6.0 sur Windows10
J'ai essayé d'implémenter Perceptron Part 1 [Deep Learning from scratch]
J'ai essayé d'obtenir diverses informations de l'API codeforces
Je vous ai fait exécuter des commandes depuis un navigateur WEB
J'ai essayé d'obtenir rapidement des données d'AS / 400 en utilisant pypyodbc