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

mon collègue et moi avons tous les deux de l'expérience dans MVVM de Web App, alors que nous sommes nouveaux à natif développement android. Maintenant, nous avons des opinions contraires sur la liaison de données android -- je suis un fan de celui-ci alors qu'il ne l'est pas.

Mes Arguments:

  • réduit le code boilerplate qui à son tour apporte
    • attelage réduit
    • meilleure lisibilité
  • puissant, facile à mettre en œuvre l'attribut personnalisé et la vue personnalisée
  • encore plus rapide que findViewById ( détails )

Ses Arguments:

  • auto-généré .classe 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 recueillir les avantages et les inconvénients de android de liaison de données.

Aspects de la discussion comprennent, mais ne sont pas limités à:

  • test unitaire
  • la taille de l'application
  • performance
  • courbe d'apprentissage
  • lisibilité
  • accouplement
24
demandé sur Community 2017-01-04 14:09:23

2 réponses

je vais commenter vos arguments d'abord puis je vais dire mon opinion:

1.Supprimer le code boilerplate - il va supprimer certains il va juste déplacer certains dans le xml ou il exigera des classes supplémentaires. Donc, vous devez être prudent et équilibrer l'utilisation de la liaison de données.

2.Lisibilité renforcée-dépend si vous êtes un nouveau développeur, alors vous pouvez trouver facile à apprendre, mais si vous avez déjà travaillé sur android, vous aurez besoin de temps supplémentaire pour l'apprendre.

3.Puissant - le code a plus de pouvoir, vous pouvez mettre en œuvre ce que vous voulez dans le code. Pensez - y comme ceci, tout ce que vous mettez en œuvre en utilisant data binding a un équivalent de code (il pourrait être plus long et plus de code à écrire), mais les revers ne sont pas valides.

4.Encore plus rapide que findViewById - comparer la vitesse entre ces deux, à mon avis est inutile, vous ne remarquerez jamais la différence, si vous voyez une certaine différence, puis l'un des la mise en œuvre est faux.

5.Génération automatique de classe - c'est vrai, il va augmenter la taille de l'application, mais seulement si vous avez des tonnes de cela il sera question. Il est vrai que sur le site android dev ils déclarent que c'est un peu mauvais d'utiliser des bibliothèques qui créent du code autogénéré ou annotations qui va générer du code supplémentaire.

6.Difficile à déboguer-dépend, comme la lisibilité, de ce à quoi vous êtes habitué, heck débogage est difficile dans tous les cas pour certains problèmes, et vous vous améliorerez en déboguant et non en utilisant une bibliothèque différente.

donc c'est pure mon opinion, j'ai développé beaucoup d'applications en utilisant différentes bibliothèques et différentes approches, et ils ont tous eu des avantages et des inconvénients, mais ce que j'ai appris: équilibrer tout, ne pas utiliser des tonnes de bibliothèques, ne pas perdre de temps à mettre en œuvre des choses qui sont déjà mis en œuvre et fonctionnent bien, ne pas" découpler tout", ne pas" coupler "tout, ne pas utiliser de code seulement, ne pas essayer de" générer " tout.

je pense que c'est tout à fait faux, et vous pouvez avoir une mauvaise idée, si vous demandez des 'Pour & Contre' à propos d'une bibliothèque/implémentation, parce que habituellement ce ne sera pas impartial, vous obtiendrez beaucoup de pour de quelqu'un qui a utilisé la bibliothèque d'une manière spécifique et cela a fonctionné et d'autres vous donneront des contre parce qu'ils ont utilisé différent 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 faire pour vous et décider si c'est bon pour votre installation. En d'autres termes, vous devez décider si une bibliothèque est bon pour vous pas d'autres personnes ;).

Mettre À Jour Le 8 Août 2018

tout d'Abord, je maintiens ma première conclusion, l'équilibre est la clé dans ce genre de situations, mais dans mon cas, la liaison de données d'accélérer un peu le processus de développement et aussi de l'améliorer. Voici quelques points que vous devriez considérer.

  1. tester L'UI -- avec data-binding il est beaucoup plus facile de tester L'UI, mais data-binding il ne suffit pas pour cela, vous avez également besoin d'une bonne architecture et en utilisant L'architecture proposée par Google montrera la puissance réelle de data-binding.

  2. les changements les plus visibles ont été indiqués aux points 2 et 5 de ma réponse initiale. Il était plus facile de lire le code après nous décidé utilisez data-binding, et la chose la plus importante ici est: nous en tant qu'équipe avons décidé que nous allons utiliser data-binding et après cela, nous nous attendions en quelque sorte à avoir la plupart de la configuration D'UI triviale et de base dans le fichier XML.

