[.NET] Principio de Segregación de Interfaces (I)

Antes de ir al meollo del asunto quiero hacerles recordar que estos Principios de Diseño Orientado a Objetos son solo sugerencias para tener un código ordenado y de fácil mantenimiento, no son ninguna suerte de mandato o de obligatoria práctica, listo continuemos.

Estoy seguro que en más de una ocasión han visto algo así:

No se preocupen, ver uno o dos puede ser normal, pero tener muchas clases similares a la siguiente, puede significar que hay algo que podemos mejorar.

Cuando diseñamos aplicaciones debemos tener cuidado en como es que vamos a trabajar con interfaces ya que si bien nos pueden ayudar a abstraer varios módulos, un uso inadecuado puede llevarnos a forzar la implementación de métodos o funciones que realmente no usaremos. Ahora conozcamos el Principio de Segregación de Interfaces, el cual sostiene lo siguiente:

Los clientes de un programa dado sólo deberían conocer de éste aquellos métodos que realmente usan, y no aquellos que no necesitan usar.

Entonces, algo muy práctico que podríamos hacer, para esta ocasión, es segregar estas operaciones de la siguiente manera:

Y de esta forma, volviendo a nuestro ejemplo, tendríamos algo así:

Hemos dado un paso y sé que la ausencia de la interfaz IRepository podría traer algunas dudas, probablemente algunos se hayan dado cuenta que hemos tomado como ejemplo una suerte de implementación del Patrón de Repositorio ó Repository Pattern y he hecho esto intencionalmente porque quiero compartirles que existe una estrecha relación entre la inadecuada implementación de un patrón de diseño con el hecho de infringir un principio de diseño, pero ya será en otra ocasión dónde comparta más sobre este patrón.

Ahora lo que quiero hacer es compartir otro ejemplo, uno que responde al Principio de Segregación de Interfaces, pero desde otro punto de partida. Supongamos una clase que hace una serie de operaciones de utilidad.

Si recordamos, esta clase no esta cumpliendo con el Principio de Responsabilidad Única, pero en vez de crear nuevas clases para este ejemplo, crearemos un par de interfaces del siguiente modo:

De tal manera que podríamos tener, por ejemplo, con la implementación de una de ellas (ILogger.cs) una alternativa para cada ocasión que se requiera ya se que tengamos o no acceso a internet o necesitemos un mayor o menor nivel de confidencialidad o respuesta. En cualquier parte de nuestro sistema.

Y eso es todo amigos, queda pendiente el último principio de diseño orientado a objetos y el patrón de repositorio.

[.NET] Principio de Sustitución de Liskov (L)

Puede ser una pregunta extraña, pero ¿qué tan guitarra es una guitarra eléctrica? A diferencia que en la vida diaria, esta interrogante sí toma cierta relevancia al tratarse del diseño de un sistema informático y es que, al momento de Tocar(), ambas tienen un comportamiento muy distinto.

Mientras que la guitarra común o acústica solo depende de su caja de resonancia para emitir efectivamente un sonido.

La guitarra eléctrica depende del efecto faraday y un amplificador.

Para todas estas situaciones es importante tener en claro el Principio de Sustitución de Liskov, el cual sostiene lo siguiente:

Los subtipos deben ser sustituibles por sus tipos base.

En el anterior ejemplo nos podemos dar con el inconveniente de que al momento de tocar tengamos algunos resultados inesperados, como le hecho de que una sí suene según lo esperado y la otra no se escuche casi nada porque falta amplificar.

Podemos tener un código que tenga la responsabilidad única de validar el tipo y que ejecute el procedimiento correspondiente.

Pero en el ejemplo anterior solo tenemos un subtipo ¿Qué pasaría si hay más? Bajo esta idea podriamos tener una clase padre llamada Instrumento.cs y ocurriría lo siguiente.

Definitivamente esta clase Player.cs no es adecuada ya que es difícil de mantener y agrega una complejidad innecesaria. Por lo tanto, la solución en esta situación es crear una nueva clase abstracta de la cual deriven las demás, de tal manera que cada subtipo tenga su propia implementación.

En ese sentido ya no es necesario alterar ningún comportamiento de la base, ni tampoco es necesario recurrir a un código adicional para conocer la diferencia que hay entre el tipo base y el subtipo.

