bruno at modulix
2005-11-29 13:54:34 UTC
<meta>
HS ici, donc xpost et fu2 fcobjet (ça fera un peu d'animation sur un ng
moribond)
</meta>
Dans d'autres langages objets (CLOS par exemple), la syntaxe d'envoi de
message est bien du genre message(destinataire, ...).
Certes, mais de mon point de vue, je pense que syntaxe et sémantique
ne sont pas complètement dissociables pour faire de l'objet : quand on
a généralement affaire à une expression qui prend en paramètres une
autre expression entre parenthèses, on pense prioritairement au
fonctionnel, comme en maths.
s/on/tu/
qui est plus proche du "sujet verbe complément", et donc exprime mieux
(sémantiquement) le concept.
Ce que je voulais souligner en l'occurrence est que ce n'est pas la
syntaxe qui importe - d'autant que cette même syntaxe (obj->member)
existe déjà en C avec une sémantique quelque peu différente - et il me
semble que le "détournement" de cette syntaxe en C++ puis en Java etc
n'est pas pour rien dans la difficulté qu'on les débutants en OO à
comprendre la différence *sémantique* entre appel de fonction/méthode et
envoi de message (le second *pouvant* entrainer le premier).
avant et totalement indépendemment de UML.
polymorphisme, *dans ce contexte*, consiste en ce que différent objets
puissent sélectionner des méthodes (comportements) différents en
réaction à un même message. Différencier message et sélection de méthode
aide AMHA à comprendre le principe. Après, la façon dont c'est
implémenté - et accessoirement la syntaxe - dans tel ou tel langage,
c'est un point de détail (en ce qui concerne l'OO, pas en ce qui
concerne le langage !-)
un objet porteAvecGonds partageant des caractéristiques communes avec
l'objet porte, ceci afin de montrer que des services communs offerts
comme ouvrir() et fermer() peuvent aussi s'y appliquer avec un
polymorphisme d'héritage.
Héritage de type ou d'implémentation ?-)
Un meilleur exemple serait de présenter également un objet "livre" et un
objet "robinet". Eux aussi comprennent les messages "ouvrir" et
"fermer", et ce ne sont clairement pas des sous-classes de "porte". Un
livre et une porte appartiennent-ils au même type ? (ou "à un" même
type, ce qui est différent) ? La réponse dépend évidemment de la
définition de "type", et il n'y a clairement pas consensus sur cette
définition.
Dans certains langages (langages à prototypes comme Self ou Javascript,
ou langages très dynamiques comme Python), il est possible de modifier
dynamiquement l'interface et/ou l'implémentation d'un objet donné. En
Python, il est possible de modifier dynamiquement la classe d'un objet
donné, et de modifier dynamiquement l'interface et/ou l'implémentation
d'une classe (une classe étant elle-même un objet), cette modif étant
immédiatement répercutée sur toutes les instances de ladite classe.
Dans ces conditions, comment définir "le" type d'un objet donné ?
(snip)
Justement pour pallier au manque de souplesse (ajout dynamique de types
et peu de modifications de code) que tu cites à peine plus haut avec
l'ADT, sans à avoir à réinventer la roue
Oui, mais pourquoi C++ ? Franchement, si c'est pour faire de l'objet,
Smalltalk, Ruby, Python ou CLOS (quoique... après réflexion, je retire
CLOS) sont probablement plus instructifs - surtout si l'OP s'interroge
sur la différence fondamentale entre un struct et un objet.
Encore un langage procédural à typage statique avec une surcouche objet.
Si l'OP veut vraiment comprendre les concepts de base de l'OO, autant
choisir un langage 1/ plus light (plus rapide à apprendre, plus facile à
mettre en oeuvre) et 2/ plus clairement objet.
</sans vouloir troller>
HS ici, donc xpost et fu2 fcobjet (ça fera un peu d'animation sur un ng
moribond)
</meta>
Bonjour,
[coupé]
Non, ne coupez pas !-)[coupé]
Imagines une porte.
Tu appelles une fonction ouvre() et une fonction ferme() en passant en
paramètre la porte. Moais.
Tu as à disposisiton un objet "porte". Tu appelles des services de la
fabrique de cet objet (classe ou autre) par l'intermédiaire de
l'objet, porte->ouvrir() et porte->fermer() par exemple.
Ce que tu montres comme différence n'est que syntaxique, pas sémantique.Tu appelles une fonction ouvre() et une fonction ferme() en passant en
paramètre la porte. Moais.
Tu as à disposisiton un objet "porte". Tu appelles des services de la
fabrique de cet objet (classe ou autre) par l'intermédiaire de
l'objet, porte->ouvrir() et porte->fermer() par exemple.
Dans d'autres langages objets (CLOS par exemple), la syntaxe d'envoi de
message est bien du genre message(destinataire, ...).
ne sont pas complètement dissociables pour faire de l'objet : quand on
a généralement affaire à une expression qui prend en paramètres une
autre expression entre parenthèses, on pense prioritairement au
fonctionnel, comme en maths.
D'une part, si dans ton exemple, ce n'était pas le mot
"message(destinataire, messageAenvoyer...)" ou
"envoieMessage(destinataire, messageAenvoyer..)" mais par exemple un
verbe comme "appliquerQqChose(destinataire, args...)", on n'aurait
beaucoup de mal à cerner où est l'objet là-dedans,
Il est clair que la syntaxe la plus courante reste 'objet message args',"message(destinataire, messageAenvoyer...)" ou
"envoieMessage(destinataire, messageAenvoyer..)" mais par exemple un
verbe comme "appliquerQqChose(destinataire, args...)", on n'aurait
beaucoup de mal à cerner où est l'objet là-dedans,
qui est plus proche du "sujet verbe complément", et donc exprime mieux
(sémantiquement) le concept.
Ce que je voulais souligner en l'occurrence est que ce n'est pas la
syntaxe qui importe - d'autant que cette même syntaxe (obj->member)
existe déjà en C avec une sémantique quelque peu différente - et il me
semble que le "détournement" de cette syntaxe en C++ puis en Java etc
n'est pas pour rien dans la difficulté qu'on les débutants en OO à
comprendre la différence *sémantique* entre appel de fonction/méthode et
envoi de message (le second *pouvant* entrainer le premier).
tout en sachant
que le mot message a une signification claire dans le monde objet (cf.
diag. séquence et collaboration en UML).
Le mot 'message' a une signification précise dans le monde objet, bienque le mot message a une signification claire dans le monde objet (cf.
diag. séquence et collaboration en UML).
avant et totalement indépendemment de UML.
D'autre part, une syntaxe "message(destinataire, message...)" implique
de passer en paramètre le message à envoyer,
(NB : ce n'est pas une syntaxe que j'ai donné en example.)de passer en paramètre le message à envoyer,
ce qui est moins
évident pour comprendre des notions comme le polymorphisme, AMHA.
Parce que tu tends à confondre message et sélection de méthode AMHA. Leévident pour comprendre des notions comme le polymorphisme, AMHA.
polymorphisme, *dans ce contexte*, consiste en ce que différent objets
puissent sélectionner des méthodes (comportements) différents en
réaction à un même message. Différencier message et sélection de méthode
aide AMHA à comprendre le principe. Après, la façon dont c'est
implémenté - et accessoirement la syntaxe - dans tel ou tel langage,
c'est un point de détail (en ce qui concerne l'OO, pas en ce qui
concerne le langage !-)
<op>
Ce que tu décrit ici est un ADT (Abstract Data Type, ou Type de Donnée
Abstrait pour les anglophobes). C'est, techniquement, l'"ancêtre" de
l'objet.
La différence fondamentale, c'est le polymorphisme, qui s'appuie sur la
notion de message. Dans ton exemple, tu appelles explicitement une
fonction déterminée. En objet, tu envoie un message à un objet, charge à
lui de déterminer la fonction implémentant la réponse adaptée à ce
message. Ceci permet à des objets de différents types de répondre,
chacun à sa façon, au même message.
Oui, j'ai oublié d'introduire par exemple un objet porteCoulissante etCe que tu décrit ici est un ADT (Abstract Data Type, ou Type de Donnée
Abstrait pour les anglophobes). C'est, techniquement, l'"ancêtre" de
l'objet.
La différence fondamentale, c'est le polymorphisme, qui s'appuie sur la
notion de message. Dans ton exemple, tu appelles explicitement une
fonction déterminée. En objet, tu envoie un message à un objet, charge à
lui de déterminer la fonction implémentant la réponse adaptée à ce
message. Ceci permet à des objets de différents types de répondre,
chacun à sa façon, au même message.
un objet porteAvecGonds partageant des caractéristiques communes avec
l'objet porte, ceci afin de montrer que des services communs offerts
comme ouvrir() et fermer() peuvent aussi s'y appliquer avec un
polymorphisme d'héritage.
Un meilleur exemple serait de présenter également un objet "livre" et un
objet "robinet". Eux aussi comprennent les messages "ouvrir" et
"fermer", et ce ne sont clairement pas des sous-classes de "porte". Un
livre et une porte appartiennent-ils au même type ? (ou "à un" même
type, ce qui est différent) ? La réponse dépend évidemment de la
définition de "type", et il n'y a clairement pas consensus sur cette
définition.
Dans certains langages (langages à prototypes comme Self ou Javascript,
ou langages très dynamiques comme Python), il est possible de modifier
dynamiquement l'interface et/ou l'implémentation d'un objet donné. En
Python, il est possible de modifier dynamiquement la classe d'un objet
donné, et de modifier dynamiquement l'interface et/ou l'implémentation
d'une classe (une classe étant elle-même un objet), cette modif étant
immédiatement répercutée sur toutes les instances de ladite classe.
Dans ces conditions, comment définir "le" type d'un objet donné ?
(snip)
Pa mal, pas mal, mais faut passer au C++ dans ce cas là !!
Pourquoi faire ?et peu de modifications de code) que tu cites à peine plus haut avec
l'ADT, sans à avoir à réinventer la roue
Smalltalk, Ruby, Python ou CLOS (quoique... après réflexion, je retire
CLOS) sont probablement plus instructifs - surtout si l'OP s'interroge
sur la différence fondamentale entre un struct et un objet.
et garder une syntaxe
proche du C.
Dans ce cas, Objective-Cproche du C.
Si changer de syntaxe ne gêne pas l'OP, vive Ada !!
<sans vouloir troller>Encore un langage procédural à typage statique avec une surcouche objet.
Si l'OP veut vraiment comprendre les concepts de base de l'OO, autant
choisir un langage 1/ plus light (plus rapide à apprendre, plus facile à
mettre en oeuvre) et 2/ plus clairement objet.
</sans vouloir troller>
--
bruno desthuilliers
python -c "print '@'.join(['.'.join([w[::-1] for w in p.split('.')]) for
p in '***@xiludom.gro'.split('@')])"
bruno desthuilliers
python -c "print '@'.join(['.'.join([w[::-1] for w in p.split('.')]) for
p in '***@xiludom.gro'.split('@')])"