Mostrando entradas con la etiqueta Programación. Mostrar todas las entradas
Mostrando entradas con la etiqueta Programación. Mostrar todas las entradas

I'm Programmer

Navigating into Internet I found this video, then I remembered my beginning like programmer.

It's true that I'm not a multimillionaire, but to make software has given to me many happy moments and a few of pride. Now when I look my students I imagine them like the next Bill Gates or Mark, then they employ to me to advise their company and to drink coffee, earning a great salary.

But I remember too, a few of them will become programmers. Many of them say: "i dislike Computer Programming or i hate to programming", then I think.. it hate programming or it hasn't brain to do it.


Image courtesy of suphakit73 - FreeDigitalPhotos.net

My words were heavy, well, I challenge you to build software. 

Do you accept?


Fundamentos de programación

Introducción a la algoritmia 

La algoritmia es el “arte” de identificar y disponer los pasos necesarios, para realizar una tarea, en forma secuencial. ¿Qué significa esto y para qué sirve?. 
Aunque los computadores pueden realizar una cantidad de cálculos tan grande (billones de operaciones por segundo), no son, lo que se podría llamar: inteligentes, a diferencia de las personas (normalmente. ;-D). Por tal motivo ningún computador realiza acción alguna sin que antes se le hayan dado todos y cada uno de los pasos que debe ejecutar para realizar la tarea y, además, estos pasos deben tener el orden correcto. 

Image courtesy of ArtJSan - FreeDigitalPhotos.net
Entonces, para que un algoritmo pueda representar la realización de una tarea se debe tener 2 cosas: 
1) Todos los pasos necesarios 
2) Los pasos deben estar en un orden correcto 

Por ejemplo, se quiere representar mediante un algoritmo las acciones que realiza una persona desde que se levanta en la mañana, hasta que se ducha para salir al trabajo.  
Opción 1
Paso 1: Levantarse 
Paso 2: Caminar hacia el baño 
Paso 3: Abrir la llave 

Para algunas personas esto puede presentar perfectamente la tarea, sin embargo, para un computador NO, ¿por qué?, simple, si se realizan los pasos anteriores podría ocurrir que la persona se duche sin quitarse la pijama (a no ser que duerma desnudo o desnuda). También podría ser que la tarea esté inconclusa ya que en ningún momento se ha indicado que la persona haya entrado a la zona de la ducha.  

Opción 2
Paso 1: retirar las mantas o cobijas 
Paso 2: levantarse de la cama 
Paso 3: Caminar hacia el baño 
Paso 4: abrir la llave de la ducha (del agua caliente)
Paso 5: desnudarse 
Paso 6: acercarse a la ducha y tocar el agua con la punta de un pie 
Paso 7: esperar a que el agua adquiera la temperatura apetecida 
Paso 8: Ponerse bajo la ducha 

Como se puede ver el nivel de detalle de la opción 2, es mucho más alto y, por tanto, la incertidumbre o el margen de realizar la tarea de forma incorrecta, es menor. 

Diagramas de flujo

Un diagrama de flujo es la forma en la que se puede representar de forma gráfica un algoritmo. Esto es de gran utilidad ya que permite representar las tareas en una forma que puede ser más natural para las personas no expertas. 

Al igual que cuando se va en un vehículo se pueden ver diferentes señales y dichas señales tienen un significado concreto, en los diagramas de flujo existen unas cuantas figuras (aunque depende en muchos casos del diseñador normalmente son pocas), que tienen un significado en concreto. Normalmente o las más comúnmente utilizadas son: 


También podrían existir otros específicos para las tareas de un computador como: imprimir en pantalla, capturar de teclado, o incluso actividades repetitivas Sin embargo, es posible con solo los 3 iniciales, representar cualquier tarea; tan solo basta con unir los símbolos mediante líneas. Es justamente en esta simplicidad donde radica el potencial de los diagramas de flujo. 

El siguiente ejemplo representaría las acciones que realiza una persona en la mañana entre que se despierta y se ducha. 

Programación Orientada a Objetos (POO - en inglés OOP)

Image courtesy of digitalart - FreeDigitalPhotos.net
La programación orientada a objetos es un paradigma o un modelo de programación que pretende representar por medio de atributos y métodos (codificados en un lenguaje de programación) cualquier cosa, ya sea del mundo real o no.