Lo mejor de esta solución es que extendemos las oportunidades de su implementación así como nos permite tener un código más ordenado.

[Cordova] Ionic’s localStorageService

En esta ocasión veremos como implementar un simple sistema de almacenamiento llave-valor para nuestras aplicaciones. A pesar de su simplicidad es muy útil si queremos guardar temporalmente información, pero poco eficaz por sí solo si es que queremos hacer consultas de datos cuando tenemos mucha información.

utils.js

Acá definimos un Factory para leer/escribir valores o cadenas JSON para las estructuras de datos.

app.js

Luego, “instalamos” el módulo ionic.utils que acabamos de crear hace un instante.

index.html

Agregamos las referencias necesarias a la raíz de nuestro SPA.

foo-ctrl.js

¡Y listo! No olvidemos que la persistencia de la información dependerá de las limitaciones de espacio en disco y el SO.

Como mencione al inicio, esta alternativa poco se presta para hacer consultas complejas de los datos almacenados, pero si guardamos un arreglo en JSON y lo usamos junto con linq.js las cosas cambian :)!

Esta simple implementación es útil, sin embargo hay otras alternativas en GitHub e inclusive en Ionic 2 que también nos pueden ayudar en este asunto.

Más adelante espero tener la oportunidad de compartir hacerca de SQLite en un proyecto Ionic, pero antes tendré que hablar un poco sobre ngCordova.

[Xamarin] ¿Cómo usar Segoe MDL2 Assets en Xamarin.Android?

En esta ocasión quiero compartir como hago para poder usar las fuentes Segoe MDL2 en un proyecto Xamarin.Android.

segmdl2.ttf

Agregamos la fuente y establecemos su Build Action como AndroidAsset.

Typefaces.cs

Creamos la clase que nos permita construir la Typeface en base a la fuente que acabamos de agregar.

IconTextView.cs

Y ahora extendemos TextView para personalizarlo con el uso de la Typeface que acabamos de obtener.

Layout.axml

Una vez hecho esto ya esta todo listo para usar nuestro IconTextView.

[Cordova] Empezando con aplicaciones Ionic en Visual Studio

Ionic es un framework muy popular para el desarrollo de aplicaciones móviles multi-plataforma usando Cordova, y actualmente Visual Studio nos permite crear y depurar fácilmente aplicaciones Ionic.

Cordova Components

Cuando estes instalando o actualizando una instalación existente de Visual Studio asegúrate de seleccionar HTML/JavaScript (Apache Cordova) dentro de Cross-Platform Mobile Development.

Ionic Templates

Para trabajar con Ionic debes instalar las Plantillas de Ionic desde el selector de plantillas para nuevos proyectos de Visual Studio. En caso no los tengas instalado ubicate en search y busca por Ionic.

Estas plantilas crean la estructura de código y agregan las dependencias necesarias a tu proyecto para que puedas empezar a crear aplicaciones con Ionic enseguida.

Ionic Pack

Para agregar Intellisense al momento de desarrollar aplicaciones con Ionic y mejorar tu productividad debes instalar el Ionic Pack.

Visual Studio Android Emulator

Finalmente, para poder probar y depurar aplicaciones para Android con gran eficiencia es recomendable usar el Emulador de Android de Visual Studio. Para usar este emulador es necesario contar con Hyper-V.

Youtube

[Xamarin] ¿Alguien dijo [INSTALL_FAILED_UPDATE_INCOMPATIBLE] en Xamarin.Android?

No sé a cuantos ni cuantas veces les habrá pasado, pero a mi ya se me esta haciendo algo recurrente el famoso [INSTALL_FAILED_UPDATE_INCOMPATIBLE] que, hasta lo que he experimentado, puede saltar cuando menos te lo esperas en pleno proceso de build y debug sin aparente explicación.

Me imagino que se puede dar por muchas razones, pero las veces que me ha ocurrido ha sido por una mala desinstalación de un build anterior, desinstalación de la cual se encarga el Visual Studio. En fin, esto siempre lo he resuelto de la misma manera y todo empieza en Ajustes.

Una vez ahí, solo tienes que ubicarte en Aplicaciones, encontrar la app que estas desarrollando y eliminarla sin piedad :)!.

