38 votes

Quelles sont les principales différences entre l'OO dans Smalltalk et Java ?

Quelles sont les principales différences entre l'OO dans Smalltalk et Java ?

Veuillez noter que je suis un programmeur Java qui essaie d'élargir ses horizons en explorant Smalltalk. Actuellement, je ne sais presque rien de Smalltalk, sauf qu'il est plus pur que Java. Par conséquent, je préférerai la réponse qui montre comment les différents concepts Java correspondent aux concepts Smalltalk correspondants, puis qui présente les concepts Smalltalk qui n'existent pas du tout dans Java.

41voto

Frank Shearar Points 12481

Passage des messages

Smalltalk utilise le passage de messages, pas l'invocation de méthodes. La distinction est subtile, mais extrêmement puissante.

Un peu de terminologie : Étant donné foo bar: baz , #bar: est un sélecteur , foo est le récepteur d'un message appelé #bar: (le # indique un symbole, un peu comme Common Lisp dirait 'bar (ou de manière encore plus appropriée, :bar )), et baz es un argument o paramètre . Quand la ligne est exécutée, foo est envoyé le message #:bar: avec argument baz . Jusqu'à présent, c'est assez normal. En Java, cela ressemblerait à foo.bar(baz); .

En Java, le système d'exécution découvrirait foo Le type réel de l'utilisateur, trouver la méthode la plus appropriée et l'exécuter.

Les choses ont l'air presque la même chose en Smalltalk. Lorsque vous envoyez un message à un objet, celui-ci recherche dans son dictionnaire de méthodes une méthode dont le nom correspond à celui du sélecteur du message. S'il n'en trouve pas, il cherche dans le dictionnaire des méthodes de sa superclasse, et ainsi de suite. C'est plutôt normal.

S'il ne trouve pas de méthode correspondante, il s'envoie à lui-même le message suivant #doesNotUnderstand: avec le message original comme paramètre. (Oui, un message envoyé est un objet.) Mais #doesNotUnderstand: n'est également qu'une méthode. Vous pouvez la surcharger.

Par exemple, vous pouvez avoir un objet qui répond à un certain nombre de messages et qui transmet tous les autres messages qu'il reçoit à un objet délégué. Remplacer #doesNotUnderstand: et hop, vous avez un proxy qui n'aura pas besoin de maintenance pour maintenir son protocole en synchronisation avec le délégué.

Syntaxe triviale

Non, je ne plaisante pas. La grammaire entière de Smalltalk fait peut-être 15 lignes de long. Le JLS ne l'est... pas. Pourquoi s'en soucier ? Une syntaxe simple permet de déchirer facilement un morceau de code. Métaprogrammation ! Refactoring !

Aucune syntaxe pour :

  • les déclarations conditionnelles : (n < 3) ifTrue: ['yes'] ifFalse: ['no']
  • pour les boucles : 1 to: 10 do: [:i | Transcript show: i asString]
  • try-catch : [i := i / 0] ifError: ['oops!']
  • essayer de terminer : [i := i / 0] ensure: [stream close]

Et remarquez toutes ces [] s - fermetures de première classe avec une syntaxe propre.

19voto

Vijay Mathew Points 17155
  1. Modèle d'objet. Dans Smalltalk, chaque chose est un objet. Java possède des types primitifs comme int et float dont la représentation et le comportement sont différents des objets complexes.
  2. Invocation du comportement. Le comportement d'un objet Smalltalk est invoqué en lui envoyant un message. Java possède des méthodes, qui sont essentiellement des appels de fonction, l'objet de destination étant un premier argument spécial appelé this .
  3. Encapsulation. Smalltalk a une encapsulation stricte. Les champs d'un objet ne peuvent être exposés que par le biais de messages. En revanche, Java autorise les champs publics.
  4. Dynamisme. Smalltalk est extrêmement dynamique. Tous les types sont identifiés à l'exécution. Une classe peut être introspectée et modifiée à l'exécution (méta-programmation dynamique !). De nouvelles classes peuvent être créées et instanciées à l'exécution. Java possède une vérification statique des types ainsi qu'un polymorphisme à l'exécution. Il y a introspection et réflexion, mais les classes et les objets ne peuvent pas être modifiés à partir d'un programme en cours d'exécution.
  5. Syntaxe. Smalltalk n'a pas de syntaxe. Il possède plutôt un format simple et cohérent pour l'envoi de messages. Java, comme les autres langages de la famille C, a une syntaxe complexe.
  6. Environnement. La plupart des implémentations de Smalltalk fournissent un environnement informatique complet, autonome et en direct avec persistance basée sur l'image . Certains de ces environnements peut même être démarré sur un métal nu . La JVM, à son tour, dépend généralement d'un système d'exploitation sous-jacent pour le threading, la mise en réseau, etc. Le code source doit être saisi dans des fichiers texte, compilé et chargé explicitement dans la JVM pour être exécuté.

18voto

ewernli Points 23180

L'une des principales différences entre Java et Smalltalk est que Smalltalk a une classe de premier ordre (sans jeu de mots).

Une classe dans Smalltalk est un objet. La chose la plus proche de static est alors une méthode et une variable du côté de la classe, comme le montre le tableau ci-dessous. mentionné par Frank Shearer.

Mais cette différence est plus profonde dès que l'on utilise l'héritage. En Java, l'héritage côté classe n'existe pas, alors qu'il est possible dans Smalltalk.

Si la classe A hérite de B et si vous avez a y b qui sont des instances de A y B en Smalltalk, b class hérite de a class . Ce ne serait pas le cas en Java où a getClass() y b getClass() retourner des instances de Class qui ne sont pas liés entre eux.

Disons maintenant que la classe A met en œuvre le modèle de singleton : il a un champ côté classe instance et une méthode getter instance . Classe B est un autre objet avec sa propre instance champ. En conséquence, A instance y B instance retournera un objet différent.

C'est clairement l'une des principales différences entre Smalltalk et Java d'un point de vue OO.

Parmi les autres différences, on peut citer l'existence de métaclasses, les méthodes d'extension, le typage en canard par rapport au typage statique, la réification de l'image de marque, les méthodes d'évaluation de la qualité de vie, etc. doesNotUnderstand et quelques autres choses qui rendent le codage en Smalltalk ou en Java complètement différent.

Et bien sûr, Smalltalk possède une fermeture dont Java est encore dépourvu.

Voir aussi Pourquoi Java ne permet-il pas de surcharger les méthodes statiques ?

12voto

igouy Points 1662

qui essaie d'élargir ses horizons en explorant Smalltalk

Si vous êtes activement Si vous essayez d'explorer Smalltalk, vous devez savoir comment lire Smalltalk.

"Je peux lire C++ et Java mais je ne peux pas lire Smalltalk" pdf

7voto

Janko Mivšek Points 3054

Dans Smalltalk, tout est objet, alors que dans Java, des choses comme les petits entiers ne sont pas encore des objets de première classe. De plus, pour continuer avec les nombres, dans Smalltalk, en raison de sa nature purement OO et de ses fortes capacités de réflexion, nous n'avons jamais besoin de nous préoccuper de la taille des nombres, comme par exemple si un nombre entier est petit ou grand et ce qui se passe quand un petit nombre entier déborde sur un grand.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X