Conceptos iniciales

Antes de explicar como funciona es necesario conocer algunas palabras que forman parte del lenguaje común de la programación orientada a objetos. Aquí unas definiciones como las transmito a mis alumnos.

Clase:

Una clase es una representación mediante código (C#, Java y otros) de cualquier cosa, es es la forma en que el programador define que caracteriza a algo y que comportamientos tiene, por ejemplo:

Si se quiere representar un vehículo se podrían obtener las siguientes características (Atributos):
  • Un vehículo tiene un número de llantas
  • También tendrá una marca
  • Un número de caballos de fuerza
  • Un color
  • Entre otras cualidades que diferencia a un vehículo de cualquier cosa que no es un vehículo.
 Pero un vehículo no es solo las cualidades que lo definen como tal, también es las acciones que puede realizar:
  • Arrancar
  • Frenar
  • Girar
  • Acelerar
Cada acción (Método) además de ejecutarse puede recibir una determinada información (parámetro) que puede modificar la forma en que dicha acción se realiza, por ejemplo se puede acelerar con más o menos potencia.

Así como existe la forma de representar lo anterior mediante código, también existen formas para representarlo de una manera gráfica, la siguiente es una representación mediante un lenguaje de modela comúnmente utilizado cuando se realiza programación orientada a objetos (UML):



El equivalente en código (Todo el código en esta página usará C# como lenguaje de programación)


    class Vehiculo
    {
        public int Numero_llantas;
        public string Marca;
        public float Caballos;
        public string Color;

        public bool Arrancar()
        {
            // Aquí lo que debe hacer para arrancar
            return true;
        }

        public bool Frenar(float Fuerza)
        {
            // Aquí lo que debe hacer para frenar
            return true;
        }

        public void Girar(float Angulo)
        {
            // Aquí lo que debe hacer para girar
        }

        public void Acelerar(float Fuerza)
        {
            // Aquí lo que debe hacer para Acelerar
        }
    }

Objeto: 

Recurriendo a la definición más conocida, un objeto es la instancia de una clase. Aunque este concepto es bastante especifico para cualquiera que lleve algún tiempo con la OOP, es de esperar esto no diga nada a alguien nuevo en la programación, incluso puede crear más confusión, como lo he podido identificar en muchos alumnos, por tal razón presento una definición un tanto personal que busca que aquellos que apenas están empezando a conocer la programación entiendan de mejor manera que es un objeto.

Como se vio, una clase es la forma en que un programador busca representar mediante código algo (cualquier cosa), pues dicho código no deja de ser simplemente código, inerte inanimado es como es como tener el ADN de una persona, pero mientras no exista ninguna persona ese ADN no será más que una serie de bases nitrogenadas: adenina, guanina, citosina y timina, en un archivo. Siguiendo esta descripción una persona (en sentido de POO), vendría a ser el objeto es decir la representación en vida de las capacidades y cualidades descritas en clase.

Al igual que pueden existir 7 mil millones de personas, se podrían tener cualquier numero de representaciones o instancias de una clase, donde cada representación (objeto), podría tener valores diferentes para cada uno de sus atributos, por ejemplo, un atributo de las personas puede ser el color de los ojos, todas las personas tienen color de ojos, solo que algunos los tienen azules otros verdes, otros marrón, etc.


Siguiendo con el ejemplo del vehículo, la forma de crear (dar vida), y por ende poder dar valor a sus cualidades e invocar o ejecutar sus métodos, es mediante el uso de la palabra new, y la forma de hacer referencia a sus atributos y métodos es poniendo un punto entre el objeto y el atributo. Es importante resaltar que en programación un objeto no es más que una variable (aunque una variable que es la representación viva de la clase). A continuación como se representa lo anterior en código:



            Vehiculo Camion = new Vehiculo();
            Camion.Numero_llantas = 16;
            Camion.Marca = "MACK";
            Camion.Caballos = 1000;
            Camion.Color = "Azúl";

            Vehiculo Motocicleta = new Vehiculo();
            Motocicleta.Numero_llantas = 2;
            Motocicleta.Marca = "Ducati";
            Motocicleta.Caballos = 150;
            Motocicleta.Color = "Roja";

Como se puede ver, un vehículo puede ser cualquier cosa que se considere como tal, una motocicleta, un camión, un auto familiar, etc, siempre y cuando se pueda representar con las características y las acciones definidas en la clase.

Atributo:

Un atributo es una cualidad de los muchos que caracterizan algo, por ejemplo: Color de piel, número de patas, Valor de una factura, etc. Todo atributo es un dato y como tal está enmarcado en lo que en programación se conoce como tipo de datos, es decir la naturaleza del dato, siendo más concretos un tipo de dato puede ser: numérico (Número de llantas), texto (Nombre de la persona), fecha (Fecha de nacimiento), etc.

Método:

Toda acción que pueda realizar un objeto se conoce como método, aunque este no es necesariamente original de la programación orientada a objetos, ésta si hace uso intensivo de ella. Un método en otros términos es una función, es la forma en que se puede por u lado reducir la construcción de código mediante la re-utilización y por otro lado simplifica la misma mediante el encapsulamiento (ocultamiento) de funcionalidades. Un ejemplo habitual es el envío de correos electrónicos, para un programador es ineficiente si tuviera, siempre que necesite envía un correo, escribir la lógica que permite comunicarse con un servidor de correo y solicitarle el envío de uno. En lugar de ello simplemente invoca una función diseñada para tal fin pasando los parámetros que requiera la función.

Es muy importante tener en cuenta que una función, al igual que un atributo, puede tener un valor determinado, lo que se conoce como valor de retorno (o simplemente retorno). Por ejemplo la función bool Frenar(float Fuerza) retorna un valor de falso o verdadero que puede indicar si el vehículo se detuvo o no.

Parámetro: 

Un parámetro es un dato que se envía a una función para modificar el comportamiento de la misma dependiendo el valor mismo que se envíe, por ejemplo en bool Frenar(float Fuerza), se envía una variable tipo float llamada Fuerza quele dira a la función con que intensidad debe frenar el vehículo.

Padre - Hijo - Herencia:

Este es uno de los conceptos más significativos de la POO, permite optimizar la forma en que se programa ya que reduce las líneas de código necesarias para muchas tareas. De igual manera en que un padre hereda cualidades a sus hijos, color de ojos, contextura física, color de piel, etc, una clase puede heredar sus cualidades a otras.

Anteriormente se dijo que un vehículo puede ser cualquier cosa que se identifique como tal, sin embargo hay vehículos que tiene características especiales, que los diferencian de otros vehículos sin dejar de ser vehículos en si mismos. Por ejemplo una motocicleta es un vehículo tanto como lo es un camión, pero ambos tienen características especiales que los diferencian unos de otros.

Un camión tiene puertas en tanto que una motocicleta no, por otro lado la motocicleta tiene manillar (casi no encuentro algo que tengan las motos y los Camiones nos ;)), es caso es que no es simplemente que los valores en sus atributos sean diferentes como es el caso del número de llantas, sino que tienen diferentes atributos por eso son dos cosas diferentes aun que con un mismo padre.

En el ejemplo anterior el padre sería el Vehículo en tanto que Motocicleta y Camión Serían los hijos:



Para representar la herencia cada lenguaje puede usar sus propias palabras, por ejemplo en C# se usan los dos puntos ":" para decir que una clase A hereda de una clase B, Así:


    class Camion : Vehiculo
    {
        public int Numero_Puertas;
    }

De  igual manera se pueden creaqr objetos específicos de cada hijo con la salvedad que no será necesario reescribir los atributos o métodos del padres, sino que la clase hijo los hereda y por tanto puede hacer uso de ellos.


    class Camion : Vehiculo
    {
        public int Numero_Puertas;
    }


y para crear los objetos se podría usar:


        Camion Camion1 = new Camion();
        Camion1.Numero_llantas = 16;
        Camion1.Marca = "MACK";
        Camion1.Caballos = 1000;
        Camion1.Color = "Azúl";
        Camion1.Numero_Puertas = 2;

        Motocicleta Motocicleta1 = new Motocicleta();
        Motocicleta1.Numero_llantas = 2;
        Motocicleta1.Marca = "Ducati";
        Motocicleta1.Caballos = 150;
        Motocicleta1.Color = "Roja";
        Motocicleta1.Manillar = "Muy chulo";









Programación Orientada a Objetos (POO - en inglés OOP)

Image courtesy of digitalart - FreeDigitalPhotos.net La programación orientada a objetos es un paradigma o un modelo de programación qu...