3.3 · Programación orientada a objetos (clases) en WLangage

Nivel 3 · Avanzado: WLangage en profundidad

3.3Programación orientada a objetos (clases) en WLangage

Objetivo: Comprender clase, objeto, encapsulación y herencia, y después decidir de forma pragmática cuándo la POO aporta claridad.
Tiempo estimado: 12 min · lectura autónoma · Si solo tienes 5 min: lee «Lo esencial en 30s» + el esquema.

Lo esencial en 30 segundos

  • La clase es el modelo, el objeto el ejemplar: los miembros llevan los datos, los métodos los tratamientos, el constructor inicializa.
  • La encapsulación protege los datos sensibles detrás de métodos; la herencia especializa una base común sin duplicación.
  • La POO no es obligatoria: Yacine la usa para las reglas de negocio ricas y las variantes de clientes, no por principio.

Mini-caso hilado — Yacine modela clientes y saldos pendientes

Yacine gestiona los clientes de la pyme de venta de material eléctrico en Orán: particulares, empresas e instaladores. Hasta ahora arrastraba variables dispersas y condiciones por todas partes para calcular un saldo pendiente y verificar la solvencia. Crea una clase Client con un constructor, un miembro de saldo pendiente y un método EstSolvable. Después hace que ClientEntreprise herede de Client para añadir un límite negociado, sin duplicar la base. Los miembros sensibles ya no se modifican directamente: todo pasa por EnregistreFacture y EstSolvable. Sin embargo, Yacine mantiene sus procedimientos de cálculo simples fuera de las clases: anota el reflejo: POO donde aporta claridad, no de forma sistemática.

Caso autónomo de esta sección: reaparece en el curso, el esquema, el guion y el reto de 48 h de la sección 3.3.

1. Clase, objeto, miembros y métodos

La programación orientada a objetos organiza el código en torno a objetos que agrupan datos y los tratamientos asociados. La clase es el modelo, el plano de construcción: la clase Client describe qué es un cliente y qué se puede hacer con él. El objeto, o instancia, es un ejemplar concreto creado a partir de esa clase. Los miembros son los datos del objeto —nombre, saldo pendiente— y los métodos los procedimientos que actúan sobre ellos. El constructor se llama automáticamente en la creación para inicializar el objeto.

2. Encapsulación, herencia, polimorfismo

La encapsulación agrupa datos y tratamientos y protege el acceso directo a los datos: se pasa por métodos, lo que garantiza el respeto de las reglas. La herencia crea una clase a partir de otra recuperando sus características y especializándolas: ClientEntreprise hereda de Client y añade su límite negociado sin duplicar la base. El polimorfismo permite llamar al mismo método sobre objetos diferentes, y cada uno responde según su clase.

3. POO útil, no obligatoria

La POO destaca en las aplicaciones complejas, las reglas de negocio ricas, el código destinado a reutilizarse y el trabajo en equipo. Pero no es obligatoria: una aplicación de gestión clásica se desarrolla muy bien en procedural, con procedimientos bien organizados en colecciones. El pragmatismo manda. Yacine usa una clase cuando un concepto lleva realmente reglas y un estado coherente —un cliente con su saldo pendiente— y mantiene procedimientos simples para los cálculos aislados.

Error frecuente de interpretación: «La POO es obligatoria en WinDev; una clase solo contiene datos; y la herencia sirve para recopiar el código de una clase en otra». No, triple error. La POO es útil pero facultativa: un procedural bien estructurado suele bastar en gestión. Una clase contiene datos y tratamientos, con encapsulación y constructor; es la estructura la que solo lleva datos. Por último, la herencia no recopia: especializa una base común, lo que precisamente evita la duplicación. Yacine elige la POO donde aporta claridad.
Clase, objeto y herencia El modelo define datos y comportamientos; los objetos lo instancian. Clasemodelo y reglas+Objetoinstancia concreta+Herenciaespecializar sin duplicar Encapsular los datos sensibles detrás de métodos.
El modelo define datos y comportamientos; los objetos lo instancian.
Versión en texto del esquema (SEO / lectores de pantalla / traducción): 1) Yacine, desarrollador WinDev en una pyme de venta de material eléctrico en Orán, modela los clientes de su aplicación de gestión con una clase Client: miembros para el código, el nombre y el saldo pendiente, constructor para inicializar, métodos EnregistreFacture y EstSolvable. 2) Protege el saldo pendiente detrás de esos métodos y hace que ClientEntreprise herede de Client para añadir un límite negociado sin recopiar la base. 3) Conserva en procedimientos los cálculos aislados que no tienen estado, porque la POO no es una obligación. Lección: la clase clarifica un concepto que lleva reglas y datos; no sustituye todo lo demás.

