6

Sé que es posible, en principio, convertir incluso lenguajes de procedimiento como C o MATLAB en orientados a objetos. Esta pregunta se ha debatido bastante bien here y here.¿Deberían aplicarse principios orientados a objetos en los lenguajes de procedimiento?

Lo que encontré que faltaba en estas discusiones y las referencias en él eran una exposición sobre si uno debería aplicarse tales principios. ¿Hay algo concreto que ganar al hacerlo? Es claramente posible, pero ¿es aconsejable para hacerlo? ¿Hay algún ejemplo entre los proyectos de código abierto donde esta práctica condujo a claras ventajas?

CLARIFICACION

Tal vez un ejemplo está en orden.

Heredé algún código de MATLAB que implementa algún algoritmo de aprendizaje automático. Hay básicamente una única función building_model que, dependiendo de una bandera de ser aprobada, ya sea entrenar un modelo o usarlo para predecir un valor futuro:

building_model('train', ...) % ... stands for the data with which the model is trained 

y

El modelo en sí se implementa con Variables persistentes de MATLAB dentro de building_model.

He desgarrado building_model en dos funciones, una para entrenamiento y otra para predicción. El modelo que se utiliza para ser implementado como variables persistentes ahora se exterioriza, por así decirlo:

model = new_model() 
model = model_train(model, ...) 
prediction = model_predict(model) 

Esto es, en términos generales, por lo que pude emular algunas características de programación orientada a objetos en MATLAB. Mi módulo de modelo de construcción ahora funciona más o menos como una clase, con un constructor y dos métodos model_train y model_predict. He logrado cierto grado de encapsulación (aunque nada impide que la persona que llama juegue con las partes internas de model), y el polimorfismo podría en principio también acomodarse. Como bono extra, obtengo la separación Comando/Consulta casi de forma gratuita ya que model_predict no devuelve model, y por lo tanto no puede alterar model.

(lectores astutos señalar que MATLAB ya tiene un sistema orientado a objetos. Por diversas razones, incluyendo el rendimiento y la compatibilidad con versiones anteriores, no puedo usarlo.)

I podría imaginar un mecanismo similar en C donde diseñaría una estructura de datos y escribiría funciones cuyo primer argumento sería una instancia de esa estructura de datos.

Lo que me gustaría saber es, ¿hasta qué punto puedo impulsar esta forma de programación? ¿Es este un patrón comúnmente aceptado (allí, he dicho la palabra)? ¿Hay algún problema de rendimiento del que debería tener cuidado?

+1

Eso es algo que a menudo falta en las discusiones sobre prácticas orientadas a objetos en general. Aún debe decidir si OOP es el diseño correcto, si está integrado en el idioma o simplemente una metodología de diseño que intenta adoptar sin ayuda del idioma. Las mismas ventajas (y desventajas) se aplican de cualquier manera. –

Respuesta

2

Creo que esta es una discusión muy importante. Creo que es seguro decir que OOP no siempre es la mejor solución en todos los idiomas. En, por ejemplo, C++ o Python, OOP es generalmente la forma natural de, p. encapsular datos. Esos idiomas están diseñados para enfocarse en las clases. En otros idiomas, puede ser más fácil crear código de buena calidad de otras maneras.

Creo que Common Lisp es un buen ejemplo. Tiene un sistema POO realmente bueno (CLOS) que diría que es realmente completo. Pero aún así, OOP no se usa tanto en Common Lisp como en Python o C++, ya que es una característica de conveniencia más que algo que se necesita para proporcionar bloques básicos de ingeniería de software.

Si usted debe usar OOP realmente no depende del problema que está tratando de resolver. Por ejemplo, creo que las cosas de GUI pueden ser realmente útiles para abordar con OOP.

+0

+1 "Creo que las cosas de GUI pueden ser realmente útiles para abordar con OOP". Así es como el Dr. Stroustrup presenta OOP a sus alumnos. – AraK

-1

La orientación del objeto es el es un medio para lograr los objetivos de ingeniería de software.

Objetivo: facilidad de mantenimiento, extensibilidad, código fuente organizado (búsqueda, etc.)
OO Constructo: Encapsulación (sólo los métodos de propiedad del 'tipo de datos/estructura' puede operar en sus datos)

Objetivo: Capacidad para desarrollar nuevas características sin modificar los existentes, la reutilización de código
Constructo OO : la herencia de implementación, polimorfismo

Objetivo: Abstracciones (usted no tiene que comprometerse a un tipo u operaciones particular, el cambio de la aplicación sin tener que cambiar los clientes) Construir
OO: Interfaz de herencia, interfaces, clases abstractas

Los objetivos no necesitan justificación. Si desea/necesita el soporte de un idioma OO o no depende de su situación particular. Si necesita utilizar C, puede imitar algunas construcciones OO y, con suerte, disfrutar de sus ventajas.

Tenga en cuenta que es absolutamente posible desarrollar una gran cantidad de código con la adhesión a todos los principios de OO.

Estoy seguro de que otros pueden enumerar otros objetivos y ejemplos (y saber cómo editar las tablas de mensajes stackoverflow)

+3

Realmente no estoy de acuerdo con que OO es * el * medio para lograr los objetivos anteriores. Todo esto fue realmente posible antes de la invención de OO. –

Cuestiones relacionadas