Índice

En ingeniería de software, un patrón de diseño es un problema que se plantea habitualmente en el diseño de software. Un patrón de diseño no es un diseño final que pueda transformarse directamente en código resuelto.

Uno de los principales problemas en el desarrollo de software es el estrecho acoplamiento del código, es decir, que incluso un pequeño cambio en una parte del código provoca modificaciones o errores en alguna otra parte del código. El código no está preparado para las pruebas unitarias y no es reutilizable.

Introducción

Actualmente existen muchos enfoques arquitectónicos como MVP, FLUX, MVI, MVVM que están resolviendo los problemas anteriores. Podemos utilizar cualquier enfoque para mantener nuestro código correctamente para que todo funcione bien, en definitiva, una vida feliz desarrollador. Este artículo discute el patrón de diseño MVVM en android y cómo podemos resolver los problemas existentes con el patrón de diseño MVVM.

Los principales componentes del patrón de diseño MVVM son :

  1. View - Informa al ViewModel sobre las acciones del usuario
  2. ViewModel - Expone flujos de datos relevantes para la Vista
  3. DataModel - Resume la fuente de datos. El ViewModel trabaja con el DataModel para obtener y guardar los datos.

Breve explicación del patrón de diseño MVVM

Google introdujo Android Architecture Components, que incluía ViewModel en lugar de Presenter y de ahí la prueba de que incluso Google está apoyando MVVM.

ViewModel

Los ViewModels son clases simples que interactúan con la capa lógica/modelo y exponen estados/datos y no tienen idea de quién o cómo serán consumidos esos datos. Sólo View(Activity) hace referencia a ViewModel y no viceversa; esto resuelve nuestro problema de acoplamiento estrecho. Una sola vista puede tener una referencia a múltiples ViewModels.

➡️
public class MainViewModel extends ViewModel {public MainViewModel() {}public String getText() {return new DataModel().getText();}}View

En Android, la actividad representa una vista en el patrón de diseño MVVM. La vista es responsable de la presentación visual de las aplicaciones y de la entrada de datos por parte de los usuarios. Esta parte no debe procesar los datos bajo ninguna circunstancia. Su función es sólo para detectar la entrada como el tacto o swipe y visualización.

El patrón arquitectónico ModelView-ViewModel se introdujo en Android con el nacimiento de la librería DataBinding. Puedes habilitar data-binding desde el app.gradle.

➡️
dataBinding{enabled = true}

Add these lines in-app.Gradle inside android{} tag. Then put your XML layout code under tag. This will generate a binding class, and you can access this class from the activity. You can see we can directly access the getText() method from XML.

➡️
<?xml version="1.0" encoding="utf-8"?><layout><data><variablename="mainViewModel"type="com.g.mvvmproject.MainViewModel" /></data><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity"><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="@{mainViewModel.text}"app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintLeft_toLeftOf="parent"app:layout_constraintRight_toRightOf="parent"app:layout_constraintTop_toTopOf="parent" /></RelativeLayout></layout>

Tras la inactividad de setContentView se establece una referencia del modelo de vista.

➡️
public class MainActivity extends AppCompatActivity {private ActivityMainBinding mActivityMainBinding;private MainViewModel mainViewModel;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);mActivityMainBinding = DataBindingUtil.setContentView(this, R.layout.activity_main);mainViewModel = new MainViewModel();mActivityMainBinding.setMainViewModel(mainViewModel);}}

Modelo de datos

DataModel contiene los datos de la aplicación. No puede hablar directamente con la Vista. Generalmente, se recomienda exponer los datos al ViewModel a través de Observables.

➡️
public class DataModel {String text="Hello World ";public String getText() {return text + text;}}

Ventajas de utilizar el patrón de diseño MVVM

  • Aumenta la posibilidad de probar el código.

En el siguiente fragmento de código, probamos el método getText() en ViewModel. Puede simular sus datos y comprobar el resultado esperado.

➡️
@RunWith(AndroidJUnit4.class)public class ExampleInstrumentedTest {@Testpublic void emailValidator_CorrectEmailSimple_ReturnsTrue() {String expected = "Hello World Hello World ";assertEquals(expected, new MainViewModel().getText());}}
  • Tu código está desacoplado.
  • La estructura de paquetes es aún más fácil de navegar.
  • El proyecto es aún más fácil de mantener.
  • Su equipo puede añadir nuevas funciones con mayor rapidez.

Conclusión

MVVM combina las ventajas de la separación de intereses que proporciona MVP, al tiempo que aprovecha las ventajas de los enlaces de datos. El resultado es un patrón en el que el modelo dirige tantas operaciones como sea posible, minimizando la lógica en la vista.

➡️
Un ejemplo sencillo de la implementación de MVVM se puede encontrar aquí.

Srinivasa Sainath

Srinivasa Sainath