sábado, 28 de mayo de 2016

Extensiones y Update de VS

cuando usamos una herramienta como visual studio, siempre es necesario unas ayudas adicionales, cuando se empieza a desarrollar, a nivel personal uso las siguientes extensiones que se encuentran tanto para las versiones licenciadas de visual studio como la última versión comunity.
·     advanced javascript outlining
"This extension provides additional outlining for Visual Studio 2012 JavaScript editor. It outlines [], {} braces, comments and regions."

·     highlight all ocurrences of selected word
Esta extensión resaltará todas las pariciones   de una palabra seleccionados con un ratón  un teclado en el documento actual y mostrar un glifo en el margen izquierdo.
Esto permite la visualización rápida de una palabra específica usada en todo el documento, incluyendo las de los comentarios.
1 ) Instalar la extensión y verifica que esté habilitado en el Administrador de Herramientas > Extensión .
Funciona de manera similar, ya que se implementó en Notepad ++
Pasos:
2 ) En la ventana del editor , seleccionar una palabra con un ratón ( es decir, haciendo doble clic) o el teclado .
 Todas las apariciones de la palabra seleccionada se deben destacar en el documento actual .
·     Html Syntax Highlighter for JS String
https://visualstudiogallery.msdn.microsoft.com/7ad6f617-0903-4690-910e-5d555faf0038
Esta extensión hace resaltado de sintaxis para HTML marcado en cadena JavaScript literal.
 
Es compatible con cualquier elemento HTML y cualquier nombre de atributo. Los colores se pueden configurar 
en " Fuentes y colores " en diálogo Opciones (nombres de los colores comienzan con "HTML “).
 
Se determinará si los literales de cadena Javascript son adecuados para ser resaltado de sintaxis, y si es así, 
¿el resaltado de sintaxis .

https://i1.visualstudiogallery.msdn.s-msft.com/7ad6f617-0903-4690-910e-5d555faf0038/image/file/161716/1/preview-full.png
·     Javascript parser
https://visualstudiogallery.msdn.microsoft.com/288a2b0f-1357-47b4-8215-1134c36bdf30
 
Cuando se está editando extremadamente grandes archivos javascript que es muy útil disponer de un conjunto 
de herramientas para mejorar el rendimiento del proceso de desarrollo y evitar posibles errores. Para resolver 
estos problemas que he creado esta extensión.

https://raw.githubusercontent.com/megaboich/js-map-parser/master/site/vs/dark_theme.png


·     Productivity Power Tools 2015
Es un paquete de extensión que aporta potentes herramientas para mejorar la productividad de los desarrolladores. La nueva versión contiene todas las características de las anteriores herramientas de potencia productividad 2013 con los siguientes cambios para trabajar con Visual Studio 2015:
1. Solución de error Visualizador se ha actualizado para aprovechar el nuevo Visual Studio 2015 Lista de errores y sus capacidades avanzadas de filtrado; filtros aplicados en la lista de errores ahora se aplicarán al visualizador también.
2. Impresión en color, Ayuda de parámetros tintadas y organizar las importaciones VB son incorporados en el Estudio 2015 producto de Visual núcleo (para que ya no son necesarios en Herramientas de productividad de potencia)
Captura de pantalla
·     Web Essentials 2015.2
La extensión Web Essentials le permite realizar tareas comunes mucho más fácil.
¡Importante!
Web Essentials 2015 ya no contiene características de agrupamiento y minifying de archivos HTML JS, CSS y, así como la compilación de archivos, MENOS SCS y CoffeeScript. Esas características se han trasladado a sus propias extensiones separadas que mejoran en gran medida las características.
Ø  Bundler y Minifier - para empaquetar y minifying JS , archivos CSS y HTML
Ø  Compilador Web - para compilar menos, archivos Sass , SCS , ( helado ) y CoffeeScript JSX
Ø  Optimizador de imagen - sin pérdidas para la optimización de PNG , JPG y GIF
Ø  Analizador de Web - para el análisis de código estático ( pelusa ) de los archivos JSX JS , TS , CSS y
Ø  Gulp fragmentos Pack - por ser más productivo escribir archivos Gulp
Ø  Ronco de fragmentos Pack - por ser más productivo escribir archivos Gulp
Ø  Mejoras Bloc - para la clasificación y la línea de codificación de texto
Ø  Sprites de imagen - para la creación , mantenimiento y uso de sprites imagen

·     VSCommands 14 for Visual Studio 2015




Extensiones y Update de VS

cuando usamos una herramienta como visual studio, siempre es necesario unas ayudas adicionales, cuando se empieza a desarrollar, a nivel personal uso las siguientes extensiones que se encuentran tanto para las versiones licenciadas de visual studio como la última versión comunity.
·     advanced javascript outlining
"This extension provides additional outlining for Visual Studio 2012 JavaScript editor. It outlines [], {} braces, comments and regions."

·     highlight all ocurrences of selected word
Esta extensión resaltará todas las pariciones   de una palabra seleccionados con un ratón  un teclado en el documento actual y mostrar un glifo en el margen izquierdo.
Esto permite la visualización rápida de una palabra específica usada en todo el documento, incluyendo las de los comentarios.
1 ) Instalar la extensión y verifica que esté habilitado en el Administrador de Herramientas > Extensión .
Funciona de manera similar, ya que se implementó en Notepad ++
Pasos:
2 ) En la ventana del editor , seleccionar una palabra con un ratón ( es decir, haciendo doble clic) o el teclado .
 Todas las apariciones de la palabra seleccionada se deben destacar en el documento actual .
·     Html Syntax Highlighter for JS String
https://visualstudiogallery.msdn.microsoft.com/7ad6f617-0903-4690-910e-5d555faf0038
Esta extensión hace resaltado de sintaxis para HTML marcado en cadena JavaScript literal.
 
