martes, mayo 15, 2007

Que es orientado a objetos?

Hace poco leí un articulo(1) donde definen un lenguaje funcional como:

"A functional language is one in which function types are first-class"

y definían first class como los tipos que pueden ser retornados, pasados por parametro, almacenados en estructuras de datos y otras cosas.

Lamentablemente para los objetos no sucede lo mismo. Tal consenso en la definición no existe, sin embargo, hay otro articulo(2), que revisaba gran parte de la literatura sobre objetos y clasificaba cuales eran los conceptos mas asociados a este paradigma.

Para mi sorpresa el concepto mas asociado no es ni objeto ni clase.
Sino...

Herencia (CHAN CHAN CHAAAAAN) le seguían objeto, clase y encapsulación.

Aquí es cuando uno se pregunta, puede haber programación orientada a objetos sin herencia? sin encapsulación?

Pues bien... yo diría que si, pero no soy nadie para decirlo. Para mi un lenguaje orientado a objetos es:

"A OO language is one in which Objects types are first-class"

Y a esto agregaría un conjunto de operadores de generación de objetos (llámelos composición herencia blablabla).

Y que es un objeto?

Inicialmente es un tipo de dato. Además posee identidad, estado y un conjunto de comportamientos.
con base a esto seguirán las posteriores divagaciones

:D

(1) Functional programming is not Self-modifying Code
(2) The quarks of object oriented development

5 comentarios:

febuiles dijo...

Creo que la herencia no es necesariamente lo mas importante de los objetos, ya que segun lo veo es algo que viene desde los conjuntos ( A _C B) y no es algo propio de los objectos.
Lo mismo pasa con el encapsulamiento, ya veiamos esto desde las interfaces en C para cualquier programa.

Me gusta mas tu idea de decir que un lenguaje OO es un lenguaje donde los objetos son ciudadanos de primer orden y un lenguaje OO "puro" es donde _todo_ es un objeto (Ruby por ejemplo, Java no).

Miguel dijo...

febules... C no tiene interfaces ni clases... si revisas la Wikipedia te daras cuenta. C++ no tiene interfaces sino herencia multiple. Y no se que tiene que ver el encapsulamiento con las interfaces... en fin. No entiendo la finalidad de blog. OOP es una manera de desarrollar software mas no la única. Ultimamente lenguages como Ruby han unido lo mejor de los funcionales (Closures,continuation,declarative programming,non side-effects) con la orientacion a objetos... Encapsulacion, herencia, blah blah blah.
Suertex

febuiles dijo...

Miguel,
Las operaciones que proporciona un programa o libreria a un programador exterior se llaman interfaz, de ahi el nombre de API (Application's Programmer Interface).
Cuando incluis "libreria.h" lo que estas haciendo realmente es usar una interfaz que te esta proporcionando de un programa, no toda la funcionalidad. No estoy hablando de algo como clases abstractas e interfaces para que el programador reimplemente como lo proponen Java y C++ sino interfaz como en la definición de interfaz de toda la vida, desde antes (y después) de C++.

Bajo ese contexto, el encapsulamiento tiene todo que ver con las interfaces, un buen desarrollo _debe_ proporcionarle al programador las operaciones sin que este sepa que hay por debajo, y ahí es cuando entra en juego el encapsulamiento.

OOP no es el único paradigma existente, pero a fecha de hoy, muchos programadores parecen no saberlo (mucho mas en nuestra ciudad, donde C# y Java son el pan de cada día), creo que el esfuerzo de mostrarles que hay algo mas ahí afuera esta bien.

PD: Los metodos con efectos colaterales tambien existen en Ruby, ejemplo de esto son las diferencias para casi todas las funciones de la libreria estandar entre funcion y funcion!.

diegoeche dijo...

Ruby tiene como feature non side-effects?

Closures,continuation,declarative programming?? has trabajado con un lenguaje funciona antes?

LA ENCARGADA dijo...

Jelou! Paso saludando.. Visitame cuando quieras... mi blog no estan.. tan.. geek (en el buen sentido del a palabra) como el tuyo.. pero de pronto te ries, no se!!! Un abrazote