sábado, 10 de diciembre de 2016

Programación Funcional en LINQ No. 2-2 - Matemática y Estadística - Generar Tripletas Pitagóricas

Resumen

Explicación del proceso funcional para la generación de tripletas -o ternas- pitagóricas a través del operador de proyección Select. Se usa la fórmula babilónica como definición matemática para definir tripletas pitagóricas.

Videotutorial

Literatura & Enlaces

Mukherjee, S (2014). Thinking in LINQ Harnessing the Power of Functional Programming in .NET Applications. United States: Apress.
Terna pitagórica (2016). Recuperado desde: https://es.wikipedia.org/wiki/Terna_pitag%C3%B3rica
Enumerable.Select Method (System.Linq) (2016). Recuperado desde: https://msdn.microsoft.com/en-us/library/system.linq.enumerable.select(v=vs.110).aspx
Enumerable.Range Method (Int32, Int32) (System.Linq) (2016). Recuperado desde: https://msdn.microsoft.com/en-us/library/system.linq.enumerable.range(v=vs.110).aspx


O

viernes, 9 de diciembre de 2016

Programación Funcional en LINQ No. 2-1 - Matemática y Estadística - Calcular el Producto Punto de Dos Vectores

Resumen

Descripción del proceso de solución del producto punto usando programación funcional.

Videotutoriales

Literatura & Enlaces

Mukherjee, S (2014). Thinking in LINQ Harnessing the Power of Functional Programming in .NET Applications. United States: Apress.
Dot product (2016). Recuperado desde: https://en.wikipedia.org/wiki/Dot_product
Enumerable.Zip(TFirst, TSecond, TResult) Method (2016). Recuperado desde: https://msdn.microsoft.com/en-us/library/dd267698(v=vs.110).aspx


O

jueves, 8 de diciembre de 2016

Programación Funcional en LINQ No. 1-5 - Instalación y Exploración de LINQPad

Resumen

Explicación del proceso de instalación de LINQPad 5, y descripción de las características principales de este editor de código.

Videotutorial

Literatura & Enlaces

Mukherjee, S (2014). Thinking in LINQ Harnessing the Power of Functional Programming in .NET Applications. United States: Apress.
LINQPad - The .NET Programmer's Playground (2016). Recuperado desde: http://www.linqpad.net/
LINQPad Command-Line and Scripting (2016). Recuperado desde: https://www.linqpad.net/lprun.aspx


O

miércoles, 7 de diciembre de 2016

Programación Funcional en LINQ No. 1-4: Beneficios de la Programación Funcional

Resumen

Estudio de los beneficios de la programación funcional:
  • Composición
  • Evaluación Perezosa
  • Inmutabilidad
  • Evaluación Paralela
  • Enfoque Declarativo

Videotutorial

Literatura & Enlaces

Mukherjee, S (2014). Thinking in LINQ Harnessing the Power of Functional Programming in .NET Applications. United States: Apress.
Composition II (2016). Recuperado desde: https://en.wikipedia.org/wiki/Piet_Mondrian#/media/File:Piet_Mondriaan,_1930_-_Mondrian_Composition_II_in_Red,_Blue,_and_Yellow.jpg
Single responsibility principle (2016). Recuperado desde: https://en.wikipedia.org/wiki/Single_responsibility_principle
Lazy evaluation (2016). Recuperado desde: https://en.wikipedia.org/wiki/Lazy_evaluation


O

martes, 6 de diciembre de 2016

Programación Funcional en LINQ No. 1-3: Tipos de Funciones

Resumen

Descripción de los tipos de funciones disponibles para realizar programación funcional:
  • Generadores
  • Estadísticas
  • Proyección
  • Filtrado

Videotutorial

Literatura & Enlaces

Mukherjee, S (2014). Thinking in LINQ Harnessing the Power of Functional Programming in .NET Applications. United States: Apress.
Enumerable.Range Method (Int32, Int32) (System.Linq) (2016). Recuperado desde: https://msdn.microsoft.com/en-us/library/system.linq.enumerable.range(v=vs.110).aspx


