Ryan Wong
Ryan WongSenior Android Developer

Nie używaj Data Binding w Androidzie

Dowiedz się, dlaczego powinniśmy przestać używać Data Binding w Androidzie.
12.12.20234 min
Nie używaj Data Binding w Androidzie

Zajmowanie się wywołaniami findViewById() od pierwszego dnia podczas pracy nad Androidowymi UI opartymi na XML było prawdziwym koszmarem. Nieco później pojawiło się coś, co nazwaliśmy View Binding, aby uprościć proces, a następnie pojawiło się wiązanie danych (Data Binding), aby pobierać dane bezpośrednio z widoków XML.

Przewiduje się, że Data Binding i View Binding staną się mniej istotne w miarę przechodzenia na Jetpack Compose. Tak, nadszedł czas, aby odejść od tych metod. Są jednak starsze aplikacje na Androida, w których przejście z Javy na Kotlina może być w zasięgu, ale przepisanie interfejsów użytkownika w Jetpack Compose może być zbyt dużym wyzwaniem.

Gdybyśmy nadal musieli trzymać się Kotlina i widoków XML, należy rozważyć wady stosowania Data Binding. A jest ich trochę, szczególnie, że wiele osób postrzega tę technikę jako nieoptymalną i ciężką w utrzymaniu.

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">

    <data>
        <variable
            name="contact"
            type="com.something.databinding.ContactCard" />
        <variable
            name="presenter"
            type="com.something.databinding.ContactListActivityPresenter"/>
    </data>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        >
        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="@={contact.contactId}"
            />
        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="@={contact.contactName}"
            />

        <EditText
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="@={contact.contactOrganisation}" />

        <Button
            android:text="Show office address on map"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:onClick="@{() -> presenter.onShowMap(contact)}"
            android:id="@+id/button" />

        <Button
            android:text="Show call history"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:onClick="@{() -> presenter.showCallHistory()}"
            />

    </LinearLayout>
</layout>

Dlaczego kochamy Data Binding w Androidzie?

Lepsza czytelność kodu

Data Binding zmniejsza potrzebę stosowania kodu boilerplate'u i upraszcza implementację wzorca Model-View-ViewModel (MVVM). 

Większe bezpieczeństwo typowania

Data Binding zapewnia bezpieczeństwo typowania poprzez sprwadzenie typów danych w czasie kompilacji. Zmniejsza to prawdopodobieństwo wystąpienia błędów w runtime’ie i poprawia ogólną stabilność aplikacji.

Lepsza wydajność

Data Binding może poprawić wydajność aplikacji poprzez zmniejszenie liczby wywołań funkcji findViewById() i zmniejszenie kodu wymaganego do aktualizacji elementów UI.

Łatwa integracja z LiveData

Data Binding jest ściśle zintegrowane z LiveData, upraszczając implementację reaktywnych komponentów UI.

Wiązanie dwukierunkowe

Data Binding pozwala na dwukierunkowe wiązanie między UI a modelem danych, co ułatwia aktualizację danych w czasie rzeczywistym.

Jak Data Binding narusza niektóre zasady inżynierii oprogramowania?

Istnieją różne opinie na temat wykorzystania Data Binding w aplikacjach Androida.

Ściśle powiązany kod

Podczas gdy Data Binding może pomóc zmniejszyć kod boilerplate i uprościć aktualizacje UI, może również utrudnić debugowanie i sprawić, że baza kodu będzie bardziej silnie powiązana. Kiedy widzimy powód „silnie powiązana”, wiemy, że nie jest to coś, czego chcemy w uniknąć nowoczesnym świecie tworzenia oprogramowania - to również dlatego zrezygnowano z używania klas bazowych.

Separation of concerns

Separation of concerns to podstawowa zasada w inżynierii oprogramowania, która opowiada się za rozdzieleniem funkcjonalności na różne moduły, tak aby każdy moduł miał pojedynczą odpowiedzialność. Dzięki temu łatwiej jest utrzymać i przetestować kod.

W przypadku Data Binding może utrudnić czytanie i zrozumienie kodu, ponieważ łączy kod UI i kod manipulacji danymi. To z kolei może utrudnić debugowanie i utrzymanie kodu, zwłaszcza jeśli aplikacja jest złożona.

Trudniejsze do testowania i debugowania

Jak powtórzono dwukrotnie powyżej, ponieważ Data Binding jest kodem wygenerowanym, może być trudniejszy do debugowania w porównaniu do zwykłego kodu. Dodatkowo, ponieważ wygenerowany kod nie jest widoczny w projekcie, prześledzenie pojawiających się problemów może być trudne.

Testowanie jednostkowe kodu stworzonego poprzez Data Binding jest również stosunkowo trudniejsze.

Techniczne względy, aby nadal używać Data Binding

Należy zauważyć, że to do każdego zespołu należy rozważyć plusy i minusy i zdecydować, czy Data Binding to odpowiednie narzędzie dla ich potrzeb. Jednakże, mamy kilka dodatkowych technicznych kwestii, jeśli chcemy dalej używać wiązania danych (Data Binding) w starszym projekcie aplikacji w języku Kotlin z widokami XML.

Data Binding zależy od KAPT, ale to KSP jest przyszłością

Jako bardziej złożony niż View Binding, Data Binding wymaga dodatkowego generowania kodu i opiera się na KAPT.

KAPT jest w trybie utrzymania. JetBrains utrzymuje go na bieżąco z ostatnimi wydaniami Kotlina i Javy, ale nie ma planów dodania nowych funkcji. Obecnie zaleca się używanie API Kotlin Symbol Processing (KSP) do przetwarzania adnotacji.

Możemy korzystać z zalet wydajności KSP tylko wtedy, gdy w projekcie używamy wyłącznie KSP bez KAPT. Im dłużej Data Binding z nami zostanie, tym większa szansa, że stanie się przeszkodą. Ponieważ inne biblioteki polegające na KAPT będą stopniowo dostarczać wersję KSP i wycofywać wersję KAPT.

Data Binding jest również w trybie utrzymania

Jak ujawnił Google, Data Binding jest również w trybie utrzymania.

Google nie planuje wspierać KSP, ani nie zaleca używania Data Binding na tym etapie, ponieważ compose jest ich zalecanym rozwiązaniem UI.

Jeśli KAPT przestanie działać, Data Binding również przestanie działać.

Podsumujmy

Utrzymanie starszego projektu aplikacji może być trudne - albo zamrażamy wszystkie wersje bibliotek i zależności (lub nawet kompilatora Kotlin), aby upewnić się, że projekt nadal się kompiluje, albo poświęcamy trochę minimalnego wysiłku, aby utrzymać aktualne zależności, aby wspierać nowsze urządzenia z systemem Android i przestrzegać polityki Google Play, a to wszystko zależy od decyzji zespołu programistów.

Ponieważ widzimy, że KAPT staje się przestarzały, warto zweryfikować wykorzystanie Data Binding, jeśli starszy projekt aplikacji ma przetrwać dłużej bez migracji do Jetpack Compose.


Oryginał tekstu w języku angielskim przeczytasz tutaj.

<p>Loading...</p>