🔎 Ejemplo concreto — 🔎 Ejemplo concreto — Una clase Client que protege su saldo pendiente

Yacine encapsula el saldo pendiente y el control de solvencia en la clase:

Client est une classe
    m_sCode est une chaine
    m_sNom est une chaine
    m_nEncours est un monetaire

    PROCEDURE Constructeur(sCode est une chaine, sNom est une chaine)
        m_sCode = sCode
        m_sNom = sNom
        m_nEncours = 0
    FIN

    PROCEDURE EnregistreFacture(nMontant est un monetaire)
        m_nEncours = m_nEncours + nMontant
    FIN

    PROCEDURE EstSolvable(nPlafond est un monetaire) : booleen
        RENVOIE m_nEncours <= nPlafond
    FIN
FIN

cClient est un Client("CLI042", "Dupont Materiel Electrique")
cClient.EnregistreFacture(12500)
SI PAS cClient.EstSolvable(20000) ALORS
    Info("Encours depasse : relance commerciale")
FIN

Lectura: el saldo pendiente solo se modifica por EnregistreFacture, nunca directamente.

Lección: la regla de solvencia viaja con el dato al que se refiere.

Vocabulario de la sección

Clase
Modelo que describe los datos y los tratamientos de un concepto, a partir del cual se crean objetos.

Ejemplo sencillo: La clase Client describe el código, el nombre, el saldo pendiente y los métodos asociados.

Lo que no es: un objeto concreto como el cliente Dupont.

Reflejo: el plano de un concepto → la clase.

Objeto (instancia)
Ejemplar concreto creado a partir de una clase, con sus propios valores de miembros.

Ejemplo sencillo: cClient es una instancia de Client para Dupont Matériel Électrique.

Lo que no es: el modelo Client que todavía no tiene valores.

Reflejo: un ejemplar utilizable → un objeto.

Encapsulación
Protección de los datos de un objeto detrás de métodos que garantizan las reglas.

Ejemplo sencillo: El saldo pendiente solo cambia mediante EnregistreFacture.

Lo que no es: un miembro modificable directamente desde cualquier pantalla.

Reflejo: dato sensible → encapsulación.

Herencia
Creación de una clase a partir de otra recuperando su base y especializándola.

Ejemplo sencillo: ClientEntreprise hereda de Client y añade un límite negociado.

Lo que no es: recopiar todo el código de Client en una segunda clase.

Reflejo: especializar sin duplicar → herencia.

Constructor
Método llamado automáticamente en la creación de un objeto para inicializarlo.

Ejemplo sencillo: El constructor de Client fija el código, el nombre y un saldo pendiente a cero.

Lo que no es: un objeto creado con miembros sin inicializar.

Reflejo: inicializar en la creación → constructor.

En la práctica — En la práctica — Crear y usar una clase

  1. Cree una clase que represente un concepto de negocio (Client, Commande) con sus miembros y sus métodos, como Yacine.
  2. Añada un constructor para inicializar el objeto y proteja los miembros sensibles mediante encapsulación.
  3. Instancie un objeto y llame a sus métodos: datos y tratamientos viajan juntos.
  4. Si varias variantes comparten una base, utilice la herencia (ClientEntreprise) en lugar de duplicar el código.