O

lunes, 5 de diciembre de 2016

Programación Funcional en LINQ No. 1-2: Declaración de Métodos Funcionales en C#

Resumen

En este vídeotutorial se exploran los delegados estándar y genéricos con los que es posible definir métodos funcionales. Se demuestra a través de ejemplos las diferencias entre estos dos tipos de delegados; por otra parte, también se implementa la composición gof=g(f(x)) usando delegados Func.

Videotutorial

Literatura & Enlaces

Mukherjee, S (2014). Thinking in LINQ Harnessing the Power of Functional Programming in .NET Applications. United States: Apress.
Delegates (C# Programming Guide) (2016). Recuperado desde: https://msdn.microsoft.com/en-us/library/ms173171(v=vs.110).aspx
Delegados en C# - Parte 5: Delegados Func y Action de .NET Framework (2016). Recuperado desde: https://ortizol.blogspot.com.co/2014/05/delegados-en-csharp--parte-5-delegados-func-y-action-de-dotnet-framework.html
Composition of Functions (2016). Recuperado desde: https://www.mathsisfun.com/sets/functions-composition.html


O

domingo, 4 de diciembre de 2016

Programación Funcional en LINQ No. 1-1: ¿Qué es la programación funcional?

Resumen

En este primer videotutorial se presenta el concepto de programación funcional a través de un enfoque matemático básico; el cual incluye la definición de composición de funciones, metáfora gráfica entre programación funciona e imperativa y una serie de recursos que extienden la explicación de este paradigma de programación.

Videotutorial

Literatura & Enlaces


Mukherjee, S (2014). Thinking in LINQ Harnessing the Power of Functional Programming in .NET Applications. United States: Apress.
Functional programming (2016). Recuperado desde: https://en.wikipedia.org/wiki/Functional_programming
Programación Funcional (2016). Recuperado desde: https://openlibra.com/es/book/programacion-funcional-2011-2012
Composition of Functions (2016). Recuperado desde: https://www.mathsisfun.com/sets/functions-composition.html
F# - Putting the Fun into Functional Programming (2016). Recuperado desde: https://www.youtube.com/watch?v=ALr212cTpf4



O

sábado, 3 de diciembre de 2016

Introducción a Videotutoriales de Programación Funcional con LINQ

Resumen

Videotutorial de introducción a la serie de videotutoriales Programación Funcional con LINQ.

Presentación




O

viernes, 2 de diciembre de 2016

Videotutorial - Uso de LINQPad para Ejecución de Expresiones C#

Resumen

En este videotutorial se explica el proceso de ejecución de código C# en LINQ a través de tres mecanismos; a saber:

  1. Expresión: permite ejecutar una única expresión del lenguaje C#.
  2. Sentencias: múltiples sentencias con expresiones.
  3. Programa: un programa compuestos por diferentes elementos de programa disponibles en C#.

Vídeotutorial




O

jueves, 1 de diciembre de 2016

Clases Utilitarias en C#

Índice

1. Introducción
2. Palabras Clave
3. Clase Console
4. Clase Environment
5. Clase Process
6. Conclusiones
7. Literatura & Enlaces

1. Introducción

En los artículos previos se exploró la infraestructura de comparación que provee Microsoft .NET Framework para efectuar comparaciones de igualdad y equivalencia de valores y tipos de datos. Ahora, en este último artículo de la serie Fundamentos Framework se describe tres de las clases utilitarias en .NET: Console, Environment y Process.

2. Palabras Clave

  • .NET
  • Clase utilitaria
  • Console
  • Environment
  • Process

3. Clase Console

Esta clase se haya definida en el namespace System. Su funcionalidad corresponde con las operaciones básicas de entrada y salida requeridas por aplicaciones de consola ("Console Class", 2016). Cuenta, por una parte, con métodos static para aceptar la entrada desde el teclado: 
  • Read
  • ReadKey
  • ReadLine
De manera análoga, existen métodos para presentar información textual en la salida estándar -i.e., la pantalla-; entre ellos se encuentran: 
  • Write, y 
  • WriteLine
Ambos static

Ejemplo de uso:

var texto = Console.ReadLine();
Console.WriteLine(texto);

Además, esta clase posee otras propiedades para para cambiar el tamaño de la ventana de la consola; como son:
  • WindowHeight, y 
  • WindowWidth.
Ejemplo de uso:

Console.Height = 200;
Console.Width = 200;

Estas dos sentencias hacen que el tamaño de la ventana de la consola se establece en 200 de alto por 200 de ancho.

Por otra parte, la clase Console cuenta con el método SetOut. Método útil para establecer el destino de la salida. Este flujo de salida puede ser útil para registrar información de la actividad de la aplicación (Albahari, 2012).

Ejemplo de uso:

using (System.IO.TextWriter w = System.IO.File.CreateText("C:\\etc\\registro.txt"))
{
Console.SetOut(w);
Console.WriteLine("xCSw");
}

Este fragmento de código genera un archivo de texto con el texto xCSw en la ruta especificada en el método CrateText.

4. Clase Environment

Esta clase, localizada en System, facilita el acceso a información del ambiente de ejecución o sistema operacional. En la siguiente tabla se muestra la lista de propiedades para accedar a esa información ("Environment Class", 2016):
Figura 1. Propiedades de Environment ("Environment Class", 2016).
También provee métodos, por ejemplo, para conocer las variables de entorno del sistema operacional:

Ejemplo de código:

Console.WriteLine(Environment.GetEnvironmentVariable("windir"));


Esta expresión da como resultado la cadena de texto:

C:\WINDOWS


la cual corresponde con el directorio del sistema operacional.

5. Clase Process

La clase System.Diagnostics.Process (Albahari, 2012) permite el acceso local y remoto a procesos. También permite lanzar nuevos procesos a través del método Start

string ie = "iexplore.exe";

string url = "https://ortizol.blogspot.com";

System.Diagnostics.Process.Start(ie, url);

El resultado de la ejecución de esta sentencia es el inicio del navegador Internet Explorer con la apertura del URL https://ortizol.blogspot.com.

En la receta Receta C# No. 4-15: Cómo Iniciar un Nuevo Proceso se explica con más detalle las capacidades de esta clase.

6. Conclusiones

Se explicaron varias de las clases utilitarias que provee .NET Framework: manejo de la consola -clase Console-, conocimiento del ambiente de ejecución o sistema operacional -la clase Environment-, y el acceso y ejecución de procesos a través de la clase Process.

Este artículo es el cierre de la serie Fundamentos de .NET Framework. El siguiente artículo da inicio a la serie Colecciones; la cual consiste en el estudio de los tipos de datos y estructuras de datos para el almacenimiento y recuperación eficientes de información: arreglos, listas, pilas, colas, tablas de hash, etc.

7. Literatura & Enlaces

Albahari, J., Albahari, B. (2012). C# 5.0 in a Nutshell. United States: O'Reilly Media.
Console Class (System) (2016). Recuperado desde: https://msdn.microsoft.com/en-us/library/system.console(v=vs.110).aspx
Environment Class (System) (2016). Recuperado desde: https://msdn.microsoft.com/en-us/library/system.environment(v=vs.110).aspx
Receta C# No. 4-15: Cómo Iniciar un Nuevo Proceso (2016). Recuperado desde: https://ortizol.blogspot.com.co/2014/09/receta-csharp-no-4-15-como-iniciar-un-nuevo-proceso.html


O

domingo, 31 de julio de 2016

Comparación de Orden en C# | Parte 2/2 | Operadores Menor Que y Mayor Que e Implementación Interfaces IComparable

Índice

1. Introducción
2. Palabras Clave
3. Operadores < y >
4. Implementación de las Interfaces IComparable
5. Conclusiones
6. Literatura & Enlaces

1. Introducción

En el artículo C# anterior se estudiaron los protocolos estándar de comparación de orden; en especial se habló acerca de las interfaces y operadores de C# que permiten la escritura de tipos de datos cuyos valores siguen un orden establecido. Esta segunda parte describe el contexto donde resulta práctico implementar las interfaces IComparable, y cuándo es viable la sobrecarga de los operadores < y >.

2. Palabras Clave

  • Comparación de orden
  • IComparable
  • IComparable<T>
  • Operador >
  • Operador <

3. Operadores < y >

Los tipos datos numéricos integrados -byte, int, float, double, decimal, etc.- tienen un orden natural. Este orden establece relaciones como 'menor que', 'mayor que', 'menor o igual que' o 'mayor o igual que'. En el lenguaje de programación C# el programador cuenta con operadores estándar para efectuar operaciones de comparación de orden a través de los operadores <, >, <= y >=.

Esta clase de relaciones no sólo está implementada para valores numéricos sino para otros tipos datos integrados de Microsoft .NET Framework. La estructura DateTime (cfr. Manipulación de Fechas y Horas en C#/5: La Estructura DateTime) sobrecarga las operadores < y > para comparar el orden de fechas.

Ejemplo de uso

bool despuesDe2019 = DateTime.Now > new DateTime(2019, 1, 1);
Console.WriteLine(despuesDe2019); // False

En este ejemplo el operador > compara la hora fecha actual con 2019/1/1. Se puede pensar que la sobrescritura de > tiene sentido debido a que la representación numérica de una fecha tiene un orden cronológico; inclusive se puede expresar en términos 'viene antes de' o 'viene después de'.

[Nota: El resultado de la evaluación de estas expresiones puede cambiar si este artículo es leído después 2019/1/1.]

Para lograr la comparación del orden de fechas, la estructura DateTime implementa las interfaces IComparable, como se muestra en la Figura 1
Implementación IComparable por DateTime
Figura 1. Implementación interfaces IComparable por DateTime ("DateTime Structure", 2016).
Continuando, en Albahari J. (2012) se anuncia que la sobrecarga de los operadores < y > involucra la implementación de las interfaces IComparable es una práctica estándar; sin embargo, la operación inversa no resulta verdadera. En .NET Framework la gran mayoría de tipos que implementan las interfaces IComparable no sobrecargan los operadores de orden mencionados.


La clase System.String constituye un ejemplo evidente para este último caso: 
Comparación en objetos String
Figura 2. Comparación errónea en objetos String.
Aún vale agregar que para la comparación de igualdad, siempre que se sobrecarga el método Equals, es una práctica estándar sobrecargar el operador de igualdad de C# == (Albahari J., 2012).

¿En qué situaciones resulta típico sobrecargar los operadores < y >?: 
  • El tipo de dato en consideración inherentemente considera los conceptos de 'mayor que' y 'menor que' para los valores que representa.
  • El resultado de la evaluación es independiente de la cultura.
  • La comparación de orden sólo tiene un único sentido o contexto para llevarse a cabo.

4. Implementación de las Interfaces IComparable

El siguiente ejemplo demuestra cómo implementar los protocolos estándar de comparación de orden discutidos anteriormente. El ejemplo compara semitonos de una nota musical.


Ejemplo de uso

Archivo C# NotaMusical.cs [Enlace alternativo][Enlace alternativo]: 

Líneas sobresalientes de este ejemplo de código fuente C#
  1. Líneas 37-46: Implementa el método CompareTo de la interfaz genérica IComparable<NotaMusical>. Dentro de este método se comprueba que si dos objetos del tipo paramétrico son iguales, entonces ambos ocupan el mismo lugar de orden. En caso contrario se efectúa la comparación con la implementación de CompareTo para valores de int de la propiedad miembro de esta estructura.
  2. Líneas 49-58: Implementa el método CompareTo de la versión no genérica de la interfaz IComparable. Primero se comprueba que si el tipo de dato es de tipo NotaMusical; de no ser así se genera la excepción InvalidOperationException. Luego la comparación se efectúa con la versión genérica de CompareTo (línea 57).
  3. Líneas 69-78: Se sobrecarga los operadores < y >. Nótese que se usan el método CompareTo y el operador == (más adelante sobrecargado). Esto garantiza la consistencia de comparación de igualdad y comparación de valores.
  4. Líneas 75-78: Sobrecarga el método Equals de la interfaz genérica IEquatable<NotaMusical>. Aquí también se usa el operador == sobrecargado en esta misma estructura. También se sobrescribe Object.Equals para mantener la consistencia con esta versión genérica.
  5. Líneas 100-110: Sobrecarga de los operadores == y != para la comparación de igualdad de objetos NotaMusical.
Salida resultante de la ejecución de este código en LINQPad

nm1 == nm2 :                  False
nm1.Equals((object)nm2): False
nm1 == nm3 :                  True
nm1.Equals((object)nm2): True
nm1 < nm2:                     True
nm1 != nm2:                    True

5. Conclusiones

Se demostró a través de un ejemplo cómo el programador puede implementar las interfaces IComparable (no-genérica y genérica) y IEquatable<T> para definir una semántica natural tanto de comparación de igualdad y de orden para el tipo de dato NotaMusical. El poder que entrega este conocimiento al programador consiste en crear tipo de datos robustos y acordes a un dominio real.

Este capítulo de artículos C# -Capítulo 6: Fundamentos de .NET Frameworkterminará con la exposición de las clases de utilidad disponibles en C#.

6. Literatura & Enlaces

Albahari, J., Albahari, B. (2012). C# 5.0 in a Nutshell. United States: O'Reilly Media.
Manipulación de Fechas y Horas en C#/5: La Estructura DateTime (2016, julio 31). Recuperado desde: https://ortizol.blogspot.com/2016/06/manipulacion-de-fechas-y-horas-en-csharp-parte-2-5-la-estructura-datetime.html
DateTime Structure (System) (2016, julio 31). Recuperado desde: https://msdn.microsoft.com/en-us/library/system.datetime.aspx
Semitono, la enciclopedia libre (2016, julio 31). Recuperado desde: https://es.wikipedia.org/wiki/Semitono


O

sábado, 30 de julio de 2016

Comparación de Orden en C# | Parte 1/2 | Introducción a Protocolos Estándar de Comparación de Orden

Índice

1. Introducción
2. Palabras Clave
3. Protocolos Estándar de Comparación de Orden
4. Las Interfaces IComparable
5. IComparable vs. Equals
6. Conclusiones
7. Literatura & Enlaces

1. Introducción

En la serie C# anterior se estudiaron los fundamentales acerca de los protocolos de comparación de igualdad; C# de .NET cuenta además con protocolos estándar para para la determinación del orden de un objeto respecto a otro. Esta serie, compuesta de dos partes, estudia los básicos de esta nueva clase de protocolos estándar:
  1. Interfaces IComparable y IComparable<T>
  2. Operadores de comparación < y > e implementación interfaces IComparable
La primera parte explica los conceptos básicos de la comparación de orden, y se explica cuál es el propósito de las interfaces IComparable (no-genérica) y IComparable<T> como protocolos estándar de comparación de orden.

2. Palabras Clave

  • Comparación de orden
  • IComparable
  • IComparable<T>
  • Protócolo estándar

3. Protocolos Estándar de Comparación de Orden

Así como .NET Framework contiene protocolos estándar para la definición de la semántica de igualdad, también define un conjunto de protocolos estándar para la determinación del orden que ocupa un objeto respecto a otro (Albahari J., 2012).

Los protocolos estándar se han definido como interfaces y operadores de C#; exactamente: 
  • Las interfaces IComparable
    • IComparable (versión no genérica)
    • IComparable<T> (versión genérica)
  • Los operadores de C# < y >
En cuanto a las interfaces, éstas se utilizan como algoritmos de ordenamiento de propósito general (Albahari J., 2012).

En .NET existe una variedad de clases, como por ejemplo String, que implementa una de estas interfaces para el ordenamiento de arreglo de cadenas de caracteres; por ejemplo: 

Ejemplo de uso

string[] escritoresRusos = { "Asimov", "Dostoiévskiy", "Gógol", "Lermontov", "Púshkin"};
Array.Sort(escritoresRusos);

foreach (string escritorRuso in escritoresRusos)
{
Console.Write(escritorRuso + " ");
}

En la salida estándar de LINQPad este es el resultado obtenido: 

Asimov Dostoiévskiy Gógol Lermontov Púshkin 

En cuanto a los operadores < y >, éstos han sido especialmente diseñados para tipos de datos numéricos. Al igual que ocurre con los operadores == y !=, los operadores < y > son resueltos de manera estática, lo que se traduce en un alto desempeño en algoritmos que efectúan miles de operaciones por segundo (Albahari J., 2012).

4. Las Interfaces IComparable

Entre los protocolos estándar de comparación de orden que provee .NET se hallan: 
  • IComparable
  • IComparable<T>
El contrato (versión simplificada) de estas interfaces comprende: 

public interface IComparable
{
int CompareTo(object other);
}

public interface IComparable
{
int CompareTo(T other);
}

Para la comparación de tipos de datos numéricos la segunda versión de IComparable resulta más eficiente debido a que se evita el uso de la técnica boxing para efectuar la comparación de orden entre dos valores. Aún así, las dos versiones siguen este esquema de funcionamiento en la implementación del método CompareTo
  • Si x está después de y, entonces x.CompareTo(y) retorna un valor numérico positivo.
  • Si x ocupa el mismo lugar de y, entonces x.CompareTo(y) retorna 0.
  • Si x está antes de y, entonces x.CompareTo(y) retorna un valor numérico negativo.
Para cadenas de texto, por ejemplo se podría realizar estas operaciones de comparación de orden:

Ejemplo de uso:

Console.WriteLine("Dostiévskiy".CompareTo("Asimov")); // 1
Console.WriteLine("Dostiévskiy".CompareTo("Dostiévskiy")); // 0
Console.WriteLine("Asimov".CompareTo("Lermontov")); // -1

Sobre string se puede efectuar esta comparación debido a que ésta clase implementa la interfaz IComparable<T>.

5. IComparable vs. Equals

Considérese la siguiente situación: se ha escrito un tipo de dato personalizado que sobrescribe el método virtual Equals y que implementa el método abstract de una de las interfaces IComparable.

Ahora, se puede pensar en la siguiente pregunta: ¿qué ocurre al comparar e igualar dos valores del tipo de dato en cuestión? Bueno, si los dos valores son iguales, Equals retornará True, y el método CompareTo retornará 0. Por otra parte, mientras que Equals retorna False cuando los dos valores comparados por igualdad son diferentes, CompareTo retorna -1 o 1 dependiendo del orden qué ocupen los valores.

Para ilustrar esto, la clase String constituye un buen ejemplo: en algunos sistemas las cadenas "ṻ" y "ǖ" son distintas para el método Equals pero equivalentes para el método CompareTo. Esto es así porque CompareTo es más meticuloso en cuanto a comparaciones que dependen de la cultura y la configuración regional del sistema.

Ejemplo de uso

Console.WriteLine("".Equals("ǖ")); // True
Console.WriteLine("".CompareTo("ǖ")); // 0

Otro punto importante a considerar es la recomendación dada en Albahari J. (2012)
Primera línea en CompareTo
Figura 1. Primera línea en CompareTo.
En términos generales se está sugiriendo evaluar primero la igualdad de los valores, y luego realizar la comparación de orden de acuerdo a la naturaleza del tipo de dato.

6. Conclusiones

Se estudiaron los básicos de los protocolos estándar de comparación de orden. Se comprendió que la comparación de orden al igual que la comparación de igualdad presenta dificultades y/o complejidades que deben ser comprendidas rigurosamente para evitar comportamientos o resultados anómalos.

La siguiente parte de esta serie explica el contexto de uso de los operadores de comparación < y >; además, un ejemplo de implementación de las interfaces IComparable e IComparable<T>.

7. Literatura & Enlaces

Albahari, J., Albahari, B. (2012). C# 5.0 in a Nutshell. United States: O'Reilly Media.

O