Cuando trabajes con la Programación Orientada a Objetos (POO) hay tres palabras que va a usar constantemente OBJETOS, CLASE, e INSTANCIA.
No te preocupes, te vas a acostumbrar a ellas casi sin esfuerzo y usarlas constantemente. Pero, lógicamente tenemos que explicarlas (porque además de programar bien, también es importante hablar bien)
Empecemos por los OBJETOS. Como ya sabemos, son la base de la Programación Orientada a objetos. Ya hemos explicado qué son los objetos en este artículo.
Como recordatorio rápido, un OBJETO es una forma de modelar una parte de la realidad. El objeto, contiene,
- Estado, a través de campos
- Comportamiento, a través de métodos
Y además, para que sea un objeto “de verdad”, debe ser tratado por tu programa con ciertas consideraciones o “reglas” particulares. Algunas de estas son:
Con esto refrescado, ya explicar los conceptos de clase e instancia.
Clase
Una CLASE es la definición formal de nuestro Objeto. Podemos pensar en ella como un “molde” o plantilla para crear objetos.
En la Clase definimos las propiedades y métodos que los objetos creados a partir de la clase tendrán
Lo vamos a ver más fácil con un ejemplo sencillo. Supongamos quieres hacer un programa que trabaja con personas (por ejemplo, para llevar el listado de alumnos de un aula, para que compren cosas, para lo que tu quieras).
La clase Persona
contiene la definición de “lo que tiene” una Persona. Supongamos que en tu programa una persona es simplemente “algo” que tiene:
nombre
, que es un textoedad
, que es un número entero.
Además, tu Persona
puede presentarse (que simpática ella). Para lo cuál tiene un método que un mensaje en la pantalla utilizando los valores de los campos nombre
y edad
.
Veamos cómo se haría esto en diferentes lenguajes de programación,
public class Persona {
// Campos o propiedades
public string nombre;
public int edad;
// Metodo
public void Presentarse() {
Console.WriteLine($"Hola, mi nombre es {nombre} y tengo {edad} años.");
}
}
class Persona {
public:
// Campos o propiedades
string nombre;
int edad;
// Metodo
void presentarse() {
cout << "Hola, mi nombre es " << nombre << " y tengo " << edad << " años." << endl;
}
};
class Persona {
// Campos o propiedades
constructor() {
this.nombre = "";
this.edad = 0;
}
// Metodo
presentarse() {
console.log(`Hola, mi nombre es ${this.nombre} y tengo ${this.edad} años.`);
}
}
class Persona:
# Campos o propiedades
def __init__(self):
self.nombre = ""
self.edad = 0
# Metodo
def presentarse(self):
print(f"Hola, mi nombre es {self.nombre} y tengo {self.edad} años.")
Instancia
Una vez que tenemos definida una CLASE, ya podemos empezar a crear objetos a partir del “molde” que define.
Una instancia es cada uno de los elementos creados según una clase
Cada INSTANCIA es un elemento independiente, que tiene sus propios valores para las propiedades definidas en la clase.
Además, por supuesto, puedes tener múltiples instancias creadas a partir de una clase (de hecho lo normal es que tengas varias instancias de una clase).
Ahora vamos a verlo con unos ejemplos en los principales lenguajes de programación. En los siguientes códigos, creamos dos instancias de la clase Persona
:
- Una para Luis, con 30 años
- Otra para Maria, con 20 años.
Además, llamamos al método Presentarse
de cada instancia para que impriman un mensaje en la consola presentándose cordialmente (con sus respectivos nombres y edades).
// Crear una instancia de la clase Persona
Persona personaLuis = new Persona();
personaLuis.nombre = "Luis";
personaLuis.edad = 30;
// Llamar al método Presentarse
personaLuis.Presentarse();
// Crear otra instancia de la clase Persona
Persona personaMaria = new Persona();
personaMaria.nombre = "Maria";
personaMaria.edad = 20;
// Llamar al método Presentarse
personaMaria.Presentarse();
// Crear una instancia de la clase Persona
Persona personaLuis;
personaLuis.nombre = "Luis";
personaLuis.edad = 30;
// Llamar al método Presentarse
personaLuis.presentarse();
// Crear otra instancia de la clase Persona
Persona personaMaria;
personaMaria.nombre = "Maria";
personaMaria.edad = 20;
// Llamar al método Presentarse
personaMaria.presentarse();
// Crear una instancia de la clase Persona
const personaLuis = new Persona();
personaLuis.nombre = "Luis";
personaLuis.edad = 30;
// Llamar al método Presentarse
personaLuis.presentarse();
// Crear otra instancia de la clase Persona
const personaMaria = new Persona();
personaMaria.nombre = "Maria";
personaMaria.edad = 20;
// Llamar al método Presentarse
personaMaria.presentarse();
# Crear una instancia de la clase persona
personaLuis = Persona()
personaLuis.nombre = "Luis"
personaLuis.edad = 30
# Llamar al método presentarse
personaLuis.presentarse()
# Crear otra instancia de la clase persona
personaMaria = Persona()
personaMaria.nombre = "Maria"
personaMaria.edad = 20
# Llamar al método presentarse
personaMaria.presentarse()
Como vemos, cada una de las instancias es independiente de las demás y tienen su propios datos. En el ejemplo, cada Persona
tiene su propio nombre
y su propia edad
.
Además, cuando llaman al método Presentarse
, acceden a sus propios valores. Cada instancia está, envueltitos y independientes, con sus propios datos.
Buenas prácticas consejos
Ahora unos comentarios y pensamientos generales.
No existe una única forma correcta
En primer lugar, dejar claro que no existe una única forma de modelar una persona. Para ti puede tener nombre
y edad
. Pero para otro puede tener nombre
, fecha nacimiento
y dni
.
Algunas formas te darán menos problemas que otras en algún momento. Por ejemplo, edad
, seguramente no es una buena idea, porque cambia todos los años. Probablemente te de menos problemas fecha nacimiento
en el futuro.
Pero, aún así, no existe una única forma correcta. Lo que metas o lo que no metas, dependerá de tus necesidades y las de tu proyecto. Y un poco de “plus de picardía” de lo que dará problemas en el algún momento.
La palabra “objeto”
Otros bonus especial para hablar de la palabra “Objeto”. En principio, el concepto OBJETO, CLASE e INSTANCIA son conceptos relacionados, pero diferentes.
Por un lado CLASE e INSTANCIA representan cosas muy diferentes, Aquí no existe ninguna duda sobre su uso. La clase es el “molde”, y la instancia “lo que creas” con ese molde.
Pero respecto a la palabra “Objeto”… ñieee. Cuando estéis en el día a día hablando con otros programadores, la vais a acabar usando como tanto para referiros a clase e instancia.
Por ejemplo, a veces dirás “hay que crear un objeto alumno”. Y en realidad aquí te estás refiriendo a crear una clase Alumno
. Pero otras veces dirás “este objeto de aquí me da un problema”, y ahí seguramente te estás refiriendo una instancia.
Al final, no os obsesionéis con ello, las palabras son palabras. Lo importante es entender bien los conceptos y que cuando hables con alguien te entiendas.