2011-05-25 25 views
5

Estaba leyendo un artículo en ibm.com/developerworks (no se puede encontrar el artículo ahora) sobre el desarrollo de software escalable para la nube.OOP y escalabilidad

Por supuesto, la idea principal fue apátrida. Ya nada debería contener el estado y esto se hizo al no tener más datos de miembros. Cada método debe obtener su fecha mediante argumentos que se le pasen.

Un ejemplo fue algo así como:

class NonScalableCircle { 
    int radius; 

    void setRadius(int radius){ 
     this.radius = radius; 
    } 

    public integer getDiameter() { 
     return 2*radius; 
    } 
} 

La explicación de por qué esto no era escalable era porque hay que establecer el radio primero y luego llamar al diámetro. Entonces, hay un orden para que funcione porque los métodos funcionan con los mismos datos.

El ejemplo era escalable:

class ScalableCircle { 
    public integer getDiameter(int radius) { 
     return 2*radius; 
    } 
} 

Y por supuesto que es verdad. Escalas sin estado mucho mejor. Dado esto y el hecho de que OBJECT = datos + comportamiento, mis preguntas son:

¿OOP simplemente no es bueno para aplicaciones altamente concurrentes? ¿OOP va a morir y será reemplazado por Programación Procesal?

Porque, tal como está ahora, muchos desarrolladores usan el Modelo de Dominio Anemic y codifican la lógica de los servicios. No hay mucho OOP hecho realmente.

Respuesta

3

¿OOP va a morir y ser reemplazado por la programación procedimental?

No hay nada de malo en OOP. Sin embargo, es posible que deba cambiar su actitud hacia la forma en que maneja OOP un poco. También señalaré que es significativamente más fácil escribir software simultáneo de escala masiva si utiliza un paradigma funcional en lugar de un paradigma de procedimiento.

Lo que su describir en términos de apátridas-dad es el comienzo de Monads

Start jugar un poco con Erlang para ver cómo se escala masiva, correctamente.

¿OOP simplemente no es bueno para aplicaciones altamente concurrentes?

OOP no es el problema, los idiomas imprescindibles sí lo son. Necesita continuation passing y otros patrones funcionales para poder escalar masivamente. La programación funcional fomenta el diseño sin estado por lo que es mucho más fácil de escalar.

Pero OOP todavía tiene su lugar, muchos lenguajes funcionales son meta idiomas y tienen OO en ellos.

Otro método para lograr una mejor escala es non-blocking IO.

Otro problema es que una gran cantidad de sistemas empresariales/empresariales se basan en J2EE & .NET que en realidad no alientan las técnicas de escalado masivo fuera de "comprar más servidores".

Si realmente desea aprovechar la escala de su código correctamente y tomar un cambio de paradigma.

También leo la concurrencia y la escala como correr un par de cientos de procesos y manejar un par de miles de conexiones simultáneamente.

+1

"No, no puedes hacer procedimientos y es muy concurrente". WTF? Esto no tiene sentido. La gran mayoría de los softwares altamente concurrentes en existencia son de procedimiento, y la vasta gran mayoría de software altamente paralelo en existencia es de procedimiento. En _principle_, funcional da ventajas de esta manera, como la gente ha estado señalando durante 25 años, pero decir algo más fuerte que eso está completamente fuera de contacto con la realidad. –

+0

@JonathonDursi su derecha, la declaración era demasiado fuerte. Lo ajusté y lo reduje significativamente. Quise decir que es difícil hacer una concurrencia alta de una manera procesal. También depende de qué nivel de concurrencia/paralelismo hablemos, si es 10 o 1000. – Raynos

+0

Lo suficiente. Pero es difícil hacer altos niveles de concurrencia de cualquier manera :) –

3

La respuesta es que nadie lo sabe. Todavía no hay mucho consenso sobre la forma "correcta" de escribir software en serie, y la programación paralela y simultánea es mucho más difícil.

La clave completa para el cálculo paralelo eficiente a escala es la distribución de datos, por lo que hay un argumento que encapsular los datos demasiado temprano en el proceso de diseño o tomando una encapsulación de datos que tenga sentido para pequeños número de tareas, e ingenuamente con la esperanza de que se amplíe; está perjudicando la escalabilidad. Tal vez eso signifique que OO tiene una mano atada a la espalda al escribir código escalable, pero tal vez solo signifique que OO, como todo lo demás, requiere una planificación cuidadosa para ser masivamente escalable.

+0

+1 "pero tal vez solo ... requiere una planificación cuidadosa para ser masivamente escalable". subestimación del premio del año;) –

+0

+1 Hay una falta de métodos probados en este sector. – Raynos

2

Si bien puede mejorar la escala a nivel local eliminando el estado donde sea posible, simplemente decir "deshacerse del estado" no resuelve demasiado. El usuario espera (y en gran medida necesita) que las cosas sean concisas.

Escalar eficientemente rara vez es una cuestión de deshacerse del estado; es una cuestión de gestionar el estado. Especialmente en el caso de la computación distribuida, se trata principalmente de averiguar en qué estado se debe replicar qué máquinas deben hacer determinadas piezas de un trabajo.

En este sentido, el código OO (al menos si se trata de razonablemente bien diseñado) tiende a ser una muy buena cosa - un objeto razonablemente bien definido define prácticamente todo el estado que necesita ser replicado para ese tipo de objetar para trabajar en esa máquina.

Contrario a la creencia popular, la programación funcional no es necesariamente una mejora importante. Primero, FP no elimina el estado (en absoluto). Hace que partes individuales del estado sean inmutables, pero esto tampoco es necesariamente una mejora importante, ya que puede llevar simplemente a eliminar una parte del estado y reemplazarlo por algo "nuevo" que tiene el mismo nombre pero un valor diferente. . En tales casos, el estado inmutable puede ser una distinción sin diferencia.

Donde OO hace una diferencia bastante sustancial es en hacer que el estado sea lo suficientemente explícito como para que un diseñador se vea (casi) obligado a pensar en el estado necesario para un objeto dado. Esto tiende a alentar implícitamente a minimizar ese estado en gran medida. También debo mencionar que a este respecto, demasiada comodidad puede ser algo malo: un lenguaje que (por ejemplo) hace que sea trivial generar código para la serialización independientemente de la cantidad de estado en un objeto hace que sea mucho más fácil para un objeto para incluir más estado. Cuando/si el trabajo del programador es proporcional (al menos en parte) a la cantidad de estado, le da al menos un pequeño estímulo para minimizar el estado.

En cualquier caso, los objetos se dividen en pedazos bastante pequeños e identificables que generalmente son bastante fáciles de administrar. Lejos de hacer la paralelización y (especialmente) la distribución más difícil, esto realmente lo hace más fácil, a menos que el código sea solo realmente mal diseñado. Por supuesto, ningún lenguaje, paradigma, metodología o cualquier otra cosa puede evitar un diseño incorrecto, pero OO le brinda al diseñador las herramientas para hacer un buen trabajo y ayudar a que la distribución y el escalado sean sustancialmente más prácticos.