Mostrando entradas con la etiqueta Conceptos. Mostrar todas las entradas
Mostrando entradas con la etiqueta Conceptos. Mostrar todas las entradas

domingo, 30 de julio de 2017

Colecciones en C# - Introducción

Índice

1. Introducción
2. Palabras Clave
3. Temas Generales de Estudio y Práctica
4. Importancia de las Colecciones
5. Nombres de Espacios Relevantes
6. Conclusiones
7. Literatura & Enlaces

1. Introducción

Este artículo C# pretende ilustrar a grandes rasgos los temas relacionados con colecciones, los cuales se tratarán en los siguientes artículos. Temas que van desde el manejo de interfaces o protocolos; clases bases para la definición de tipos de datos de colecciones para los requisitos de estructuración de datos de un problema específico; y desde luego, el estudio y práctica de las estructuras de datos incorporadas en .NET: listas, conjuntos, diccionarios, entre otros.

2. Palabras Clave

  • Cola
  • Colección
  • Diccionario
  • Estructura de dato
  • Interfaz
  • Lista
  • Protocolo
  • Tipo de dato

3. Temas Generales de Estudio y Práctica

El estudio de colecciones en el lenguaje de programación C# merece que se lleve a cabo una elaborada exposición teórica, pero sobretodo, la implementación de fragmentos o ejemplos de código fuente que evidencien la formación sintáctica y la utilidad de las construcciones para colecciones o estructuras de datos.


Los temas relevantes de estudio que se tratarán en los siguientes artículos C# comprende el estudio de los temas:
  • Enumeración de elementos de una estructura de datos
  • Los protocolos o interfaces ICollection y IList
  • El tipo de datos Array
  • Estructuras de datos fundamentales: listas, colas, pilas, conjuntos, diccionarios
  • Diseño de colecciones o estructuras de datos personalizadas
  • Diseño de comparación e igualdad de elementos de una colección o estructura de datos

4. Importancia de las Colecciones

Las colecciones en C# permiten la gestión, es decir el almacenamiento, la recuperación, el ordenamiento y operaciones de manipulación de grupos o conjuntos de datos. A la hora de escribir una implementación -clase, método, función, etc.-, se requiere guardar y recuperar datos para subsecuentes manipulaciones. El almacenamiento y recuperación se deben realizar de forma eficiente e intuitiva: el programador debería concentrarse más en el desarrollo de la implementación que en el funcionamiento subyacente del tipo de estructura -lista, cola, pila, etc.-, en uso.

Continuando, una colección o estructura de datos se puede ver como un receptáculo para la contención de la informoción del estado de una o más entidades que comprenden el problema que se está resolviendo. Visualmente se puede ver como la representación de la siguiente figura:
Estructura de datos o colección
Figura 1. Introducción - Deficiones ("Data Structure", 2017).

5. Nombres de Espacios Relevantes

En .NET Framework se dispone de varios nombres de espacio donde se localizan los protocolos, clases, y construcciones adicionales para el trabajo con estructuras de datos o colecciones. En la Figura 2 se resumen estos namespaces:
Namespaces de colecciones en .NET Framework
Figura 2. Namespaces de colecciones en .NET Framework (Albahari, 2012).
En próximos artículos se presentarán descripciones y ejemplos esenciales para comprender su utilidad en el desarrollo de aplicaciones que requieran manipular datos siguiendo una lógica de almacenamiento y recuperación acorde a una colección predefinida o implementada por el propio programador.

6. Conclusiones

En este primer artículo de Colecciones en C# se presentó una generalización de los temas relacionados con colecciones o estructuras de datos, los cuales se profundizarán en próximas entregas; que al mismo tiempo contendrán las descripciones conceptuales, la motivación, la relevancia, y ejemplos prácticos esenciales de este tipo de construcciones o elementos de programa del lenguaje o el Framework.

En el siguiente artículo se iniciará la discusión conceptual acerca de la enumeración o enlistamiento de elementos de datos en una colección.

7. Literatura & Enlaces

Albahari, J., Albahari, B. (2012). C# 5.0 in a Nutshell. United States: O'Reilly Media.
Data structure — R introduction documentation
http://venus.ifca.unican.es/Rintro/dataStruct.html


O

viernes, 22 de julio de 2016

Tareas Comunes con Números en C# - Parte 5/5 | Clase Random

Índice

