Programación Orientada a Objetos – Introducción (POO Parte 1)

La programación orientada a objetos (POO), es un paradigma de programación; un paradigma de programación es un estilo de desarrollo de software, es decir, un modelo para resolver uno o varios problemas computacionales.

Existen muchos paradigmas de programación, como programación imperativa, declarativa, funcional, orientada a objetos, etc. En la actualidad, el paradigma de programación más utilizada es la orientada a objetos, la gran mayoría de programadores y desarrolladores de software usan este paradigma.

¿Qué es un Objeto?

Un objeto es el concepto clave de la programación orientada a objetos, un objeto es una abstracción de algún hecho o entidad del mundo real, básicamente es un reflejo del mundo real en un software que contiene toda la información que permite definirlo e identificarlo a través de objetos y clases.

Para entender mejor; imaginemos que estamos dando un paseo por una avenida, comúnmente observamos: autos, personas y casas; estos son entidades, para nosotros toda entidad son objetos.

Los objetos tienen dos características; tienen estados y comportamientos.

¿Qué son los estados / atributos del objeto?

Los estados son las características o rasgos de la entidad, por ejemplo:

  • Un auto tiene: un modelo, marca, año de fabricación, color, etc.
  • Una persona tiene: un nombre, apellido, edad, profesión, etc.
  • Una casa tiene: un color, área, dirección, etc.

A los estados se le conoce como atributos del objeto.

¿Qué son los comportamientos / métodos del objeto?

Los comportamientos es toda acción que puede hacer el objeto, por ejemplo:

  • El auto puede: encender, moverse, etc.
  • La persona puede: comer, caminar, etc.
  • La casa puede: abrir la puerta, alojar personas, etc.

A los comportamientos se le conoce como métodos del objeto, que básicamente emula el comportamiento o actividad de la entidad.

Estos métodos mencionados son algo literal, así que no nos sirve en sistemas de gestión, pero si en los juegos. La mayoría de los juegos son una simulación del mundo real, en un juego: el auto puede encender y moverse. La programación orientada a objetos tiene gran influencia en el desarrollo de juegos por el nivel de abstracción, sin embargo, para el desarrollo de juegos es mejor usar la programación orientada a entidades y componentes.

Hablando de sistemas de gestión, por ejemplo, orientada a ventas, el objeto/entidad principal es la persona que realiza la venta (Vendedor).

Como atributos/estados tiene:

  • ID
  • Nombres
  • Apellidos
  • Documento de identidad
  • Puesto
  • Etc.

Como métodos/comportamientos puede:

  • Verificar existencia de productos.
  • Realizar venta de productos.
  • Facturar la venta.
  • Afiliar clientes.
  • Etc.

Obviamente para el proceso de venta, el objeto vendedor necesita otros objetos, como,objeto producto, objeto comprobante de pago, objeto cliente.

La programación orientada a objetos, básicamente está plegada por clases y objetos.

Clase

Una clase es simplemente una plantilla, plano, molde o un prototipo para crear objetos, en la clase están declaradas los estados y comportamientos del objeto, sin embargo, aún no están definido. Para entender mejor, observa el gráfico la casa.

House drawing in vector. The contours of the house. Vector created of 3d.

Como notaste, es algo abstracto, un simple dibujo, plantilla, prototipo, plano, molde o un bosquejo, no tiene estados definidos, pero este simple molde de la casa, a futuro tendrá características, como el color, el área construida, área del terreno.

Objeto

En cambio un objeto, ya tiene sus estados definidos y comportamientos asociados.

En conclusión, a partir de la clase (molde, plantilla… abstracto) se construye un objeto; la casa tomó forma: ya tiene un color, sabemos de cuántos metros cuadrados es el terreno, cantidad de habitaciones, etc.

En general se dice que cada objeto es una instancia o ejemplar de una clase, eso quiere decir, que a partir de un molde o clase, podemos crear una infinidad de objetos.

Lenguajes de programación que soportan POO

