10.- Las propiedades

10.- Las propiedades
Como ya dijimos, las propiedades es una mezcla entre método y campo, puesto que almacenan valores y además nos permiten hacer cálculos sobre ellos. Para el que accede a la propiedad, la ve como un campo.
Además, son miembros de clase que nos permiten leer, escribir o calcular un campo privado de la clase, es decir, nos permite leerlo, cambiarle su valor o calcularle uno nuevo.
Una propiedad genérica, tiene la siguiente estructura:

  • Contiene un descriptor Get. Se utiliza para leer la propiedad. Una propiedad sin este valor, se considera de solo escritura, puesto que no es posible leerla.
  • Contiene un descriptor Set. Se utiliza para asignar un valor a la propiedad. Si este descriptor no existiera, la propiedad sería solo de lectura y por tanto, sería como cuando vimos la constante, que era un campo de solo lectura.
  • Tiene un campo del mismo tipo que la propiedad y asociado a esta.

Las propiedades no son campos, por tanto no podemos pasar como argumento en un método una propiedad.

¿Qué usos le podemos dar a las variables? Pues podemos usarlas para validar datos antes de permitir un cambio, exponer los datos de forma transparente obtenidos desde otro origen o cuando se realiza una acción, por ejemplo si cambiamos su valor, se genera un evento avisándonos de que la propiedad ha cambiado.

¿Dónde se declaran las propiedades? Las propiedades se declaran a nivel de clase mediante el tipo, el nombre de la propiedad, el descriptor get y el descriptor set.

Ejemplo. En la siguiente propiedad, declaramos un campo month y le asignamos el valor 7. Acto seguido declaramos la propiedad pública Month y en la cual si nosotros solicitáramos su lectura, nos daría el valor del campo month, en este caso, nos daría el valor 7. Si dijéramos que la propiedad Month vale ahora 10 (Octubre), en el descriptor set, comprobaría que el valor que le pasamos es mayor que 0, que como mínimo vale 1 y menor que 13, que como máximo valga 12. Una vez efectuada la comprobación le asignaría el valor a la propiedad. ¿Qué ocurriría si le asignamos el valor 15? Pues como no cumple las condiciones de mayor de 0 y menor de 13 y no se asignaría ningún valor a la propiedad quedando en su estado anterior. El valor value, es el valor que asignamos a la propiedad. ¿bien?

C#

    private int month = 7;  // el campo month
    public int Month    // La propiedad Month
    {
        get
        {
            return month;
        }
        set
        {
            if ((value > 0) && (value < 13))             {                 month = value;            
        }         
    }     
} 

VB.NET

 
Private m_month As Integer = 7' el campo month
Public Property Month() As Integer' La propiedad Month
 		Get
 			Return m_month
 		End Get
 		Set(value As Integer)
 			If (value > 0) AndAlso (value < 13) Then
				m_month = value
			End If
		End Set
End Property

Otro ejemplo con nuestra clase preferida, la clase Vehiculo. Asignamos un propiedad a esta clase llamada Matricula y otra Potencia, pues vamos a crear una instancia de esta y vamos a leer y escribir sus propiedades.
C#

static void Main(string[] args)
{
     Console.WriteLine ("Comienza la App");
     Vehiculo miVehiculo = new Vehiculo();
     miVehiculo.Potencia = 120;
     miVehiculo.Matricula = "0000 XXX";
     Console.WriteLine(miVehiculo.Potencia);
     Console.WriteLine(miVehiculo.Matricula);
     Console.WriteLine("Pulse INTRO para finalizar..");
     Console.ReadLine();
} 

class Vehiculo
{
        public Vehiculo()
        {
            // código utilizado al instanciar la clase
        }
        private double _potencia;
        public double Potencia
        {
            get { return _potencia; }
            set { _potencia = value; }
        } 

        private string _matricula;
        public string Matricula
        {
            get { return _matricula; }
            set { _matricula = value; }
        }
}

VB.NET


Private Shared Sub Main(args As String())
       Console.WriteLine("Comienza la App")
       Dim miVehiculo As New Vehiculo()
       miVehiculo.Potencia = 120
       miVehiculo.Matricula = "0000 XXX"
       Console.WriteLine(miVehiculo.Potencia)
       Console.WriteLine(miVehiculo.Matricula)
       Console.WriteLine("Pulse INTRO para finalizar..")
       Console.ReadLine()
End Sub  

Private Class Vehiculo

       Public Sub New()
           ' código utilizado al instanciar la clase
       End Sub

       Private _potencia As Double
       Public Property Potencia() As Double
            Get
                 Return _potencia
            End Get
            Set(value As Double)
                _potencia = value
            End Set
       End Property
       Private _matricula As String
       Public Property Matricula() As String
            Get
                Return _matricula
            End Get
            Set(value As String)
                _matricula = value
            End Set
       End Property
End Class

En este ejemplo, desde el método de clase Main, creamos un objeto Vehículo llamado miVehiculo, le asignamos a la propiedad Potencia un valor de 120 , a la propiedad de Matrícula 0000 XXX y una vez asignadas, las imprimimos por pantalla.
¿Qué ocurre dentro de las propiedades? Cuando le asignamos un valor a la Propiedad Potencia, estamos accediendo al descriptor set dándole al valor del campo _potencia, el valor asignado de 120 pero en el siguiente paso, cuando lo imprimimos por pantalla accedemos al descriptor get y este lo que hace es ir a buscar el campo privado de clase _potencia y devuelve su valor que es 120. Así de fácil.

Otro ejemplo un poco más complejo.
C#

