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
android
mvvm
data-binding
android-databinding
lzl124631x
quelle
quelle
Antworten:
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
xml
oder 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
annotations
generierten 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.
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.
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.
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 :)).
quelle
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.
quelle
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.
quelle