Sabe crear clases para estructurar los casos complejos, sabiendo además que la POO sigue siendo una elección pragmática.

Guion paso a paso — modelar un cliente como Yacine (5 min)

1) Identifique un concepto que lleva a la vez datos y reglas (cliente, pedido). 2) Enumere sus miembros y los métodos que deben protegerlos. 3) Escriba el constructor para garantizar una inicialización correcta. 4) Instancie un objeto en una pantalla y llame a sus métodos. 5) Si un caso vecino comparte la base, hágalo heredar en lugar de copiar el código.

Mantenga este criterio: una clase se justifica cuando el comportamiento y las reglas merecen viajar con los datos.

Modelo para copiar y pegar — la ficha de POO de Yacine

Classe        : modele (donnees + methodes + constructeur)
Objet         : instance concrete avec ses valeurs
Encapsulation : proteger les membres sensibles via des methodes
Heritage      : specialiser un socle commun sans dupliquer
Pragmatisme   : POO si regles riches / variantes / composants ; sinon procedural

Un cliente empresa

Yacine hace que ClientEntreprise herede de Client para añadir un límite negociado.

Un saldo pendiente incoherente

El saldo pendiente ya solo se modifica mediante EnregistreFacture: la regla está centralizada.

Un cálculo aislado

Yacine mantiene CalculeMontantTTC como procedimiento: no hay ningún dato de estado que encapsular.

Un constructor olvidado

Un objeto creado sin inicialización produce un saldo pendiente absurdo: Yacine añade un constructor.

✓ Buenas prácticas

  • Modelar una clase cuando unas reglas acompañan a los datos.
  • Proteger los miembros sensibles con la encapsulación.
  • Usar la herencia para especializar, no para recopiar.

✗ Errores frecuentes

  • Crear una clase que solo lleva datos.
  • Dejar modificar un saldo pendiente o un estado directamente.
  • Querer objetivarlo todo por principio.

Puntos clave

  • Clase = modelo, objeto = instancia, miembros = datos, métodos = tratamientos.
  • El constructor inicializa el objeto en su creación.
  • Encapsulación y herencia evitan incoherencias y duplicación.
  • La POO es útil pero no obligatoria: el pragmatismo manda.

Reto 48 h — aplícalo mañana

Como Yacine, elija en su aplicación un concepto que lleve reglas (cliente, pedido, producto) y cree una clase con sus miembros, un constructor y dos métodos. Proteja un miembro sensible mediante encapsulación y después añada una variante por herencia. Escriba por último en una frase por qué mantiene el resto en procedimientos: la POO debe clarificar, no complicar.

Lista de salida de la sección
  • Distingo clase, objeto, miembros, métodos y constructor.
  • Comprendo encapsulación, herencia y polimorfismo.
  • Sé decidir cuándo la POO aporta claridad.
Autoevaluación 1-5: ¿modelo un concepto con sus reglas?Autoevaluación 1-5: ¿evito la POO decorativa?

Preguntas frecuentes

¿Hay que usar la POO en un proyecto WinDev de gestión clásica?

No necesariamente: una aplicación de gestión se desarrolla muy bien en procedural estructurado, con procedimientos organizados en colecciones. La POO resulta interesante cuando un concepto lleva reglas ricas, cuando la encapsulación es necesaria, cuando varias variantes comparten una base o cuando el código debe reutilizarse como componente. Es una herramienta, no una obligación.

¿Qué diferencia hay entre una estructura y una clase?

La estructura solo agrupa datos, sin comportamiento ni protección: perfecta para transportar una dirección o una línea importada. La clase agrupa datos y tratamientos, con constructor, encapsulación y herencia: se justifica cuando hay comportamiento y reglas que garantizar. En caso de duda, empiece por la estructura si solo necesita agrupar informaciones.

Comprueba tu comprensión

¿Qué agrupa una clase en WLangage?

Recursos adicionales (opcional, para ir más allá)

Examen del nivel 3Preguntas inéditas y más difíciles para validar tus conocimientos