icon example ejemplo definicion java oop programming-languages smalltalk

example - ¿Cuáles son las principales diferencias entre OO en Smalltalk y Java?



line border java example (7)

¿Cuáles son las principales diferencias entre OO en Smalltalk y Java?

Tenga en cuenta que soy un programador de Java que intenta expandir sus horizontes explorando Smalltalk. Actualmente no sé casi nada sobre Smalltalk, excepto que es más puro que Java. Por lo tanto, preferiré la respuesta que muestra cómo varios conceptos de Java se correlacionan con los conceptos de Smalltalk correspondientes y luego presenta los conceptos de Smalltalk que no existen en Java.



Paso de mensajes

Smalltalk usa el mensaje que pasa, no la invocación del método. La distinción es sutil, pero enormemente poderosa.

Algunos términos: Dada la foo bar: baz , #bar: es un selector , foo es el receptor de un mensaje llamado #bar: (el # indica un símbolo, al igual que Common Lisp diría ''bar (o incluso más apropiado #bar: :bar )), y baz es un argumento o parámetro . Cuando se ejecuta la línea, a foo se le envía el mensaje #:bar: con argumento baz . Hasta ahora, es bastante normal. En Java, se vería como foo.bar(baz); .

En Java, el sistema de tiempo de ejecución averiguaría el tipo real de foo , encontraría el método más apropiado y lo ejecutaría.

Las cosas se ven casi iguales en Smalltalk. Cuando envía un objeto a un mensaje, busca en su diccionario de métodos un método cuyo nombre coincida con el del selector del mensaje. Si no puede encontrar uno, busca en el diccionario de métodos de su superclase, y así sucesivamente. Bastante normal.

Si no puede encontrar ningún método de correspondencia, se envía el mensaje #doesNotUnderstand: con el mensaje original como parámetro. (Sí, el envío de un mensaje es un objeto). Pero #doesNotUnderstand: también es solo un método. Puedes anularlo.

Por ejemplo, puede tener un objeto que responda a un conjunto de mensajes al reenviar cualquier otro mensaje que reciba a algún objeto delegado. #doesNotUnderstand: y #doesNotUnderstand: , tiene un proxy que no necesitará mantenimiento para mantener su protocolo sincronizado con el delegado.

Sintaxis trivial

No, no estoy bromeando. La gramática entera de Smalltalk tiene quizás 15 líneas de longitud. El JLS es ... no. ¿Por qué importa? Una sintaxis simple hace que sea sencillo separar un trozo de código. Metaprogramación! Refactoring!

Sin sintaxis para:

  • declaraciones condicionales: (n < 3) ifTrue: [''yes''] ifFalse: [''no'']
  • para bucles: 1 to: 10 do: [:i | Transcript show: i asString] 1 to: 10 do: [:i | Transcript show: i asString]
  • try-catch: [i := i / 0] ifError: [''oops!'']
  • try-finally: [i := i / 0] ensure: [stream close]

Y observe todos esos [] s - cierres de primera clase con una sintaxis limpia.


  1. Modelo de objeto. En Smalltalk todo, es un objeto. Java tiene tipos primitivos como int y float, cuya representación y comportamiento son diferentes de los objetos complejos.
  2. Invocación de comportamiento. Se invoca el comportamiento de un objeto Smalltalk enviándole un mensaje. Java tiene métodos, que son básicamente llamadas a funciones, siendo el objeto de destino un primer argumento especial llamado this .
  3. Encapsulación Smalltalk tiene una encapsulación estricta. Los campos de un objeto se pueden exponer solo a través de mensajes. Por el contrario, Java permite campos públicos.
  4. Dinamismo. Smalltalk es extremadamente dinámico. Todos los tipos se identifican en tiempo de ejecución. Una clase puede ser introspectada y modificada en tiempo de ejecución (¡meta-programación dinámica!). Se pueden crear nuevas clases y crear instancias en el tiempo de ejecución. Java tiene comprobación de tipo estático junto con polimorfismo en tiempo de ejecución. Hay introspección y reflexión, pero las clases y los objetos no se pueden modificar desde un programa en ejecución.
  5. Sintaxis. Smalltalk no tiene una sintaxis. En cambio, tiene un formato simple y consistente para enviar mensajes. Java, como otros lenguajes de la familia C, tiene una sintaxis compleja.
  6. Ambiente. La mayoría de las implementaciones de Smalltalk proporcionan un entorno de cómputo completo e independiente con persistencia basada en imágenes . Algunos de estos entornos pueden incluso iniciarse en bare metal . A su vez, la JVM generalmente depende de un sistema operativo subyacente para el enhebrado, la creación de redes, etc. El código fuente debe ingresarse en archivos de texto, compilarse y cargarse explícitamente en la JVM para su ejecución.

