web-dev-qa-db-fra.com

Quels sont les avantages et les inconvénients de la liaison de données Android?

Mon collègue et moi avons de l'expérience dans MVVM de Web App, alors que nous sommes nouveaux dans le développement natif Android. Maintenant, nous avons des opinions contraires sur Android data- contraignant - j'en suis fan tant qu'il ne l'est pas.

Mes arguments:

  • Réduit le code passe-partout qui à son tour apporte
    • Moins de couplage
    • Meilleure lisibilité
  • Attribut personnalisé et affichage personnalisé puissants et faciles à mettre en œuvre
  • Encore plus rapide que findViewById ( détails )

Ses arguments:

  • Le .class généré automatiquement augmente la taille de l'application.
  • Plus difficile à déboguer

J'ai fait une enquête mais il n'y a pas beaucoup de discussions à ce sujet. Maintenant, je veux collecter les avantages et les inconvénients de la liaison de données Android.

Les aspects de la discussion comprennent, sans s'y limiter:

  • test de l'unité
  • taille de l'application
  • performance
  • courbe d'apprentissage
  • lisibilité
  • couplage
45
lzl124631x

Je commenterai d'abord vos arguments puis je donnerai mon avis:

1.Supprimez le code passe-partout - il en supprimera certains, il en déplacera juste quelques-uns dans le xml ou nécessitera des classes supplémentaires. Vous devez donc être prudent et équilibrer l'utilisation de la liaison de données.

2.Une meilleure lisibilité - cela dépend si vous êtes un nouveau développeur, il vous sera peut-être facile de l'apprendre, mais si vous avez déjà travaillé sur Android, vous aurez besoin de plus de temps pour l'apprendre.

3.Puissant - le code a plus de puissance, vous pouvez implémenter ce que vous voulez dans le code. Pensez-y comme ceci, tout ce que vous implémentez à l'aide de la liaison de données a un équivalent de code (il peut être plus long et plus de code à écrire), mais l'inverse n'est pas valide.

4.Même plus rapide que findViewById - en comparant la vitesse entre ces deux, à mon avis est inutile, vous ne remarquerez jamais la différence, si vous voyez une différence, alors l'une des implémentations est incorrecte.

5. Classe générée automatiquement - il est vrai que cela augmentera la taille de l'application, mais encore une fois seulement si vous en avez des tonnes, cela importera. Il est vrai que sur le site Web de développement Android Android), ils déclarent qu'il est plutôt mauvais d'utiliser des bibliothèques qui créent du code généré automatiquement ou annotations qui générera du code supplémentaire.

Difficile à déboguer - dépend, comme la lisibilité, de ce à quoi vous êtes habitué, diable le débogage est difficile dans tous les cas pour certains problèmes, et vous obtiendrez de meilleurs résultats en déboguant pas en utilisant une bibliothèque différente.

Donc, c'est pur mon avis, j'ai développé de nombreuses applications en utilisant différentes bibliothèques et différentes approches, et elles avaient toutes des avantages et des inconvénients, mais ce que j'ai appris: équilibrez tout, n'utilisez pas des tonnes de bibliothèques, ne gaspillez pas temps à implémenter des choses qui sont déjà implémentées et qui fonctionnent bien, ne "découplez pas tout", ne "couplez" pas tout, n'utilisez pas seulement du code, n'essayez pas de "générer" tout.

Je pense que c'est tout à fait faux, et vous pouvez vous faire une mauvaise idée, si vous demandez des `` avantages et inconvénients '' à propos d'une bibliothèque/implémentation, car généralement ce ne sera pas impartial, vous obtiendrez beaucoup de pros de la part de quelqu'un qui a utilisé le bibliothèque d'une manière spécifique et cela a fonctionné et d'autres vous donneront des inconvénients car ils ont utilisé différents et cela n'a pas fonctionné.

Donc en conclusion, je pense que vous devriez vérifier ce que la bibliothèque peut faire pour vous et ce qui ne peut pas le faire et décider si c'est bon pour votre configuration. En d'autres termes, vous devez décider si une bibliothèque est bonne pour vous, pas pour les autres;).

Mise à jour - 8 août 2018

Tout d'abord, je reste fidèle à ma conclusion initiale, l'équilibre est la clé dans ce genre de situations, mais dans mon cas, la liaison de données accélère un peu le processus de développement et l'améliore également. Voici quelques nouveaux points auxquels vous devriez tous réfléchir.

  1. Test de l'interface utilisateur - avec la liaison de données, il est beaucoup plus facile de tester l'interface utilisateur, mais la liaison de données n'est pas suffisante pour cela, vous avez également besoin d'une bonne architecture et l'utilisation de l'architecture suggérée par Google montrera la puissance réelle de la liaison de données.

  2. Les changements les plus visibles ont été fournis pour les points 2 et 5 de ma réponse d'origine. Il était en quelque sorte plus facile de lire le code après que nous avons décidé d'utiliser la liaison de données, et la chose la plus importante ici est: nous, en équipe, avons décidé que nous utiliserons la liaison de données et après cela, nous nous attendions à avoir la plupart de la configuration de l'interface utilisateur triviale et de base dans le fichier XML.

Pour la partie de débogage, voici un peu délicat, Android Studio a beaucoup à améliorer sur les erreurs et la saisie semi-automatique pour la liaison de données, mais les erreurs les plus courantes que vous obtiendrez après la première 2 à 3 occurrences. J'ai également appris qu'un "projet propre", de temps en temps, aide BEAUCOUP.

  1. Un autre point que vous devrez prendre en considération est la configuration du projet pour utiliser la liaison de données, en ce moment AS (3.1) prend en charge la liaison de données par défaut (il suffit de définir un indicateur dans graddle) pour Java, mais j'ai eu quelques problèmes avec Kotlin, après un peu de recherche ici sur SO, j'ai réussi à tout réparer.

