Saltar al contenido
Explorar conocimiento

concepto · fundamentos · 6 min de lectura

Clase

Una clase define la estructura y el comportamiento común que usarán sus objetos, separando el plano compartido de los datos particulares de cada instancia.

No requiere conocimientos previos.

Alcance en breve

Cubre

  • class definitions as reusable object blueprints
  • instances, fields, methods, and constructors at a conceptual level
  • the difference between shared behavior and per-object state

No cubre

  • deep inheritance hierarchies and polymorphism
  • design patterns built from classes
  • framework-specific component classes

Supone

  • The reader has basic programming literacy and has seen variables and functions before.

Resumen

Una clase es una definición reutilizable para crear objetos. Describe qué datos puede tener cada objeto, qué operaciones puede ejecutar y cómo se inicializa una nueva instancia. La clase no es el objeto en sí: es el plano que permite construir muchos objetos con la misma forma general.

Importa porque ayuda a organizar código alrededor de conceptos del dominio. En vez de pasar datos sueltos entre funciones, una clase puede agrupar el estado que pertenece a una entidad y las operaciones que mantienen coherente ese estado.

Alcance y supuestos

Este paquete cubre la idea de clase como concepto básico de programación orientada a objetos: definición, instancia, campos, métodos y constructor. Usa TypeScript como ejemplo porque su sintaxis hace visible la forma de la clase, pero el modelo mental aplica a lenguajes como Java, C#, Kotlin, Python o JavaScript moderno con matices propios.

No cubre jerarquías profundas de herencia, polimorfismo, interfaces, clases abstractas, patrones de diseño ni componentes de frameworks. Tampoco asume que toda solución deba usar clases: muchas veces una función y una estructura de datos simple alcanzan.

Modelo mental

Piensa en una receta de cocina y las pizzas que salen de esa receta. La receta dice qué ingredientes se necesitan y qué pasos seguir; cada pizza concreta puede tener su propio tamaño, temperatura o cantidad de queso. La clase es la receta. Cada objeto creado desde esa clase es una pizza concreta.

La receta no se come, pero permite producir muchas pizzas similares. Del mismo modo, una clase no representa un usuario, una factura o un carrito específico: representa la forma que tendrán esos objetos y las acciones disponibles sobre ellos.

Esa separación evita mezclar dos preguntas distintas: "¿qué puede hacer este tipo de objeto?" y "¿qué valores tiene este objeto ahora?". La clase responde la primera con métodos y reglas compartidas. La instancia responde la segunda con su estado particular.

Uso práctico

Usa una clase cuando un concepto tiene identidad, estado propio y reglas que conviene mantener cerca de ese estado:

  • Cart puede guardar ítems y exponer addItem, removeItem y total para proteger las reglas del carrito.
  • Money puede evitar mezclar montos con monedas distintas si sus métodos validan la moneda antes de operar.
  • ❌ Una clase Utils con funciones sueltas no modela una entidad; suele esconder un módulo de funciones estáticas.
  • ❌ Una clase UserData que solo contiene campos públicos, sin reglas ni comportamiento, puede ser una estructura de datos simple.

Ejemplo trabajado: modelar un carrito con reglas propias

Supón que una tienda necesita calcular el total de un carrito y evitar cantidades inválidas. Si el código usa arrays sueltos, cualquier parte de la aplicación puede agregar una cantidad negativa y romper el total. Una clase permite centralizar esa regla donde vive el estado.

type CartItem = {
  name: string;
  unitPrice: number;
  quantity: number;
};

class Cart {
  private items: CartItem[] = [];

  addItem(name: string, unitPrice: number, quantity: number) {
    if (quantity <= 0) {
      throw new Error("Quantity must be positive");
    }

    this.items.push({ name, unitPrice, quantity });
  }

  total() {
    return this.items.reduce((sum, item) => {
      return sum + item.unitPrice * item.quantity;
    }, 0);
  }
}

La clase Cart define la forma y las reglas del carrito. items guarda el estado interno de cada instancia. addItem protege la regla de cantidad positiva. total calcula un resultado a partir del estado actual.

const cart = new Cart();
cart.addItem("Notebook", 1200, 1);
cart.addItem("Mouse", 25, 2);

console.log(cart.total()); // 1250

cart es una instancia: tiene sus propios ítems y su propio total. Si creas const secondCart = new Cart(), ese segundo carrito comparte los mismos métodos definidos por la clase, pero no comparte el array items con el primero.

La frontera importante es esta: pon dentro de la clase las reglas que protegen el estado del objeto. No pongas dentro de la clase todo lo que exista alrededor del objeto. Por ejemplo, enviar un email de confirmación cuando se compra el carrito probablemente pertenece a un servicio o caso de uso, no al carrito mismo.

Un chequeo rápido antes de crear una clase:

  1. ¿Hay estado que debe permanecer consistente entre operaciones?
  2. ¿Hay reglas que siempre deben cumplirse al modificar ese estado?
  3. ¿Tiene sentido crear más de una instancia independiente?
  4. ¿El nombre representa un concepto del dominio y no solo una carpeta para funciones?

Si las respuestas son sí, una clase puede hacer el código más explícito. Si no, una función, un tipo o un módulo pueden ser más simples.

Evidencia

Práctica

Conexiones

Ver grafo local

Fuentes citadas