Saltar al contenido

Comprensión de la programación orientada a objetos en C#

Todos sabemos cómo crear objetos, obtener/establecer propiedades y llamar métodos. Pero la programación orientada a objetos (OOP) es mucho más que eso. Cuanto más conozca estos conceptos, más podrá aprovechar las características de los lenguajes OOP, como C#, para construir aplicaciones bien hechas y comprobables.

Este post cubre cuatro técnicas clave para construir un gran software orientado a objetos, como se identifica en la Figura 1. Para más información sobre estas y otras técnicas pragmáticas de OOP, vea mi curso, Fundamentos de la Programación Orientada a Objetos en C#. Este curso incluye demostraciones paso a paso de la construcción de un componente de la biblioteca de clase desde la especificación hasta la codificación y las pruebas, todo ello siguiendo los principios de OO.

Comprensión de la programación orientada a objetos en C#
Comprensión de la programación orientada a objetos en C#

Identificación de clases

Independientemente de la formalidad de su proceso de desarrollo, cada proyecto comienza con algunas palabras:

  • «¿Puede construir un sistema de gestión de clientes para ayudarnos a rastrear nuestros clientes y pedidos?»
  • O tal vez, «¿Puede actualizar nuestro sistema de contabilidad actual para rastrear nuestro presupuesto?»
  • O simplemente, «Necesitamos cambiar el sistema para rastrear diferentes tipos de productos».

Esas palabras pueden venir en forma de una especificación, una solicitud de cambio o tal vez sólo un correo electrónico. El primer paso para desarrollar un gran código C# es convertir estas palabras en un conjunto de clases bien definidas.

Separación de responsabilidades

La programación orientada a objetos implica separar lógicamente las responsabilidades de una aplicación en clases. Cada clase definida debería tener una responsabilidad primaria. Limitando cada clase a un propósito singular, es más fácil escribir, probar y más tarde encontrar esa clase cuando se necesite actualizarla o ampliarla. Esto hace que el código sea más fácil de modificar y adaptar a nuevos requisitos y demandas futuras. Puede que oigan que esto se conoce como «el principio de separación de preocupaciones».

Establecimiento de relaciones

Ninguna clase es una isla. La programación orientada a objetos implica la comprensión de las relaciones entre las clases. Los tipos más comunes de relaciones son:

  • Colaboración («usa a»): Un objeto utiliza las características de otro objeto para realizar una tarea. Por ejemplo, un Repositorio de Clientes «usa un» objeto Cliente para poblar en un Recuperar y serializar en un guardar.
  • Composición («tiene a»): Un objeto puede estar compuesto por otros objetos. Por ejemplo, un pedido «tiene un» cliente, y un pedido «tiene una» dirección de envío.
  • Agregación: Un tipo especial de composición en el que las partes componentes no existen excepto como parte de la composición. Por ejemplo, la relación Orden e Ítem de Orden es una agregación porque el Ítem de Orden no existe excepto cuando está asociado a un Orden específico.
  • Herencia («es a»): Un objeto «es un» tipo de otro objeto. Por ejemplo, un cliente comercial «es un» cliente, y un cliente residencial «es un» cliente.

Estas relaciones definen cómo los objetos creados a partir de esas clases pueden trabajar juntos para realizar las operaciones de la aplicación.

Aprovechar la reutilización

Uno de los objetivos clave del OOP es la reutilización. Hay varias maneras de aprovechar la reutilización en una aplicación orientada a objetos:

  • Colaboración: Definir un conjunto de clases comunes y reutilizar esas clases a través de la colaboración. Por ejemplo, una clase de dirección podría reutilizarse en cualquier lugar donde se requiera una dirección.
  • Herencia: Extraer el código común en una clase base y reutilizar ese código en todas las clases derivadas. Por ejemplo, una clase base de entidad puede contener el código básico necesario para cada entidad de business object de la aplicación.
  • Componentes: Construir una biblioteca encapsulada de clases reutilizables como un componente separado (proyecto Visual Studio). Por ejemplo, una biblioteca de métodos de extensión de String o un componente de Logging que puede ser reutilizado en todos los proyectos y aplicaciones.
  • Interfaces: Definir una interfaz para cada función que una entidad necesita apoyar. Por ejemplo, una función de registro o una función de serialización. Reutilice esa interfaz en cualquier entidad que necesite apoyar ese papel.

Un beneficio secundario del uso de la herencia o de las interfaces es el polimorfismo. Polimorfismo es una palabra que suena impresionante y que básicamente significa «muchas formas». Es el concepto de que un solo método puede tener muchas formas y puede comportarse de manera diferente, dependiendo del tipo que lo haya llamado.

En el polimorfismo basado en la herencia, un método puede comportarse de manera diferente dependiendo de la clase derivada que lo llame. Por ejemplo, digamos que una clase base de entidad tiene un método Save. Si cada entidad anula ese método Save con su propia implementación, llamar a Save en un objeto Customer se comportará de forma diferente que llamar a Save en un objeto Product.

En el polimorfismo basado en la interfaz, un método puede comportarse de manera diferente según la instancia de la interfaz que lo llame. Por ejemplo, digamos que una interfaz ILoggable tiene un método Log. Suponiendo que tanto la clase Cliente como la clase Producto implementan la interfase ILoggable, llamar Log en un objeto Cliente puede comportarse de manera diferente que llamar Log en un objeto Producto.

OOP es la base

La programación orientada a los objetos es la base de muchos de los enfoques actuales de desarrollo de aplicaciones, como se muestra en la figura 2. Si quieres tener éxito en los cursos de matemáticas como el cálculo y las ecuaciones diferenciales, tienes que dominar el álgebra. Del mismo modo, si quieres tener éxito con una codificación limpia, ágil y patrones de diseño, tienes que dominar OOP.

Para llevar

Comprender y utilizar técnicas de codificación orientadas a los objetos es la clave para construir aplicaciones C# bien elaboradas y comprobables.

Para más información, vea mi curso Fundamentos de la Programación Orientada a Objetos en C#. Esto te lleva paso a paso a través de los principios y prácticas de la programación orientada a objetos. Cuando termines este curso:

  • Tendrá una base firme en los principios y prácticas de la programación orientada a objetos.
  • Tendrá el conocimiento para construir aplicaciones de calidad de producción.
  • Y estarás listo para avanzar con éxito a los cursos y técnicas de nivel intermedio C#.

Para saber más sobre lo que la C# se usa para ver este post sobre el asunto.