Hecho esto, ya puedes continuar presionando F5 y ser feliz.

[.NET] ¿Cómo grabar vídeos en Windows Phone Silverlight?

Hace poco tuve que aprender a progamar para subir vídeos en Windows Phone. Al parecer habían un par de formas de hacerlo, así que a continuación compartiré la que me funcionó y la que creo que fue la mejor alternativa. Se aceptan sugerencias :)!

Para mi caso en especial todo gira alrededor de la siguiente clase:


En el proyecto Windows Phone, empezamos actualizando el WMAppManifest.xml para poder usar la cámara y el micrófono.


Luego de ello ya podemos definir nuestra pantalla como mejor creamos.


En mi caso quedo así:

Luego de definir la pantalla, viene el .cs en el cual hay que lidear con el estado de la cámara, no vayamos a usar recursos que ya estan en uso y con la orientación de nuestra aplicación. Para mi fue todo un lío llegar a terminar esta parte, es más, actualmente tiene un bug. Una estrella para quien lo encuentra.


En fin, luego de haber capturado correctamente la información y dando aceptar, nos ayudamos de una variable estática en el App.xaml.cs llamada PendingVideo y navegamos hacia atrás. Ya del otro lado, la usamos y limpiamos referencias innecesarias.

[Xamarin] ¿Cómo saber si tengo conexión en Xamarin.Android?

Es importante conocer el estado de conexión de nuestra aplicación para no hacer consultas que pueden resultar en fallas, así como para tener la oportunidad de mostrar al usuario el mensaje adecuado para que no crea que hay una falla en la aplicación cuando el verdadero problema es uno de conectividad.

En caso de Xamarin.Android, lo primero que debemos hacer es agregar los permisos adecuados al AndroidManifest.xml.

Seguido de ello podemos hacer lo siguiente para validar si tenemos algun tipo de conexión:

O lo siguiente para saber si tenemos conexión con algún host en específico.

Si son instrucciones recurrentes en nuestra aplicación, deberíamos encapsularlas y ponerlas en una clase llamada ConnectivityService.cs por ejemplo.


Para mayor info acerca de ConnectivityManager, véase la documentación oficial: https://developer.xamarin.com/api/type/Android.Net.ConnectivityManager/

[Xamarin] BusyIndicator personalizado para Xamarin.Forms

BusyIndicator.xaml

Empezamos creando un ContentView que contenga un Frame con un ActivityIndicator. En caso queramos agregar un texto podriamos poner un StackLayout que contenga el ActivityIndicator y un Label. Ya queda a tu imaginación o a los requerimientos para mejorar esta vista básica.

BusyIndicator.xaml.cs

Creamos un BindableProperty para dar soporte a DataBinding. Aunque en el ejemplo que viene no lo uso, sería ideal establecerlo de esta forma por si en algún momento definimos algún ViewModel o su DataContext.

SplashPage.xaml

Hacemos referencia al namespace donde se encuentra nuestro BusyIndicator.

SplashPage.xaml.cs

Y ya esta listo para usar. No olviden que también se puede definir el valor de la propiedad IsBusy desde el XAML.

[Xamarin] Fuentes personalizadas en aplicaciones Xamarin.Forms

Para el presente post usaré 2 fuentes (Magistral.otf y RadicalBeat.ttf) y quiero hacer recordar que para conocer el nombre de una fuente hay que darle doble click al archivo .otf o .ttf.

PCL

Creamos un control personalizado extendiendo la clase Label para disponer de una propiedad FontName.

Definimos una interfaz gráfica sin olvidarnos de importar el namespace de nuestro control personalizado.

iOS

Establecemos el Build Action de las fuentes en BundleResource y el Copy to Output Directory en Copy always.

Luego modificamos el Info.plist para indicar en donde se encuentran nuestras fuentes.

Creamos una clase que extienda de LabelRenderer.

Y listo.

Android

Establecemos el Build Action de las fuentes en AndroidAsset.

Creamos una clase que extienda de LabelRenderer.

Y listo.

Los gists usados para este post puedes ubicarlos aqu&iacute: https://gist.github.com/MAlexanderSalazar/62bdf1ac153078817b26