Comme deuxième conclusion (de mon message d'origine), si vous le pouvez et que la date limite/exigences/etc du projet vous permet d'essayer la liaison de données, allez-y, cela vaudra (sauf si vous faites des trucs vraiment stupides :))).

36
danypata

Même si j'aime la réponse de danypata, je voudrais ajouter/modifier certaines de ses déclarations dans Android databinding.

1.Supprimez le code passe-partout - Comme écrit dans la réponse danypatas, il supprime du code et ajoute du code ailleurs comme dans les mises en page. Cela ne signifie pas que le code de la chaudière n'est pas réduit, car il est généralement réduit.

Par exemple, vous pouvez créer un adaptateur de liaison, qui gère plusieurs adaptateurs de tableau personnalisés pour votre spinner/recyclerview/listview/.. mais ne nécessite qu'un seul adaptateur simple. Vous pouvez utiliser l'adaptateur dans votre mise en page en utilisant par exemple.

app:myCoolAdaptersData="@{model.mydata}"

Vous pouvez maintenant créer votre adaptateur générique et (ré) utiliser votre adaptateur de liaison dans toutes vos dispositions au lieu d'utiliser par exemple:

ListView lv = findViewById(...);
CoolGenericAdapter<MyModel> coolAdapter = new CoolGenericAdapter<>(...);
lv.setAdapter(coolAdapter);

Ceci est juste un exemple simple qui reprend le code beaucoup dans des projets plus importants. Un autre exemple pour réduire le code est que vous liez votre modèle à votre disposition. La mise à jour des valeurs de champ de votre modèle met également à jour votre modèle (s'il s'agit au moins d'un BaseObservable/ObservableField).

Cela signifie que vous n'avez pas besoin de trouver toutes vos vues, de mettre à jour vos vues, de mettre à jour vos modèles, ...

2. lisibilité accrue - Le temps supplémentaire consacré à l'apprentissage de la liaison de données n'a pas vraiment d'importance. Puisque les dispositions ne sont pas vraiment différentes, sauf que vous les enveloppez dans une balise de disposition et y mettez vos espaces de noms, cela ne diffère pas vraiment des dispositions "normales". L'utilisation d'adaptateurs de liaison et l'accès au modèle dans la mise en page peuvent prendre un certain temps, mais vous pouvez généralement commencer par commencer par les bases qui sont faciles et belles à utiliser également. Apprendre de nouvelles choses prend toujours du temps, mais vous pourrez facilement réviser le temps lors de l'utilisation de la liaison de données après un certain temps.

.Powerful - Oui, c'est très puissant. Il est plus facile de réutiliser le code existant, de réutiliser les adaptateurs de liaison existants et peut conduire à plus de code généré, mais ce n'est pas toujours vrai. Par exemple, vous pouvez créer plusieurs adaptateurs dans plusieurs classes au lieu de créer un adaptateur de liaison, il peut être difficile de "l'optimiser" ultérieurement. L'optimisation de l'adaptateur de liaison signifie qu'il est mis à jour partout. L'optimisation peut diminuer les "lignes de code" puisque la chaudière est de toute façon réduite.

J'accepte les 4. et 5.

6. Difficile à déboguer Puisque AS 3.0+ génère des conseils utiles comme des problèmes de syntaxe dans votre mise en page (numéro de ligne et fichier), son code généré par liaison de données est facile à déboguer. Si vous rencontrez des problèmes pour trouver le problème, vous pouvez également rechercher des erreurs dans le code généré. Certaines bibliothèques comme dagger 2 ou Android peut vous confondre car les lignes d'erreur ne correspondent pas à la véritable "erreur". Cela est dû au code généré par d'autres processeurs d'annotation. Si vous savez que cette annotation les processeurs peuvent avoir des problèmes avec les sorties d'erreur des liaisons de données, vous pouvez facilement résoudre ce problème.

7. Test unitaire C'est possible comme si vous n'utilisez pas la liaison de données en utilisant executePendingBindings.

8. Lisibilité La lisibilité peut être meilleure sans liaison de données. Étant donné que vous mettez une logique métier dans votre mise en page, une partie dans votre code réel, cela peut conduire à du code spaghetti. Un autre problème est que l'utilisation de lambdas dans votre disposition peut être très confuse si le "concepteur de disposition" ne sait pas quel paramètre peut être utilisé.

Un autre très gros problème est que l'adaptateur de liaison peut être partout. L'utilisation de l'annotation BindingAdapter génère le code. Cela signifie que son utilisation dans votre mise en page peut entraîner des problèmes pour trouver le code approprié. Si vous souhaitez mettre à jour un adaptateur de liaison, vous devez le "trouver".

Quand devez-vous utiliser quoi? Pour les projets plus importants, c'est une très bonne idée d'utiliser la liaison de données avec le modèle mvvm ou mvp. Il s'agit d'une solution vraiment propre et très facile à étendre. Si vous voulez simplement créer une petite application simple, vous pouvez très bien utiliser MVC Pattern sans liaison de données. Si vous disposez d'adaptateurs de liaison génériques existants qui peuvent être utilisés à partir d'autres projets, vous souhaiterez peut-être utiliser la liaison de données, car il est facile de réutiliser ce code.

2
Emanuel S

Je travaille sur un énorme projet Android et l'équipe a décidé d'éliminer progressivement la bibliothèque de liaison de données. Pourquoi? La principale raison est qu'elle exacerbe le temps de construction (10+ minutes), en générant un beaucoup de classe dans le processus de construction.

0
DYS