Es compatible con cualquier elemento HTML y cualquier nombre de atributo. Los colores se pueden configurar 
en " Fuentes y colores " en diálogo Opciones (nombres de los colores comienzan con "HTML “).
 
Se determinará si los literales de cadena Javascript son adecuados para ser resaltado de sintaxis, y si es así, 
¿el resaltado de sintaxis .

https://i1.visualstudiogallery.msdn.s-msft.com/7ad6f617-0903-4690-910e-5d555faf0038/image/file/161716/1/preview-full.png
·     Javascript parser
https://visualstudiogallery.msdn.microsoft.com/288a2b0f-1357-47b4-8215-1134c36bdf30
 
Cuando se está editando extremadamente grandes archivos javascript que es muy útil disponer de un conjunto 
de herramientas para mejorar el rendimiento del proceso de desarrollo y evitar posibles errores. Para resolver 
estos problemas que he creado esta extensión.

https://raw.githubusercontent.com/megaboich/js-map-parser/master/site/vs/dark_theme.png


·     Productivity Power Tools 2015
Es un paquete de extensión que aporta potentes herramientas para mejorar la productividad de los desarrolladores. La nueva versión contiene todas las características de las anteriores herramientas de potencia productividad 2013 con los siguientes cambios para trabajar con Visual Studio 2015:
1. Solución de error Visualizador se ha actualizado para aprovechar el nuevo Visual Studio 2015 Lista de errores y sus capacidades avanzadas de filtrado; filtros aplicados en la lista de errores ahora se aplicarán al visualizador también.
2. Impresión en color, Ayuda de parámetros tintadas y organizar las importaciones VB son incorporados en el Estudio 2015 producto de Visual núcleo (para que ya no son necesarios en Herramientas de productividad de potencia)
Captura de pantalla
·     Web Essentials 2015.2
La extensión Web Essentials le permite realizar tareas comunes mucho más fácil.
¡Importante!
Web Essentials 2015 ya no contiene características de agrupamiento y minifying de archivos HTML JS, CSS y, así como la compilación de archivos, MENOS SCS y CoffeeScript. Esas características se han trasladado a sus propias extensiones separadas que mejoran en gran medida las características.
Ø  Bundler y Minifier - para empaquetar y minifying JS , archivos CSS y HTML
Ø  Compilador Web - para compilar menos, archivos Sass , SCS , ( helado ) y CoffeeScript JSX
Ø  Optimizador de imagen - sin pérdidas para la optimización de PNG , JPG y GIF
Ø  Analizador de Web - para el análisis de código estático ( pelusa ) de los archivos JSX JS , TS , CSS y
Ø  Gulp fragmentos Pack - por ser más productivo escribir archivos Gulp
Ø  Ronco de fragmentos Pack - por ser más productivo escribir archivos Gulp
Ø  Mejoras Bloc - para la clasificación y la línea de codificación de texto
Ø  Sprites de imagen - para la creación , mantenimiento y uso de sprites imagen

·     VSCommands 14 for Visual Studio 2015




Reiniciar, detener y arrancar el IIS desde linea de comando

Iniciar
cmd.exe
iisreset /start

Detener
cmd.exe
iisreset /stop

Reiniciarcmd.exe
iisreset

domingo, 26 de julio de 2015

ADO.NET: Buenas prácticas en el acceso a datos.


ADO.NET es un conjunto de clases que exponen servicios de acceso a datos para programadores de .NET Framework. […]
Constituye una parte integral de .NET Framework y proporciona acceso a datos relacionales, XML y de aplicaciones.[…]

Las clases que nos brinda ADO.NET representan todos los conceptos básicos y necesarios para acceder a cualquier orígen de datos y realizar cualquier tipo de operación: Conexión, Transacción, Comando, Parametro, Set de datos, Tabla, y más…

Es importante que conozcamos qué es y cómo funciona ADO.NET porque siempre lo vamos a estar utilizando al acceder a datos, ya sea de manera directa mediante el uso de sus clases o de manera indirecta al utilizar alguna herramienta de mapeo de objetos a datos (ORM) o librería de terceros, las cuales internamente harán uso de ADO.NET.

Es muy importante leer la documentación existente en el Sitio oficial y siempre es muy útil seguir las novedades en el Blog oficial.

La cantidad de artículos y videos no oficiales que existen con tutoriales del estilo “Cómo conectarse a SQL Server desde C#” o “Accediendo a datos con .NET”, es incontable y crece día a día. Pero, lamentablemente, es común encontrar en ellos errores y/o malas prácticas que afectan la seguridad y/o performance de la aplicación final. Es por eso que este artículo intento destacar las mejores prácticas que podemos seguir y también mencionar los principales errores que debemos evitar, basado en mis propias experiencias y en libros/documentación oficial.

Cadenas de conexión

Para poder conectarnos a un orígen de datos, vamos a necesitar una cadena de conexión o Connection String. Es altamente probable que una cadena de conexión cambie, por ej.: porque cambia el ambiente en el cual se está ejecutando la aplicación (desarrollo, testing, producción, etc.) o porque cambiaron las credenciales de acceso a una BD.

Es por esto que debemos evitar definir las cadenas de conexión dentro del código (hard-coded), ya que para cambiarlas vamos a tener que: modificar el código, compilar e instalar la nueva versión de la aplicación. Lo recomendable entonces, es definirlas en algún medio en el cual puedan ser modificadas de manera fácil, rápida y sin afectar la aplicación.

Siguiendo esta recomendación, el medio recomendado para las cadenas de conexión es el archivo de configuración de la aplicación (web.config o app.config, según el tipo de aplicación). Allí contamos con la sección dedicada al respecto <connectionStrings>.

Modo ineficaz:

string connectionString = "Server=.;Database=Ejemplo;Integrated Security=True";
using (var conn = new SqlConnection(connectionString))
{
    //  ...
}
Modo eficiente:

<connectionStrings>
  <add name="EjemploBD"
        connectionString="Server=.;Database=Ejemplo;Integrated Security=True"
        providerName="System.Data.SqlClient" />
</connectionStrings>

string connectionString = ConfigurationManager.ConnectionStrings["EjemploBD"].ConnectionString;
using (var conn = new SqlConnection(connectionString))
{
    // ...
}
Opcionalmente, también contamos con la funcionalidad de encriptar todas las cadenas de conexión del archivo de configuración para una mayor seguridad. Mas info al respecto acá.

En una sección posterior de este artículo también veremos una interesante utilidad que le podemos dar al dato providerName…

NO usar “conexiones estáticas”

En muchas oportunidades encontré proyectos que usan una variable estática para guardar el objeto de conexión a la BD. Probablemente la intención de esto es evitar abrir nuevas conexiones para cada operación que se desea realizar, ya que es un proceso costoso (tanto en tiempo como recursos).

Guardar la conexión en una variable estática implica que ésta será única para toda la aplicación. Lo cual sería completamente aceptable si la aplicación utilizara un único hilo de ejecución y fuera usado por un único usuario, sin ningún tipo de concurrencia. Aunque difícilmente una aplicación tendrá dichas características…

Pongamos como ejemplo una aplicación web que usa una “conexión estática”: cada usuario que acceda al sitio será atendido usando un nuevo hilo de ejecución del proceso que ejecuta la aplicación, imaginemos que un primer usuario accederá a una página que utilizará la conexión para obtener una lista de registros a mostrar, y ahora imaginemos que un segundo usuario accede en ese preciso instante a otra página de la aplicación la cual también intentará utilizar la conexión para obtener otra lista de registros a mostrar, pero lamentablemente se encontrará con que la conexión no está disponible y verá un “hermoso” mensaje de error en pantalla… Sólo por mencionar uno de los tantos escenarios de error posibles.

En definitiva: “conexión estática” = muy mala práctica.

Entonces, ¿cómo abrir una conexión sin problemas y de la manera mas performante? La respuesta es simple:

Crear una conexión.
Abrir la conexión.
Usar la conexión para realizar las operaciones necesarias.
Cerrar la conexión.
Liberar los recursos.
Pero, ¿no es acaso costoso abrir una nueva conexión? Si. Pero ADO.NET emplea un proceso llamado Connection Pooling o agrupación de conexiones para resolver este problema. Para explicarlo de manera resumida y muy simplificada, se encarga de llevar una lista de las últimas conexiones abiertas y cada vez que se intente abrir una nueva conexión busca en dicha lista alguna similar para reutilizarla. Todo esto sucede mágicamente bajo nuestras narices, y por lo tanto podemos despreocuparnos del tema.

Liberar los recursos luego de utilizarlos

Este aspecto no es algo propio del ADO.NET, sino más bien de todo el Framework .NET y que siempre debemos tenerlo en cuenta en el desarrollo de nuestras aplicaciones.

Haciendo un brevísimo y simplificado resúmen podemos decir lo siguiente:
Existen objetos que internamente utilizan ciertos recursos que deben ser liberados luego de ser utilizados (entre ellos, las conexiones a bases de datos). Estos objetos implementan la interfaz IDisposable, que publica un único método Dispose, el cual se encarga de liberar dichos recursos. Quien utiliza estos objetos tiene la responsabilidad de llamar siempre al método Dispose una vez que haya finalizado con su utilización. No liberar estos recursos puede deteriorar la performance de la aplicación, y en algunos casos extremos incluso puede causar la caída del servidor (al agotar el procesamiento/memoria). La manera más conveniente de asegurar la llamada al método Dispose de un objeto es mediante el uso del bloque using. Este bloque permite declarar cualquier objeto que implemente la interfaz Dispose, dentro del cual estará disponible para ser utilizado dicho objeto, y se encargará de llamar automáticamente al método Dispose cuando se finalice la ejecución de todas las instrucciones que contiene, incluso si se produce un error.

Pueden encontrar más info acá.

Volviendo a ADO.NET, debemos asegurarnos de liberar todos los recursos de los objetos luego de utilizarlos. Podemos determinar fácilmente cuales son estos objetos verificando si implementan la interfaz IDisposable.

Modo ineficaz:

var conn = new SqlConnection(ConfigurationManager.ConnectionStrings["EjemploBD"].ConnectionString);
conn.Open();
           
var command = new SqlCommand("SELECT * FROM Usuarios", conn);
var reader = command.ExecuteReader();
while (reader.Read())
{
    // ...
}

//  Si se produce un error antes de llegar a esta línea, "reader" no se cierra ni libera correctamente sus recursos
reader.Close();
reader.Dispose();

//  Si se produce un error antes de llegar a esta línea, "command" no libera correctamente sus recursos
command.Dispose();

//  Si se produce un error antes de llegar a esta línea, "conn" no se cierra ni libera correctamente sus recursos
conn.Close();
conn.Dispose();
Modo eficiente:

//  Este bloque using cierra y libera automáticamente los recursos utilizados por "conn"
using (var conn = new SqlConnection(ConfigurationManager.ConnectionStrings["EjemploBD"].ConnectionString))
{
    conn.Open();

    //  Este bloque using libera automáticamente los recursos utilizados por "command"
    using (var command = new SqlCommand("SELECT * FROM Usuarios", conn))
               
    //  Este bloque using cierra y libera automáticamente los recursos utilizados por "reader"
    using (var reader = command.ExecuteReader())
    {
        while (reader.Read())
        {
            // ...
        }
    }
}
Uso de parámetros

En la mayoría de los casos, definimos la consulta o comando a ejecutar de manera dinámica, en base a datos ingresados/seleccionados por el usuario o según las reglas de negocio definidas. En estos casos, hay quienes directamente definen en una cadena de texto la consulta, concatenando directamente los datos ingresados por el usuario formateando (cuando corresponda) textos, números, fechas, etc.

Por ejemplo:

string cmdTexto = String.Format("SELECT * FROM Usuarios WHERE Login = '{0}'", login);

using (var command = new SqlCommand(cmdTexto, conn))
{
    //  ...
}
Esta metodología tiene muchas falencias, pero las dos mas importantes a destacar son:

Presenta un grave riesgo de seguridad, frente a la técnica SQL Injection.
Necesita una “conversión manual” de tipos de datos al armar la consulta SQL. Lo cual es “trabajoso” y muy propenso a error.
La manera mas eficiente y segura de especificar los parámetros a utilizar en una consulta es mediante el uso del objeto ADO.NET que representa un parámetro. Podemos crearlo indicando solamente su nombre y su valor, para finalmente agregarlo a la lista de parámetros del comando. De esta manera, tanto la consulta SQL como la lista de parámetros serán enviados al orígen de datos sin que nosotros tengamos que hacer ninguna verificación de seguridad ni conversión de datos alguna.

Modo ineficaz e inseguro:

var cmdTexto = String.Format(
    "INSERT INTO Usuarios (Login, EstaActivo, FechaCreacion) VALUES ('{0}', {1}, '{2})",
    login, estaActivo ? 1 : 0, fechaCreacion.ToString("yyyy-MM-dd HH:mm:ss"));

using (var command = new SqlCommand(cmdTexto, conn))
{
    int filasAfectadas = command.ExecuteNonQuery();
}
Modo eficiente:

var cmdTexto = "INSERT INTO Usuarios (Login, EstaActivo, FechaCreacion) VALUES (@Login, @EstaActivo, @FechaCreacion)";

using (var command = new SqlCommand(cmdTexto, conn))
{
    command.Parameters.Add(new SqlParameter("@Login", login));
    command.Parameters.Add(new SqlParameter("@EstaActivo", estaActivo));
    command.Parameters.Add(new SqlParameter("@FechaCreacion", fechaCreacion));

    int filasAfectadas = command.ExecuteNonQuery();
}
Manejo de transacciones

Las clases ADO.NET tienen las clases y métodos necesarios para gestionar transacciones. Uno debe utilizar el método BeginTransaction en el objeto de la conexión, el cual inicia una transacción y devuelve un nuevo objeto que la representa. Este objeto debe ser asignado en los comandos que se desean ejecutar dentro del contexto de dicha transacción, y finalmente, debe ser aplicada (commit) o deshechada (rollback).

Sin embargo, existe una manera más sencilla e incluso más potente de manejar transacciones, mediante el uso de una clase del Framework llamada System.Transactions.TransactionScope. Para poder utilizar esta clase será necesario agregar una referencia a la librería System.Transactions del Framework.

En su uso más básico, simplemente basta definir un bloque en el cual se crea una instancia de la clase TransactionScope, y automáticamente todas las operaciones siguientes se ejecutarán dentro del contexto de una transacción. Todo esto se gestionará de manera automática y transparente para nosotros. Lo único que debemos hacer es llamar al método Complete antes de finalizar el bloque para aplicar todas las operaciones realizadas, de lo contrario se desharán todos los cambios.

También cuenta con la capacidad de decidir si es necesario crear una transacción distribuída, en caso de haber realizado operaciones que afecten a más de un orígen de datos, y lo hace también de manera automática. Esto se hace sólo si es estrictamente necesario, eficientizando al máximo el procesamiento.

Un ejemplo:

using (var scope = new TransactionScope())
{
    using (var conn1 = new System.Data.SqlClient.SqlConnection(connString))
    {
        conn1.Open();

        using (var cmd1 = conn1.CreateCommand())
        {
            cmd1.CommandText = commandText1;
            cmd1.ExecuteNonQuery();
        }
    }

    using (var conn2 = new System.Data.SqlClient.SqlConnection(connString))
    {
        conn2.Open();

        using (var cmd2 = conn2.CreateCommand())
        {
            cmd2.CommandText = commandText2;
            cmd2.ExecuteNonQuery();
        }
    }

    scope.Complete();
}
Uso de herramientas de mapeo de objetos a datos (ORM’s)

En mi opinión personal, una de las mejores alternativas es utilizar algún ORM que se encargue de resolver el acceso a datos, permitiéndonos enfocar pura y exclusivamente en la función principal de nuestra aplicación, brindando así valor agregado constantemente.

Estas herramientas también suelen ser la mejor opción ya que, al ser precisamente su principal función resolver el acceso a datos, lograrán una gran madurez y performance que probablemente nos tomaría a nosotros mucho tiempo.

EntityFramework es el ORM que recomiendo usar en las aplicaciones .NET.

Anexo: Acceso a datos único para cualquier tipo de BD.

Generalmente, al crear nuestras aplicaciones ya decidimos cual será el tipo de BD que usaremos: SQL Server, MySQL, Oracle, etc. Y podemos crear nuestra lógica de acceso a datos utilizando las clases ADO.NET correspondientes.

Sin embargo, existen aplicaciones que usan más de un tipo de BD. O quizás exista una alta probabilidad de migrar a otro tipo en alguna etapa avanzada del desarrollo.

Gracias a los patrones de diseño aplicados al diseñar las clases de ADO.NET, es muy fácil crear lógica de acceso a datos reutilizable para cualquier tipo de BD. Para ello es necesario hacer uso de las clases bases, de las cuales todos los Providers o proveedores de ADO.NET deben heredar.

Un ejemplo de cómo sería ese código sería algo así:

var dbFactory = DbProviderFactories.GetFactory(providerName);
if (dbFactory == null)
    throw new ArgumentException("providerName");

using (var conn = dbFactory.CreateConnection())
{
    conn.ConnectionString = connectionString;
    conn.Open();

    using (var cmd = conn.CreateCommand())
    {
        cmd.CommandText = cmdText;

        //  Se pueden agregar parámetros
        var p1 = cmd.CreateParameter();
        p1.ParameterName = "@Parametro1";
        p1.Value = new DateTime(2014, 2, 24);
        cmd.Parameters.Add(p1);

        //  Ejecutar comando con la operación necesaria
        int filasAfectadas = cmd.ExecuteNonQuery();

        object valor = cmd.ExecuteScalar();

        //  Abrir un DataReader para recorrer la lista de registros obtenidos por el comando
        using (var reader = cmd.ExecuteReader())
        {
            while (reader.Read())
            {
                //  hacer lo necesario con cada registro
            }
            reader.Close();
        }
    }
}
En el código pueden ver las variables:

providerName. Nombre del proveedor ADO.NET a utilizar. Ejemplos:
"System.Data.SqlClient"
"System.Data.Odbc"
connectionString. Cadena de conexión a utilizar. Ejemplos:
"Server=(localhost);Database=Sistema;Integrated Security=True"
"Server=(localhost);Database=Sistema;User ID=sa;Password=*****"
cmdText. Texto de la sentencia SQL a ejecutar. Ejemplos:
"SELECT [UsuarioId], [NombreUsuario], [EstaActivo] FROM [Usuarios]"
"UPDATE [Usuarios] SET [EstaActivo] = @EstaActivo WHERE [UsuarioId] = @UsuarioId"
Este era el uso interesante del dato providerName que les había mencionado anteriormente.

jueves, 9 de julio de 2015

Patrones Creacionales

-Fábrica Abstracta ( Abstract Factory )

El problema a solucionar por este patrón es el de crear diferentes familias de objetos, como por ejemplo la creación de interfaces gráficas de distintos tipos (ventana, menú, botón, etc.).

-Método de Fabricación ( Factory Method )

Parte del principio de que las subclases determinan la clase a implementar.

-Prototipado ( Prototype )

Se basa en la clonación de ejemplares copiándolos de un prototipo.

-Singleton

Restringe la instanciación de una clase o valor de un tipo a un solo objeto.

-MVC ( Model View Controler )

Este patrón plantea la separación del problema en tres capas: la capa model, que representa la realidad; la capa controler , que conoce los métodos y atributos del modelo, recibe y realiza lo que el usuario quiere hacer; y la capa vista, que muestra un aspecto del modelo y es utilizada por la capa anterior para interaccionar con el usuario.

¿Qué es un Patrón de Diseño?

¿Qué es un Patrón de Diseño?

Esta fue la primer pregunta que me hice cuando comencé a investigar sobre este tema. Al principio no tenía mucha idea de por dónde comenzar, por lo que mi primera reacción fue realizar una búsqueda en Internet y obtener de esta manera alguna base sobre la cual apoyarme. La definición que más me gustó fue la siguiente:

“Los patrones de diseño son el esqueleto de las soluciones a problemas comunes en el desarrollo de software.”

En otras palabras, brindan una solución ya probada y documentada a problemas de desarrollo de software que están sujetos a contextos similares. Debemos tener presente los siguientes elementos de un patrón: su nombre, el problema (cuando aplicar un patrón), la solución (descripción abstracta del problema) y las consecuencias (costos y beneficios).

Grande fue mi sorpresa al averiguar que existen varios patrones de diseño popularmente conocidos, los cuales se clasifican como se muestra a continuación:

Patrones Creacionales: Inicialización y configuración de objetos.

Patrones Estructurales: Separan la interfaz de la implementación. Se ocupan de cómo las clases y objetos se agrupan, para formar estructuras más grandes.

Patrones de Comportamiento: Más que describir objetos o clases, describen la comunicación entre ellos.

sábado, 20 de junio de 2015

Patrones Estructurales

Patrones Estructurales

Adaptador (Adapter): Convierte una interfaz en otra.

Puente (Bridge): Desacopla una abstracción de su implementación permitiendo modificarlas independientemente.

Objeto Compuesto (Composite): Utilizado para construir objetos complejos a partir de otros más simples, utilizando para ello la composición recursiva y una estructura de árbol.

Envoltorio (Decorator): Permite añadir dinámicamente funcionalidad a una clase existente, evitando heredar sucesivas clases para incorporar la nueva funcionalidad.

Fachada (Facade): Permite simplificar la interfaz para un subsistema.

Peso Ligero (Flyweight): Elimina la redundancia o la reduce cuando tenemos gran cantidad de objetos con información idéntica.

Apoderado (Proxy): Un objeto se aproxima a otro

Singleton patrón de diseño

Estructura de un programa COBOL

La estructura de un programa COBOL Consiste de 4 divisiones:

· Identification Division
· Environment Division
· Data Division
· Procedure Division.

Identification Division

La Identification Division es obligatoria. Las otras tres son opcionales, pero si se las codifica, estas deben ser invocadas en orden. Cada división tiene un propósito especifico y usa Cláusulas, Frases, instrucciones y Sentencias para cumplir con dicho objetivo.
La Identification Division es la primer división que se escribe en un programa COBOL. Especifica el nombre del programa y provee de información adicional, tal como el autor del programa y la fecha de compilación. La Identification Division debe comenzar con las
palabras IDENTIFICATION DIVISION o ID DIVISION. El párrafo PROGRAM-ID es obligatorio y debe ser el primero de la identificación. Los restantes párrafos son opcionales y pueden ser escritos en cualquier orden.

Environment Division

La Environment Division de un programa COBOL brinda información sobre las características físicas especificas del ambiente en el que correrá el programa. Especifica información sobre la computadora en que se generó el programa y aquella en la que se correrá. También relaciona los archivos de entrada y salida del programa con los
dispositivos de hardware específicos. La Environment Division se compone de dos secciones “section”:

*Configuration Section
*Input-Output Section.

Data Division

La Data Division describe las estructuras de datos a ser procesadas por el programa COBOL. Puede contener hasta cinco secciones (dependiendo del cobol en uso, las primeras tres comunes a todos), todas son opcionales:

* File Section
* Working-Storage Section
* Linkage Section
* Screen Section
* Local Section

Estas secciones, en orden, están compuestas por la descripción de los archivos, las descripciones de entrada de datos necesarias para ejecutar el programa, las descripciones de áreas de datos para recibir parámetros, las descripciones de las áreas para describir el formato de los datos a ser mostrados y recibidos desde pantalla y la descripción de las entradas de datos que permitirán generar distintas instancias de las variables en aquellos
programas recursivos.

Procedure Division

La Procedure Division es la cuarta y ultima división dentro de un programa COBOL. Contiene los procedimientos, secciones, párrafos, declaraciones, sentencias e instrucciones necesarias para ejecutar el procesamiento de la función y resolver el problema de procesamiento de los datos. Una sección declarativa “Declaratives Section” puede aparecer al comienzo de la procedure division. Esta especifica procesos declarativos a ser procesados cuando se produce una condición de excepción que no puede ser tratada por los testeos ordinarios. La sentencia USE debe ser la primer sentencia de cada sección especificada dentro de la Declaratives Section. Esta identifica el tipo de procesos declarativos provistos. (En la actualidad esta sección es muy poco usada dada las posibilidades de testeos de condiciones de excepción que tienen las sentencias actuales).

viernes, 19 de junio de 2015

DEFINICION DE BUSINESS INTELLIGENCE

“Business Intelligence (BI) es un término cierto que abarca los procesos, las herramientas, y las tecnologías para convertir datos en información, información en conocimiento y planes para conducir de forma eficaz las actividades de los negocios. BI abarca las tecnologías de datawarehousing los procesos en el ‘back end’, consultas, informes, análisis y las herramientas para mostrar información (estas son las herramientas de BI) y los procesos en el ‘front end’

Exploremos algunos ejemplos concretos de cómo el Business Intelligence nos puede generar beneficios:

• Beneficios tangibles, generación de ingresos:

• Mejorar la adquisición de clientes y su conversión mediante el uso de la segmentación.
• Reducir la tasa de abandono de clientes, incrementar su fidelidad, teniendo en cuenta cuál es su valor.
• Incrementar los ingresos por crecimiento de las ventas.
• Aumentar los resultados, consiguiendo que nuestros clientes actuales compren más productos o servicios.
• Evitar las pérdidas producidas por las ventas de nuestros competidores.
• Aumentar la rentabilidad por el acceso a información detallada de productos, clientes, etc.
• Conocer mejor cuáles son las características demográficas de nuestra zona de influencia.
• Hacer crecer la participación de mercado.
• Reducir el tiempo de lanzamiento de nuevos productos o servicios.
• Mejorar aquellas actividades relacionadas con la captura de datos.
• Analizar la cesta de la compra y la afinidad de venta entre los productos Facilitar la adopción de los cambios en la estrategia.
• Proveer el autoservicio de información a trabajadores, colaboradores, clientes y proveedores.
• Medir la efectividad de las campañas rápidamente y ser capaces de hacer los ajustes durante el ciclo de vida de las mismas.
• Optimizar las acciones de marketing.
• Identificar clientes rentables en segmentos no rentables.
• Analizar a la competencia cuando establecemos precios.
• Crear nuevas oportunidades.

• Beneficios tangibles, reducción de costes:

• Negociar mejores precios con los proveedores, identificar a los proveedores más importantes, gestionar descuentos por cantidades de compra; permitir el análisis del cumplimiento de los proveedores y asignar las compras de acuerdo con ello; medir el nivel de calidad, servicio y precio.
• Reducir o reasignar el personal necesario para llevar a cabo los procesos.
• Incrementar la productividad con información más inmediata y mejor.
• Aumentar el control de costes.
• Disminuir los gastos.
• Eliminar ineficiencias y reducir los costes operativos al generar “una sola versión de la verdad”.
• Descender pérdidas detectando fraude.
• Reducir los créditos incobrables.
• Bajar las reclamaciones (por ejemplo en el sector seguros).
• Eliminarlas sobreproducciones de productos.
• Proveer inventarios “just-in-time”; gestionar los inventarios de productos acabados; mejorar la gestión de materias primas y productos acabados; reducir los costes de mantenimiento del stock.
• Acortar los tiempos de respuesta a las peticiones de informes.
• Analizar los problemas, reparaciones y defectos y proveer la información para hacer un seguimiento y corregir los problemas recurrentes.
• Reducir el tiempo para recoger la información para cumplir con las normativas legales.
• Evaluar el rendimiento de los activos y generar las alertas cuando el mantenimiento preventivo se debe llevar a cabo.
• Proveer el suministro dentro del plazo.
• Hacer un seguimiento de los problemas de los productos desde el inicio de su vida hasta el fin.
• Retirar los viejos equipos para disminuirlos costes de actividad.
• Reducir las devoluciones de productos.
• Analizar la productividad de los empleados.
• Dar soporte a las reclamaciones de facturación.
• Abaratar los costes de las acciones de marketing.
• Hacer un mejor seguimiento de las acciones delictivas.
• Saber qué comisiones se deben pagar.
• Hacer decrecer las pérdidas de créditos, analizando la utilización de los clientes, asignando un análisis de riesgo.

• Beneficios intangibles:

• Optimizar la atención a los clientes.
• Aumentar la satisfacción de los clientes.
• Mejorar el acceso a los datos a través de consultas, análisis informes.
• Información más actualizada.
• Dotar a la información de mayor precisión.
• Conseguir ventajas competitivas.
• Controlar mejor de la información.
• Ahorrar costes.
• Menor dependencia de los sistemas desarrollados.
• Mayor integración de la información.

• Beneficios estratégicos:

• Mayor habilidad para analizar estrategias de precios.
• Y para identificar y nutrir a aquellos clientes con mayor potencial.
• Mejorar la toma de decisiones, realizándola de forma más rápida, informada y basada en hechos.
• Mayor visibilidad de la gestión.
• Dar soporte a las estrategias.
• Aumentar el valor de mercado.

Harold Caicedo

miércoles, 8 de octubre de 2014

Abstract Factory (Fabrica Abstracta) Patron de diseño


Crea una instancia de varias familias de clases

Definición


Proporcionar una interfaz para crear familias de objetos relacionados o dependientes sin especificar sus clases concretas.


Frecuencia de uso:
High


























UML class diagram


Los participantes


Las clases y los objetos que participan en este modelo son:

  • AbstractFactory (ContinentFactory) 
  1. declara una interfaz para las operaciones que crean productos abstractos 
  • ConcreteFactory (AfricaFactory, AmericaFactory) 
  1. implementa las operaciones para crear objetos de productos concretos 
  • AbstractProduct (Herbivore, Carnivore) 
  1. declara una interfaz para un tipo del objeto Product
  • Product (Wildebeest, Lion, Bison, Wolf) 
  1. define un objeto de producto que se crea por la correspondiente fábrica de hormigón 
  2. implementa la interfaz AbstractProduct 
  • Client (AnimalWorld) 
  1. utiliza interfaces declaradas por las clases AbstractFactory y AbstractProduct 
Código estructural en C # 

Este código estructural demuestra el patrón Abstract Factory crear jerarquías paralelas de los objetos. Creación de objetos ha sido abstraído y no hay necesidad de nombres de clase no modificables en el código de cliente.

  1. using System;

  2. namespace Abstract.Structural
  3. {
  4.   /// <summary>
  5.   /// MainApp startup class for Structural
  6.   /// Abstract Factory Design Pattern.
  7.   /// </summary>
  8.   class MainApp
  9.   {
  10.     /// <summary>
  11.     /// Entry point into console application.
  12.     /// </summary>
  13.     public static void Main()
  14.     {
  15.       // Abstract factory #1
  16.       AbstractFactory factory1 = new ConcreteFactory1();
  17.       Client client1 = new Client(factory1);
  18.       client1.Run();

  19.       // Abstract factory #2
  20.       AbstractFactory factory2 = new ConcreteFactory2();
  21.       Client client2 = new Client(factory2);
  22.       client2.Run();

  23.       // Wait for user input
  24.       Console.ReadKey();
  25.     }
  26.   }

  27.   /// <summary>
  28.   /// The 'AbstractFactory' abstract class
  29.   /// </summary>
  30.   abstract class AbstractFactory
  31.   {
  32.     public abstract AbstractProductA CreateProductA();
  33.     public abstract AbstractProductB CreateProductB();
  34.   }


  35.   /// <summary>
  36.   /// The 'ConcreteFactory1' class
  37.   /// </summary>
  38.   class ConcreteFactory1 : AbstractFactory
  39.   {
  40.     public override AbstractProductA CreateProductA()
  41.     {
  42.       return new ProductA1();
  43.     }
  44.     public override AbstractProductB CreateProductB()
  45.     {
  46.       return new ProductB1();
  47.     }
  48.   }

  49.   /// <summary>
  50.   /// The 'ConcreteFactory2' class
  51.   /// </summary>
  52.   class ConcreteFactory2 : AbstractFactory
  53.   {
  54.     public override AbstractProductA CreateProductA()
  55.     {
  56.       return new ProductA2();
  57.     }
  58.     public override AbstractProductB CreateProductB()
  59.     {
  60.       return new ProductB2();
  61.     }
  62.   }

  63.   /// <summary>
  64.   /// The 'AbstractProductA' abstract class
  65.   /// </summary>
  66.   abstract class AbstractProductA
  67.   {
  68.   }

  69.   /// <summary>
  70.   /// The 'AbstractProductB' abstract class
  71.   /// </summary>
  72.   abstract class AbstractProductB
  73.   {
  74.     public abstract void Interact(AbstractProductA a);
  75.   }


  76.   /// <summary>
  77.   /// The 'ProductA1' class
  78.   /// </summary>
  79.   class ProductA1 : AbstractProductA
  80.   {
  81.   }

  82.   /// <summary>
  83.   /// The 'ProductB1' class
  84.   /// </summary>
  85.   class ProductB1 : AbstractProductB
  86.   {
  87.     public override void Interact(AbstractProductA a)
  88.     {
  89.       Console.WriteLine(this.GetType().Name +
  90.         " interacts with " + a.GetType().Name);
  91.     }
  92.   }

  93.   /// <summary>
  94.   /// The 'ProductA2' class
  95.   /// </summary>
  96.   class ProductA2 : AbstractProductA
  97.   {
  98.   }

  99.   /// <summary>
  100.   /// The 'ProductB2' class
  101.   /// </summary>
  102.   class ProductB2 : AbstractProductB
  103.   {
  104.     public override void Interact(AbstractProductA a)
  105.     {
  106.       Console.WriteLine(this.GetType().Name +
  107.         " interacts with " + a.GetType().Name);
  108.     }
  109.   }

  110.   /// <summary>
  111.   /// The 'Client' class. Interaction environment for the products.
  112.   /// </summary>
  113.   class Client
  114.   {
  115.     private AbstractProductA _abstractProductA;
  116.     private AbstractProductB _abstractProductB;

  117.     // Constructor
  118.     public Client(AbstractFactory factory)
  119.     {
  120.       _abstractProductB = factory.CreateProductB();
  121.       _abstractProductA = factory.CreateProductA();
  122.     }

  123.     public void Run()
  124.     {
  125.       _abstractProductB.Interact(_abstractProductA);
  126.     }
  127.   }
  128. }
Resultado
ProductB1 interacts with ProductA1
ProductB2 interacts with ProductA2

Código del mundo real en C #

Este código del mundo real demuestra la creación de diferentes animales para un juego de ordenador utilizando diferentes fábricas. Aunque los animales creados por las fábricas son de continente diferentes, las interacciones entre los animales siguen siendo los mismos.

  1. using System;

  2. namespace Abstract.RealWorld
  3. {
  4.   /// <summary>
  5.   /// MainApp startup class for Real-World
  6.   /// Abstract Factory Design Pattern.
  7.   /// </summary>
  8.   class MainApp
  9.   {
  10.     /// <summary>
  11.     /// Entry point into console application.
  12.     /// </summary>
  13.     public static void Main()
  14.     {
  15.       // Create and run the African animal world
  16.       ContinentFactory africa = new AfricaFactory();
  17.       AnimalWorld world = new AnimalWorld(africa);
  18.       world.RunFoodChain();

  19.       // Create and run the American animal world
  20.       ContinentFactory america = new AmericaFactory();
  21.       world = new AnimalWorld(america);
  22.       world.RunFoodChain();
  23.       // Wait for user input
  24.       Console.ReadKey();
  25.     }
  26.   }

  27.   /// <summary>
  28.   /// The 'AbstractFactory' abstract class
  29.   /// </summary>
  30.   abstract class ContinentFactory
  31.   {
  32.     public abstract Herbivore CreateHerbivore();
  33.     public abstract Carnivore CreateCarnivore();
  34.   }

  35.   /// <summary>
  36.   /// The 'ConcreteFactory1' class
  37.   /// </summary>
  38.   class AfricaFactory : ContinentFactory
  39.   {
  40.     public override Herbivore CreateHerbivore()
  41.     {
  42.      return new Wildebeest();
  43.     }
  44.     public override Carnivore CreateCarnivore()
  45.     {
  46.       return new Lion();
  47.     }
  48.   }

  49.   /// <summary>
  50.   /// The 'ConcreteFactory2' class
  51.   /// </summary>
  52.   class AmericaFactory : ContinentFactory
  53.   {
  54.     public override Herbivore CreateHerbivore()
  55.     {
  56.       return new Bison();
  57.     }
  58.     public override Carnivore CreateCarnivore()
  59.     {
  60.       return new Wolf();
  61.     }
  62.   }

  63.   /// <summary>
  64.   /// The 'AbstractProductA' abstract class
  65.   /// </summary>
  66.   abstract class Herbivore
  67.   {
  68.   }
  69.   /// <summary>
  70.   /// The 'AbstractProductB' abstract class
  71.   /// </summary>
  72.   abstract class Carnivore
  73.   {
  74.     public abstract void Eat(Herbivore h);
  75.   }
  76.   /// <summary>
  77.   /// The 'ProductA1' class
  78.   /// </summary>
  79.   class Wildebeest : Herbivore
  80.   {
  81.   }

  82.   /// <summary>
  83.   /// The 'ProductB1' class
  84.   /// </summary>
  85.   class Lion : Carnivore
  86.   {
  87.     public override void Eat(Herbivore h)
  88.     {
  89.       // Eat Wildebeest
  90.      Console.WriteLine(this.GetType().Name +
  91.         " eats " + h.GetType().Name);
  92.     }
  93.   }

  94.   /// <summary>
  95.   /// The 'ProductA2' class
  96.   /// </summary>
  97.   class Bison : Herbivore
  98.   {
  99.   }

  100.   /// <summary>
  101.   /// The 'ProductB2' class
  102.   /// </summary>
  103.   class Wolf : Carnivore
  104.   {
  105.     public override void Eat(Herbivore h)
  106.     {
  107.       // Eat Bison
  108.       Console.WriteLine(this.GetType().Name +
  109.         " eats " + h.GetType().Name);
  110.     }
  111.   }
  112.   /// <summary>
  113.   /// The 'Client' class
  114.   /// </summary>
  115.   class AnimalWorld
  116.   {
  117.     private Herbivore _herbivore;
  118.     private Carnivore _carnivore;

  119.     // Constructor
  120.     public AnimalWorld(ContinentFactory factory)
  121.     {
  122.       _carnivore = factory.CreateCarnivore();
  123.       _herbivore = factory.CreateHerbivore();
  124.     }
  125.     public void RunFoodChain()
  126.     {
  127.       _carnivore.Eat(_herbivore);
  128.     }
  129.   }
  130. }

Resultado
Lion eats Wildebeest
Wolf eats Bison