Was sind die Vor- und Nachteile der Android-Datenbindung?

71

Sowohl mein Kollege als auch ich haben Erfahrung mit MVVM von Web App, während wir neu in der nativen Android-Entwicklung sind. Jetzt haben wir gegenteilige Meinungen über Android-Datenbindung - ich bin ein Fan davon, während er es nicht ist.

Meine Argumente:

  • Reduziert den Boilerplate-Code, der wiederum bringt
    • Weniger Kopplung
    • Stärkere Lesbarkeit
  • Leistungsstarke, einfach zu implementierende benutzerdefinierte Attribute und benutzerdefinierte Ansicht
  • Noch schneller als findViewById ( Details )

Seine Argumente:

  • Die automatisch generierte .class-Datei erhöht die App-Größe.
  • Schwieriger zu debuggen

Ich habe einige Nachforschungen angestellt, aber es gibt nicht viele Diskussionen darüber. Jetzt möchte ich die Vor- und Nachteile der Android-Datenbindung sammeln.

Zu den Diskussionsaspekten gehören unter anderem:

  • Gerätetest
  • App-Größe
  • Performance
  • Lernkurve
  • Lesbarkeit
  • Kupplung
lzl124631x
quelle
4
Ich fand diese Art von Diskussionen wirklich schön zu lernen, warum wurde sie nicht als eine Diskussion markiert, die eine Meinung ausdrückt, also ist das für SO nicht wert? Nizza
Lernmöglichkeit
Bitte lesen Sie diesen Artikel, in dem die Nachteile der Verwendung der Datenbindungsbibliothek erläutert werden. Man muss vorsichtig sein, wie viel Logik man in die XML-Datei einfügen möchte. Link zum Artikel medium.com/@hellotimmutton/…
Hitesh Bisht
Gute Frage in der Tat.
Malwinder Singh

Antworten:

55

Ich werde zuerst Ihre Argumente kommentieren und dann meine Meinung äußern:

1.Entfernen Sie den Boilerplate-Code - er entfernt einige, er verschiebt nur einige in der xmloder es werden zusätzliche Klassen benötigt. Sie müssen also vorsichtig sein und die Verwendung der Datenbindung ausbalancieren.

2. Stärkere Lesbarkeit - hängt davon ab, ob Sie ein neuer Entwickler sind, dann fällt es Ihnen vielleicht leicht, es zu lernen, aber wenn Sie zuvor an Android gearbeitet haben, benötigen Sie zusätzliche Zeit, um es zu lernen.

3. Leistungsstark - Der Code hat mehr Leistung. Sie können alles, was Sie möchten, in Code implementieren. Stellen Sie sich das so vor: Alles, was Sie mithilfe der Datenbindung implementieren, hat ein Code-Äquivalent (es kann länger und mehr Code zum Schreiben sein), aber die Umkehrung ist ungültig.

4.Selbst schneller als findViewById- ein Vergleich der Geschwindigkeit zwischen diesen beiden ist meiner Meinung nach nutzlos. Sie werden den Unterschied nie bemerken. Wenn Sie einen Unterschied feststellen, ist eine der Implementierungen falsch.

5.Auto generierte Klasse - es ist wahr, es wird die App-Größe erhöhen, aber wieder nur, wenn Sie Tonnen davon haben, wird es wichtig sein. Es ist wahr, dass auf der Android Dev-Website angegeben wird, dass es schlecht ist, Bibliotheken zu verwenden, die automatisch annotationsgenerierten Code erstellen oder zusätzlichen Code generieren.

6. Schwer zu debuggen - hängt, wie die Lesbarkeit, davon ab, was Sie gewohnt sind. Das Debuggen ist bei einigen Problemen in beiden Fällen schwierig, und Sie werden besser, wenn Sie debuggen und keine andere Bibliothek verwenden.