Los principales lenguajes de programación que soporta programación orientada a objetos son:

  • Ada
  • C++
  • C#
  • Clarion
  • Delphi
  • Eiffel
  • Java
  • Léxico
  • Objective-C
  • Ocaml
  • Oz
  • Php
  • PowerBuilder
  • Python
  • Ruby
  • Smalltalk
  • Visual Basic (VB.Net)

La programación orientada a objetos es igual en cualquier lenguaje de programación, lo único que cambia es la sintaxis.

Ejemplo POO C#, VB.Net

Pasemos el ejemplo de la casa a la programación.

Crear Clase – Molde

Crea una clase de nombre casa; como sabemos en la clase definimos los estados (atributos) y los comportamientos (métodos) del objeto. Declaramos los atributos de la casa según tipo de datos, también declaramos los métodos vender y alquilar, en ello mostraremos por ejemplo, la información de la acción y características.

public class Casa
{
    //Estados - Atributos
    public string direccion;
    public string color;
    public string techo;
    public double areaConstruida;
    public double areaTerreno;
    public int numDormitorios;
    public int numPisos;
    public int numBaños;

    //Comportamientos - Métodos
    public void vender()
    {
        Console.WriteLine("Casa "+ color+" de "+areaTerreno+" metros cuadrados de terreno a sido VENDIDA\nMas detalles:");
        Console.WriteLine("\tDireccion: "+direccion);
        Console.WriteLine("\tColor: " + color);
        Console.WriteLine("\tTecho: " + direccion);
        Console.WriteLine("\tArea construida: " + areaConstruida);
        Console.WriteLine("\tArea de terreno: " + areaTerreno);
        Console.WriteLine("\tCantidad de dormitorios: " + numDormitorios);
        Console.WriteLine("\tCantidad de pisos: " + numPisos);
        Console.WriteLine("\tCantidad de baños: " + numBaños);
    }

    public void Alquilar()
    {
        Console.WriteLine("Casa " + color + " de" + areaTerreno + " metros cuadrados de terreno a sido ALQUILADA\nMas detalles:");
        Console.WriteLine("\tDireccion: " + direccion);
        Console.WriteLine("\tColor: " + color);
        Console.WriteLine("\tTecho: " + direccion);
        Console.WriteLine("\tArea construida: " + areaConstruida);
        Console.WriteLine("\tArea de terreno: " + areaTerreno);
        Console.WriteLine("\tCantidad de dormitorios: " + numDormitorios);
        Console.WriteLine("\tCantidad de pisos: " + numPisos);
        Console.WriteLine("\tCantidad de baños: " + numBaños);
    }
}
Public Class Casa
    Public direccion As String
    Public color As String
    Public techo As String
    Public areaConstruida As Double
    Public areaTerreno As Double
    Public numDormitorios As Integer
    Public numPisos As Integer
    Public numBaños As Integer

    Public Sub vender()
        Console.WriteLine("Casa " & color & " de " & areaTerreno & " metros cuadrados de terreno a sido VENDIDA" & vbLf & "Mas detalles:")
        Console.WriteLine(vbTab & "Direccion: " & direccion)
        Console.WriteLine(vbTab & "Color: " & color)
        Console.WriteLine(vbTab & "Techo: " & direccion)
        Console.WriteLine(vbTab & "Area construida: " & areaConstruida)
        Console.WriteLine(vbTab & "Area de terreno: " & areaTerreno)
        Console.WriteLine(vbTab & "Cantidad de dormitorios: " & numDormitorios)
        Console.WriteLine(vbTab & "Cantidad de pisos: " & numPisos)
        Console.WriteLine(vbTab & "Cantidad de baños: " & numBaños)
    End Sub

    Public Sub Alquilar()
        Console.WriteLine("Casa " & color & " de" & areaTerreno & " metros cuadrados de terreno a sido ALQUILADA" & vbLf & "Mas detalles:")
        Console.WriteLine(vbTab & "Direccion: " & direccion)
        Console.WriteLine(vbTab & "Color: " & color)
        Console.WriteLine(vbTab & "Techo: " & direccion)
        Console.WriteLine(vbTab & "Area construida: " & areaConstruida)
        Console.WriteLine(vbTab & "Area de terreno: " & areaTerreno)
        Console.WriteLine(vbTab & "Cantidad de dormitorios: " & numDormitorios)
        Console.WriteLine(vbTab & "Cantidad de pisos: " & numPisos)
        Console.WriteLine(vbTab & "Cantidad de baños: " & numBaños)
    End Sub
