Hola, soy Miguel y aquí les traigo otro post.
La biblioteca de enlace de datos existe desde hace bastante tiempo, sin embargo, no son muchos los desarrolladores que la utilizan.
Una de las principales razones detrás de esta falta de adopción es la creencia de que resulta en un código incuestionable.
Sin embargo, cuando se usa correctamente puede hacer que probar el código sea más fácil, mientras que también aumenta la reutilización del código.
En este artículo revisaremos algunos ejemplos para ver cómo podemos usar la vinculación de datos de manera efectiva para lograr esto y qué evitar hacer.
Separar la lógica de vista de la lógica de presentación
Un caso de uso común que encontramos en la mayoría de los proyectos es el manejo de la visibilidad de una vista. Normalmente, alguien escribiría un código como el siguiente para manejar esto.
class MainActivity : Activity() { ... private fun viewLogic() { if (data == null) { someView.visibility = View.GONE } } ... }
Este enfoque da como resultado un código que es difícil de probar y requiere Robolectric o Espresso.
Sin embargo, la lógica de la condición if
, datos == nulo
, es lógica de presentación y se puede mover al modelo de vista donde se puede probar fácilmente. Después de hacerlo, el código se ve así.
class MainActivity : Activity() { ... private fun viewLogic() { if (!hasData) { someView.visibility = View.GONE } } ... }
class MainViewModel(...) { ... private fun someFun(...) { _hasData.value = data != null } ... }
Sin embargo, probar la lógica de vista restante todavía no es fácil, ya que el código permanece en nuestra Actividad. Sin embargo, con el enlace de datos, este fragmento de código puede volverse reutilizable y fácil de probar.
Pero primero echemos un vistazo a cómo alguien podría usar el enlace de datos de manera inapropiada al usar el lenguaje de expresión proporcionado por la biblioteca en xml.
<layout xmlns:android="http://schemas.android.com/apk/res/android"> ... <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/ic_logo" android:visibility="@{viewModel.hasData ? View.VISIBLE : View.GONE}" /> ... </layout>
Este código no se puede probar por unidad ni se puede reutilizar. El lenguaje de expresión tiene algunos casos de uso específicos, sin embargo, este no es uno de ellos y no debe usarse en la mayoría de los casos.
En su lugar, deberíamos utilizar otra característica de enlace de datos llamada Adaptadores de enlace. Al hacer uso de ellos, el código ahora se verá así.
<layout xmlns:android="http://schemas.android.com/apk/res/android"> ... <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/ic_logo" app:isVisible="@{viewModel.hasData}" /> ... </layout>
class BindingAdapters { @BindingAdapter("isVisible") fun isVisible(view: View, value: Boolean) { view.visibility = if (value) VISIBLE else GONE } }
La lógica de la vista ahora se ha movido a la clase BindingAdapters
y ahora también es reutilizable.
Ahora también es mucho más fácil de probar con Robolectric
o una biblioteca simulada como MockK
, ya que no está vinculado a un ciclo de vida de Actividad o Fragmento.
Los enlaces en el xml
también se pueden probar creando algunas pruebas de instrumentación ligeras y rápidas de ejecutar.
@RunWith(AndroidJUnit4::class) class MainActivityBindingsTest { ... @Test @UiThreadTest fun testMainState() { val binding = ActivityMainBinding.inflate(targetContext) binding.viewModel = CountDownViewModelImpl(GetData(...)) binding.executePendingBindings() assertEquals(binding.imageView.visibility, View.GONE) } }
Al igual que con todas las herramientas, para que sea eficaz debe utilizarse correctamente. Siguiendo algunas reglas simples al usar el enlace de datos, su código puede ser más fácil de probar y reutilizar, lo que también resulta en una base de código que es más fácil de mantener.
Gracias por leer este post y feliz codificación.
Añadir comentario