Das ist also meiner Meinung nach rein. Ich habe viele Apps mit unterschiedlichen Bibliotheken und Ansätzen entwickelt, und alle hatten Vor- und Nachteile, aber was ich gelernt habe: Alles ausbalancieren, nicht Tonnen von Bibliotheken verwenden, nicht verschwenden Zeit, Dinge zu implementieren, die bereits implementiert sind und gut funktionieren, nicht "alles entkoppeln", nicht alles "koppeln", nicht nur Code verwenden, nicht versuchen, alles "zu generieren".

Ich denke, es ist völlig falsch, und Sie können eine falsche Vorstellung bekommen, wenn Sie nach Vor- und Nachteilen für eine Bibliothek / Implementierung fragen, weil es normalerweise nicht unparteiisch ist, werden Sie viele Vorteile von jemandem bekommen, der das verwendet Bibliothek auf eine bestimmte Art und Weise und es hat funktioniert und andere werden Ihnen Nachteile geben, weil sie anders verwendet haben und es nicht funktioniert hat.

Abschließend denke ich, Sie sollten überprüfen, was die Bibliothek für Sie tun kann und was nicht, und entscheiden, ob es für Ihr Setup gut ist. Mit anderen Worten, Sie sollten entscheiden, ob eine Bibliothek für Sie gut ist, nicht für andere Personen;).

Update - 8. August 2018

Zunächst stehe ich immer noch zu meiner anfänglichen Schlussfolgerung: Ausgewogenheit ist der Schlüssel in solchen Situationen, aber in meinem Fall beschleunigt die Datenbindung den Entwicklungsprozess ein wenig und verbessert ihn auch. Hier sind einige neue Punkte, über die Sie alle nachdenken sollten.

  1. Testen der Benutzeroberfläche - Mit der Datenbindung ist es viel einfacher, die Benutzeroberfläche zu testen, aber die Datenbindung reicht dafür nicht aus. Sie benötigen auch eine gute Architektur. Die Verwendung der von Google vorgeschlagenen Architektur zeigt die tatsächliche Leistungsfähigkeit der Datenbindung.

  2. Die sichtbarsten Änderungen wurden für die Punkte 2 und 5 gegenüber meiner ursprünglichen Antwort bereitgestellt. Es war einfacher, den Code zu lesen, nachdem wir uns für die Datenbindung entschieden hatten , und das Wichtigste dabei ist: Wir als Team haben beschlossen, die Datenbindung zu verwenden, und danach haben wir erwartet, dass wir den größten Teil davon haben das triviale und grundlegende UI-Setup in der XML-Datei.

Für den Debugging-Teil, der hier etwas knifflig ist, muss Android Studio die Fehler erheblich verbessern und die Datenbindung automatisch vervollständigen. Die häufigsten Fehler treten jedoch nach den ersten 2-3 Vorkommen auf. Außerdem habe ich gelernt, dass ein "sauberes Projekt" von Zeit zu Zeit VIEL hilft.

  1. Ein weiterer Punkt, den Sie berücksichtigen müssen, ist die Projektkonfiguration für die Verwendung der Datenbindung. Derzeit unterstützt AS (3.1) standardmäßig die Datenbindung (setzen Sie einfach ein Flag in Grad) für Java, aber ich hatte einige Probleme mit Kotlin, nach ein bisschen Suche hier auf SO habe ich es geschafft, alles zu reparieren.

Als zweite Schlussfolgerung (aus meinem ursprünglichen Beitrag), wenn Sie können und die Projektfrist / Anforderungen / etc es Ihnen ermöglicht, Datenbindung zu versuchen, wird es sich lohnen (es sei denn, Sie machen einige wirklich dumme Sachen :)).

