¿Qué quiso decir Alan Kay con "asignación" en The Early History of Smalltalk?

45

He estado leyendo The Early History of Smalltalk y hay algunas menciones de "asignación" que hacen Me cuestiono mi comprensión de su significado:

  

Aunque la POO vino de muchas motivaciones, dos eran centrales. El de gran escala consistió en encontrar un mejor esquema de módulos para sistemas complejos que implican el ocultamiento de detalles, y el de pequeña escala fue encontrar una versión más flexible de la asignación y luego tratar de eliminarla por completo.

(de 1960-66: principios de la POO y otras ideas formativas de los años sesenta , Sección I)

  

Lo que obtuve de Simula fue que ahora podría reemplazar los enlaces y la asignación con objetivos . Lo último que quería que hiciera cualquier programador es entrometerse con el estado interno, incluso si se presenta de manera figurada. En su lugar, los objetos deben presentarse como sitio de comportamientos de nivel superior más apropiados para su uso como componentes dinámicos .   (...)   Es desafortunado que gran parte de lo que hoy se denomina "programación orientada a objetos" es simplemente una programación de estilo antiguo con construcciones más sofisticadas. Muchos programas están cargados con operaciones de "estilo de asignación" que ahora se realizan mediante procedimientos adjuntos más costosos.

(de Estilo "orientado a objetos" , Sección IV)

¿Tengo razón al interpretar que la intención es que los objetos deben ser fachadas y cualquier método (o "mensaje") cuyo propósito es establecer una variable de instancia en un objeto (es decir, una "asignación") está derrotando el propósito? ? Esta interpretación parece estar respaldada por dos declaraciones posteriores en la Sección IV:

  

Cuatro técnicas utilizadas juntas (estado persistente, polimorfismo, creación de instancias y métodos como objetivos para el objeto) representan gran parte del poder. Ninguno de estos requiere que se emplee un "lenguaje orientado a objetos" (ALGOL 68 puede casi cambiarse a este estilo) y OOPL simplemente enfoca la mente del diseñador en una dirección particularmente fructífera. Sin embargo, hacer el derecho de encapsulación es un compromiso no solo con la abstracción del estado, sino también con eliminar las metáforas orientadas por el estado de la programación.

... y:

  

Las declaraciones de asignación, incluso las abstractas, expresan metas de muy bajo nivel, y se necesitarán más de ellas para hacer algo. En general, no queremos que el programador esté jugando con el estado, ya sea simulado o no.

¿Sería justo decir que aquí se alientan instancias opacas e inmutables? ¿O es simplemente directo cambios de estado que no se recomiendan? Por ejemplo, si tengo una clase BankAccount , está bien tener los métodos / mensajes de instancia GetBalance , Deposit y Withdraw ; solo asegúrate de que no hay un método / mensaje de instancia SetBalance ?

    
pregunta Olivier Dagenais 03.06.2011 - 04:52

2 respuestas

82

La idea básica (influenciada por Sketchpad) es que la mayoría de las variables / valores están en relaciones dinámicas entre sí (mantenidas por el interior del objeto), por lo que poder restablecer directamente un valor desde el exterior es peligroso. Debido a que (en Smalltalk) de todos modos, se requiere al menos un método de establecimiento, esto permite la posibilidad de que una acción de configuración externa sea mediada por el método interno para mantener las interrelaciones deseadas. Pero la mayoría de las personas que usan setters simplemente los usan para simular asignaciones directas a variables internas, y esto viola el espíritu y la intención del OOP real.

Pero los objetos tienen "líneas mundiales" de cambios en el tiempo. Esto se puede considerar como una historia de versiones del objeto en el que las relaciones están de acuerdo. No hay condiciones de carrera en este esquema ... un objeto solo es visible cuando está estable y ya no está computando. Esto es como un reloj de dos fases en HW. (Idea de Strachey, y de forma diferente a McCarthy, e influenciada por Lucid.)

Mis mejores deseos,

Alan Kay

    
respondido por el Alan Kay 03.06.2011 - 12:47
21

Me doy cuenta de que Alan ya respondió a esta pregunta, por lo que podría parecer que no tiene sentido responder más. Sin embargo, Alan no respondió todas las preguntas que tenía.

En particular:

  

¿Sería justo decir que opaco,   instancias inmutables están siendo   animado aquí? O es simplemente   cambios de estado directos que son   ¿desanimado? Por ejemplo, si tengo un   Clase BankAccount, está bien tener   GetBalance, Depositar y Retirar   métodos de instancia / mensajes; solo hazlo   Seguro que no hay una instancia de SetBalance   método / mensaje?

La respuesta aquí es que no está utilizando un comportamiento de orden superior para estructurar su programa. Los sistemas de servicios financieros del mundo real no deberían tener un método de depósito en una clase de cuenta bancaria, porque no es así en absoluto cómo funcionaban los bancos antes de la invención de las computadoras. Cuando se inventaron los cajeros automáticos, tenían que automatizar literalmente lo que hacía un cajero en el banco. La función de un cajero sería notificar a los clientes sobre el estado de su cuenta. Para hacer esto, el cliente puede interactuar con el Cajero solo de algunas maneras, como pasar un comprobante de depósito al Cajero.

Al reificar directamente estos objetos (cajero, recibo de depósito, etc.), el dominio del problema está estructurado de acuerdo con los mensajes que pasan las entidades en el sistema.

Una cuenta en sí misma desempeña un papel: la idea de una cuenta significa literalmente una cuenta de las entradas y salidas financieras en relación con un activo, una responsabilidad, un ingreso o un gasto. Un sistema de contabilidad, o contador, registra, retiene y reproduce estos flujos y le informa la situación financiera de la cuenta en un momento determinado. El informe más reciente del Teller se puede considerar como "en este momento", pero en realidad no: es realmente la situación financiera que describe el contador en un momento determinado. Simplemente tiene la ilusión de ser "en este momento" cuando va al banco, porque generalmente usted es el único autorizado para realizar pagos. Esto fue especialmente cierto hace 100 años, pero hoy en día muchas personas tienen pagos automáticos, y la cuenta puede cambiar mientras está físicamente en el banco que tiene una boleta de saldo, porque la boleta de saldo solo le informa sobre el momento en que se marcó la hora. .

¿Por qué es esto importante? Bueno, pregúntese qué necesita hacer para registrar una transacción:

El Cliente tiene su propio registro de auditoría interna de todo lo que ha hecho, incluidos los recibos del Banco. Asimismo, el Banco mantiene su propio registro de auditoría interna de todo lo que han hecho. El Banco siempre hace contabilidad de doble entrada , lo que significa que registran las transacciones en el Libro mayor y balance. Esto le permite al Banco realizar reconciliación y asegurarse de que no haya entradas espurias cuando cierran sus libros para un período financiero determinado (diario, semanal, mensual, trimestral, anual, bianual, lo que sea) . Esto también sugiere que el registro de lo que se registra debe ser idempotente. Es decir, si tuviéramos que escribir un programa para enumerar todas las transacciones únicas, podríamos hacerlo incluso si hubiera duplicados falsos en nuestro registro de auditoría interna, porque incrustamos identificadores de transacciones idempotentes en los mensajes de registro.

Dada la posibilidad de que los pagos automáticos de débito y crédito de su cuenta, tenga sentido que el Contador también pueda hacer pronósticos por usted. Esta fue la realización del impacto que las computadoras podrían tener en los sistemas contables. En consecuencia, alguien inventó un esquema de sistema contable llamado Resources-Events-Agents que estaba más en línea con no solo mirar en el pasado, pero también mirando el futuro y estimando los flujos de efectivo con una granularidad más fina que antes. Esencialmente, REA es solo más metadatos que los sistemas contables clásicos, lo que permite una mejor presentación de informes y análisis de negocios. Por ejemplo, el análisis de la "cadena de valor" y el análisis de la "cadena de suministro" no son cosas fáciles de hacer con la contabilidad clásica.

Del mismo modo, Agoric Computing o Smart Contracts aporta ideas de los mecanismos del mercado a la informática. Es importante que cuando proporcione un comprobante de depósito también proporcione un cheque o cartera para depositar. Dado que hay un tiempo de espera entre la recepción del cheque y el ingreso real a su cuenta, necesita una forma segura de administrar la moneda. Como resultado, las capacidades de los objetos son una forma natural de lograr una moneda segura distribuida. Se pueden usar para asegurarse de que Alice no engañe a Bob retirando todos sus fondos después de que ella le escribió a Bob ese cheque.

    
respondido por el John Zabroski 10.06.2011 - 01:42

Lea otras preguntas en las etiquetas