1. Introducción
2. Palabras Clave
3. Clase Random
3.1 Generalidades
3.2 Creación de instancias
3.3 Métodos comunes
3.4 Criptografía
4. Conclusiones
5. Literatura & Enlaces

1. Introducción

Para operaciones con números aleatorios, en .NET Framework se cuenta con la clase Random. Esta clase facilita al programador la generación no sólo de valores enteros aleatorios, sino además decimales y bytes. Este último artículo de la serie Tareas Comunes con Números en C#, describe tanto el uso de esta tipo de dato como buenas prácticas a tener en cuenta a la hora de instanciar objetos; al final se presenta una alternativa para la generación segura de valores pseudoaleatorios seguros para aplicaciones de criptografía.

2. Palabras Clave

  • Criptografía
  • Pseudoaleatorio
  • Random

3. Clase Random

3.1 Generalidades

La clase Random es un elemento de programa que actúa como un artefacto generador de números pseudoaleatorios. De acuerdo con "Random Class" (2016), la clase Random ha sido diseñado teniendo en cuenta los requerimientos estadísticos para la generación aleatoria de secuencias de números.

Los valores de los tipos de datos q ue genera esta clase comprende bytes, integers y doubles (Albahari, 2012).

3.2 Creación instancias

Una instancia de la clase puede ser creada usando el constructor predeterminado (i.e., sin argumentos) o especificando una semilla (seed).

Las siguientes líneas de código demuestran que la especificación de un valor de semilla para dos instancias de Random, garantiza la reproducibilidad de valores aleatorios: 

// Reproducibilidad de valores aleatorios:
var aleatorio1 = new Random(1);
var aleatorio2 = new Random(1);

Console.WriteLine(aleatorio1.Next(100) + ", " + aleatorio1.Next(100)); // 24, 11
Console.WriteLine(aleatorio2.Next(100) + ", " + aleatorio2.Next(100)); // 24, 11

En caso contrario, es decir sin reproducibilidad de valores, usar el constructor predeterminado. De ser así, la clase Random usa la hora actual del sistema para la instanciación. Sin embargo, el programador debe tener presente la advertencia dada en Albahari (2012)
"Because the system clock has limited granularity, two Random instances created close together (typically within 10 ms) will yield the same sequence of values."
Esto indica al programador que instancias creadas en deltas de tiempos muy ínfimos es análogo a crear dos instancias con la misma semilla (como el ejemplo de código de arriba).

Además se advierte: 
"A common trap is to instantiate a new Random object every time you need a random number, rather than reusing the same object."
Lo cual sugiere reutilizar una instancia en particular en lugar de crear una nueva cada vez que sea necesario. Aún así, en Albahari (2012) se aclara este punto inclusive más: 
"A good pattern is to declare a single static Random instance. In multithreaded scenarios, however, this can cause trouble because Random objects are not thread-safe."
Así que el programador debe mantener esta precaución con operaciones distribuidas en distintos threads que acceden a una única instancia static Random, en caso de omitirlase pueden obtener resultados inconsistentes.

3.3 Métodos comunes

Random cuenta con los siguientes métodos: 
Métodos clase Random
Figura 1. Métodos clase Random ("Random Class", 2016).
Aquí se puede ilustrar el uso del métodos NextDouble

var aleatorio = new Random();

Console.WriteLine(aleatorio.NextDouble());

En la salida estándar se produce el siguiente resultado: 

0.467010679872246

NextDouble genera un valor numérico double entre 0 y 1.

3.4 Criptografía

En Albahari (2012) anuncian que la funcionalidad de Random no se considera apropiada para alto nivel de seguridad, como en el caso de criptografía. En su lugar, Microsoft .NET Framework provee un generador de números aleatorios criptográficamente más robusto y seguro.

Del generador al que se hace referencia reside en el namespace System.Security.CryptographyEl programador puede conocer su uso a través de este ejemplo: 

// Generador pseudoaleatorio seguro:
var aleatorioSeguro = RandomNumberGenerator.Create();
byte[] bytes = new byte[32];
aleatorioSeguro.GetBytes(bytes);

