Desde su blog, parece que está familiarizado con la programación imperativa y funcional, y que está familiarizado con los conceptos básicos involucrados en la programación orientada a objetos, pero nunca ha tenido realmente "clic" sobre qué lo hace útil Trataré de explicar en términos de ese conocimiento, y espero que sea útil para usted.
En esencia, OOP es una forma de utilizar el paradigma imperativo para gestionar mejor los altos grados de complejidad mediante la creación de estructuras de datos "inteligentes" que modelan el dominio del problema. En un programa (estándar de procedimiento no orientado a objetos), tiene dos cosas básicas: variables y código que sabe qué hacer con ellas. El código toma información del usuario y de otras fuentes, la almacena en variables, opera en ella y produce datos de salida que van al usuario u otras ubicaciones.
La programación orientada a objetos es una forma de simplificar su programa tomando ese patrón básico y repitiéndolo en una escala más pequeña. Al igual que un programa es una gran colección de datos con código que sabe qué hacer con él, cada objeto es un pequeño dato vinculado al código que sabe qué hacer con él.
Al dividir el dominio del problema en partes más pequeñas y asegurarse de que la mayor cantidad de datos posible esté directamente relacionada con el código que sabe qué hacer con él, hace que sea mucho más fácil razonar sobre el proceso en su conjunto y también sobre el sub- problemas que componen el proceso.
Al agrupar los datos en clases de objetos, puede centralizar el código relacionado con esos datos, haciendo que el código relevante sea más fácil de encontrar y de depurar. Y al encapsular los datos detrás de los especificadores de acceso y solo acceder a ellos a través de métodos (o propiedades, si su idioma los admite), reduce en gran medida el potencial de corrupción de datos o la violación de invariantes.
Y al usar la herencia y el polimorfismo, puede reutilizar clases preexistentes, personalizándolas para satisfacer sus necesidades específicas, sin tener que modificar los originales o reescribir todo desde cero. (Lo cual es algo que nunca debe hacer , si puede evitarlo). Solo tenga cuidado de comprender su objeto base, o podría terminar con canguros asesinos .
Para mí, estos son los principios fundamentales de la programación orientada a objetos: gestión de la complejidad, centralización del código y modelado mejorado del dominio de problemas mediante la creación de clases de objetos, herencia y polimorfismo, y una mayor seguridad sin sacrificar el poder o el control mediante el uso de encapsulación y propiedades. Espero que esto te ayude a entender por qué tantos programadores lo encuentran útil.
EDITAR: en respuesta a la pregunta de Joel en los comentarios,
¿Puede explicar qué contiene un "programa orientado a objetos" (aparte de estas definiciones elegantes que ha esbozado) que es fundamentalmente diferente de un programa imperativo? ¿Cómo "haces rodar la pelota"?
Un pequeño descargo de responsabilidad aquí. Mi modelo de "un programa orientado a objetos" es básicamente el modelo Delphi, que es muy similar al modelo C # /. NET ya que fueron creados por ex miembros del equipo de Delphi. Lo que digo aquí puede no aplicarse, o no aplicarse tanto, en otros idiomas OO.
Un programa orientado a objetos es aquel en el que toda la lógica está estructurada en torno a objetos. Por supuesto, esto tiene que ser arrancado en alguna parte. Su programa típico de Delphi contiene un código de inicialización que crea un objeto singleton llamado Application
. Al comienzo del programa, llama Application.Initialize
, luego llama a Application.CreateForm
cada formulario que desea cargar en la memoria desde el principio, y luego Application.Run,
muestra el formulario principal en la pantalla e inicia el ciclo de entrada / evento que forma el núcleo de cualquier Programas informáticos interactivos.
La aplicación y sus formularios sondean los eventos entrantes del sistema operativo y los traducen en llamadas a métodos en su objeto. Una cosa que es muy común es el uso de controladores de eventos, o "delegados" en .NET-speak. Un objeto tiene un método que dice "haz X e Y, pero también verifica si este controlador de eventos en particular está asignado y llámalo si es así". Un controlador de eventos es un puntero de método, un cierre muy simple que contiene una referencia al método y una referencia a la instancia del objeto, que se utiliza para extender el comportamiento de los objetos. Por ejemplo, si tengo un objeto de botón en mi formulario, personalizo su comportamiento adjuntando un controlador de eventos OnClick, lo que hace que algún otro objeto ejecute un método cuando se hace clic en el botón.
Por lo tanto, en un programa orientado a objetos, la mayor parte del trabajo se realiza definiendo objetos con ciertas responsabilidades y vinculándolos, ya sea a través de punteros de método o mediante un objeto que llama directamente a un método definido en la interfaz pública de otro objeto. (Y ahora volvemos a la encapsulación). Esta es una idea de la que no tenía idea antes de tomar clases de OOP en la universidad.