2009-02-03 6 views
5

Últimamente he estado pensando mucho sobre alternativas al enfoque basado en clases para la orientación a objetos. Una cosa que me molesta en los idiomas de hoy es que a menudo usamos static classes/singletons to design single (global) objects porque no hay otra manera de hacerlo, por lo que en mi opinión es más un truco que una característica. Otra cosa es que Java, por ejemplo, permite que el programador sea have enums with additional data (global state) and functionality, lo que también los convierte en un tipo de objeto.¿Podrías imaginar alguna otra forma de implementar OO que el enfoque clásico basado en clases?

De todos modos, lo que me gustaría saber es si tiene alguna idea para un enfoque diferente de la orientación a objetos en un lenguaje compilado y eficiente (por lo tanto, crear objetos mediante prototipos probablemente no sea una buena idea) o, si usted no tiene ninguno, si hay cosas en el enfoque OO clásico que también le molestan mucho.

[EDITAR]: Solo para aclarar las cosas. Como se indicó anteriormente, ya conozco la programación basada en prototipos.

+0

Solo por curiosidad, ¿para qué es esto? ¿Estás diseñando un idioma? –

+0

Sí, lo era. Scanner + Parser ya estaban terminados, pero cuando estaba en la mitad de la implementación del análisis semántico, comencé a preguntarme sobre las preguntas anteriores. Actualmente, el proyecto está en el hielo ya que no he encontrado una buena solución para eso (desafortunadamente, soy perfeccionista). Sin embargo, eso no significa que no siga pensando en eso. ;) – balu

+0

Debería ser una wiki de la comunidad. –

Respuesta

4

Eche un vistazo a Actor Model. Es algo así como clases, excepto por ser asincrónico. Si cada actor es una máquina de estado finito, tendrías un sistema potencialmente poderoso.

Erlang usa algo así, me han dicho ... al menos similar. El punto con el modelo de actor es que no necesita ser implementado puramente, y por lo tanto no necesita ser parte de Erlang.

Inicié un pequeño lenguaje que usaba ese modelo hace unos años. Podría intentarlo de nuevo alguna vez.

+0

Mi código OOP por lo general se ve como un actor. Las interfaces son definiciones de mensajes. La mayoría de los métodos son nulos. Hay una gran diferenciación entre "entidades" y "valores". También hace que la mayoría de los patrones de diseño tengan más sentido :) – kyoryu

1

Creo que tiene problemas para definir el enfoque de "OO clásico". ¿El método de la señal en Objective-C es clásico o el método estático en el estándar C++?

En los lenguajes funcionales, es bastante fácil tener funciones no objeto que, en cierto sentido, actúan como objetos porque devuelven funciones cuyas implementaciones son opacas. Por ejemplo, el código siguiente en el Esquema

(define (create-ball color) 
    (lambda (attribute-name) 
     (if (equal? attribute-name "color") 
      color 
      "method-not-supported")))) 

dará salida a una función que no es oficialmente un "objeto", pero puede actuar como tal ya que almacena el estado, pero usted no está muy claro lo que es exactamente mal con los paradigmas orientados a objetos a los que has estado expuesto.

3

Ahora que mi traje ignífugo está asegurado de forma segura, puedo decirlo: No me agrada el OOP.

El problema central que tengo es que trata de llegar a una taxonomía única en la que cada unidad de funcionalidad realmente pertenece.

Hay un par de problemas con esto. En primer lugar, producir una buena taxonomía es difícil. La gente apesta a crearlos. En segundo lugar, no estoy convencido de que realmente pueda estructurar una jerarquía razonable y sostenible que resista el cambio en un proyecto que contenga muchas entidades; toda la práctica de la refactorización está básicamente reconociendo la dificultad de crear taxonomías grandes, todas incomparables.

En realidad, creo que OOP está sobre-diseñado. Todo lo que puede hacer con OOP se puede hacer con funciones de orden superior (HOF). Los HOF son una solución mucho más elegante y mucho más flexible para los mismos problemas que OOP trata de resolver.

Así que si está pidiendo otra forma de hacer cosas de estilo OOP, los HOF son probablemente la tecnología alternativa más cercana que tiene un nivel similar de flexibilidad.

+0

Estoy de acuerdo en muchos puntos. Mi único desacuerdo es que OOP es como una expresión regular. Úselo un poco y organiza su vida. Úselo demasiado y agrega errores. Creo que los HOF son exactamente los mismos a ese respecto. – user54650

0

echar un vistazo profundo en Javascript que tiene el modelo basado prototipo o echa un vistazo a lua que tiene una cierta extraña manera de poner en práctica la orientación a objetos

0

Tome un vistazo a CLOS, que es básicamente la función/método basado.

0

El lenguaje Go de Google toma un enfoque decididamente diferente a la orientación a objetos, tal vez vale la pena verlo.

Cuestiones relacionadas