pour la partie débogage, voici un peu délicat, Android Studio a beaucoup à améliorer sur les erreurs et autocomplete pour la liaison de données, mais les erreurs les plus courantes que vous obtiendrez après les 2-3 premières occurrences. Aussi j'ai appris qu'un" projet propre " forme de temps en temps, aide beaucoup.

  1. un autre point que vous devrez prendre en considération est la configuration du projet pour utiliser data-binding, dès maintenant que (3.1) prend en charge par défaut data-binding (il suffit de mettre un drapeau dans graddle) pour Java, mais j'ai eu quelques problèmes avec Kotlin, après un peu de recherche ici, donc, j'ai réussi à tout corriger.

comme une deuxième conclusion( de mon post original), Si vous pouvez et l'échéance du projet/exigences/etc cela vous permet de tester la liaison de données, allez-y ça vaut (à moins que vous ne vraiment stupide de trucs :)) ).

21
répondu danypata 2018-08-08 19:04:16

même si j'aime la réponse de danypata je voudrais ajouter/éditer certaines de ses déclarations à la databinding android.

1.Supprimer le code de boilerplate - comme écrit dans la réponse de danypatas il supprime du code et ajoute du code ailleurs comme dans les layouts. Cela ne signifie pas que le boilercode n'est pas réduit parce qu'il est généralement réduit.

par exemple, vous pouvez vouloir créer un bindingadapter, qui gère plusieurs arrayadapters pour votre spinner / recyclerview/listview/.. mais ne nécessite qu'un simple adaptateur. Vous pouvez utiliser l'adaptateur dans votre mise en page en utilisant par exemple

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

maintenant vous pouvez créer votre adaptateur générique et (re)utiliser votre bindingadapter dans tous vos layouts au lieu d'utiliser par exemple:

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

ce n'est qu'un exemple simple qui récuse le code alot dans les grands projets. Un autre exemple pour recalculer le code est, que vous liez votre modèle à votre disposition. La mise à jour des valeurs de champ de votre modèle met généralement votre modèle à jour (si c'est au moins un champ observable/de base).

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

2.Lisibilité accrue - le temps supplémentaire consacré à l'apprentissage de la collecte de données n'a pas vraiment d'importance. Puisque les mises en page ne sont pas vraiment différent, sauf que vous enveloppez - les dans une étiquette de mise en page et mettez vos espaces de noms là, il ne diffère pas vraiment des layouts "réguliers". L'utilisation de bindingadapteurs et l'accès au modèle dans la disposition peut prendre un certain temps, mais habituellement vous pouvez commencer par les bases qui sont faciles et belles à utiliser ainsi. Apprendre de nouvelles choses prend toujours du temps, mais vous pourrez facilement réviser le temps lors de l'utilisation de databinding après un certain temps.

3.Puissant - Oui, son très puissant. Son plus facile pour réutiliser du code existant, réutiliser bindingadapters et peut conduire à plus de code généré, mais ce n'est pas toujours vrai. Par exemple, vous pouvez créer plusieurs cartes dans plusieurs classes au lieu de créer un bindingadapter, il peut être difficile pour "optimiser" plus tard. Optimiser le Bindingadapter signifie qu'il est mis à jour partout. L'optimisation peut diminuer les" lignes de code " puisque le boilerplace est réduit de toute façon.

j'accepte 4. et 5.

6. Difficile de déboguer car as 3.0 + outputs conseils utiles comme des problèmes de syntaxe dans votre mise en page (numéro de ligne et le fichier) son facile à déboguer le code généré par databinding. Si vous avez des problèmes pour trouver le numéro, vous pouvez également vérifier les erreurs dans le code généré. Certaines bibliothèques comme dagger 2 ou android architecture library peuvent vous confondre parce que les lignes d'erreur ne correspondent pas à la vraie "erreur". Ceci est dû au code généré par d'autres processeurs d'annotation. Si vous savez que ceux les processeurs d'annotation peuvent avoir des problèmes avec les sorties d'erreur des bases de données, vous pouvez facilement corriger cela.

7. Tests unitaires C'est possible comme si vous n'utilisez pas la reliure de données en utilisant des reliures exécutepending.

8. Lisibilité la lisibilité peut être meilleure sans reliure de données. Puisque vous mettez un peu de logique d'affaires dans votre mise en page, Certains dans votre code réel, il peut conduire à spaghetti-code. Un autre problème est que utiliser lambdas dans votre mise en page peut être très confus si le "layout-designer" ne sait pas quel param peut être utilisé.

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

Quand devez-vous utiliser quoi? pour projets de plus grande envergure c'est une très bonne idée d'utiliser la reliure de données avec le modèle mvvm ou mvp. C'est vraiment une solution propre et très facile à étendre. Si vous voulez juste créer une petite application simple, vous pouvez utiliser MVC Pattern sans databinding. Si vous avez des adaptateurs de Binding génériques existants qui peuvent être utilisés à partir d'autres projets, Vous pouvez vouloir utiliser la reliure de données, parce qu'il est facile de réutiliser ce code.

0
répondu Emanuel S 2017-08-20 03:01:53