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.
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.
Los comentarios están cerrados.