class Cuadrado
    {
        public double _lado;
        public Cuadrado(double s)  //constructor
        {
            _lado = s;
        }
        public double Area
        {
            get
            {
                return _lado * _lado;
            }
            set
            {
                _lado = System.Math.Sqrt(value);
            }
        }
        public double Volumen
        {
            get { return _lado * _lado * _lado; }
            set { _lado =System.Math.Pow( value, 1 / 3); }
        } 

static void Main(string[] args)
{
      Cuadrado MiCuadrado = new Cuadrado(4);
      Console.WriteLine(MiCuadrado.Area); // imprime por pantalla 16
      MiCuadrado.Area = 100; // ahora el lado vale 10, pero no lo vemos porque es un camp privado de clase
      Console.WriteLine(MiCuadrado.Volumen); // imprime por pantalla 1000
 }

VB.NET

Class Cuadrado
        Public _lado As Double
        Public Sub New(s As Double)
           'constructor
            _lado = s
        End Sub
        Public Property Area() As Double
            Get
                Return _lado * _lado
            End Get
            Set(value As Double)
                _lado = System.Math.Sqrt(value)
            End Set
        End Property
        Public Property Volumen() As Double
           Get
                Return _lado * _lado * _lado
           End Get
           Set(value As Double)
               _lado = System.Math.Pow(value, 1 \ 3)
           End Set
        End Property
End Class

Private Shared Sub Main(args As String())
            Dim MiCuadrado As New Cuadrado(4)
            Console.WriteLine(MiCuadrado.Area)
            ' imprime por pantalla 16
            MiCuadrado.Area = 100
            ' ahora el lado vale 10, pero no lo vemos porque es un camp privado de clase
End Sub

Creamos una clase Cuadrado a la cual le agregamos una propiedad llamada Area con un campo llamado _lado. En el constructor de la clase, (lo primero que hace una clase cuando se instancia), le agregamos un parámetro s, de modo que cuando instanciemos la clase Cuadrado, nos pedirá que le pasemos un argumento, en este caso el valor del lado el cual automáticamente es asignado al campo _lado. Hasta aquí todo bien.

Si le pedimos al objeto cuadrado el valor de su Area, el descriptor get, obtendrá el valor de _lado y lo multiplicará por si mismo, obteniendo el Area que solicitamos.

Si ahora le dijéramos a este objeto que el valor de su Area es 100, el descriptor set calcularía la raíz cuadrada del área para asignar al campo _lado este valor, en este caso 10, por tanto al solicitarle que imprima por pantalla la propiedad Volumen, este ha calculado el nuevo valor del lado y el nuevo valor del volumen. Este es uno de los poderes secretos de las propiedades. Fantástico ¿no?

Ahora que sabemos que son las propiedades, más adelante crearemos algunas más complejas que nos avisen cuando cambie su valor generando eventos.

Saludos “der Waki”

9.- Los métodos

9.- Los métodos
Como dijimos, los métodos son las acciones realizadas por el objeto. En la cuarta entrega, escribíamos con el “lenguaje der Waki” la clase Vehículo con los métodos Avanzar, Arrancar o Parar. En el método Avanzar le añadíamos la velocidad hasta la que queríamos que nuestro vehículo llegara.
El valor velocidad es el parámetro del método, es el que aparece en el método, mientras que el argumento es el valor pasado una vez creado el objeto. Ejemplo.
C#


/* ************************************************
* © WAKI 2014
* PROYECTO:        Aprender a Programar.
* Archivo:         Program.cs
* Descripción:     Clase Main y Vehículo
* Historial:
* Comentarios:
*
****************************************************/
using System;
namespace MyNameSpace
{
    class MyApp
    {
        static void Main(string[] args)
        {
            Console.WriteLine ("Comienza la App ==>");
            Vehiculo miVehiculo = new Vehiculo();

            miVehiculo.Avanzar(50); // esto hace avanzar el vehículo hasta los 50km/h. 50 es el ARGUMENTO
            Console.WriteLine ("Pulse una tecla para frenar el vehículo...");
            Console.ReadLine();
            miVehiculo.Avanzar(0); // esto hace parar. 0 es el ARGUMENTO
            Console.WriteLine("Pulse INTRO para finalizar..");
            Console.ReadLine();
       }
    }
    class Vehiculo
    {
        public Vehiculo()
        {
            // código utilizado al instanciar la clase
        }
        public void Avanzar(int kmHora)
        {
            // kmHora es el parámetro tipo número entero del método Avanzar
            Console.WriteLine("La velocidad del vehículo es de " + kmHora.ToString() + " km/h");
        }
    }
}

VB.NET

' ************************************************
'* © WAKI 2014
'* PROYECTO:        Aprender a Programar.
'* Archivo:         Program.cs
'* Descripción:     Clase Main y Vehículo
'* Historial:
'* Comentarios:
'*
'***************************************************
Namespace MyNameSpace
    Class MyApp
        Private Shared Sub Main(args As String())
            Console.WriteLine("Comienza la App ==>")
            Dim miVehiculo As New Vehiculo()

            miVehiculo.Avanzar(50)
            ' esto hace avanzar el vehículo hasta los 50km/h. 50 es el ARGUMENTO
            Console.WriteLine("Pulse una tecla para frenar el vehículo...")
            Console.ReadLine()

            miVehiculo.Avanzar(0)
            ' esto hace parar. 0 es el ARGUMENTO
            Console.WriteLine("Pulse INTRO para finalizar..")
            Console.ReadLine()
        End Sub
    End Class

    Class Vehiculo
        ' código utilizado al instanciar la clase
        Public Sub New()
        End Sub

        Public Sub Avanzar(kmHora As Integer)
            ' kmHora es el parámetro tipo número entero del método Avanzar
            Console.WriteLine("La velocidad del vehículo es de " & kmHora.ToString() & " km/h")
        End Sub
    End Class
End Namespace

Analizando código…

  1. Escribimos en la consola “Comienza App ==>”
  2. Creamos el objeto miVehiculo
  3. Llamamos al método Avanzar de miVehículo pasando el argumento 50
  4. Se visualiza en la consola “La velocidad del vehículo es de 50 Km/h”
  5. Escribimos en la consola “Pulse una tecla para frenar el vehículo…”
  6. Al pulsar INTRO, llamamos de nuevo al método Avanzar de miVehículo pasando el argumento 0
  7. Se visualiza en la consola “La velocidad del vehículo es de 0 Km/h”
  8. Al pulsar INTRO finalizamos.

Nota: Solo hay detalle nuevo que se nos pasa por alto y es
que en C# ¿se suman las palabras?. El texto se concatena en C# mediante el
signo + mientras que en VB.NET es mediante el signo &. Estos son operadores
y los hay a miles (no tantos Waki!).
Un método puede contener múltiples parámetros y de cualquier índole. Podría crear una clase a la
que pasará como un argumento un objeto tipo Vehículo, cualquier objeto admite,
ahora si, si la clase o el método tiene como parámetros un objetos tipo
Vehículo, solo y exclusivamente podemos pasarle este tipo de objeto y no un
número del tipo int, Integer o entero, un string o cadena, o booleano, etc
Más cosas con los métodos, podemos crear métodos con el mismo nombre pero con distinto tipo de parámetros.  Esto se llama sobrecarga y permite utilizar un
mismo método de diferente forma como en la vida misma o ¿nosotros caminamos siempre del mismo modo?,  a pesar de que
el método caminar es el mismo, podemos hacerlo calzados o descalzados (con lo que variaría la velocidad), el tipo de calzado, hacia atrás, hacia adelante,
etc. Expongo un ejemplo.
C#

public void Avanzar(int kmHora)
{
      // kmHora es el parámetro tipo número entero del método Avanzar
      Console.WriteLine("La velocidad del vehículo es de " + KmHora.ToString() + " km/h");
}

public void Avanzar()
{
     // avanza hasta los 50 Km/h como valor predeterminado
     Console.WriteLine("La velocidad del vehículo es de 50 km/h");
}

public void Avanzar(int kmHora, bool limitarA120)
{
	// kmHora es el parámetro tipo número entero del método Avanzar
	// limitarA120 no permite que pase de 120 km/h
	if (limitarA120 && kmHora > 120)
	{
		kmHora = 120;
	}
       Console.WriteLine("La velocidad del vehículo es de " + kmHora.ToString() + " km/h");
}

VB.NET

Public Sub Avanzar(kmHora As Integer)
    ' kmHora es el parámetro tipo número entero del método Avanzar
    Console.WriteLine("La velocidad del vehículo es de " & kmHora.ToString() & " km/h")
End Sub

Public Sub Avanzar()
    ' avanza hasta los 50 Km/h como valor predeterminado
    Console.WriteLine("La velocidad del vehículo es de 50 km/h")
End Sub

Public Sub Avanzar(kmHora As Integer, limitarA120 As Boolean)
    ' kmHora es el parámetro tipo número entero del método Avanzar
    ' limitarA120 no permite que pase de 120 km/h
    If limitarA120 AndAlso kmHora > 120 Then
        kmHora = 120
    End If
    Console.WriteLine("La velocidad del vehículo es de " & kmHora.ToString() & " km/h")
End Sub

Tres métodos Avanzar pero con distintos parámetros. El primero permite llevar al vehículo a una velocidad concreta, el segundo lleva al vehículo a una velocidad predeterminada y el tercero lleva un parámetros que nos va a permitir limitar la velocidad a 120 Km/h. Si el segundo argumento pasado (parámetro limitarA120), tiene un valor false, (falso), se comporta como el método primero, pero si el argumento pasado tiene un valor true, (verdadero), el método limitará la velocidad a 120. ¿Cómo? Mediante el fragmento if o If…

La instrucción if para C# o If…Then para VB.NET tiene muchas variantes, pero esta es la más sencilla. Lo primero que hace es efectuar una comparación booleana, quiere decir que se obtendrá un Sí o un No, un Verdadero o un Falso, un true o un false. Dentro de esta condición hacemos otra comparación mediante el operador && o AndAlso que es el operador equivalente a decir Y; en el método preguntamos, ¿es verdadero el argumento pasado limitarA120? Y además ¿es verdadero que el argumento pasado de velocidad es mayor que 120? Pues si esto es verdadero, se limitará la velocidad a 120 Km/h, pero si alguno de las condiciones de la instrucción if no se cumple, el argumento limitar es falso o la velocidad es inferior a 120, pues no se limitará. ¿OK? Pues tan útil como ya he dicho se llama sobrecarga de métodos.

Por último, los métodos también pueden devolver valores. Si le pedimos a una calculadora que sume dos número, primero nos solicitará los dos números y luego el método suma, devolverá un resultado con las dos cantidades sumadas, bien, pues a un método por ejemplo le pasamos dos argumentos y este, devuelve la suma de ambos. En VB.NET los métodos que devuelven valores se llaman funciones. Ejemplos es lo que nos hace falta!. Vamos a convertir los tres métodos del ejemplo anterior pero devolviendo el texto que escribimos en la consola, evitando incluir Console.WriteLine en cada método.

C#

/* ************************************************
* © WAKI 2014
* PROYECTO:        Aprender a Programar.
* Archivo:         Program.cs
* Descripción:     Clase Main y Vehículo
* Historial:
* Comentarios:
*
****************************************************/

using System;
namespace MyNameSpace
{
    class MyApp
    {
        static void Main(string[] args)
        {
            Console.WriteLine ("Comienza la App");
            Vehiculo miVehiculo = new Vehiculo();
            string textoDeSalida = miVehiculo.Avanzar(90); // esto hace avanzar el vehículo hasta los 90km/h. 90 es el ARGUMENTO
            Console.WriteLine(textoDeSalida);   // Aquí se imprime el texto devuelto por los métodos
            Console.WriteLine ("Pulse una tecla para frenar el vehículo...");

            Console.ReadLine();
            textoDeSalida = miVehiculo.Avanzar(0); // esto hace parar. 0 es el ARGUMENTO
            Console.WriteLine(textoDeSalida);   // Aquí se imprime el texto devuelto por los métodos
            Console.WriteLine("Pulse una tecla para activar velocidad predeterminada...");
            Console.ReadLine();

            textoDeSalida = miVehiculo.Avanzar(); // esto hace parar. 0 es el ARGUMENTO
            Console.WriteLine(textoDeSalida);   // Aquí se imprime el texto devuelto por los métodos
            Console.WriteLine("Pulse una tecla para limitar velocidad...");
            Console.ReadLine();

            textoDeSalida = miVehiculo.Avanzar(150,true); // velocidad a 150 km/h y limitador activado
            Console.WriteLine(textoDeSalida);   // Aquí se imprime el texto devuelto por los métodos
            Console.WriteLine("Pulse INTRO para finalizar..");
            Console.ReadLine();
        }
    }

    class Vehiculo
    {
        public Vehiculo()
        {
            // código utilizado al instanciar la clase
        }

        public string Avanzar(int kmHora)
        {
            // kmHora es el parámetro tipo número entero del método Avanzar
            return "La velocidad del vehículo es de " + kmHora.ToString() + " km/h";
        } 

        public string Avanzar()
        {
            // avanza hasta los 50 Km/h como valor predeterminado
            return "La velocidad del vehículo es de 50 km/h";
        } 

        public string Avanzar(int kmHora, bool limitarA120)
        {
            // kmHora es el parámetro tipo número entero del método Avanzar
            // limitarA120 no permite que pase de 120 km/h
            string textoDeSalida = "La velocidad del vehículo es de "; 

            if (limitarA120 && kmHora > 120)
            {
                textoDeSalida = "La velocidad del vehículo era de " + kmHora + " Km/h, pero ahora es de ";
                kmHora = 120;
            }
            return  textoDeSalida + kmHora.ToString() + " km/h";
        }
    }
}

VB.NET

/* ************************************************
* © WAKI 2014
* PROYECTO:        Aprender a Programar.
* Archivo:         Program.cs
* Descripción:     Clase Main y Vehículo
* Historial:
* Comentarios:
*
****************************************************/
using System;
namespace MyNameSpace
{
    class MyApp
    {
        static void Main(string[] args)
        {
            Console.WriteLine ("Comienza la App");
            Vehiculo miVehiculo = new Vehiculo();
            string textoDeSalida = miVehiculo.Avanzar(90); // esto hace avanzar el vehículo hasta los 90km/h. 90 es el ARGUMENTO
            Console.WriteLine(textoDeSalida);   // Aquí se imprime el texto devuelto por los métodos
            Console.WriteLine ("Pulse una tecla para frenar el vehículo...");
            Console.ReadLine();

            textoDeSalida = miVehiculo.Avanzar(0); // esto hace parar. 0 es el ARGUMENTO
            Console.WriteLine(textoDeSalida);   // Aquí se imprime el texto devuelto por los métodos
            Console.WriteLine("Pulse una tecla para activar velocidad predeterminada...");
            Console.ReadLine();

            textoDeSalida = miVehiculo.Avanzar(); // esto hace parar. 0 es el ARGUMENTO
            Console.WriteLine(textoDeSalida);   // Aquí se imprime el texto devuelto por los métodos
            Console.WriteLine("Pulse una tecla para limitar velocidad...");
            Console.ReadLine();

            textoDeSalida = miVehiculo.Avanzar(150,true); // velocidad a 150 km/h y limitador activado
            Console.WriteLine(textoDeSalida);   // Aquí se imprime el texto devuelto por los métodos
            Console.WriteLine("Pulse INTRO para finalizar..");
            Console.ReadLine();
        }
    }

    class Vehiculo
    {
        public Vehiculo()
        {
            // código utilizado al instanciar la clase
        }

        public string Avanzar(int kmHora)
        {
            // kmHora es el parámetro tipo número entero del método Avanzar
            return "La velocidad del vehículo es de " + kmHora.ToString() + " km/h";
        }

        public string Avanzar()
        {
            // avanza hasta los 50 Km/h como valor predeterminado
            return "La velocidad del vehículo es de 50 km/h";
        } 

        public string Avanzar(int kmHora, bool limitarA120)
        {
            // kmHora es el parámetro tipo número entero del método Avanzar
            // limitarA120 no permite que pase de 120 km/h
            string textoDeSalida = "La velocidad del vehículo es de ";
            if (limitarA120 && kmHora > 120)
            {
                textoDeSalida = "La velocidad del vehículo era de " + kmHora + " Km/h, pero ahora es de ";
                kmHora = 120;
            }
            return  textoDeSalida + kmHora.ToString() + " km/h";
        }
    }
}

Analizando código… en el método Main, ocurre lo siguiente:

  1. Escribimos en la consola “Comienza App ==>”
  2. Creamos el objeto miVehiculo
  3. Llamamos al método Avanzar(90) de miVehículo pasando el argumento 90
  4. Se visualiza en la consola “La velocidad del vehículo es de 90 Km/h”
  5. Escribimos en la consola “Pulse una tecla para frenar el vehículo…”
  6. Al pulsar INTRO, llamamos de nuevo al método Avanzar(0) de miVehículo pasando el argumento 0
  7. Se visualiza en la consola “La velocidad del vehículo es de 0 Km/h”
  8. Escribimos en la consola “Pulse una tecla para activar velocidad predeterminada…”
  9. Al pulsar INTRO, llamamos de nuevo al método Avanzar() sin argumentos de miVehiculo.
  10. Se visualiza en la consola “La velocidad del vehículo es de 50 Km/h”
  11. Escribimos en la consola “Pulse una tecla para limitar velocidad…”
  12. Al pulsar INTRO, llamamos de nuevo al método Avanzar(150) de miVehículo pasando el argumento 150
  13. Se visualiza en la consola “La velocidad del vehículo era de 150 Km/h, pero ahora es de 120 Km/h.”
  14. Al pulsar INTRO finalizamos.

En el último método Avanzar creamos una variable textoDeSalida, a la cual le damos un valor u otro dependiendo si se limita la velocidad o no y para devolver los valores al lugar desde los hemos llamado es mediante la instrucción return que retorna o devuelve el valor calculado.

Para la sobrecarga de métodos, lo único que no podemos hacer es crear dos métodos con el mismo número de parámetros y del mismo tipo, lo que provocaría una ambigüedad y el compilador no sabría cual ejecutar.

Como ya sabemos compilar, practica y crea, que no duele!

Saludos “der Waki”

8.- Nuestro primer programa «ereeh la caña illo!!!”

8.- Nuestro primer programa «ereeh la caña illo!!!”
Ahora que ya sabemos cómo crear una clase, vamos a intentar crear nuestra primera aplicación.
En todos los libros que he leído, la primera aplicación que se desarrolla es la típica en “Hello world!!” o un “Hola Mundo!!” en la que se imprime o se obtiene en pantalla el mismo texto y tiene su historia; la más antigua de ellas y que yo conozca es la de un tejedor (“muuuu espabilao”) llamado Joseph Marie Jacquard que allá por 1801, le daba instrucciones a un telar mediante tarjetas perforadas y consiguió escribir “hello word” en uno de sus tapices, después dicen que Bill Gates inició Windows 1 con la misma frase, o un libro de C por los años 70 que imprimía lo mismo y … hasta hoy que se sigue usando por todos los begginers o principiantes . Pero para cambiar y siendo este un blog “andalú”, nuestra primera aplicación va a escribir un mensaje que diga “ereeh la caña illo!!!” (Traducido a eres la caña chiquillo, cosas de los andaluces!), ¿ok?, bueno, vamos allá.Antes de nada, quiero decir que toda aplicación tiene un método llamado Main tanto para C# como VB.NET. Da igual en que clase lo pongamos que el compilador se encargará de buscarlo e iniciar todo desde ahí, desde Main. Este método tiene además dos modificadores, uno public y otro static. El modificador público es para acceder a la aplicación desde el exterior y el static lo explico ahora mismo.

Cuando creamos un clase y la instanciamos, se genera un nuevo objeto, si instanciamos esta clase mil veces, tendremos 1000 objetos, pero si una clase o un miembro de clase es static, lo primero es que no hace falta instanciarla y lo segundo, que solo se crea una solo objeto.

Ejemplo. Si tenemos un clase vehículo estática y queremos que arranque el vehículo, no haría falta crear un nuevo vehículo, sino que escribiríamos el nombre de la clase seguido de punto y el método a usar, Vehículo.Arrancar, pero con el inconveniente de que solo habrá un solo objeto. Pasemos a un ejemplo:

C#

/* ************************************************
* © WAKI 2014
* PROYECTO:        Aprender a Programar.
* Archivo:         Program.cs
* Descripción:     Clase Main y Vehículo 
* Historial:            
* Comentarios:
*
****************************************************/
using System;
namespace MyNameSpace
{
    class MyApp
    {
        static void Main(string[] args)
        {
            Vehiculo miVehiculo = new Vehiculo();
            miVehiculo.Arrancar();
            ClaseEstatica.MetodoEstatico();
        }
    }
    static class ClaseEstatica
    {
        static public ClaseEstatica() 
        {            

        } 

        static public void MetodoEstatico()
        {
            // código cuando se accede al método estático
        }
    }

    class Vehiculo
    {
        public Vehiculo()
        {
            // código utilizado al instanciar la clase
        } 

        public void Arrancar()
        {
            // código necesario para arrancar
        }
    }
}

VB.NET

' ************************************************
'* © WAKI 2014
'* PROYECTO:        Aprender a Programar.
'* Archivo:         Program.vb
'* Descripción:     Clase Main y Vehículo
'* Historial:           
'* Comentarios:
'*
'***************************************************
Namespace MyNameSpace
    Class MyApp
        Private Shared Sub Main(args As String())
            Dim miVehiculo As New Vehiculo()
            miVehiculo.Arrancar()
            ClaseEstatica.MetodoEstatico()
        End Sub
    End Class

    NotInheritable Class ClaseEstatica
        Private Sub New()
        End Sub
        Public Shared Sub MetodoEstatico()
            ' código cuando se accede al método estático
        End Sub
    End Class

    Class Vehiculo
        ' código utilizado al instanciar la clase
        Public Sub New()
        End Sub
        Public Sub Arrancar()
            ' código necesario para arrancar
        End Sub
    End Class
End Namespace

Analicemos el código; tenemos un espacio de nombres llamado MyNameSpace con tres clases, una pública y estática MyApp que contiene el método Main, otra Vehiculo y otra pública y estática llamada ClaseEstatica. La primera es desde donde accederemos desde Windows, (donde pone string[] args, son parámetros enviados como argumentos y los veremos con más detalle) y en su método Main hacemos lo siguiente:

Creamos un objeto Vehículo al que llamamos miVehiculo (el nombre es elección del usuario, podría haberle llamado coche, micoche, etc) e instanciamos uno nuevo (new Vehiculo). A partir de este momento, cada vez que nos referimos a miVehiculo nos referimos a el que hemos creado y ahora que ya tenemos un objeto, invocamos el método Arrancar desde este mismo objeto. Ahora nos referimos a la clase estática pero sin hacer referencia a new ClaseEstatica , directamente escribiendo la clase y seguido del método estático. Fácil, ¿no?

En VB.NET las clases se instancia primero con Dim, luego el nombre y posteriormente As New nombre de la clase

Volviendo a nuestra primera aplicación y centrándonos en ella. Abrimos el Bloc de Notas o Notepad++, creamos un nuevo archivo de texto y escribimos (aconsejo escribir) o copiamos y pegamos el código de nuestra primera Aplicación. Guardamos donde queramos el archivo, eso si, guardando con extensión .cs para C# o .vb para VB.NET. Si no vemos las extensiones, hay que habilitar su visualización.

(En W7, desde una ventana del explorador de Windows, Organizar, Opciones de carpeta y búsqueda, Pestaña Ver y casi al final de la lista desmarcamos Ocultar las Extensiones de Archivos …)

C#

/* ************************************************
* © WAKI 2014
* PROYECTO:        Aprender a Programar.
* Archivo:         Program.cs
* Descripción:     Clase Main y Vehículo    
* Historial:            
* Comentarios:
*
****************************************************/
using System;
namespace MyConsoleApplication
{
    class MyApp
    {
        static void Main(string[] args)
        {
            Console.WriteLine ("ereeh la caña illo!!!");
            Console.WriteLine("Pulse una tecla para cerrar");
            Console.ReadLine();
        }
    }
}

VB.NET

'* ************************************************
'* © WAKI 2014
'* PROYECTO:        Aprender a Programar.
'* Archivo:         Module1.vb
'* Descripción:     Clase Main y Vehículo
'* Historial:            
'* Comentarios:
'*
'****************************************************
Module Module1
    Class MyApp
        Public Shared Sub Main(args As String())
            Console.WriteLine("ereeh la caña illo!!!")
            Console.WriteLine("Pulse Intro para cerrar")
             Console.ReadLine()
        End Sub
    End Class
End Module

Nota: (Una instrucción Module define un tipo de referencia disponible en su espacio de nombres. Un módulo es similar a una clase pero con algunas distinciones importantes. Cada módulo tiene exactamente una instancia y no necesita ser creado ni asignado a una variable. Los módulos no admiten la herencia ni implementan interfaces. No es una clase y no puede declarar.)

Analicemos este nuevo código. Vemos que hemos escrito la clase Console que procede del espacio de nombre System que lo tenemos importado, esta clase tiene múltiples métodos, pero hemos escogido WriteLine y ReadLine. El primero escribe una línea en la consola (pantalla negra) y el segundo espera una entrada del teclado y una vez recibida cierra el programa. La parte que va incluida entre los paréntesis de los métodos se llama argumento y tiene un tipo, es decir si el método dice que solo puede recibir un texto, no podemos pasarle un número (aunque ya veremos que también se puede), pero en definitiva, el método decide que recibir.

Una vez que recibe el argumento tipo string (texto), se visualiza en pantalla.
Ahora vamos a crear el programa. Dijimos que necesitábamos un compilador que lo encontraremos en C:\Windows\Microsoft.NET\Framework\(Versión de .NET) yo en mi caso voy a compilar con la versión .NET Framework 4.0 por tanto yo tengo el compilador en C:\Windows\Microsoft.NET\Framework\v4.0.30319.

En W7, abro el símbolo del sistema como administrador (Inicio-Todos los Programas-Accesorios- Símbolo del Sistema y le damos con el botón derecho “Ejecutar como Administrador”.

Una vez en la pantalla oscura, escribimos cd\ e INTRO de modo que el símbolo del sistema se irá a C: \>, en esta ruta se creará nuestro programa y después de esto, escribo la ruta donde se encuentra el compilador seguido del archivo que queremos compilar, en mi caso C:\Windows\Microsoft.NET\Framework\v4.0.30319\csc.exe C:\Desarrollo\ConsoleApplication1\Program.cs, pulsamos INTRO y et voilá, compilado, ya tenemos nuevo programa!, en C:\ tendremos un ejecutable llamado program.exe. Lo ejecutamos y … ahí lo llevas

Saludos “der Waki”

7.- Un modo de tener el código ordenado

7.- Un modo de tener el código ordenado
Como ya dije en el Post 5, el coste llevado a cabo para el mantenimiento del software es muy costoso, por lo que sería muy conveniente escribir un código muy comentado, claro y estructurado, esto nos daría limpieza y efectividad pudiendo detectar y minimizar los ERRORES (porque haberlos, «haylos»)
Para comentar el código, escribimos en C#
// Aquí van los comentarios
o en VB.NET
’Aquí van los comentarios.
Este texto en Visual Studio se torna verde cuando se trata de un comentario.
Si en vez de dos barras, escribimos tres, podemos escribir comentarios continuamente al pulsar ENTER y cambiar de línea, escribiéndose automáticamente otras tres barras (C#) o comillas simples(»’).
Si estamos programando en Visual Studio y escribimos estas tres barras o comillas simples encima de un método, variable, propiedad, etc., es decir sobre un miembro de clase, se inserta automáticamente una etiqueta llamada <summary> con otra etiqueta de cierre </summary> y el contenido que escribamos entre estas dos etiquetas se visualizará automáticamente con IntelliSense
que es una herramienta de ayuda de Visual Studio con la cual según vamos escribiendo, se van visualizando los miembros de clase disponibles en esta;
además visualiza la información escrita entre las dos etiquetas <summary>Esto describe el miembro de clase </summary>.
Una vez comentado el código, existe otra forma de tener el código ordenado mediante bloques y esto se hace escribiendo
C#

#region MyRegion

// aquí podemos poner todos los

// miembros de clase que queramos
#endregion

VB.NET

#Region "MyRegion"
        ' aquí podemos poner todos los
        ' miembros de clase que queramos
#End Region

Esto no se compila y simplemente nos permite mantener los miembros de clase ordenaditos y enclaustrados entre regiones o bloques de código, por ejemplo, podemos crear una región llamada propiedades y variables donde incluyamos solo exclusivamente estos miembros u otra donde incluya los métodos asociados a controles y dentro de esta más bloques de código separándolos por tipo de control, de modo que cuando quiera visualizar un método asociado a un evento click de un botón, me iré a la región Controles y dentro de esta a otra región llamada Botones y en su interior estará el método que busco evitando dar muchas vueltas con la rueda del ratón o efectuando búsquedas de texto.Debemos pensar que el código será revisado por otra persona o por nosotros mismos miles de años después, por tanto, ordena!!! (¿miles? jajajaja dejémoslo en cientos).
Además, imaginemos una clase con 1000 líneas, al incluir el código entre regiones, es posible contraer o expandir las regiones, evitando mantener las mil líneas desplegadas con el consiguiente lio.
Otra forma de de mantener claro el código es escribir con mucha sencillez los métodos, espaciados y con pocas líneas (A ser posible).
Otro aspecto muy importante es la nomenclatura de los nombres de las clases y miembros de clase, ¿por qué es importante? Pues si recuerdan cuando en el lenguaje “der waki” asignábamos los nombres a las características y métodos de la clase vehículo, los nombrábamos con Velocidad, Potencia, Matrícula, Número de Bastidor, Arrancar, Parar, Avanzar, etc., pues eso, cuando quiero asignarle la matrícula a la propiedad Matrícula debo hacerlo con sentido común; si le hubiéramos puesto como nombre Abrigo, diría ¿para qué le he puesto el nombre Abrigo a la propiedad Matrícula?
Menuda tontería no!! Pues por ahí van los tiros.

Existen múltiples notaciones para nombrar los miembros de clase, pero nos centramos en dos, notación Pascal y Camello ( que nombres!!). La notación Pascal utiliza la primera letra de cada palabra con mayúscula, de modo que si nombramos la propiedad NumeroBastidor, iniciamos cada palabra con mayúsculas sin espacios y si usamos la notación camello es igual que la Pascal pero iniciando con minúsculas y dándole ese aspecto de jorobas de camello subiendo y bajando.
Microsoft utiliza este método para crear sus aplicaciones y dependiendo del miembro
de clase que sea, adaptaremos el nombre de un modo u otro y que a continuación detallo:

  • Espacios de nombres. Para los espacios de nombres se usa el nombre de la compañía o el nombre del producto con la primera letra en mayúscula y resto en minúsculas, por ejemplo Microsoft tiene un espacio de nombres Microsoft de alto nivel y según van creando productos, le agregan un nuevo espacio de nombres,  Microsoft.Win32,  System.Windows.Forms, etc.
  • Para las clases, utilizamos sustantivos con notación Pascal. Otra manía que tengo y que aprendí de dos buenos programadores, es encabezar las clases con comentarios, nombre del archivo de la clase, que hace la clase, quien la ha creado y cuando, si le introduzco modificaciones, que modificaciones se han realizado y cuando, en definitiva, una serie de datos que me informen de la clase.
  • Para los métodos también Notación Pascal, pero como los métodos hacen cosas, actúan, llevan a cabo una labor, interesa que describan los que hacen mediante verbos acompañados de objeto sobre el que recae la acción. Por ejemplo ImprimirFactura, CalcularSalario, AbrirBaseDeDatos, ObtenerUsuario, etc. Yo personalmente, uso en castellano los métodos privados y los métodos públicos los pongo en inglés para globalizar la clase, si estos métodos los hiciera públicos, les daría PrintInvoice, CalculatePay,OpenDataBase, GetUser, etc. Debo hacer hincapié en que existen métodos que además de hacer algo obtienen algo, como el último ejemplo ObtenerUsuario que se encargaría de buscar en algún sitio el usuario que está activo en el momento, bueno pues existen métodos que comprueban algo por ejemplo EstaLaPuertaAbierta
    y si lo está, devolvería un valor verdadero y si no lo está devolvería un valor
    falso, este tipo se llaman boolean de Boole el matemático que estudio el algebra de su mismo nombre sobre el sistema binario, pues este tipo de métodos deben comenzar con la tercera persona del verbo ser o estar, en inglés Is, por ejemplo IsOpenDoor, de modo que si utilizamos este método con alguna condición, sería mucho más claro de entender, en el lenguaje “der Waki”

Si está abierta la puerta, ciérrala

En C#

if (IsOpenDoor())
{
     // cerrar puerta
}

En VB.NET

If IsOpenDoor() Then
     ' cerrar puerta
End If
  • Las propiedades. Estilo Pascal (primera en mayúscula de cada palabra)
  • Variables. Sobre las variables o campos, hay tema para todos los gustos. Vamos a ver, si una clase se llama Autor y creamos un campo que identifique al autor, no vamos a ponerle el mismo nombre de la clase, le ponemos por ejemplo NombreAutor con notación Pascal y cuando accedamos a esta variable los haremos mediante Autor.NombreAutor. Para las variables privadas o de menor entidad, yo utilizo la notación Camello (primera en minúsculas) y en algunos casos (para gustos los colores) le incluyo a la notación camello un guión bajo al inicio, así de un primer vistazo introduciendo un guión, echo un vistazo sobre estas.

De todos modos, los IDE (Entornos de Desarrollo Integrado) como Visual Studio, Eclipse, etc.., cambian de color (como los comentarios que los ponía en verde) cada elemento dependiendo del tipo que sea.

En resumen, para todo programador es importantísimo el orden, tengo la experiencia de crear aplicaciones con pocas líneas de código y que al volver a modificar algún detalle, volverse en un trabajo tedioso, por tanto el tiempo invertido inicialmente es fundamental para futuras modificaciones o ampliaciones.

Saludos «der Waki»

6.- ¿Que código podemos escribir en una clase?

6.- ¿Que código podemos escribir en una clase?

Hola de nuevo, ahora que sabemos como crear una clase, vamos a ver que podemos escribir dentro de ella para poder generar aplicaciones.

Dentro de una clase podemos incluir lo que llamaremos miembros de clase y estos son:

    • Campos. Un campo es una variable que se utiliza para almacenar un valor. Si yo quiero calcular x+3, creo una variable x pudiéndole asignar infinitos valores, pero lo importante no es poder asignarle infinitos valores, es que puede almacenar un valor, al nombre x le adjudicamos una relación con un valor.
    • Métodos. Los métodos son el código real, lo que tiene que hacer un objeto cuando lo instanciamos. En la clase vehículo que creamos, había varios métodos, ARRANCAR, PARAR y AVANZAR. Dentro de los métodos escribiremos el código necesario para hacer lo que queremos hacer.
    • Propiedades. Las propiedades a mi parecer han sido un gran invento, son campos con métodos!! que cosas tiene esto de la programación!, pues si, son campos de cara al usuario, es decir almacenan valores pero en realidad son métodos porque dentro de las propiedades podemos incluir más código. Los llaman Smart Fields (Campos inteligentes)!! y pueden ser de lectura y escritura o lectura.
    • Constantes. Es un campo con un valor fijo, invariable, de solo lectura, ya que no podemos cambiarlo. ¿Para que se utilizan? pues por ejemplo para almacenar el número pi, el número e, un texto que se repite mil veces y es siempre el mismo, pues para eso.
    • Eventos. Un evento se produce cuando pasa algo, por ejemplo click de ratón. Si le asignamos un evento a un botón, cuando hagamos click sobre él (cuando pulsamos), este correrá código de un método asociado, por ejemplo cambiar de color el botón. En el lenguaje «der waki», cuando pulses el botón, cambiar de color botón.

Hay más miembros de clase, pero creo que con estos es suficiente para aprender.

Existen además elementos muy importantes en programación que son los modificadores de acceso. A todos los miembros de clase hay que especificarle lo visibles o accesibles que deben ser vistos desde fuera o desde la misma clase. Por ejemplo supongamos que mi casa es una clase, yo que soy el propietario, (vivo en la clase) puedo abrir la puerta, llamar al timbre, cocinar, limpiar, etc. pero un alguien que intente usar mi casa, no podría hacerlo porque no tiene los medios para hacerlo, lo más que le permitiría sería dejar una carta en el buzón o llamar al timbre. Pues como solo quiero que haga eso, los métodos de dejar carta en el buzón y llamar al timbre, pues estos métodos los haría públicos, mientras que los de cocinar o limpiar los haría privados.

¿Captada la idea? pues hay cuatro modificadores (en C#):

    • public. Esto quiere decir que el miembro de clase, es accesible desde fuera de la clase que lo ha definido y de la jerarquía de clases derivadas o heredadas. Vamos, que si instanciamos un casa nueva como la mía por ejemplo, el usuario de esa clase solo podrá usar los métodos que creamos como públicos.
    • protected. El miembro de clase no es visible desde fuera pero si desde las clases derivadas. Nuestro ejemplo, clase vehículo y camión. El método ARRANCAR podría ser protected, ya que al derivar la clase camión de vehículo, este método podría ser usado por el camión aunque el método en si pertenece a vehículo.
    • private. Los miembros de clase con este modificador solo son accesibles desde la propia clase, las clases derivadas no pueden acceder a ellos.
    • internal. Los miembros de clase internos solo son accesibles desde la compilación es un híbrido entre protected y public, dependiendo donde esté el código.

En VB.NET son Public, Protected, Private y Friend.

Damos paso a un ejemplo de una clase con una propiedad, un campo y un método. Por cierto, se me olvidaba, no lo puse en la anterior entrega para no liarnos, todas las clases tiene un método inicial con el mismo nombre que la clase (por algún sitio tenía que empezar la clase, ¿no?)

En C#

using System;
using System.Drawing;
using System.Windows.Forms;
namespace MyNameSpace
{
    public class MyClass: Form
    {
        public MyClass()
        {
               // lo primero que hace la clase cuando es instanciado como objeto,
               // es el código contenido aquí. El nombre es igual que la clase
        }          

        // aquí incluyo los campos
        int variable_1 = 3;
        const double s = 3.1415926535; // número pi           

        // aquí incluyo las propiedades. Para las propiedades, habrá un capítulo entero
        private string variable_privada_propiedad;
        public string Propiedad_1
        {
            get { return variable_privada_propiedad ; }
            set { variable_privada_propiedad  = value; }
        }          

        // aquí los métodos
        protected void CargarMenuPrincipal()
        {
            // el código para cargar el menú principal, estaría contenido aquí
        }
    }
}

en  VB.NET


Imports System
Imports System.Drawing
Imports System.Windows.Forms
Namespace MyNameSpace
    Public Class [MyClass]
        Inherits Form     

        Public Sub New()
            ' lo primero que hace la clase cuando es instanciado como objeto,
             ' es el código contenido aquí. el nombre es igual que la clase
        End Sub 

        ' aquí incluyo los campos
        Private variable_1 As Integer = 3
        Const s As Double = 3.1415926535 ' número pi

        ' aquí incluyo las propiedades. Para las propiedades, habrá un capítulo entero
        Private variable_privada_propiedad As String
        Public Property Propiedad_1() As String
            Get
                Return variable_privada_propiedad
            End Get
            Set(value As String)
                variable_privada_propiedad = value
            End Set
        End Property 

        ' aquí los métodos
        Protected Sub CargarMenuPrincipal()
            ' el código para cargar el menú principal, estaría contenido aquí
        End Sub

    End Class
End Namespace

Analicemos el código. Lo primero importamos espacios de nombres (using e Imports), después nuestro espacio de nombres, todas las clases que creemos dentro de este espacio de nombres, podrán ser instanciadas a través de este.

Nombre de la clase con modificador público. Ahora vemos en C# dos puntos y Form y para VB Inherits Form, pues esto es como realmente se hereda una clase de otra, nuestra clase hereda de la clase Form que proviene del espacio de nombres System.Windows.Forms, de modo que nuestra clase tendrá el aspecto de un formulario de Windows. La herencia solo puede ser usada una sola vez, es decir, una clase solo se puede ser derivada de otra, pero no de 3 o cuatro clases, para hacer algo parecido, tenemos otros elementos.

Después aparece el constructor de la clase, que es el código que primero se ejecutará.

Pasamos a los campos. Primero tenemos un campo del tipo número entero (int e Integer) al cual le hemos dado por primera vez el valor de 3. Como es variable en cualquier momento podemos darle cualquier valor; como es privado, solo puede ser visto desde la clase.

Ahora creamos un valor constante (de solo lectura) de tipo numérico doble (double y Double) y le asignamos el número pi con 10 decimales.

Ahora creamos una propiedad que como ya he dicho, dedicaré un capítulo a este miembro de clase y por último un método protected simple con el pretendemos cargar el menú principal de nuestra aplicación. (Para C# un método se inicia con void y llaves {} y en VB mediante Sub y End Sub.)

Ya está, poco a poco va creciendo nuestra clase y le vamos dando forma. El desarrollo de software es arquitectura por tanto antes de empezar a escribir código hay muchos elementos comunes y fijos que siempre aparecen en las clases, pero hay otros que debemos y tenemos que meditar, planificar, diseñar, etc. antes de plasmarlos en una clase como líneas de código.

Antes de despedirme he dejado caer los tipos int y double, pues hay muchos más. Al declarar una variable como un tipo concreto, le estamos diciendo que guarde en memoria un objeto concreto con unas características concretas, por ejemplo, cuando hemos guardado en la variable variable_1 el valor 3 como un valor entero, estamos diciéndole al sistema que el valor que voy a guardar en un futuro, no va a sobrepasar los 32 bit en binario (ala!!!) y sin embargo para el valor de pi, he visto que es necesario su utilización como valor double que utiliza valor en coma flotante con 64 bit en binario (otra vez alaaaaa!!!!!)¿pero que es esto? tranquiiiilos! todo llega.

Espero no haberos aburrido!!

Saludos «der Waki»

5.- Primer contacto con el código

5.- Primer contacto con el código

Por fin vamos a comenzar a escribir código!!! (pero poco, que luego nos liamos)

Hay una gran variedad de lenguajes, pero en principio nos vamos a centrar en .NET y los lenguajes que usamos para .NET.¿Qué es .NET? Es una plataforma a la que las aplicaciones acceden a coger lo que les hace falta, de ese modo cada vez que desarrollamos una aplicación no tiene porque llevar consigo ciertas herramientas. Con esto conseguimos que todo el mundo use las mismas utilidades y del mismo modo.

De los componentes que tiene .NET Framework nos enfocamos en dos, el CLR (Common Language Runtime) y la biblioteca de clases.

El primero es un entorno de ejecución que asegura que el código escrito cumple una serie de reglas, (vamos que es bueno!) y por otra parte compila desde un lenguaje intermedio (MSIL) al código nativo. El CLR nos permite poder crear una clase en Visual Basic, crear dos heredadas de esta en C# y C++. Que cosas!!

La biblioteca de clases contiene todas las clases base, (valga la redundancia), para todos los lenguajes de programación. En definitiva, da igual el lenguaje que utilicemos, todos valen!.

Antes de continuar, vamos a repasar alguna palabra nueva.

¿Que es compilar? es convertir un lenguaje a otro, normalmente a código máquina. ¿Y que es código máquina? es el lenguaje que solamente entiende un microprocesador, el chip principal de nuestro PC.

Por tanto, generamos clases C#, VB, .. el compilador lo convierte a MSIL y posteriormente el CLR se encargará de compilar a código máquina con otro compilador (Just In Time JIT ) lo que vayamos necesitando. (Es bastante más complicado, pero dejémoslo ahí, más o menos).

Y yo ¿qué necesito para crear un programa? pues un editor de texto, por ejemplo el bloc de notas (Notepad.exe) o yo, personalmente utilizo notepad++,  (lo utilizo mucho para HTML) tabula, cambia el color de variables, métodos, tiene múltiples lenguajes, etc, y por último un compilador.

¿Dónde consigo el compilador? Al instalar .NET Framework, se instalan también los compiladores, por lo que podemos compilar desde la línea de comandos (csc para C# y vbc para VB. Ya lo haremos! poco a poco.

Pero entonces, ¿por qué tenemos que instalar Visual Studio? Visual Studio es un IDE (Entorno de Desarrollo Integrado), el cual tiene un conjunto de herramientas para diferentes lenguajes como  C++, C#, Visual Basic .NET, F#, Java, Python, Ruby, PHP y para entornos de desarrollo ASP.NET que te AYUDAN MUCHÍÍÍÍÍÍSIMO a crear aplicaciones, por tanto os insto a usarlo. Microsoft, tiene una versión de Visual Studio Express gratuita, te registras y a programar!

Como dije vamos a aprender dos lenguajes muy comunes C# (la almohadilla se lee Sharp, por tanto C Sharp) o Visual Basic .NET.

Cuando creamos la clase vehículo o camión, yo ponía en el lenguaje «der waki», comienza declaración de clase, pues eso, cuando se genera una clase, hay que poner lo siguiente:

En C#


using Espacio_de_nombres1;
using Espacio_de_nombres1;

namespace espacio_de_nombres
{
public class Class1
{
// aquí va el código    }
}

en VB:NET


Imports espacio_de_nombres1
Imports espacio_de_nombres2

Namespace espacio_de_nombres
Class [MyClass]
' aquí va el código
End Class
End Namespace

En primer lugar ¿Qué es la palabra using o Imports? La biblioteca de clases de .NET Framework tiene un entramado jerárquico de clases enorme y algunos nombres bastante largos. Si tenemos que usar alguna de las clases de alguna biblioteca, tendríamos que escribir continuamente los espacios de nombre a la que pertenecen las clases ( y algunos son largos, largos), pues de este modo, una vez incluidos mediante using o Imports, no es necesario escribir continuamente y si
el compilador no entiende algo que he escrito, se encarga de buscarlo en la
lista de using.

¿Qué es el espacio de nombres? Los espacios de nombres se utilizan en gran medida en la programación de dos maneras. En primer lugar, .NET Framework utiliza los espacios de nombres para organizar sus múltiples clases. En segundo lugar, declarar espacios de nombres propios puede ayudar a controlar el ámbito de clase y nombres de método en proyectos de programación grandes. Concluyendo, son contenedores de clases que nos ayudan a mantenerlas ordenadas y localizadas. Si creo 5 clases distintas pero están todas en el mismo namespace, podré acceder a cualquiera de ellas a través de este por ejemplo escribiendo namespace1.clase3.

Para declarar la clase, utilizamos las llaves en C#, mientras que en VB
Iniciamos con Class y finalizamos con End Class. Dentro de la clase, escribiremos el código.

Donde ponía Nota, en C# es // y después los comentarios y en
VB.NET la comilla simple ‘.

Ojo!!, en C#, las líneas deben acabar con punto y coma «;».

Como consejo, diría que a la hora de escribir código, hay que respetar
escrupulosamente los nombres mediante una notación específica, respetar
tabulaciones, comentar, en definitiva limpieza porque si un programa es grande,
la cosa se puede complicar muy mucho, además, si trabajáramos en un equipo de
trabajo, lo que estoy diciendo se convertiría en condición indispensable. El mantenimiento de las aplicaciones es muy costoso y si no tenemos el código limpio, mal vamos!, dedicaremos un post solo a la notación.

Nos quedamos aquí por hoy, pero recuerden, aún hay mas!!!

Saludos “der waki”

 

 

4.- Y ahora, creo un objeto heredado

4.- Y ahora, creo un objeto heredado

En esta entrega vamos a crear un objeto utilizando la herencia y el polimorfismo, creando una nueva clase que va a heredar las características y las funciones de su «padre» además de añadirle las suyas propias.

Volviendo de nuevo al código «der waki», vamos a utilizar la clase vehículo de la anterior entrega para crear una clase nueva llamada camión.

Un camión como dijimos, sigue siendo un vehículo pero agregándole nuevas características; una era la capacidad de la caja y otra avanzar con reductora (para los que no sepan lo que es reductora es una caja de cambios especial que mediante ruedas dentadas como no podía ser de otro modo, obtiene potencia en perjuicio de velocidad, mas fuerza!!). Comenzamos.Declaro Camión. Heredo de Vehículo. Nota: Herencia!!!

(comienza declaración de clase)

Nota:  Características

propiedad capacidad. Esto es número.

Nota: ahora declaro los métodos

Nota: Este método es igual que el de vehículo, ahora tenemos dos método llamados avanzar, uno el que hemos heredado de vehículo y el otro que estamos creando ahora. Solo hay que especificar cual utilizar.

método Avanzar (¿Hasta que velocidad?)

(comienza método)

Nota: Polimorfismo!!!

Requisitos. El vehículo debe estar arrancado, el vehículo no debe tener el freno de mano echado….

Acciones.  Activar caja de cambios reductora. Llevar el coche a la velocidad del método. Envío más o menos combustible a los inyectores dependiendo de como esté pisado el acelerador y como es automático, el embrague se ha accionado y la caja de cambios engrana con otros métodos internos y … (encapsulación), más acciones que no vemos!!

(finaliza método)

(finaliza declaración de clase)

Ahora ya que tenemos la plantilla, vamos a crear el objeto Camión.

Crear un nuevo Vehículo como Camión que voy a llamar camión «der waki»

Nota: He hecho esto para instanciar un vehículo pero como camión, ¿para que? para que cuando inicie el método avanzar lo haga con la reductora.

la matrícula del camión der waki es 0001 AAA. Nota: Esta propiedad es heredada

el número de bastidor de camión der waki es YYYYYY. Nota: Esta propiedad es heredada

la potencia de camión der waki es 250 CV. Nota: Esta propiedad es heredada

la velocidad de camión der waki es 0 km/h. Nota: Esta propiedad es heredada

la capacidad de camión der waki es 36 metros cúbicos. Nota: Esta propiedad es solo del camión!

Ordeno al camión der waki Arrancar Motor

Ordeno al camión der waki Avanzar. Nota: Avanzará con reductora porque hemos instanciado un vehículo pero como camión, por tanto utilizará el método avanzar de camión, es decir con reductora.

Ordeno al camión der waki  Parar Motor

Bueno, pues en esta clase, hemos intentado adaptar los principios fundamentales de la programación, herencia, encapsulación y polimorfismo creando un nuevo objeto heredado y con funciones sobrescritas.

Saludos «der Waki»

PD. Tengo que hacer un inciso sobre las propiedades de una clase; cuando he declarado una propiedad, le he dicho esto es texto, esto es un número, esto es una fecha, etc… bueno, esto es un aspecto que hay que tener en cuenta, cuando declaramos las propiedades o variables de una clase, tenemos que decirle que son y que van a albergar en su interior de modo que estén preparadas, bueno realmente lo que estamos es instanciar nuevas clases y estas, tiene métodos propios del tipo que sea. Por ejemplo, si incluimos una nueva propiedad a la clase vehículo como fecha de fabricación, no sería válido ponerle el 42 de Febrero de 2014,  ya que la clase de fechas no permitiría tal aberración.

3.- Voy a crear un objeto

3.- Voy a crear un objeto
En esta entrega, vamos a crear un objeto y que previamente debemos construir su plantilla o clase, pero no vamos a utilizar ningún lenguaje de programación conocido, sino que vamos a inventarnos uno, el lenguaje «der Waki«. (Vaya tela con er Waki y sus inventos!!)Vamos a crear el objeto vehículo del primer post, un vehículo simple que arranca, para el motor y avanza, que tiene matrícula, número de bastidor, potencia y velocidad, para ello, debemos crear la plantilla; en lenguajes de programación, se comienza siguiendo una ortografía concreta, declarando la clase, pero como nos vamos a inventar un lenguaje nuevo, pues adelante ahí va!!

(el vehículo que vamos a generar, le obviamos muchos de los aspectos técnicos que conocemos, ya que el fin de este post, es aprender a programar, no hacer un master en automovilismo!. Supongamos que es un vehículo automático, sin embrague que es más fácil, de conducir)

declaro Vehículo

(comienza declaración de clase)

Nota:  ahora declaro las características. (las notas no afectan al declarar ni instanciar el objeto, son NOTAS)

propiedad matrícula. Esto es texto.

propiedad número de bastidor. Esto es texto.

propiedad potencia. Esto un número.

propiedad velocidad. Esto un número

Nota: ahora declaro los métodos

método Arrancar Motor

(comienza método)

Requisitos. Estar parado el motor. Nota: Es simple, pero debe ser así, jeje

Acciones. Alimentar con electricidad el coche, accionar motor de arranque, enviar combustible, arrancar motor.

(finaliza método)

método Parar Motor

(comienza método)

Requisitos. Estar arrancado el motor.

Acciones. Cortar alimentación al coche, parar motor.

(finaliza método)

método Avanzar (¿Hasta que velocidad?)

(comienza método)

Requisitos. El vehículo debe estar arrancado, el vehículo no debe tener el freno de mano echado….

Acciones.  Llevar el coche a la velocidad del método. Envío más o menos combustible a los inyectores dependiendo de como esté pisado el acelerador y como es automático, el embrague se ha accionado y la caja de cambios engrana con otros métodos internos y … Nota: Y muchas más cosas que ocurren y se comprueban antes de avanzar (encapsulación), nosotros no las vemos!!

(finaliza método)

(finaliza declaración de clase)

Pues esto con mucha simpleza y con el leguaje «der waki», hemos declarado una clase llamada vehículo, si ahora quiero crear un objeto vehículo, digo en mi lenguaje…

Crear nuevo Vehículo que voy a llamar vehículo der waki

la matrícula del vehículo der waki es 0000 AAA

el número de bastidor de vehículo der waki es XXXXXXXX

la potencia de vehículo der waki es 177 CV

la velocidad de vehículo der waki es 0 km/h

Ordeno al vehículo der waki Arrancar Motor

Ordeno al vehículo der waki Avanzar (hasta los 20 Km/h)

Ordeno al vehículo der waki Avanzar (hasta los 50 Km/h)

Ordeno al vehículo der waki Avanzar (hasta los 0 Km/h) Nota: Esto es lo mismo que frenar, no?

Ordeno al vehículo der waki  Parar Motor

Pues esto, en un lenguaje muy simple, es lo que se hace con una clase para convertirla en un objeto. Una vez creada la plantilla (clase) podemos crear (instanciar) tantos vehículos como queramos y asignarles las propiedades distintas a cada uno de estos objetos. Vehículos distintos con diferentes propiedades pero basados en una misma plantilla.

Como ya veremos no es tan difícil adaptar el lenguaje «der waki» a los lenguajes de programación, prácticamente y por eso lo he hecho así, se hacen de este modo. Tranquilos, ya llegará el momento de escribir código, primero la base. Para integrar o derivar hay que aprender muchas cosas antes!

Saludos «der Waki».

2.- En programación todo es un objeto

2.- En programación todo es un objeto
¿Qué es una clase? Una clase es una colección de objetos que comparten características comunes entre ellos. Es la plantilla en la que nos basamos para crear un objeto.Un clase contiene métodos y propiedades entre otras cosas y siguiendo el ejemplo del post de ¿Que es la Programación Orientada a Objetos? podemos decir que el vehículo es una clase, sus características son propiedades y sus funcionalidades métodos. Además a los objetos en la clase les podemos añadir eventos que son acciones que se realizan cuando ocurre un suceso concreto.

Para crear el objeto generamos una clase y dentro de esta sus propiedades y métodos y esto se hace mediante texto con una “ortografía” concreta dependiendo del lenguaje utilizado. Si estamos desarrollando una aplicación de Windows con .NET utilizaríamos por ejemplo como  lenguaje C# (csharp) o Visual basic y con la ortografía concreta de cada lenguaje generaríamos esa clase; posteriormente necesitaríamos de un programa compilador para convertir esta clase en una aplicación ejecutable de window.

Una librería DLL es una clase y no es un programa ejecutable tipo window, tiene funcionalidades y características concretas.

Vamos a poner un ejemplo práctico, creamos una aplicación tipo ventana en la que vamos a incluir una caja de texto donde poder escribir y un botón y cada vez que pulsemos, aparecerá un mensaje de alerta con el texto de la caja.

Normalmente Visual Studio hace muchas cosas por nosotros, pero vamos a entender que no. Entonces, para crear la ventana de window generamos una nueva clase la cual HEREDARÁ de la clase form para que tenga todas las funcionalidades de un formulario tipo window, titulo, botones de cerrar, minimizar, maximizar, ajustable, etc. La clase form es un OBJETO al instanciarla. Dentro de ese nuevo form que hemos creado añadimos la caja de texto y el botón (en un futuro ya veremos cómo hacerlo) y tanto la caja de texto donde escribimos y el botón son OBJETOS, son clases también con sus propiedades, métodos y eventos que al instanciarlas, se convierten en objetos, estos, llamados controles, heredan funcionalidades comunes  de la clase CONTROL que también es un OBJETO y la clase control hereda de otra Component y así de ese modo mediante la herencia de clases le añadimos el legado de otros desarrolladores que generaron esas clases.

Las clases son plantillas para crear OBJETOS y al agregar un control tipo botón al formulario como contenedor estamos instanciando una clase que será un OBJETO o una clase botón y la estamos añadiendo en esta contenida.

En definitiva, en programación todo es un OBJETO.

Nota: Todos los lenguajes de programación están orientado a objetos, JAVA por ejemplo es un lenguaje tipo POO, C++  o C#. Todo lo que explique irá orientado a .NET y como lenguajes C# o VB.NET.

Saludos «der Waki»

1.- ¿Que es la Programación Orientada a Objetos (POO o OOP, Object Oriented Programming)?

1.- ¿Que es la Programación Orientada a Objetos (POO o OOP, Object Oriented Programming)?

Este es mi primer post en wakicode y como no, voy a dedicarlo a lo que creo que es más importante para aprender a programar, la Programación Orientada a Objetos.

Como para cualquier situación en la vida en la que debemos realizar un trabajo, proceso, tarea, etc. necesitamos de unos conocimientos previos para poder realizarlos; por ejemplo, si jamás hemos conducido un coche, al sentarnos solos por primera vez delante del volante es como si nos sentáramos en una cabina de un avión; si no hay conocimientos, no hay conducción o sin embargo si la hubiera porque hemos visto a alguien conducir, lo haríamos mal o aprenderíamos con defectos que costarían mucho luego corregir. Para aprender a programar, es necesario conocer obligatoriamente los conceptos de POO, ya que sin ellos, puede que hagamos pinitos en programación, pero jamás llegaremos a poder afrontar aplicaciones claras y limpias en las que poder corregir, reutilizar o compartir. Si aprendéis bien estos conceptos, aprenderéis a programar, si aplicáis correctamente los conceptos de POO, estos cumplirán su promesa

¿Qué es un objeto en programación? Pues es como en la vida real, un algo que tiene unas características concretas y que puede hacer cosas o no. Un ejemplo. Una radio es un objeto que tiene las siguientes características:

  • Onda media
  • Frecuencia modulada
  • Onda corta
  • Puede variar el volumen
  • Puede buscar frecuencias
  • Puede cambiar entre onda corta, onda media y frecuencia modulada
  • Tiene dos altavoces
  • Tiene un indicador de estéreo
  • etc…

en líneas generales hemos detallado un objeto con unas características y que además tiene funciones como cambiar a FM, variar volumen, variar frecuencia, etc.. grosso modo, si quisiera en programación crear una radio, tendría un objeto radio que he creado antes y simplemente instanciaría una nueva radio cuantas veces quisiera. Vamos a detallar los principios de la POO y luego pasaremos a un ejemplo.

La POO tiene unos conceptos básicos y fundamentales y son encapsulación, herencia y polimorfismo.

La encapsulación (arte de ocultar) es la capacidad de ocultar los procesos internos de un objeto y proporcionar los que si queremos que usen los usuarios. En el caso de la radio, el usuario no tiene porqué saber como desmodula la radio la señal de frecuencia modulada en señal de audio, es decir la señal que recibe la antena y que se convierte en música por el altavoz. El usuario ENCIENDE o APAGA, CAMBIA de frecuencia, VARIA el volumen, etc. pero no tiene porqué conocer que hace interiormente. Cada vez que instanciemos una nueva radio, el usuario solo podrá ver y usar estas funciones.

La herencia es la relación que tiene un objeto de otro objeto. Yo tengo una herencia de mi padre y de mi madre, porque he heredado y valga la redundancia genéticamente características propias de ellos. Además con el tiempo, yo he adquirido nuevas características que me hacen único como cualquier ser humano, bueno pues en programación es la parte más significativa del diseño de un sistema; sin herencia tendríamos que repetir y cambiar código continuamente cada vez que hiciéramos una corrección. En definitiva es aprovechar objetos con características concretas y heredarlas a nuestro objeto. Un ejemplo.

Creamos un objeto vehículo, el cual solo le vamos a dar la funcionalidad de arrancar, parar y avanzar y como características un motor con la posibilidad de cambiar su potencia, matrícula, número de bastidor.

Creamos otro objeto al que llamaremos vehículo con marcha atrás, este objeto va a heredar de vehículo pero le damos un nuevo desempeño, marchar hacia atrás.Creamos ahora un objeto camión, que hereda las funcionalidades de vehículo con marcha atrás; a este objeto camión, le añadimos una caja y a esta caja le damos la posibilidad de cambiar su volumen para en un futuro poder crear camiones con diferentes capacidades. Creamos otro objeto turismo que hereda de igual modo de vehículo con marcha atrás y a este se me ocurre ponerle una característica como número de puertas y la posibilidad de hacerlo descapotable y por último creamos un objeto motocicleta el cual va a heredar de vehículo y le damos una característica concreta de tipo (carretera, trial, trail, scooter, enduro,….).

Si quisiera crear un camión con caja de 10 metros cúbicos, simplemente instanciaría un objeto camión, le asignaríamos el volumen y como hereda de vehículo marcha atrás y este de vehículo, podrá arrancar, parar, avanzar, ir hacia atrás y además con las características propias de un vehículo, matrícula, potencia y número de bastidor.

Supongamos que en un futuro le añadimos nuevas características a los vehículos como por ejemplo aparcar solo, pues agregamos al objeto vehículo con marcha atrás la posibilidad de aparcar, mientras que las motocicletas no podrían. Las funciones internas que deba realizar el objeto en sus entrañas para poder aparcar solo es a lo que nos referíamos antes con el concepto de encapsulación, el usuario no tiene porqué conocer que hace para aparcar solo.

El polimorfismo es la funcionalidad de invocar nuevo código con código antiguo. Expliquemos esto. El vehículo puede avanzar, pero en el caso del camión le podemos añadir la posibilidad de avanzar con reductora, es decir le damos esa posibilidad pero bajando la velocidad en beneficio de potencia para llevar más peso. Esto implica que dentro del objeto camión creamos una función avanzar pero propia del camión. Esto nos proporciona dos beneficios, uno es poder agrupar objetos que tienen una base común y tratarlos consistentemente y otra es que el código antiguo puede utilizar un código nuevo.

Esto es solo un pequeño resumen de la POO que espero hayáis entendido, sin estos conceptos, los programas que desarrolléis en un futuro podrían convertirse en una pesadilla con su consecuente pérdida de tiempo.

Saludos “der Waki”