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?
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. –