Con este código sólo se crea la representación del número pseudoaleatorio como un arreglo de bytes. En el caso de requerirse una representación legible, este código permite obtener un valor entero a través de la clase BitConverter [Otros Mecanismos de Conversión en C#/4: Clase BitConverter]

// Obtención de entero a través de BitConverter:
byte[] b = new byte[4];
aleatorioSeguro.GetBytes(b);
int i = BitConverter.ToInt32(bytes, 0);

Console.WriteLine(i.ToString());

Resultado en la salida estándar de LINQPad

98007634

4. Conclusiones

Se comprendió cómo usar la clase Random para la generación de valores enteros, punto flotantes y bytes de modo aleatorio. Entre sus funciones estudiadas esta la reproducibilidad de valores aleatorios para experimentos, generación de valores aleatorios como decimales. Al final se advirtió que la implementación de Random no es útil para un alto nivel de seguridad en aplicaciones de seguridad; como criptografía.

La siguiente serie se enfoca en el estudio de enumeraciones en C#.

5. Literatura & Enlaces

Albahari, J., Albahari, B. (2012). C# 5.0 in a Nutshell. United States: O'Reilly Media.
Random Class (System) (2016, julio 22). Recuperado desde: https://msdn.microsoft.com/en-us/library/system.random.aspx
Otros Mecanismos de Conversión en C#/4: Clase BitConverter (2016, junio 22). Recuperado desde: https://ortizol.blogspot.com/2016/07/otros-mecanismos-de-conversion-en-csharp-parte-4-4-clase-bitconverter.html


O

Tareas Comunes con Números en C# - Parte 4/5 | Estructura Complex

Índice

1. Introducción
2. Palabras Clave
3. Estructura Complex
3.1 Generalidades
3.2 Sintaxis de declaración
3.3 Operaciones
4. Conclusiones
5. Literatura & Enlaces

1. Introducción

A parte de la estructura BigInteger, el programador C# cuenta con otra estructura también muy interesante: Complex. Esta estructura brinda los mecanismos para la operación de números complejos. Este penúltimo artículo describe cómo representar números de este conjunto.

2. Palabras Clave

  • Complex
  • Estructura
  • Física
  • Matemáticas
  • Número complejo

3. Estructura Complex

3.1 Generalidades

Al igual que BigInteger [Tareas Comunes con Números en C#/5 | Estructura BigInteger], la estructura Complex reside en el namespace Complex (assembly System.Numerics.dll), y fue introducida en la versión de Microsoft .NET Framework 4.0.

Complex proporciona elementos de programa para la representación de números complejos. Este conjunto de números se considera una extensión de los números reales y posee las estructuras esenciales para representar un cuerpo algebraicamente cerrado ("Número complejo", 2016).

Complex internamente representa un número complejo, el cual posee esta estructura: 
Estructura número complejo
Donde a y b miembros que representan la parte real e imaginaria, respectivamente, y su tipo de dato es double.

3.2 Sintaxis de declaración

Declarar una instancia de este tipo es sencillo: 

// Declaración de variables de tipo Complex:
var c1 = new Complex(5.0, 7.0);
var c2 = new Complex(3.1, 11.2);

Con WriteLine obtenemos su representación literal en salida estándar: 

Console.WriteLine(c1);
Console.WriteLine(c2);

(5, 7)
(3.1, 11.2)

3.3 Operaciones

Sobre un objeto de Complex, el programador puede invocar funciones -e.g., propiedades, métodos- para realizar otras operaciones útiles; como: 

Console.WriteLine(c1.Real);
Console.WriteLine(c1.Imaginary);
Console.WriteLine(c1.Phase);
Console.WriteLine(c1.Magnitude);

Salida: 

5
7
0.950546840812075
8.60232526704263

O partir crear un número complejo a partir de coordenadas polares: 

Complex c3 = Complex.FromPolarCoordinates(7.3, 7);

Console.WriteLine(c3);

Resultado: 

(5.50348645670612, 4.79600217064716)

No hay que dejar atrás las operaciones aritméticas básicas: 

Console.WriteLine(c1 + c3);
Console.WriteLine(c1 - c2);
Console.WriteLine(c1 * c2);
Console.WriteLine(c1 / c2);

Al ejecutar estas sentencias en LINQPad se obtiene: 

(10.5034864567061, 11.7960021706472)
(1.9, -4.2)
(-62.9, 77.7)
(0.695298037763791, -0.253980007404665)

Por otro lado, existen métodos static en Complex para efectuar operaciones más avanzadas; entre ellas (Albahari, 2012)
  • Trigonométricas, 
  • Logaritmos, 
  • Exponenciaciones, 
  • Conjugada

4. Conclusiones

Se estudió la estructura Complex. Estructura útil para la manipulación de valores del conjunto de los números complejos. Este tipo de conocimiento técnico puede resultar al programador de enorme utilidad para construir aplicaciones para contextos de física, matemática, o otras áreas de las ciencias básicas.

El último artículo de esta serie explicará cómo generar números pseudoaleatorios por medio de la clase Random.

5. Literatura & Enlaces

Albahari, J., Albahari, B. (2012). C# 5.0 in a Nutshell. United States: O'Reilly Media.
Tareas Comunes con Números en C#/5 | Estructura BigInteger (2016, julio 22). Recuperado desde: https://ortizol.blogspot.com/2016/07/tareas-comunes-con-numeros-en-csharp-parte-3-5-estructura-biginteger.html
Complex Structure (System.Numerics) (2016, julio 22). Recuperado desde: https://msdn.microsoft.com/en-us/library/system.numerics.complex(v=vs.110).aspx
Número complejo (2016, julio 22). Recuperado desde: https://es.wikipedia.org/wiki/N%C3%BAmero_complejo


O

jueves, 21 de julio de 2016

Tareas Comunes con Números en C# - Parte 1/5 | Conversiones

Índice

1. Introducción
2. Palabras Clave
3. Conversiones Númericas
4. Conclusiones
5. Literatura & Enlaces

1. Introducción

A partir de este artículo se inicia la serie C#: Tareas Comunes con Números en C#. Aquí el programador comprenderá varias de las operaciones comunes sobre valores numéricos que es posible efectuar con los artefactos de software que Microsoft .NET Framework proporciona. La serie se divide en 5 artículos que comprende
  1. Conversiones
  2. Matemática
  3. Estructura BigInteger
  4. Números Complejos
  5. Aleatoriedad

La primera parte -Conversiones- describe, a modo de resumen, los elementos de programa que permiten convertir números desde y hacia distintas fuentes: cadenas de caracteres, bases numéricas, entre otros.

2. Palabras Clave

  • Base numérica
  • Casting
  • Conversión

3. Conversiones

En las series Formato y Parseo en C# y Cadenas de Caracteres de Formato y Cadenas de Caracteres de Formato y Flags en C# se expusieron varios de los mecanismos que proporciona .NET Framework para la conversión de valores numéricos a partir de cadenas de caracteres -objetos string-.

En este artículo la tarea principal está enfocada en crear una tabla de resumen de estas operaciones de conversión disponibles para valores numéricos. La Tabla 1 describe una tarea, las operaciones involucradas, y un ejemplo explícito de su uso. 
Conversiones numéricas
Tabla 1. Ejemplos de conversiones numéricas.
¿Cuáles son los valores resultantes de cada conversión después de ejecutar estos ejemplos de código? En la Figura 1 se muestra el resultado obtenido en la ventana Debugger de LINQPad
Resultados conversiones numéricas
Figura 1. Resultados conversiones numéricas.
Este es el código fuente de prueba utilizado: 

> Prueba de ejecución (online): http://ideone.com/Ed90QR

4. Conclusiones

Se resumió el listado de funciones para la conversión de valores numéricos a partir de distintas fuentes, bases numéricas, tipo de casting, redondeo.

La segunda parte de esta serie discute varias de los miembros de la clase Math.

5. Literatura & Enlaces

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

O

Globalización y Localización en C#

Índice

1. Introducción
2. Palabras Clave
3. Internacionalización
3.1 Globalización
3.1.1 Generalidades
3.1.2 Lista de verificación
3.1.3 Validación de la cultura
3.2 Localización
4. Conclusiones
5. Literatura & Enlaces

1. Introducción

Una aplicación que tiene alto impacto en número de usuarios tiende a trascender límites culturales. Esto requiere que el programador escriba código que adapte la aplicación a distintas configuraciones regionales y culturales. .NET Framework cuenta con los mecanismos apropiados para facilitar las tareas que comprometen la internacionalización de una aplicación: globalización y localización. Este artículo C# describe los fundamentos a comprender para la escritura de una aplicación de esta categoría.

2. Palabras Clave

  • Assembly satélite
  • Cultura
  • Globalización
  • Internacionalización
  • Localización
  • Región
  • Satellite assembly

3. Internacionalización

Para internacionalizar una aplicación el programador debe llevar a cabo dos tareas básicas:
  • Globalización, y 
  • Localización

3.1 Globalización

3.1.1 Generalidades

La globalización de una aplicación está relacionada con la implementación de las siguientes tareas (Albahari, 2012)
  1. Aseguramiento de la continuación en la estabilidad de la aplicación cuando ésta se ejecuta sobre una configuración regional y cultural distinta a la que fue desarrollada.
  2. Conservación y respeto de las reglas de formato de una cultura cualquiera; por ejemplo en la presentación de fechas, valores de moneda.
  3. Uso de assemblies satélite -un satellite assembly es un assembly que contiene la configuración los recursos específicos para un idioma dado- para adaptar la aplicación de acuerdo a lengua de una cultura específica.
[NotaEstas tareas están ordenadas de mayor a menor prioridad; esto quiere decir que el programador debe preocuparse por alcanzar los objetivos en este orden dado durante el desarrollo de la aplicación.]

3.1.2 Lista de verificación

En el artículo Cadenas de Caracteres y Manipulación de Texto en C#/5: Char se describen varios de los aspectos importantes en la manipulación valores literales. Aún así, aquí se resumen las tareas a llevar a cabo durante el proceso de globalización (Albahari, 2012)
  • Comprensión del sistema Unicode y codificación de texto (Cadenas de Caracteres y Manipulación de Texto en C#/5: Sistemas de Codificación de Texto y Unicode).
  • Distinguir entre la funcionalidad que ofrece los métodos ToUpperToLower, ToUpperInvariant y ToLowerInvariant en objetos string y char.
  • Dar prioridad a los mecanismos de formato y conversión/parseo independientes de la cultura.
  • Optar por el formato y conversión dependiente cuando el comportamiento de la aplicación está orientado estrictamente a una cultura específica.

3.1.3 Validación de la cultura

Para validar o probar que la configuración regional y cultural son aptas para un escenario concreto, el programador puede usar la propiedad Thread.CurrentThread.CurrentCulture para la asignación un valor de cultura específico.

Para ejemplificarlo, esta línea de código C# resulta útil: 

Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo ("tr-TR");

Se ha usado la cadena "tr-TR" para referirse a la configuración cultural turca; esto es así porque resulta apropiada como prueba; así: 

Console.WriteLine("i".ToUpper() != "I"); // true
Console.WriteLine("I".ToLower() != "i"); // true

Esto no es cierto, por ejemplo, para la la configuración regional y cultural "en-GB".

Además se debe tener en cuenta estos otros dos casos para la cultura turca (Albahari, 2012):
  • Las fechas se formatean como día.mes.año.
  • Se usa la coma (,) como indicador de punto decimal.

3.2 Localización

En particular, la localización está más relacionada con la última tarea descrita en la sección 3.1.1; es decir la escritura de assemblies satélite. La ventaja de esta tarea es que el programador puede dedicar esfuerzos posteriores a la construcción de la aplicación.

.NET Framework cuenta con los mecanismos y artefactos de software para permitir al programador aplicar un formato específico acorde a las reglas de una cultura particular. Esto por medio del uso de la funcionalidad de formato que ofrece el método ToString en instancias de objetos DateTime y tipos de datos por valor.

Sin embargo, el programador debe tener en cuenta que durante la escritura de la aplicación se debe asumir una cultura neutra; de lo contrario surgirán comportamientos inesperados hasta la falla fatal en la ejecución de la aplicación (Albahari, 2012).

[Nota: Más adelante se describe con más detalle este proceso de localización de aplicaciones.]

4. Conclusiones

Con esto artículo al programador ha comprendido los lineamientos básicos a considerar a la hora de construir una aplicación que trasciende una cultura y requiere adaptar formatos y conversiones a distintas configuraciones regionales y culturales.

Los próximos artículos se enfocan en el trabajo con valores numéricos: conversiones, matemática, uso de la estructura BigInteger, números complejos, entre otros.

5. Literatura & Enlaces

Albahari, J., Albahari, B. (2012). C# 5.0 in a Nutshell. United States: O'Reilly Media.
Cadenas de Caracteres y Manipulación de Texto en C#/5: Char (2016, julio 21). Recuperado desde: https://ortizol.blogspot.com.co/2015/11/cadenas-de-caracteres-y-manipulacion-de-texto-en-csharp-parte-1-5-char.html
Cadenas de Caracteres y Manipulación de Texto en C#/5: Sistemas de Codificación de Texto y Unicode (2016, julio 21). Recuperado desde: https://ortizol.blogspot.com.co/2016/04/cadenas-de-caracteres-y-manipulacion-de-texto-en-csharp-parte-5-5-sistemas-de-codificacion-de-texto-y-unicode.html


O