danypata
quelle
2
Ein RIESIGER Nachteil im Moment - die aktuelle Implementierung (Bibliothek + Android Studio 2.2.3 auf Mac) ist unzuverlässig. Ich habe immer noch Probleme mit IDE-Fehlern (Fehler im Code werden angezeigt, aber das Projekt wird kompiliert, Fehler bleiben bestehen, bis Sie die IDE erneut öffnen), Probleme mit der automatischen Vervollständigung in XML-Layoutdateien, gelegentliche Fehler beim Generieren von Klassen usw. Es ist sehr ärgerlich.
Jan Slominski
Vielen Dank für Ihren Kommentar! Wie Sie bereits gesagt haben, ist es besser, alles ins Gleichgewicht zu bringen, als extrem zu werden. Der Grund, warum ich nach Vor- und Nachteilen frage, ist, dass ich mehr Einblicke von Entwicklern haben möchte, die mehr Erfahrung mit der Bindung von Android-Daten haben, und ich hoffe, dass ich es selbst ausgleichen kann :) Vielen Dank für Ihren Rat und ich werde Schauen Sie sich die Dokumente genauer an, was es kann und was nicht.
lzl124631x
Ich könnte dieser Antwort nicht mehr zustimmen. Der Schlüssel ist, alles auszugleichen. Natürlich ist es viel schwieriger als extrem zu werden. Wie man sagt, ist Engineering eine Kunst, Kompromisse einzugehen. Dasselbe gilt auch für viele Dinge im Leben: Anfänger sehen nur Schwarz und Weiß, weise Menschen sehen Graustufen.
Huyc
während der Verwendung von Daten binidng. Ich stehe vor Problemen, da das Generieren von Viewbinding-Ressourcen viel Zeit in Anspruch nimmt. Warum ist das so? Wie kann das Binden von Viewbinding generiert oder aktualisiert werden?
Ramesh_D
@Ramesh_D Ich hatte dieses Problem bisher nicht, es gibt Zeiten, in denen ich Tippfehler mache und die Bindungen nicht generiert werden. Aber seien Sie geduldig, dies ist eine fortlaufende Funktion, die sich im Laufe der Zeit verbessern wird.
Danypata
8

Auch wenn mir die Antwort von danypata gefällt, möchte ich einige seiner Aussagen zur Android-Datenbindung hinzufügen / bearbeiten.

1.Kesselplattencode entfernen - Wie in danypatas answer geschrieben, wird Code entfernt und an anderer Stelle Code hinzugefügt, wie in Layouts. Das bedeutet nicht, dass der Boilercode nicht reduziert wird, weil er normalerweise reduziert wird.

Beispielsweise möchten Sie möglicherweise einen Bindungsadapter erstellen, der mehrere benutzerdefinierte Arrayadapter für Ihren Spinner / recyclerview / listview / .. verarbeitet, jedoch nur einen einfachen Adapter benötigt. Möglicherweise möchten Sie den Adapter in Ihrem Layout verwenden, indem Sie z

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

Jetzt können Sie Ihren generischen Adapter erstellen und Ihren Bindungsadapter in allen Layouts (wieder) verwenden, anstatt beispielsweise Folgendes zu verwenden:

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

Dies ist nur ein einfaches Beispiel, das den Code in größeren Projekten häufig enthält. Ein weiteres Beispiel für das Wiederholen von Code ist, dass Sie Ihr Modell an Ihr Layout binden. Durch das Aktualisieren der Feldwerte Ihres Modells wird normalerweise auch Ihr Modell aktualisiert (sofern es sich mindestens um ein BaseObservable / ObservableField handelt).

Das bedeutet, dass Sie nicht alle Ihre Ansichten finden, Ihre Ansichten aktualisieren, Ihre Modelle aktualisieren müssen, ...

2. Stärkere Lesbarkeit - Die zusätzliche Zeit, die für das Erlernen der Datenbindung aufgewendet wird, spielt keine Rolle. Da sich die Layouts nicht wirklich unterscheiden, außer dass Sie sie in ein Layout-Tag einbinden und Ihre Namespaces dort platzieren, unterscheidet es sich nicht wirklich von "normalen" Layouts. Die Verwendung von Bindungsadaptern und der Zugriff auf das Modell im Layout kann einige Zeit dauern. In der Regel können Sie jedoch mit den Grundlagen beginnen, die auch einfach und ansprechend zu verwenden sind. Das Erlernen neuer Inhalte erfordert immer Zeit, aber Sie können die Zeit für die Verwendung der Datenbindung nach einer Weile leicht überarbeiten.

