Esta crónica fue probado por expertos para garantizar la veracidad de nuestra esta crónica.
Solución:
Si estamos hablando de programación orientada a objetos, el término “paso de mensajes” proviene de Smalltalk. En pocas palabras, los principios básicos de Smalltalk son:
- Objeto es la unidad básica del sistema orientado a objetos.
- Los objetos tienen lo suyo. estado.
- Los objetos se comunican enviando y recibiendo. mensajes.
Si está interesado en Smalltalk, eche un vistazo a Pharo o Squeak.
Java/C#/C++ y muchos otros lenguajes usan un enfoque ligeramente diferente probablemente derivado de Simula. Tú invocar un método en lugar de pasar un mensaje.
Creo que estos términos son más o menos equivalentes. Puede que la única diferencia interesante sea que el paso de mensajes (al menos en Smalltalk) siempre se basa en el envío dinámico y el enlace tardío, mientras que en el caso de la invocación de métodos se puede usar static envío y encuadernación anticipada también. Por ejemplo, C++ (AFAIK) realiza el enlace anticipado de forma predeterminada hasta que aparece la palabra clave “virtual” en alguna parte…
De todos modos, independientemente del formalismo que use su lenguaje de programación para la comunicación entre dos objetos (paso de mensajes o invocación de métodos), siempre se considera un buen estilo OOP para prohibir el acceso directo a variables de instancia en la terminología de Smalltalk o miembros de datos en la terminología de C++ o cualquier término que sea utilizado en su lenguaje de programación.
Smalltalk prohíbe directamente el acceso a las variables de instancia en el nivel de sintaxis. Como mencioné anteriormente, los objetos en el programa Smalltalk pueden interactuar solo pasando/recibiendo mensajes. Muchos otros lenguajes permiten el acceso a variables de instancia a nivel de sintaxis, pero se considera una mala práctica. Por ejemplo, el famoso El libro efectivo de C++ contiene la recomendación correspondiente: Artículo 22: Declare que los miembros de datos son privados.
Las razones son:
- coherencia sintáctica (la única forma de que los clientes accedan a un objeto es a través de funciones miembro o paso de mensajes);
- control más preciso sobre la accesibilidad de los miembros de datos (puede implementar acceso sin acceso, acceso de solo lectura, acceso de lectura y escritura e incluso acceso de solo escritura);
- luego puede reemplazar el miembro de datos sin romper su interfaz pública.
El último es el más importante. es la esencia de encapsulación – ocultación de información en el nivel de clase.
El punto sobre la encapsulación es más importante de lo que podría parecer inicialmente. Si oculta sus miembros de datos de sus clientes (es decir, los encapsula), puede asegurarse de que las invariantes de clase siempre se mantengan, porque solo las funciones de miembro pueden afectarlas. Además, se reserva el derecho de cambiar sus decisiones de implementación más adelante. Si no oculta tales decisiones, pronto descubrirá que incluso si posee el código fuente de una clase, su capacidad para cambiar cualquier cosa pública está extremadamente restringida, porque se romperá demasiado código de cliente. Público significa no encapsulado y, en términos prácticos, no encapsulado significa inalterable, especialmente para las clases que se usan mucho. Sin embargo, las clases más utilizadas son las que más necesitan encapsulación, porque son las que más pueden beneficiarse de la capacidad de reemplazar una implementación por otra mejor.
(ñ) Scott Meyers, C++ eficaz: 55 formas específicas de mejorar sus programas y diseños (3.ª edición)
No es exactamente una respuesta a su pregunta, sino una pequeña digresión sobre envío de mensajes frente a invocación de métodos:
El termino mensaje se refiere al hecho de que no sabes cual se invocará el método debido al polimorfismo. Tú pedir un objeto para hacer algo (de ahí el término mensaje) y actúa en consecuencia. El término método invocación es engañoso ya que sugiere que elija un método exacto.
El termino mensaje también está más cerca de la realidad del lenguaje dinámico, donde podrías enviar un mensaje que el objeto no entiende (ver doesNotUnderstand
en Smalltalk). Entonces no se puede hablar realmente de la invocación del método dado que no hay ninguna coincidencia y el envío del mensaje fallará. En static lenguaje escrito, este problema se evita.
“Pasar un mensaje” es una abstracción.
La mayoría de los lenguajes orientados a objetos hoy en día implementan esa abstracción en forma de invocación de características. Por característica me refiero un método una operación (ver editar a continuación), propiedad o algo similar. Bertrand Meyer en OOSC2 argumenta que la invocación de características es la unidad básica de computación en los lenguajes orientados a objetos modernos; esta es una forma perfectamente válida y coherente de implementar la vieja idea abstracta de que “los objetos se comunican mediante el paso de mensajes”.
Son posibles otras técnicas de implementación. Por ejemplo, los objetos administrados por algunos sistemas de middleware se comunican pasando mensajes a través de una función de cola.
En resumen: no confundas abstracciones con código. En los viejos tiempos, los programadores solían preocuparse mucho por la teoría porque la programación apenas existía como una profesión convencional. Hoy en día, la mayoría de los programadores rara vez están familiarizados con la teoría detrás del código. 🙂
Por cierto, y para los que se inclinan por la teoría, los enfoques de programación y modelado orientados a agentes a menudo enfatizan el paso de mensajes como un mecanismo de comunicación entre agentes, argumentando que se deriva de la teoría de los actos de habla. Aquí no interviene la invocación de ningún método.
Editar. En la mayoría de los lenguajes OO, llama a operaciones en lugar de métodos. Es el motor de tiempo de ejecución el que decide qué método en particular invocar como respuesta a la operación que ha llamado. Esto permite la implementación de los tan mencionados mecanismos de polimorfismo. Este pequeño matiz generalmente se olvida en el lenguaje rutinario cuando nos referimos a “llamar a un método”. Sin embargo, es necesario para diferenciar entre operaciones (como características que implementan el paso de mensajes) y métodos (como versiones específicas de dichas operaciones).
Calificaciones y comentarios
Puedes añadir valor a nuestro contenido informacional dando tu veteranía en las anotaciones.