Aprendiendo .NET sobre la marcha: Viejos Windows Forms (i)


Aprendiendo .NET sobre la marcha: viejos WIndows Forms (ii)>>


Si, ya son viejos. Windows 8 y 10 usan WPF para sus aplicaciones, sin embargo aún siguen usándose, sobretodo cuando se desarrollan aplicaciones que seguirán viviendo en versiones desde Windows 7. También son buenas para aprender. Así que vamos a comenzar, y como había dicho: comienzo con el análisis de una aplicación sencilla pero tratando de que sea funcional y útil al aprendizaje. Algo más: Esta serie de publicaciones es un tutorial básico para aprender a programar con C# en VStudio; Ya después me daré a la tarea de profundizar en otros temas, de ahí la importancia de sus comentarios. Ahora, sin más preámbulos, comencemos.

Planteando el proyecto

La aplicación a desarrollar implementará mejoras a la anterior, será, por tanto, una que realice cálculos geométricos: perímetros, superficies, volúmenes; agregaremos rectas y puntos, un graficador sencillo de funciones predefinidas y un registro de eventos, a manera de historial, mismo que podrá ser guardado en un archivo.

Con esto cubrimos el manejo de controles y de archivos, y será una aplicación de un solo formulario a la que podremos cambiar la fuente también y guardar esa configuración.

Iniciando el análisis

Las funcionalidades son:

  • Cálculo de perímetros y superficies para figuras planas, en concreto: polígonos regulares, cuadriláteros y triángulos.
  • Cálculo de áreas laterales y totales para prismas y pirámides con bases en forma de las figuras anteriores.
  • Determinar la ecuación de la recta a partir de dos puntos
  • Determinar la ecuación de la recta a partir de un punto y la pendiente
  • Determinar un segundo punto de una recta a partir de un punto y la pendiente
  • Mostrar la gráfica de funciones trigonométricas entre -360 y 360 grados
  • Mostrará una lista de las los cálculos solicitados, los datos proporcionados y los resultados a manera de historial
  • Se podrá guardar el historial en un archivo de texto
  • Se organiza todo por pestañas: en la primera estarán los cálculos, en la segunda el graficador y en la tercera el historial

Esta aplicación es útil a nivel escolar, aunque hay otras mucho más completas. También es útil a nuestros propósitos de aprendizaje.

Creando el proyecto en VStudio

Comenzamos creando un proyecto en VStudio eligiendo el tipo Windows Forms Application, y luego añadimos un nuevo proyecto de tipo Library class (Biblioteca de clases) para .NET Framework, después agregamos un proyecto de Pruebas Unitarias.

Biblioteca de clases

¿Por qué una biblioteca de clases? ¿Qué es? ¿Para qué sirve? Porque permite separar el código colocando todas las clases y funciones por separado, generando una DLL que luego podemos reutilizar o modificar sin tener que recompilar todo el proyecto. Es una colección de clases, enumeraciones y demás elementos agrupadas en un espacio de nombres. Para mantener aislados y organizados los elementos de una solución, de esta forma podemos solo modificar la DLL generada y reutilizarla en otros proyectos. El siguiente es el contenido inicial para el código que existirá como parte de nuestra biblioteca de clases, e involucra algunos conceptos que ahondaremos.

namespace TutoWinForm.Core {
    public interface IPoligono {
        float Perimetro();
        float Superficie();
    }
    public interface IPoliedro {
        float Volumen();
        float AreaLateral();
        float AreaTotal();
    }

    public class Triangulo : IPoligono {
        public float LadoA { get; set; }
        public float LadoB { get; set; }
        public float LadoC { get; set; }

        public float Perimetro() {
            return LadoA + LadoB + LadoC;
        }

        public float Superficie() {
            return LadoA * LadoB / 2;
        }
    }
    public class Cuadrilatero : IPoligono {
        public float LadoA { get; set; }
        public float LadoB { get; set; }
        public float LadoC { get; set; }
        public float LadoD { get; set; }

        public float Perimetro() {
            return LadoA + LadoB + LadoC + LadoD;
        }

        public float Superficie() {
            if (LadoA == LadoB && LadoB == LadoC && LadoC == LadoD)
                return LadoA * LadoA;
            else
                return (LadoA + LadoB) * LadoC / 2;
        }
    }
    public class PoligonoRegular : Triangulo, IPoligono {
        public int NumLados { get; set; }

        public new float Perimetro() {
            return NumLados * LadoA;
        }

        public new float Superficie() {
            return base.Superficie() * NumLados;
        }
    }

    public class Prisma : IPoliedro {
        public PoligonoRegular Base { get; set; }
        public float Altura { get; set; }

        public Prisma() {
            Base = new PoligonoRegular();
        }

        public float AreaLateral() {
            return Base.Perimetro() * Altura;
        }

        public float AreaTotal() {
            return AreaLateral() + (Base.Superficie() * 2);
        }

        public float Volumen() {
            return Base.Superficie() * Altura;
        }
    }
    public class Piramide : Prisma, IPoliedro {
        public float AlturaCara { get; set; }
        public Piramide() {
            Base = new PoligonoRegular();
        }

        public new float AreaLateral() {
            return Base.Perimetro() * AlturaCara / 2;
        }
        public new float AreaTotal() {
            return AreaLateral() + Base.Superficie();
        }
        public new float Volumen() {
            return base.Volumen() / 3;
        }
    }
}

La palabra interface define una interfaz, que es un contrato mediante el cual, la clase que lo use se obliga a implementar los métodos ahí descritos. En realidad no crea herencia, ni herencia múltiple, ya que no contiene implementaciones de funciones o propiedades, solo la descripción. Son usadas para mantener coherencia entre las clases.

En cambio, la clase Poligono sí hereda los métodos y propiedades de la clase Triangulo, lo mismo para entre las clases Prisma y Piramide.

Como se puede ver, en las clases Triangulo y Prisma ya se implementan algunos métodos que también se implementan en las clases heredadas Poligono y Piramide, por ello estoy utilizando la palabra new, mientras que dentro de la nueva implementación utilizo base. Es una forma de Polimorfismo La palabra base especifica que se utilice la implementación hecha en la clase base en lugar de la indicada en la clase heredada.

Én la siguiente publicación haremos nuestras pruebas unitarias para verificar el correcto funcionamiento de nuestras clases y luego será la aplicación de Windows

Agradezco los comentarios que puedan hacerme, así como el que se suscriban para recibir noticias y, si consideran útil, compartir mi blog.

Comentarios

Entradas populares