Cuando @Janko Mivšek significa todo lo que realmente significa todo. :)

Incluso hasta el envío de mensajes, lo que estás haciendo es crear un objeto que sea el contexto.

También lo que no tienes en smalltalk es el modificador de acceso (privado / protegido / público). No tienes paquete en alguna implementación de Smalltalk y en la mayoría de los paquetes de implementación Smalltalk no tienen la misma semántica que Java.

En smalltalk no tienes estructura de control como para, si, intenta / atrapa ... Lo bueno es que no los necesitas porque tienes bloqueo de bloque en smalltalk.

En smalltalk no tienes miembro estático, sino que tienes Class que son objeto (puedes enviar un mensaje a la clase, también puedes mantener la clase en una variable).

En smalltalk no tienes clase anidada.

...


En Smalltalk todo es el objeto, mientras que en Java cosas como los enteros pequeños aún no son los objetos de primera clase. Además, para continuar con los números, en Smalltalk debido a su naturaleza OO pura y fuertes capacidades de reflexión, nunca necesitamos preocuparnos por el tamaño del número, como si un entero es pequeño o grande y lo que sucede cuando el entero pequeño se desborda a lo grande.


Un concepto de Smalltalk que no existe en Java pero se ha vuelto cada vez más popular en los últimos años es el bloqueo. Los bloques son una forma de funciones anónimas que incluyen el contexto en el que se definieron. Es importante destacar que los bloques también son objetos. Smalltalk en realidad carecía de cualquier tipo de if -statement incorporado o for -loop o algo así, pero logró crear el mismo efecto solo con paso de mensajes y bloques.

object isBig ifTrue: [self runIntoObject:object] ifFalse: [self katamariBall absorbObject:object]. 1 to: 10 do: [:number | number print]


Una diferencia clave entre Java y Smalltalk es que Smalltalk tiene una clase de primera clase (sin juego de palabras).

Una clase en Smalltalk es un objeto. Lo más parecido al método static y la variable es el método y la variable del lado de la clase, como lo mentioned Frank Shearer.

Pero esta diferencia es más profunda tan pronto como se usa la herencia. En java, la herencia del lado de la clase no existe, mientras que es posible en Smalltalk.

Si la clase A hereda de B , y si tiene a y b que son instancias de A y B , en Smalltalk, la b class hereda de a class . Este no sería el caso en Java donde a getClass() b getClass() devuelven instancias de Class , que no están relacionadas entre sí.

Digamos ahora que la clase A implementa el patrón singleton: tiene una instance campo del lado de la clase y una instance método getter. La clase B es otro objeto con su propio campo de instance . Como consecuencia, A instance y A instance B instance devolverán un objeto diferente.

Esta es claramente una de las principales diferencias entre Smalltalk y Java desde el punto de vista OO.

Otra diferencia incluye la existencia de metaclases, métodos de extensión, tipado de pato versus tipado estático, reificación de doesNotUnderstand y algunas otras cosas que hacen que la codificación en Smalltalk o Java sea completamente diferente.

Y, por supuesto, Smalltalk tiene un cierre del que todavía carece Java.

Ver también ¿Por qué Java no permite la anulación de métodos estáticos?