End Class

Crear Objeto – Instancia

Desde la clase principal, creamos el objeto casa a partir de clase casa, en C# colocamos el nombre de clase, luego asignamos un nombre para el objeto, signo igual (=), new casa.

Casa objetoCasa = new Casa();
Dim objetoCasa As New Casa()

La palabra reservada new es para instanciar a una clase, básicamente, Casa objetoCasa = new Casa(); es la instancia o crea el objeto; también se puede decir que llama el constructor de la clase. Luego definimos los atributos (Dar valor a los estados, asignar el color, dirección, etc). Finalmente invocamos un método (comportamiento) del objeto, por ejemplo: Vender la casa.

    class Program
    {
        static void Main(string[] args)
        {
            Casa objetoCasa = new Casa();//instanciamos
            //Inicializamos los atributos, asignar-definir valores
            objetoCasa.direccion = "Av José";
            objetoCasa.color = "Blanco";
            objetoCasa.techo = "Tejas";
            objetoCasa.areaConstruida = 239;
            objetoCasa.areaTerreno = 145;
            objetoCasa.numDormitorios = 5;
            objetoCasa.numPisos = 2;
            objetoCasa.numBaños = 3;
            //invocamos un metodo-comportamiento
            objetoCasa.vender();
    Class Program
        Shared Sub Main(args As String())
            Dim objetoCasa As New Casa() 'instanciamos'
            'Inicializamos los atributos, asignar-definir valores'
            objetoCasa.direccion = "Av José"
            objetoCasa.color = "Blanco"
            objetoCasa.techo = "Tejas"
            objetoCasa.areaConstruida = 239
            objetoCasa.areaTerreno = 145
            objetoCasa.numDormitorios = 5
            objetoCasa.numPisos = 2
            objetoCasa.numBaños = 3
            'invocamos un metodo-comportamiento'
            objetoCasa.vender()
End Sub

Resultado

Casa Blanco de 145 metros cuadrados de terreno a sido VENDIDA
Mas detalles:
        Direccion: Av José
        Color: Blanco
        Techo: Av José
        Area construida: 239
        Area de terreno: 145
        Cantidad de dormitorios: 5
        Cantidad de pisos: 2
        Cantidad de baños: 3

Ten en cuenta que a partir de una clase podemos crear una infinidad de objetos, ejemplo:

    Casa objetoCasa = new Casa();
    objetoCasa.direccion = "Av José";
    objetoCasa.color = "Blanco";
    objetoCasa.techo = "Tejas";
    objetoCasa.areaConstruida = 239;
    objetoCasa.areaTerreno = 145;
    objetoCasa.numDormitorios = 5;
    objetoCasa.numPisos = 2;
    objetoCasa.numBaños = 3;
    objetoCasa.vender();

    Casa objetoCasa2 = new Casa();
    objetoCasa2.direccion = "Av Argentina";
    objetoCasa2.color = "Amarillo";
    objetoCasa2.techo = "Concreto";
    objetoCasa2.areaConstruida = 589;
    objetoCasa2.areaTerreno = 350;
    objetoCasa2.numDormitorios = 9;
    objetoCasa2.numPisos = 3;
    objetoCasa2.numBaños = 5;
    objetoCasa.Alquilar();

    Casa objetoCasa3 = new Casa();
    objetoCasa3.direccion = "Av Morfé";
    objetoCasa3.color = "BlanquiRoja";
    objetoCasa3.techo = "Tejas";
    objetoCasa3.areaConstruida = 239;
    objetoCasa3.areaTerreno = 145;
    objetoCasa3.numDormitorios = 5;
    objetoCasa3.numPisos = 2;
    objetoCasa3.numBaños = 3;
    objetoCasa3.vender();

¿Qué es el Constructor de una Clase u Objeto?

Un constructor es un método especial de una clase que se llama automáticamente cuando se instancia la clase (crear objeto), su función es inicializar el objeto.

Constructor por defecto o sin parámetros

El constructor se crea automáticamente si no la declaramos, se le conoce como constructor por defecto, que es un constructor sin parámetros. El constructor tiene el mismo nombre que la clase a la que pertenece.

    public class Casa
    {
        //Estados - Atributos
        public string direccion;
        public string color;
        public string techo;
        public double areaConstruida;
        public double areaTerreno;
        public int numDormitorios;
        public int numPisos;
        public int numBaños;

        //Constructor por defecto- sin parametros
        public Casa()
        {

        }
    Public Class Casa
        'Estados - Atributos'
        Public direccion As String
        Public color As String
        Public techo As String
        Public areaConstruida As Double
        Public areaTerreno As Double
        Public numDormitorios As Integer
        Public numPisos As Integer
        Public numBaños As Integer

        'Constructor por defecto- sin parametros'
        Public Sub New()

        End Sub

No es necesario declarar el constructor por defecto, un claro ejemplo es el ejemplo anterior mostrado, donde no fue necesario declarar el constructor de la clase casa. Sin embargo, si tenemos constructores con parámetros, y queremos dar uso el constructor sin parámetros, es necesario declarar el constructor sin parámetros, es decir, si tenemos sobrecarga de constructores (Ver constructores mixto).

En este tipo de constructor, los atributos se inicializan directamente accediendo a los atributos del objeto/clase.

Constructor con parámetros

El constructor tiene uno o más parámetros.

    public class Casa
    {
        //Estados - Atributos
        public string direccion;
        public string color;
        public string techo;
        public double areaConstruida;
        public double areaTerreno;
        public int numDormitorios;
        public int numPisos;
        public int numBaños;

        //Constructor con parametros
        public Casa(string direccion, string color, string techo, double areaConstruida, double areaTerreno, int numDormitorios, int numPisos, int numBaños)
        {
            this.direccion = direccion;
            this.color = color;
            this.techo = techo;
            this.areaConstruida = areaConstruida;
            this.areaTerreno = areaTerreno;
            this.numDormitorios = numDormitorios;
            this.numPisos = numPisos;
            this.numBaños = numBaños;
        }
    Public Class Casa

        'Estados - Atributos'
        Public direccion As String
        Public color As String
        Public techo As String
        Public areaConstruida As Double
        Public areaTerreno As Double
        Public numDormitorios As Integer
        Public numPisos As Integer
        Public numBaños As Integer

        'Constructor con parametros'
        Public Sub New(direccion As String, color As String, techo As String, areaConstruida As Double, areaTerreno As Double, numDormitorios As Integer, numPisos As Integer, numBaños As Integer)
            Me.direccion = direccion
            Me.color = color
            Me.techo = techo
            Me.areaConstruida = areaConstruida
            Me.areaTerreno = areaTerreno
            Me.numDormitorios = numDormitorios
            Me.numPisos = numPisos
            Me.numBaños = numBaños

        End Sub

En este tipo de constructor, los atributos se inicializan momentáneamente al crear la instancia (Crear objeto).

    class Program
    {
        static void Main(string[] args)
        {
            Casa objetoCasa = new Casa("Av José", "Blanco", "Tejas", 239, 145, 5, 2, 3);
objetoCasa.vender();

Constructores Mixto (Con parámetros y sin parámetros)- Sobrecarga

Como se mencionó, no es necesario declarar el constructor por defecto, excepto si tenemos sobrecarga de constructores, es decir, si tenemos constructores con parámetros, y queremos dar uso el constructor sin parámetros, es necesario declarar el constructor sin parámetros.

public class Casa
{
    //Estados - Atributos
    public string direccion;
    public string color;
    public string techo;
    public double areaConstruida;
    public double areaTerreno;
    public int numDormitorios;
    public int numPisos;
    public int numBaños;

    //Constructores
    public Casa()
    {

    }

    public Casa(string direccion, string color, string techo, double areaConstruida, double areaTerreno, int numDormitorios, int numPisos, int numBaños)
    {
        this.direccion = direccion;
        this.color = color;
        this.techo = techo;
        this.areaConstruida = areaConstruida;
        this.areaTerreno = areaTerreno;
        this.numDormitorios = numDormitorios;
        this.numPisos = numPisos;
        this.numBaños = numBaños;
    }

    public Casa(string direccion, string color, string techo, double areaConstruida, double areaTerreno)
    {
        this.direccion = direccion;
        this.color = color;
        this.techo = techo;
        this.areaConstruida = areaConstruida;
        this.areaTerreno = areaTerreno;
    }

    public Casa(string direccion, string color)
    {
        this.direccion = direccion;
        this.color = color;
    }

Propiedades / Métodos Get y Set

Por medidas de seguridad y buenas prácticas, los atributos deberían ser privados, y estos atributos deben ser manipulados a través de métodos get y set (Java) o mediante propiedades (.NET).

public class Casa
{
        //Estados - Atributos
        private string direccion;
        private string color;
        private string techo;
        private double areaConstruida;
        private double areaTerreno;
        private int numDormitorios;
        private int numPisos;
        private int numBaños;

        //Propiedades
        public string Direccion
        {
            get
            {
                return direccion;
            }

            set
            {
                direccion = value;
            }
        }

        public string Color
        {
            get
            {
                return color;
            }

            set
            {
                color = value;
            }
        }

        public string Techo
        {
            get
            {
                return techo;
            }

            set
            {
                techo = value;
            }
        }

        public double AreaConstruida
        {
            get
            {
                return areaConstruida;
            }

            set
            {
                areaConstruida = value;
            }
        }

        public double AreaTerreno
        {
            get
            {
                return areaTerreno;
            }

            set
            {
                areaTerreno = value;
            }
        }

        public int NumDormitorios
        {
            get
            {
                return numDormitorios;
            }

            set
            {
                numDormitorios = value;
            }
        }

        public int NumPisos
        {
            get
            {
                return numPisos;
            }

            set
            {
                numPisos = value;
            }
        }

        public int NumBaños
        {
            get
            {
                return numBaños;
            }

            set
            {
                numBaños = value;
            }
        }
Public Class Casa
        'Estados - Atributos'
        Private direccion As String
        Private color As String
        Private techo As String
        Private areaConstruida As Double
        Private areaTerreno As Double
        Private numDormitorios As Integer
        Private numPisos As Integer
        Private numBaños As Integer

        'Propiedades'
        Public Property Direccion() As String
            Get
                Return direccion

            End Get

            Set(value As String)
                direccion = value

            End Set

        End Property

        Public Property Color() As String
            Get
                Return color

            End Get

            Set(value As String)
                color = value

            End Set

        End Property

        Public Property Techo() As String
            Get
                Return techo

            End Get

            Set(value As String)
                techo = value

            End Set

        End Property

        Public Property AreaConstruida() As Double
            Get
                Return areaConstruida

            End Get

            Set(value As Double)
                areaConstruida = value

            End Set

        End Property

        Public Property AreaTerreno() As Double
            Get
                Return areaTerreno

            End Get

            Set(value As Double)
                areaTerreno = value

            End Set

        End Property

        Public Property NumDormitorios() As Integer
            Get
                Return numDormitorios

            End Get

            Set(value As Integer)
                numDormitorios = value

            End Set

        End Property

        Public Property NumPisos() As Integer
            Get
                Return numPisos

            End Get

            Set(value As Integer)
                numPisos = value

            End Set

        End Property

        Public Property NumBaños() As Integer
            Get
                Return numBaños

            End Get

            Set(value As Integer)
                numBaños = value

            End Set

        End Property

End class

También se puede asignar esos valores a través del constructor, como se hizo en el constructor con parámetros.

Pilares de programación orientada a objetos

Los mecanismos más importantes y poderosos de la programación orientada a objetos son sus pilares. Estos pilares repotencian los conceptos de modularidad y reutilización de código, tenemos cuatro pilares principales:

  • Abstracción
  • Encapsulamiento
  • Herencia
  • Polimorfismo

La programación orientada a objetos se aplica junto a patrones de arquitectura y patrones de diseño.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *