Qu'entend Alan Kay par «assignation» dans The Early History of Smalltalk?

47

J'ai lu The Early History of Smalltalk et il y a quelques mentions de "mission" qui me font douter de ma compréhension de sa signification:

Bien que la POO vienne de nombreuses motivations, deux étaient centrales. La solution à grande échelle consistait à trouver un meilleur schéma de module pour les systèmes complexes impliquant la dissimulation de détails, tandis que la solution à petite échelle consistait à trouver une version plus flexible de la tâche, puis à tenter de l'éliminer complètement.

(de 1960 à 1966 - Début de la programmation orientée objet et autres idées formatrices des années soixante , section I)

Ce que j'ai compris de Simula, c'est que vous pouvez désormais remplacer les liaisons et les tâches par des objectifs . La dernière chose que vous souhaitiez que tout programmeur fasse est de manipuler l'état interne, même s'il est présenté de manière figurative. Au lieu de cela, les objets doivent être présentés comme le site de comportements de niveau supérieur plus appropriés pour une utilisation en tant que composants dynamiques . (...) Il est regrettable qu’une grande partie de ce qu’on appelle la "programmation orientée objet" soit aujourd’hui simplement une programmation à l’ancienne avec des constructions plus sophistiquées. De nombreux programmes sont chargés d'opérations de type "affectation", effectuées maintenant par des procédures attachées plus coûteuses.

(de style "orienté objet" , Section IV)

Ai-je raison d'interpréter l'intention comme étant que les objets sont censés être des façades et que toute méthode (ou "message") ayant pour but de définir une variable d'instance sur un objet (c'est-à-dire une "affectation") est contraire à l'objectif? Cette interprétation semble être étayée par deux affirmations ultérieures de la section IV:

Quatre techniques utilisées ensemble - l’état persistant, le polymorphisme, l’instanciation et les méthodes comme objectifs de l’objet - représentent une grande partie de la puissance. Aucun de ceux-ci ne nécessite l'emploi d'un "langage orienté objet" - ALGOL 68 peut presque être transformé en ce style - et OOPL se concentre simplement sur l'esprit du concepteur dans une direction fructueuse particulière. Cependant, bien encapsuler est un engagement non seulement d'abstraction d'état, mais également d'éliminer les métaphores orientées État de la programmation.

...et:

Les déclarations de mission, même abstraites, expriment des objectifs de bas niveau et il en faudra plus pour que tout soit accompli. En général, nous ne voulons pas que le programmeur se moque de l'état, qu'il soit simulé ou non.

Serait-il juste de dire que des cas opaques et immuables sont encouragés ici? Ou est-ce simplement des changements d'état directs découragés? Par exemple, si j'ai une BankAccountclasse, il est OK d'avoir GetBalance, Depositet les Withdrawméthodes d'instance / messages; assurez-vous simplement qu'il n'y a pas de SetBalanceméthode d'instance / de message?

Olivier Dagenais
la source

Réponses:

86

L'idée de base (influencée par Sketchpad) est que la plupart des variables / valeurs sont en relation dynamique (maintenues par l'intérieur de l'objet), il est donc dangereux de réinitialiser directement une valeur de l'extérieur. Parce que (dans Smalltalk de toute façon) il y a au moins une méthode de définition requise, cela permet à une action de configuration extérieure d'être transmise par la méthode interne afin de maintenir les interrelations souhaitées. Mais la plupart des personnes qui utilisent des setters les utilisent simplement pour simuler des assignations directes à des variables intérieures, ce qui va à l’encontre de l’esprit et de l’intention d’une véritable POO.

Mais les objets ont des "lignes du monde" de changements dans le temps. Cela peut être considéré comme une "histoire" de versions de l'objet dans lequel les "relations" s'accordent. Il n'y a pas de conditions de concurrence dans ce schéma ... un objet n'est visible que lorsqu'il est stable et n'est plus en calcul. Cela ressemble à une horloge à deux phases dans HW. (Idée de Strachey et différente de McCarthy et influencée par Lucid.)

Meilleurs vœux,

Alan Kay

Alan Kay
la source
2
@ Alan-Kay: Merci! Puis-je avoir votre permission pour citer cela dans ma thèse?
Olivier Dagenais
2
Contrôler les effets secondaires, ou savoir comment contrôler les effets secondaires, a été le holly graal pour de nombreuses langues. Mais il semble qu'aucun ne l'ait encore trouvé. :)
mathk
@OlivierDagenais même si je suis sûr qu'Alan serait plus que ravi (il a l'air d'un mec génial), les réponses de SE sont sous licence CC.
Wayne Werner
Horloge à deux phases? Est-ce un peu comme le modèle "observateur" et le modèle de flux de données, comme dans Excel ou dans React.JS, où les objets propagent les modifications pour conserver les contraintes.
aoeu256
21

Je me rends compte qu'Alan a déjà répondu à cette question et il pourrait donc sembler inutile de répondre davantage. Cependant, Alan n'a pas répondu à toutes vos questions.

En particulier:

Serait-il juste de dire que des cas opaques et immuables sont encouragés ici? Ou est-ce simplement des changements d'état directs découragés? Par exemple, si j'ai une classe BankAccount, les méthodes et les messages d'instance GetBalance, Deposit et Withdraw sont acceptables; assurez-vous simplement qu'il n'y a pas de méthode / message d'instance SetBalance?

La réponse ici est que vous n'utilisez pas un comportement d'ordre supérieur pour structurer votre programme. Les systèmes de services financiers du monde réel ne devraient pas avoir une méthode de dépôt sur une classe BankAccount, car ce n'est pas du tout le fonctionnement des banques avant l'invention des ordinateurs! Lorsque les guichets automatiques ont été inventés, ils devaient littéralement automatiser ce que faisait un caissier à la banque. Le rôle d'un guichetier serait d'informer les clients de l'état de leur compte. Pour ce faire, le client n'est autorisé à interagir avec le caissier que de plusieurs manières, par exemple en transmettant un bordereau de dépôt au caissier.

En réifiant directement ces objets - Teller, Deposit Slip, etc. - le domaine du problème est structuré en fonction des messages transmis par les entités du système.

Un compte lui-même joue un rôle - l'idée de compte signifie littéralement un compte d'entrées et de sorties financières en rapport avec un actif, un passif, un revenu ou une dépense. Un système comptable, ou comptable, enregistre, conserve et reproduit ces flux et vous indique la situation financière du compte à un moment donné. Le rapport le plus récent du caissier peut être considéré comme "en ce moment", mais pas vraiment: il s'agit en réalité de la situation financière telle qu'elle a été décrite par le comptable à un moment donné. Il a juste l’illusion d’être "en ce moment" lorsque vous allez à la banque, car vous êtes généralement le seul autorisé à effectuer des paiements. C'était particulièrement vrai il y a 100 ans, mais aujourd'hui, beaucoup de gens utilisent des paiements automatisés.

Pourquoi est-ce important? Eh bien, demandez-vous ce qu'il faut faire pour enregistrer une transaction:

Le client dispose de son propre journal d'audit interne de tout ce qu'il a fait, y compris les reçus de la Banque. De même, la Banque tient son propre journal d’audit interne de tout ce qu’elle a fait. La Banque toujours fait la comptabilité à double entrée , ce qui signifie qu'ils consignent les transactions dans la feuille du grand livre et l' équilibre. Cela permet à la banque d'effectuer un rapprochementet assurez-vous qu'il n'y a pas d'entrées parasites quand ils ferment leurs comptes pour un exercice financier donné (quotidien, hebdomadaire, mensuel, trimestriel, annuel, bi-annuel, peu importe). Ceci suggère également que l'enregistrement pour ce qui est enregistré devrait être idempotent. Cela signifie que si nous devions écrire un programme répertoriant toutes les transactions uniques, nous pourrions le faire même si des doublons illicites figuraient dans notre journal d'audit interne, car nous intégrions des identifiants de transaction idempotents dans les messages de journalisation.

Étant donné que les paiements automatisés peuvent débiter et créditer votre compte, il semble logique que le comptable puisse également effectuer des prévisions pour vous. C'était la réalisation de l'impact que les ordinateurs pourraient avoir sur les systèmes de comptabilité. En conséquence, quelqu'un a inventé un système de comptabilité appelé Resources-Events-Agents qui était plus en ligne avec non seulement regarder le passé, mais aussi regarder l'avenir et estimer les flux de trésorerie avec une granularité plus fine qu'auparavant. REA représente essentiellement plus de métadonnées que les systèmes de comptabilité classiques, ce qui permet d'améliorer les rapports et l'analyse commerciale. Par exemple, l'analyse "chaîne de valeur" et l'analyse "chaîne d'approvisionnement" ne sont pas des tâches faciles à faire avec la comptabilité classique.

De même, Agoric Computing ou Smart Contracts apporte des idées allant des mécanismes du marché à l'informatique. Il est important que lorsque vous fournissez un bordereau de dépôt, vous fournissiez également un chèque ou un porte-monnaie à déposer. Comme il existe un délai entre la réception du chèque et son insertion dans votre compte, vous avez besoin d'un moyen sécurisé pour gérer les devises. Il s’avère que les fonctionnalités d’objet sont un moyen naturel d’atteindre une monnaie sécurisée et distribuée. Ils peuvent être utilisés pour s'assurer qu'Alice ne trompe pas Bob en retirant tous ses fonds après avoir écrit ce chèque à Bob.

John Zabroski
la source
Merci d’avoir dissipé cet BankAccountexemple de jouet trop commun .
Akuhn
Bien que dans l’ensemble votre réponse soit excellente (beaucoup trop peu de personnes comprennent qu’un compte n’est pas un solde, mais une liste de transactions, merci de le faire), vous n’obtenez pas une comptabilité en partie double. Le point de double saisie est que chaque débit ou crédit d'un compte (c.-à-d. Une liste de transactions) a des crédits ou des débits correspondants sur d'autres comptes pour faire correspondre les choses. Par exemple, si vous débitez un client de 108 ¥ (c'est-à-dire que le client vous a donné beaucoup d'argent), vous créditez un compte de produits de 100 ¥ et votre compte "taxe due" de 8 ¥ pour correspondre à ce débit et indiquer où l'argent est versé. (ou devrait aller).
Curt J. Sampson