3. Kraftvoll - Ja, es ist sehr mächtig. Es ist einfacher, vorhandenen Code wiederzuverwenden, vorhandene Bindungsadapter wiederzuverwenden und kann zu mehr generiertem Code führen, aber das ist nicht immer wahr. Beispielsweise können Sie mehrere Adapter in mehreren Klassen erstellen, anstatt einen Bindungsadapter zu erstellen. Es kann schwierig sein, ihn später zu "optimieren". Durch die Optimierung des Bindungsadapters wird dieser überall aktualisiert. Durch die Optimierung können die "Codezeilen" verringert werden, da der Kesselplatz ohnehin verkleinert wird.

Ich stimme 4. und 5 zu.

6. Schwer zu debuggen Da AS 3.0+ nützliche Hinweise wie Syntaxprobleme in Ihrem Layout (Zeilennummer und Datei) ausgibt, ist es einfach, generierten Code für die Datenbindung zu debuggen. Wenn Sie Probleme haben, das Problem zu finden, möchten Sie möglicherweise auch den generierten Code auf Fehler überprüfen. Einige Bibliotheken wie Dolch 2 oder Android-Architekturbibliothek können Sie verwirren, da die Fehlerzeilen nicht mit dem tatsächlichen "Fehler" übereinstimmen. Dies ist auf generierten Code zurückzuführen, der von anderen Anmerkungsprozessoren generiert wurde. Wenn Sie wissen, dass diese Anmerkungsprozessoren möglicherweise Probleme mit der Ausgabe von Datenbindungsfehlern haben, können Sie dies leicht beheben.

7. Unit-Tests Es ist möglich, wenn Sie die Datenbindung nicht mithilfe von executePendingBindings verwenden.

8. Lesbarkeit Die Lesbarkeit ist möglicherweise ohne Datenbindung besser. Da Sie einige Geschäftslogiken in Ihr Layout und einige in Ihren realen Code einfügen, kann dies zu Spaghetti-Code führen. Ein weiteres Problem ist, dass die Verwendung von Lambdas in Ihrem Layout sehr verwirrend sein kann, wenn der "Layout-Designer" nicht weiß, welcher Parameter verwendet werden kann.

Ein weiteres sehr großes Problem ist, dass der Bindungsadapter überall sein kann. Mit der Annotation BindingAdapter wird der Code generiert. Das bedeutet, dass die Verwendung in Ihrem Layout zu Problemen bei der Suche nach dem richtigen Code führen kann. Wenn Sie einen Bindungsadapter aktualisieren möchten, müssen Sie ihn "finden".

Wann sollten Sie was verwenden? Für größere Projekte ist es eine gute Idee, die Datenbindung zusammen mit dem MVVM- oder MVP-Muster zu verwenden. Dies ist eine wirklich saubere Lösung und sehr einfach zu erweitern. Wenn Sie nur eine kleine einfache Anwendung erstellen möchten, können Sie MVC Pattern ohne Datenbindung verwenden. Wenn Sie über generische Bindungsadapter verfügen, die aus anderen Projekten verwendet werden können, möchten Sie möglicherweise die Datenbindung verwenden, da dieser Code leicht wiederverwendet werden kann.

Emanuel S.
quelle
4

Ich arbeite an einem riesigen Android-Projekt und das Team hat beschlossen, die Datenbindungsbibliothek auslaufen zu lassen. Warum? Der Hauptgrund ist, dass die Erstellungszeit (über 10 Minuten) verkürzt wird, indem im Erstellungsprozess viele Klassen generiert werden.

DYS
quelle
Wenn Ihr Team nicht in der Lage ist, einen Erstellungsprozess zu optimieren und eine Bibliothek zu exportieren, haben Sie möglicherweise ein anderes Problem als die Verwendung der Datenbindung. :-)
Emanuel S