martes, 25 de junio de 2013

Refactorización de la Clase Prueba

En la presente entrada nos detendremos en la refactorización de la clase Prueba (descrita en Primer Programa en C#). Se introducirán nuevos conceptos, y se hará una descripción del uso del método Main: sus distintas firmas, valores de retorno, su parámetro en forma de arreglo de tipo string. También hablaremos de los tipos de funciones en C#.

Debido a que ya hemos hecho uso del concepto de clase, aprovecharé esta misma entrada para describirla (como bloque de construcción y elemento fundamental en la programación orientada a objetos).

- ¿Qué es la refactorización?:

Si nos apoyamos en la definición en [1], se entiende que la refactorización es el proceso de modificar la estructura interna de una construcción de código fuente (clase, namespace, enumeración, método, propiedad, etc.) sin alterar su protocolo (funcionalidad o comportamiento) externo. Otra manera de referirnos al mismo proceso es limpiar el código.


- Refactorización de la clase Prueba [2]:

En el primer programa que presentamos en [2], se mostró varios de los conceptos básicos de la programación en C#. Ahora les explicaré una versión de esa clase a la que le he aplicado refactorización (o limpieza del código) con el fin de hacer algunas definiciones importantes que nos servirán para la escritura de programas mejor estructurados y con código comprensible a futuro y para otros programadores.

Si nosotros observamos detenidamente, por ejemplo la clase Console [3], la documentación asociada a ésta muestra una descripción simplificada de los constructores, métodos, propiedades, etc., encontramos funciones de alto nivel y bajo nivel.

Una definición básica para funciones de alto nivel, son aquellas que muestran el concepto de una función desde su forma más abstracta (más cercana al lenguaje de los humanos), es decir, si tenemos:

public void Suma(double valorA, double valorB)

Mientras que una función de bajo nivel, es aquella que presenta en un nivel (cercano al lenguaje de la arquitectura de la máquina) de detalle la implementación de una función. Así:

public double Suma(double valorA, double valorB)
{
double suma = valorA + valorB;

return suma;
}

Podemos apreciar la diferencia entre ambas declaraciones: la primera resulta más simple y directa que la segunda, dado que esta última nos ofrece la declaración completa del método Suma con todas las sentencias dentro del cuerpo.

Ahora sí pasemos a hacer una refactorización de la clase Prueba presentada en [2]:

class Prueba
{
static void Main()
{
Console.WriteLine(PiesAPulgadas(30)); // 360
Console.WriteLine(PiesAPulgadas(100)); // 1200
}

static int PiesAPulgadas(int pies)
{
int pulgadas = pies * 12;
return pulgadas;
}
}


Aquí se puede ver el uso explícito de los dos conceptos anteriores (funciones de alto y bajo nivel).  Aquí tenemos la firma (signatura) del método PiesAPulgadas:

static int PiesAPulgadas(int pies)

Así mismo, la invocación de esa función desde una función de alto nivel (Main):

static void Main()
{
Console.WriteLine(PiesAPulgadas(30)); // 360
Console.WriteLine(PiesAPulgadas(100)); // 1200
}

Examinemos algunos de los elementos más importantes de la clase Prueba:


El método Main es el método reconocido por C# para señalar el punto de entrada de ejecución del programa. Este método se caracteriza por poseer diferentes versiones permisibles:

static void Main()
static void Main(string[] args)
static int Main()
static int Main(string[] args)

En cuanto a los tipos de retorno (void e int) el segundo es utilizado para indicar el estado (satisfactorio, con advertencias, o error) de finalización del programa.

Dos de las versiones de este método, además, especifican un parámetro como arreglo de objetos string; útil para programas tipo consola que requieren de argumentos ingresados de la línea de comandos (prompt).


- Clases de funciones en C#:

El método Main es un tipo de función en C#. Existen otros; como:
  • Operadores aritméticos: suma (+), resta (-), producto (*), y cociente (/).
  • Constructores: Especifican la forma en que debe ser creado un objeto.
  • Propiedades: Permiten cambiar y obtener el estado de un objeto.
  • Métodos: Comportamiento del objeto.
  • Eventos: Responde a los cambios del estado de un objeto.
- La clase Console [3]:

Console representa objetos para la entrada, salida y error estándares. Permite a un programa tipo consola obtener valores desde la entrada estándar (teclado); igualmente presentar valores en la salida estándar (pantalla). En la refactorización de la clase Prueba se puede ver el uso del método WriteLine para mostrar los valores devueltos por el método PiesAPulgadas.


- Concepto de namespace:

En el nivel más exterior de un programa, los tipos se organizan dentro de namespaces. En la línea 1 se observa la inclusión de los tipos disponibles en el namespace System []. La clase Console pertenece a ese namespace.

Definición de un namespace:


Al igual que las clases Prueba y Prueba2, .NET Framework también se encuentra organizado dentro de namespaces anidados. Por ejemplo, este es el namespace que contiene los tipos para la manipulación de texto:

using System.Text;

Conclusiones:

El uso de la refactorización es importante para limpiar o reestructurar el código de proyectos pasados. Con la clase Prueba se ejemplificó el proceso anterior. Se introdujo los conceptos de función de bajo y alto nivel para diferenciar funciones que son legiblemente humanas, como los de bajo nivel, que muestran los detalles de la implementación de un tipo de función. Finalmente, se definió lo que es y para qué sirve un namespace.

Glosario:

- Alto nivel
- Bajo nivel
- Entrada estándar
- Namespace
- Refactorización
- Salida estándar

Referencias:
[1] Refactorización - http://es.wikipedia.org/wiki/Refactorizaci%C3%B3n
[2] Primer Programa en C# - http://ortizol.blogspot.com/2013/06/primer-programa-en-c.html
[3] Console class - http://msdn.microsoft.com/en-us/library/system.console.aspx
[4] I want to know the difference between Low-level functions & Top-level functions - http://stackoverflow.com/questions/633617/i-want-to-know-the-difference-between-low-level-functions-top-level-functions
[5] C# 5.0 in a Nutshell by Joseph Albahari and Ben Albahari. Copyright 2012 Joseph Albahari and Ben Albahari, 978-1-449-32010-2.
[6] System Namespace - http://msdn.microsoft.com/en-us/library/system.aspx.
H

2 comentarios:

  1. Buenas tardes.

    Igualmente en esta entrada del blog tampoco se ven los códigos.

    Un saludo.

    ResponderEliminar
  2. Gracias David por su observación. Se ha realizado la corrección de presentación de código fuente C#. Saludos.

    ResponderEliminar

Envíe sus comentarios, dudas, sugerencias, críticas. Gracias.