Discussion:
Variable arbre
(trop ancien pour répondre)
fraction
2009-10-13 14:06:32 UTC
Permalink
Bonjour.
Existe-t-il (sous Visual Basic) une méthode pour définir une
collection sous forme d'arbre (par exemple un arbre généalogique) ?
Merci.
fraction
2009-10-17 17:53:45 UTC
Permalink
Toujours sur Visual Basic, est-il possible de définir un tableau dont
le nombre de dimensions est variable) ?
Bruno Desthuilliers
2009-10-19 13:07:08 UTC
Permalink
Post by fraction
Post by fraction
Bonjour.
Existe-t-il (sous Visual Basic) une méthode pour définir une
collection sous forme d'arbre (par exemple un arbre généalogique) ?
Merci.
Toujours sur Visual Basic, est-il possible de définir un tableau dont
le nombre de dimensions est variable) ?
Quel est le rapport avec la programmation objet ? Pose la question sur
un newsgroup dédié à VB.
fraction
2009-10-20 13:52:55 UTC
Permalink
On 19 oct, 15:07, Bruno Desthuilliers <bruno.
 >> Bonjour.
 >> Existe-t-il (sous Visual Basic) une méthode pour définir une
 >> collection sous forme d'arbre (par exemple un arbre généalogique) ?
 >> Merci.
 >>
Post by fraction
Toujours sur Visual Basic, est-il possible de définir un tableau dont
le nombre de dimensions est variable) ?
Quel est le rapport avec la programmation objet ? Pose la question sur
un newsgroup dédié à VB.
Oui, je viens de découvrir le forum dont tu parles. Désolé.
fraction
2009-10-20 14:07:07 UTC
Permalink
Post by fraction
On 19 oct, 15:07, Bruno Desthuilliers <bruno.
 >> Bonjour.
 >> Existe-t-il (sous Visual Basic) une méthode pour définir une
 >> collection sous forme d'arbre (par exemple un arbre généalogique) ?
 >> Merci.
 >>
Post by fraction
Toujours sur Visual Basic, est-il possible de définir un tableau dont
le nombre de dimensions est variable) ?
Quel est le rapport avec la programmation objet ? Pose la question sur
un newsgroup dédié à VB.
Oui, je viens de découvrir le forum dont tu parles. Désolé.
Ne le prends pas mal, mais j'ai peur de déroger à l'ordre de ce forum
davantage par ma présence que par le contenu de mon propos. Il n'y a
personne.
fraction
2009-10-20 14:13:13 UTC
Permalink
Post by fraction
Ne le prends pas mal, mais j'ai peur de déroger à l'ordre de ce forum
davantage par ma présence que par le contenu de mon propos. Il n'y a
personne.
Sans vouloir paraître insolent, c'est quoi la programmation "objet" ?
Est-ce que ça aurait un rapport avec les objets évènementiels de
Visual Basic par exemple ?
Marc Boyer
2009-10-20 15:09:06 UTC
Permalink
Post by fraction
Post by fraction
Ne le prends pas mal, mais j'ai peur de déroger à l'ordre de ce forum
davantage par ma présence que par le contenu de mon propos. Il n'y a
personne.
Sans vouloir paraître insolent, c'est quoi la programmation "objet" ?
Un très vaste sujet.
Voir Wikipedia pour un début:
http://fr.wikipedia.org/wiki/Programmation_orient%C3%A9e_objet

Marc Boyer
--
En prenant aux 10% des francais les plus riches 12% de leurs revenus,
on pourrait doubler les revenus des 10% les plus pauvres.
http://www.inegalites.fr/spip.php?article1&id_mot=130
Bruno Desthuilliers
2009-10-21 08:06:01 UTC
Permalink
Post by fraction
Sans vouloir paraître insolent, c'est quoi la programmation "objet" ?
C'est pas insolent, et c'est même tout à fait dans le sujet cette fois !-)

Commence effectivement pas le lien suggéré par Marc. C'est du wikipedia
donc à prendre avec des pincettes et pas mal de recul, mais ça te fera
quand même une intro à peu près correcte et généraliste.
Post by fraction
Est-ce que ça aurait un rapport avec les objets évènementiels de
Visual Basic par exemple ?
Je ne sais pas ce que tu appelles "objets évènementiels" en VB. A vrai
dire, ça fait bon nombre d'année que je n'ai pas mis le nez dans du VB
(et sans vouloir troller, je ne m'en porte que mieux). Ceci étant, en
VB6, il y avait déjà pas mal d'éléments de POO, même si le modèle objet
était un peu baroque. Tous les éléments de l'UI par exemple (forms,
controls etc) étaient des objets. Comme je le disais, je n'ai pas suivi
les évolutions depuis, mais PAQJS, le passage à .NET aurait plutôt
renforcé cette tendance.
Bruno Desthuilliers
2009-10-21 07:57:15 UTC
Permalink
Post by fraction
Post by fraction
On 19 oct, 15:07, Bruno Desthuilliers <bruno.
Post by Bruno Desthuilliers
Post by fraction
Post by fraction
Bonjour.
Existe-t-il (sous Visual Basic) une méthode pour définir une
collection sous forme d'arbre (par exemple un arbre généalogique) ?
Merci.
Toujours sur Visual Basic, est-il possible de définir un tableau dont
le nombre de dimensions est variable) ?
Quel est le rapport avec la programmation objet ? Pose la question sur
un newsgroup dédié à VB.
Oui, je viens de découvrir le forum dont tu parles. Désolé.
Ne le prends pas mal, mais j'ai peur de déroger à l'ordre de ce forum
davantage par ma présence que par le contenu de mon propos.
Mouarf !-)
Post by fraction
Il n'y a
personne.
Ca, on peut pas dire que ce soit très vivant ic. Ca commence même à
sentir un peu... Honnêtement, le conseil de poster sur le NG approprié
visait surtout à favoriser tes chances de recevoir des réponses
pertinentes à tes questions.
Marc Boyer
2009-10-21 07:59:15 UTC
Permalink
Post by Bruno Desthuilliers
Ca, on peut pas dire que ce soit très vivant ic. Ca commence même à
sentir un peu...
Voui. Les rares discussions objet intéressantes ont plutôt lieu
sur les forum des langages...

Marc Boyer
--
En prenant aux 10% des francais les plus riches 12% de leurs revenus,
on pourrait doubler les revenus des 10% les plus pauvres.
http://www.inegalites.fr/spip.php?article1&id_mot=130
Wykaaa
2009-10-23 16:18:53 UTC
Permalink
Post by Marc Boyer
Post by Bruno Desthuilliers
Ca, on peut pas dire que ce soit très vivant ic. Ca commence même à
sentir un peu...
Voui. Les rares discussions objet intéressantes ont plutôt lieu
sur les forum des langages...
Marc Boyer
C'est dommage parce qu'il me semble qu'il y aurait des choses à dire sur
l'objet indépendamment des langages.
Bruno Desthuilliers
2009-11-04 18:18:38 UTC
Permalink
Post by Wykaaa
Le 21-10-2009, Bruno Desthuilliers
Post by Bruno Desthuilliers
Ca, on peut pas dire que ce soit très vivant ic. Ca commence même à
sentir un peu...
Voui. Les rares discussions objet intéressantes ont plutôt lieu
sur les forum des langages...
C'est dommage parce qu'il me semble qu'il y aurait des choses à dire sur
l'objet indépendamment des langages.
Oui et non... Contrairement à la pf ou au modèle relationel, qui
s'inscrivent tous deux dans un cadre théorique relativement bien défini,
la POO a presque autant de définitions que d'implémentations. Du point
de vue purement théorique, l'approche objet se résume en deux "axiomes",
tous les deux suffisament vagues et abscons pour autoriser un nombre
d'interprétations qui tends vers l'infini. Bizarrement, l'essentiel de
la littérature sur le sujet, au contraire, ne prend en compte que le
modèle issue de l'implémentation "dominante" (la lignée Simula / C++ /
Java, et très partiellement Smalltalk), ou, si elle mentionne les autres
modèles possibles (Self, CLOS, Python, Javascript, etc), ne le fait que
superficiellement et sans tenir compte de ce que ces implémentations
permettent.
Wykaaa
2009-11-07 12:59:57 UTC
Permalink
Post by Bruno Desthuilliers
Post by Wykaaa
Le 21-10-2009, Bruno Desthuilliers
Post by Bruno Desthuilliers
Ca, on peut pas dire que ce soit très vivant ic. Ca commence même à
sentir un peu...
Voui. Les rares discussions objet intéressantes ont plutôt lieu
sur les forum des langages...
C'est dommage parce qu'il me semble qu'il y aurait des choses à dire sur
l'objet indépendamment des langages.
Oui et non... Contrairement à la pf ou au modèle relationel, qui
s'inscrivent tous deux dans un cadre théorique relativement bien défini,
la POO a presque autant de définitions que d'implémentations. Du point
de vue purement théorique, l'approche objet se résume en deux "axiomes",
tous les deux suffisament vagues et abscons pour autoriser un nombre
d'interprétations qui tends vers l'infini. Bizarrement, l'essentiel de
la littérature sur le sujet, au contraire, ne prend en compte que le
modèle issue de l'implémentation "dominante" (la lignée Simula / C++ /
Java, et très partiellement Smalltalk), ou, si elle mentionne les autres
modèles possibles (Self, CLOS, Python, Javascript, etc), ne le fait que
superficiellement et sans tenir compte de ce que ces implémentations
permettent.
Et bien, justement, recherchons les invariants objets de tous ces
langages. En clair, qu'ont-ils en commun par rapport à l'objet ?
De la réponse à cette question, on pourra certainement déduire un modèle
objet général mais plus précis.
Patrick Lamaizière
2009-11-07 13:20:09 UTC
Permalink
Post by Wykaaa
Et bien, justement, recherchons les invariants objets de tous ces
langages. En clair, qu'ont-ils en commun par rapport à l'objet ?
De la réponse à cette question, on pourra certainement déduire un modèle
objet général mais plus précis.
On risque d'arriver au mot clef *struct* , non ?
Bruno Desthuilliers
2009-11-07 18:49:03 UTC
Permalink
Post by Patrick Lamaizière
Post by Wykaaa
Et bien, justement, recherchons les invariants objets de tous ces
langages. En clair, qu'ont-ils en commun par rapport à l'objet ?
De la réponse à cette question, on pourra certainement déduire un modèle
objet général mais plus précis.
On risque d'arriver au mot clef *struct* , non ?
Même pas. En Python ou en javascript (au moins - c'est certainement le
cas dans pas mal d'autres langages), les objets ne sont pas basés sur
des structs mais sur des hashtables.
Bruno Desthuilliers
2009-11-07 18:51:26 UTC
Permalink
Wykaaa a écrit :
(snip)
Post by Wykaaa
Et bien, justement, recherchons les invariants objets de tous ces
langages. En clair, qu'ont-ils en commun par rapport à l'objet ?
Le fait d'avoir
1/ des objets définis par une identité, un état et un comportement
2/ que ces objets communiquent entre eux par l'envoi de message.

Bref, les deux "axiomes" de base de la POO... Et les deux seules
communément admises.
Post by Wykaaa
De la réponse à cette question, on pourra certainement déduire un modèle
objet général mais plus précis.
Voilà, c'est fait !-)
Patrick Lamaizière
2009-11-08 13:33:36 UTC
Permalink
Post by Bruno Desthuilliers
Le fait d'avoir
1/ des objets définis par une identité, un état et un comportement
2/ que ces objets communiquent entre eux par l'envoi de message.
Bref, les deux "axiomes" de base de la POO... Et les deux seules
communément admises.
Tu ne places même pas l'héritage dedans ? Ça me parait le mimimum
syndical quand même.
Bruno Desthuilliers
2009-11-09 08:56:08 UTC
Permalink
Post by Patrick Lamaizière
Post by Bruno Desthuilliers
Le fait d'avoir
1/ des objets définis par une identité, un état et un comportement
2/ que ces objets communiquent entre eux par l'envoi de message.
Bref, les deux "axiomes" de base de la POO... Et les deux seules
communément admises.
Tu ne places même pas l'héritage dedans ?
Non.
Post by Patrick Lamaizière
Ça me parait le mimimum
syndical quand même.
Pour moi c'est avant tout un artefact d'une certaine conception de l'OO
qui tend un peu trop à s'ériger en vérité révélée.

Dans la pratique, les deux cas d'utilisation de l'héritage dans le
modèle sont:

1/ l'héritage de type, autremenent dit le support du dispatch
polymorphique dans les langages à typage statique déclaratif.

2/ l'héritage d'implémentation, autrement dit un support pour
l'automatisation de la composition/délégation.

Ces deux cas d'utilisations sont essentiellement liés aux limitations
imposées par le typage statique déclaratif. Dans un langage dynamique
avec un support décent pour la délégation, on n'a pas techniquement
besoin d'héritage (pas plus que de classe, d'ailleurs, cf les langages à
prototype). Ce n'est donc pas un fondamental de l'OO, CQFD.
David MENTRE
2009-11-09 16:52:43 UTC
Permalink
Bonjour,
Dans un langage dynamique avec un support décent pour la délégation,
on n'a pas techniquement besoin d'héritage
Tu peux donner un exemple et/ou détailler, parce que là j'ai du mal à
suivre. Qu'est-ce que c'est un « support décent pour la délégation » ?

Cordialement,
david
--
David Mentré
ld
2009-11-10 09:30:43 UTC
Permalink
Post by David MENTRE
Bonjour,
Dans un langage dynamique avec un support décent pour la délégation,
on n'a pas techniquement besoin d'héritage
Tu peux donner un exemple et/ou détailler, parce que là j'ai du mal à
suivre. Qu'est-ce que c'est un « support décent pour la délégation » ?
La possibilite de delegue un message de maniere generique a un autre
receveur, sans particulierement connaitre le message ni les arguments.
COS est (a ma connaissance) le seul "language" capable de supporter la
delegation generique des multi-methodes et avec en bonus une vitesse
equivalente aux virtual functions de C++.

a+, ld.
Bruno Desthuilliers
2009-11-10 11:15:09 UTC
Permalink
Post by David MENTRE
Bonjour,
Dans un langage dynamique avec un support décent pour la délégation,
on n'a pas techniquement besoin d'héritage
Tu peux donner un exemple et/ou détailler, parce que là j'ai du mal à
suivre. Qu'est-ce que c'est un « support décent pour la délégation » ?
Le fait de ne pas devoir coder manuellement toute la délégation. Un
exemple en Python:


class Foo(object):
def bar(self):
print "in Foo.bar"

class Baaz(object):
def __init__(self):
self._foo = Foo()

def __getattr__(self, name):
try:
return getattr(self._foo, name)
except AttributeError:
# on masque la délégation, ça ne concerne pas le client
raise AttributeError("object %s has no attribute '%s'"
% type(self).__name__, name)


b = Baaz()
b.bar()
ld
2009-11-10 09:39:35 UTC
Permalink
On 7 nov, 19:51, Bruno Desthuilliers
Post by Bruno Desthuilliers
(snip)
Post by Wykaaa
Et bien, justement, recherchons les invariants objets de tous ces
langages. En clair, qu'ont-ils en commun par rapport à l'objet ?
Le fait d'avoir
1/ des objets définis par une identité, un état et un comportement
2/ que ces objets communiquent entre eux par l'envoi de message.
Bref, les deux "axiomes" de base de la POO... Et les deux seules
communément admises.
Tu n'as fait que deplacer le probleme en parlant de message sans
preciser. Tous les languages OO supportent 1/ mais leurs modeles OO
different considerablement suivant si les messages supportent eux-meme
1/ (comme SmallTalk, CLOS, Objc) ou non (C++, Java, ...). Et si on en
reste a ta definition, alors le C est un language OO.
Post by Bruno Desthuilliers
Post by Wykaaa
De la réponse à cette question, on pourra certainement déduire un modèle
objet général mais plus précis.
Voilà, c'est fait !-)
Ben non. Si c'etait aussi simple, ca serait deja fait. De plus il
manque deux points clef de la POO: l'encapsulation et le subtyping.

a+, ld.
Bruno Desthuilliers
2009-11-10 11:19:46 UTC
Permalink
Post by ld
On 7 nov, 19:51, Bruno Desthuilliers
Post by Bruno Desthuilliers
(snip)
Post by Wykaaa
Et bien, justement, recherchons les invariants objets de tous ces
langages. En clair, qu'ont-ils en commun par rapport à l'objet ?
Le fait d'avoir
1/ des objets définis par une identité, un état et un comportement
2/ que ces objets communiquent entre eux par l'envoi de message.
Bref, les deux "axiomes" de base de la POO... Et les deux seules
communément admises.
Tu n'as fait que deplacer le probleme en parlant de message sans
preciser.
C'est intentionnellement que je n'ai pas précisé.
Post by ld
Tous les languages OO supportent 1/ mais leurs modeles OO
different considerablement suivant si les messages supportent eux-meme
1/ (comme SmallTalk, CLOS, Objc) ou non (C++, Java, ...).
Indeed.
Post by ld
Et si on en
reste a ta definition, alors le C est un language OO.
"ma" définition concerne l'OO en général. Elle n'a pas pour but de
définir ce qu'est (ou n'est pas) un "langage OO".
Post by ld
Post by Bruno Desthuilliers
Post by Wykaaa
De la réponse à cette question, on pourra certainement déduire un modèle
objet général mais plus précis.
Voilà, c'est fait !-)
Ben non. Si c'etait aussi simple, ca serait deja fait. De plus il
manque deux points clef de la POO: l'encapsulation et le subtyping.
Pour quelles définitions de "encapsulation" et de "subtyping", et en
quoi - selon ces définitions - ces deux concepts sont-ils des "points
clés" ?
ld
2009-11-10 12:13:21 UTC
Permalink
On Nov 10, 12:19 pm, Bruno Desthuilliers <bruno.
Post by Bruno Desthuilliers
Post by ld
On 7 nov, 19:51, Bruno Desthuilliers
Post by Bruno Desthuilliers
(snip)
Post by Wykaaa
Et bien, justement, recherchons les invariants objets de tous ces
langages. En clair, qu'ont-ils en commun par rapport à l'objet ?
Le fait d'avoir
1/ des objets définis par une identité, un état et un comportement
2/ que ces objets communiquent entre eux par l'envoi de message.
Bref, les deux "axiomes" de base de la POO... Et les deux seules
communément admises.
Tu n'as fait que deplacer le probleme en parlant de message sans
preciser.
C'est intentionnellement que je n'ai pas précisé.
Post by ld
Tous les languages OO supportent 1/ mais leurs modeles OO
different considerablement suivant si les messages supportent eux-meme
1/ (comme SmallTalk, CLOS, Objc) ou non (C++, Java, ...).
Indeed.
Post by ld
Et si on en
reste a ta definition, alors le C est un language OO.
"ma" définition concerne l'OO en général. Elle n'a pas pour but de
définir ce qu'est (ou n'est pas) un "langage OO".
Post by ld
Post by Bruno Desthuilliers
Post by Wykaaa
De la réponse à cette question, on pourra certainement déduire un modèle
objet général mais plus précis.
Voilà, c'est fait !-)
Ben non. Si c'etait aussi simple, ca serait deja fait. De plus il
manque deux points clef de la POO: l'encapsulation et le subtyping.
Pour quelles définitions de "encapsulation" et de "subtyping", et en
quoi - selon ces définitions - ces deux concepts sont-ils des "points
clés" ?
l'encapsulation permet de compartimenter 1/ et d'eviter une exposition
dangereuse pour le couplage (fermer les portees), et appliquer les
fameux "separation of concern" et "divide and conquer". C'est a mon
avis le point fondamental de la POO, separer l'interface de
l'implementation a l'echelle des objets (des classes), pas seulement
des modules. Par exemple en C, on peut utilise un ADT et une API, mais
les consequences sur le design a grande echelle sont differentes.

le subtyping vient ensuite comme moyen d'etendre et de modulariser un
systeme ferme par l'encapsulation (sous certaines conditions, cf
Liskov). En particulier je vois le subtyping comme une projection d'un
type sur un autre, ni plus ni moins. Et en general c'est la que les
choses se compliquent ;-)

a+, ld.
Wykaaa
2009-11-12 12:52:17 UTC
Permalink
On Nov 10, 12:19 pm, Bruno Desthuilliers <bruno.
Post by Bruno Desthuilliers
Post by ld
On 7 nov, 19:51, Bruno Desthuilliers
Post by Bruno Desthuilliers
(snip)
Post by Wykaaa
Et bien, justement, recherchons les invariants objets de tous ces
langages. En clair, qu'ont-ils en commun par rapport à l'objet ?
Le fait d'avoir
1/ des objets définis par une identité, un état et un comportement
2/ que ces objets communiquent entre eux par l'envoi de message.
Bref, les deux "axiomes" de base de la POO... Et les deux seules
communément admises.
Tu n'as fait que deplacer le probleme en parlant de message sans
preciser.
C'est intentionnellement que je n'ai pas précisé.
Post by ld
Tous les languages OO supportent 1/ mais leurs modeles OO
different considerablement suivant si les messages supportent eux-meme
1/ (comme SmallTalk, CLOS, Objc) ou non (C++, Java, ...).
Indeed.
Post by ld
Et si on en
reste a ta definition, alors le C est un language OO.
"ma" définition concerne l'OO en général. Elle n'a pas pour but de
définir ce qu'est (ou n'est pas) un "langage OO".
Post by ld
Post by Bruno Desthuilliers
Post by Wykaaa
De la réponse à cette question, on pourra certainement déduire un modèle
objet général mais plus précis.
Voilà, c'est fait !-)
Ben non. Si c'etait aussi simple, ca serait deja fait. De plus il
manque deux points clef de la POO: l'encapsulation et le subtyping.
Pour quelles définitions de "encapsulation" et de "subtyping", et en
quoi - selon ces définitions - ces deux concepts sont-ils des "points
clés" ?
l'encapsulation permet de compartimenter 1/ et d'eviter une exposition
dangereuse pour le couplage (fermer les portees), et appliquer les
fameux "separation of concern" et "divide and conquer". C'est a mon
avis le point fondamental de la POO, separer l'interface de
l'implementation a l'echelle des objets (des classes), pas seulement
des modules. Par exemple en C, on peut utilise un ADT et une API, mais
les consequences sur le design a grande echelle sont differentes.
L'encapsulation est très certainement le concept clé de l'objet bien que
des langages non objet supportent correctement ce concept (je pense, en
particulier, à ADA 83). Vouloir faire l'impasse sur ce concept quand on
parle d'objet c'est ne pas prendre en compte toutes les dimensions de
l'approche objet.
Sans encapsulation, on ne peut pas parler de réutilisabilité (du moins
sans prendre de grands risques).
le subtyping vient ensuite comme moyen d'etendre et de modulariser un
systeme ferme par l'encapsulation (sous certaines conditions, cf
Liskov). En particulier je vois le subtyping comme une projection d'un
type sur un autre, ni plus ni moins. Et en general c'est la que les
choses se compliquent ;-)
a+, ld.
Le subtyping permet de particulariser les objets, pas de les étendre.
Les étendre passe par la généricité.
par ailleurs dans ce fil, j'ai vu que Bruno ne tient pas compte de
l'héritage dans l'approche objet, soit. Mais on a besoin, dans
l'approche objet d'une notion de "hiérarchie" (au sens de relation
d'ordre strict partielle entre objets). Il y en a déjà une, issue des
langages non objet, c'est l'agrégation (faible ou forte, peut importe
pour ce qui nous occupe). Dans l'approche objet "classique", il y a une
autre notion de hiérarchie, c'est l'héritage qui permet le
polymorphisme d'héritage (qui se distingue du polymorphisme "ad'hoc" de
type surcharge ou du polymorphisme universel à la ML). Alors, en
remplacement de l'héritage, certains, dont Bruno, parlent de délégation
(c'est plutôt le vocabulaire des langages d'acteurs que des langages
p"purement objet") mais cette délégation doit tout de même respecter la
notion de hiérarchie sur les objets (on ne délègue pas à n'importe quel
objet, n'importe comment). La délégation ne peut se faire correctement
qu'en respectant cette notion d'ordre strict entre les objets, objets de
la délégation.
Bruno Desthuilliers
2009-11-12 13:25:54 UTC
Permalink
Post by Wykaaa
On Nov 10, 12:19 pm, Bruno Desthuilliers <bruno.
(snip)
Post by Wykaaa
Post by Bruno Desthuilliers
Post by ld
Ben non. Si c'etait aussi simple, ca serait deja fait. De plus il
manque deux points clef de la POO: l'encapsulation et le subtyping.
Pour quelles définitions de "encapsulation" et de "subtyping", et en
quoi - selon ces définitions - ces deux concepts sont-ils des "points
clés" ?
l'encapsulation permet de compartimenter 1/ et d'eviter une exposition
dangereuse pour le couplage (fermer les portees), et appliquer les
fameux "separation of concern" et "divide and conquer". C'est a mon
avis le point fondamental de la POO, separer l'interface de
l'implementation a l'echelle des objets (des classes), pas seulement
des modules. Par exemple en C, on peut utilise un ADT et une API, mais
les consequences sur le design a grande echelle sont differentes.
L'encapsulation est très certainement le concept clé de l'objet bien que
des langages non objet supportent correctement ce concept (je pense, en
particulier, à ADA 83). Vouloir faire l'impasse sur ce concept quand on
parle d'objet c'est ne pas prendre en compte toutes les dimensions de
l'approche objet.
L'encapsulation en tant que découplage entre interface et implémentation
est dans une certaine mesure sous-entendue par la distinction entre
messages (l'interface) et comportement (l'implémentation).
Post by Wykaaa
Sans encapsulation, on ne peut pas parler de réutilisabilité (du moins
sans prendre de grands risques).
En ce qui me concerne, la réutilisabilité est ici au mieux un bénéfice
secondaire - le bénéfice primaire attendu étant surtout une meilleure
gestion de la complexité.
Post by Wykaaa
le subtyping vient ensuite comme moyen d'etendre et de modulariser un
systeme ferme par l'encapsulation (sous certaines conditions, cf
Liskov). En particulier je vois le subtyping comme une projection d'un
type sur un autre, ni plus ni moins.
Ce qui implique pour commencer une notion de type. Quel est le type d'un
objet dans un langage à prototype ? Et même, pour commencer, qu'est-ce
qu'un type ?-)
Post by Wykaaa
Et en general c'est la que les
choses se compliquent ;-)
Indeed !-)
Post by Wykaaa
Le subtyping permet de particulariser les objets, pas de les étendre.
Les étendre passe par la généricité.
par ailleurs dans ce fil, j'ai vu que Bruno ne tient pas compte de
l'héritage dans l'approche objet, soit.
J'en tiens bien sûr compte - je précisais juste que l'héritage, au moins
dans le sens où il existe comme fonctionnalité de la plupart des
langages objets, n'est pas AMHA un concept *nécessaire* à la définition
de l'OO.
Post by Wykaaa
Mais on a besoin, dans
l'approche objet d'une notion de "hiérarchie" (au sens de relation
d'ordre strict partielle entre objets). Il y en a déjà une, issue des
langages non objet, c'est l'agrégation (faible ou forte, peut importe
pour ce qui nous occupe). Dans l'approche objet "classique", il y a une
autre notion de hiérarchie, c'est l'héritage qui permet le
polymorphisme d'héritage
En quoi ce polymorphisme apporte-t'il quoi que ce soit à celui plus
générique déjà offert par la séparation entre message et comportement ?
En quoi est-il nécessaire qu'un objet doive "hériter" d'un autre pour
comprendre un sous-ensemble commun de messages ?
Post by Wykaaa
(qui se distingue du polymorphisme "ad'hoc" de
type surcharge ou du polymorphisme universel à la ML). Alors, en
remplacement de l'héritage, certains, dont Bruno, parlent de délégation
(c'est plutôt le vocabulaire des langages d'acteurs que des langages
p"purement objet")
La notion de composition/délégation est assez fréquemment évoquée dans
la littérature, et notamment citée comme préférable à l'héritage
d'implémentation dans le GoF.
Post by Wykaaa
mais cette délégation doit tout de même respecter la
notion de hiérarchie sur les objets
Ah bon ? Et pourquoi donc ?
Post by Wykaaa
(on ne délègue pas à n'importe quel
objet, n'importe comment).
Du moment que l'objet auquel on délègue comprend les messages qu'on lui
envoie, je ne vois pas où est le problème.
Post by Wykaaa
La délégation ne peut se faire correctement
qu'en respectant cette notion d'ordre strict entre les objets, objets de
la délégation.
On a déjà eu l'occasion de comparer nos points de vues et approches du
génie logiciel - et les raisons (notamment contextuelle) pour lesquelles
ces points de vues et approches diffèrent sensiblement. En ce qui me
concerne - et même si je peux comprendre son intérêt de ton point de vue
- cette "notion d'ordre strict" n'est (AMHA etc...) pas absolument
(voire absolument pas) nécessaire, et parfois (voire souvent) tout
simplement nuisible.

En tout état de cause, je ne vois pas en quoi cette notion est
constitutive de l'OO - même si elle constitutive du modèle objet
dominant, avec pour résultat tout un (célèbre) livre de recettes dont le
but principal est de contourner les limitations imposées par ce modèle !-)

PS : avant de vous précipiter sur vos claviers, n'oubliez pas que je
suis un joyeux troll !-)))
Wykaaa
2009-11-12 17:01:58 UTC
Permalink
Post by Bruno Desthuilliers
Post by Wykaaa
On Nov 10, 12:19 pm, Bruno Desthuilliers <bruno.
(snip)
Post by Wykaaa
Post by Bruno Desthuilliers
Post by ld
Ben non. Si c'etait aussi simple, ca serait deja fait. De plus il
manque deux points clef de la POO: l'encapsulation et le subtyping.
Pour quelles définitions de "encapsulation" et de "subtyping", et en
quoi - selon ces définitions - ces deux concepts sont-ils des "points
clés" ?
l'encapsulation permet de compartimenter 1/ et d'eviter une exposition
dangereuse pour le couplage (fermer les portees), et appliquer les
fameux "separation of concern" et "divide and conquer". C'est a mon
avis le point fondamental de la POO, separer l'interface de
l'implementation a l'echelle des objets (des classes), pas seulement
des modules. Par exemple en C, on peut utilise un ADT et une API, mais
les consequences sur le design a grande echelle sont differentes.
L'encapsulation est très certainement le concept clé de l'objet bien
que des langages non objet supportent correctement ce concept (je
pense, en particulier, à ADA 83). Vouloir faire l'impasse sur ce
concept quand on parle d'objet c'est ne pas prendre en compte toutes
les dimensions de l'approche objet.
L'encapsulation en tant que découplage entre interface et implémentation
est dans une certaine mesure sous-entendue par la distinction entre
messages (l'interface) et comportement (l'implémentation).
Post by Wykaaa
Sans encapsulation, on ne peut pas parler de réutilisabilité (du moins
sans prendre de grands risques).
En ce qui me concerne, la réutilisabilité est ici au mieux un bénéfice
secondaire - le bénéfice primaire attendu étant surtout une meilleure
gestion de la complexité.
Post by Wykaaa
le subtyping vient ensuite comme moyen d'etendre et de modulariser un
systeme ferme par l'encapsulation (sous certaines conditions, cf
Liskov). En particulier je vois le subtyping comme une projection d'un
type sur un autre, ni plus ni moins.
Ce qui implique pour commencer une notion de type. Quel est le type d'un
objet dans un langage à prototype ? Et même, pour commencer, qu'est-ce
qu'un type ?-)
Un type définit un ensemble de "valeurs" et d'opérations autorisées sur
ces valeurs. Les valeurs d'un objet sont en fait l'ensemble de ses états
autorisés (l'ensemble des n-uplets autorisés sur les valeurs de ses
attributs).
Dans un langage fonctionnel tel que ML, les fonctions elles-mêmes ont un
type, ce qui permet l'inférence de types.
Post by Bruno Desthuilliers
Post by Wykaaa
Et en general c'est la que les
choses se compliquent ;-)
Indeed !-)
Post by Wykaaa
Le subtyping permet de particulariser les objets, pas de les étendre.
Les étendre passe par la généricité.
par ailleurs dans ce fil, j'ai vu que Bruno ne tient pas compte de
l'héritage dans l'approche objet, soit.
J'en tiens bien sûr compte - je précisais juste que l'héritage, au moins
dans le sens où il existe comme fonctionnalité de la plupart des
langages objets, n'est pas AMHA un concept *nécessaire* à la définition
de l'OO.
L'héritage est lié au principe de classification (la taxonomie ou
taxinomie). Il permet de regrouper dans une même hiérarchie des
abstractions ayant des caractéristiques communes mais aussi des
particularismes. Classer les éléments de l'univers du discours (en
l'occurrence, en informatique, les objets de l'application) est
essentiel pour savoir de quoi l'on parle. Il permet d'éviter les
problèmes d'imprédictabilité au sens de Poincaré.
Post by Bruno Desthuilliers
Post by Wykaaa
Mais on a besoin, dans l'approche objet d'une notion de "hiérarchie"
(au sens de relation d'ordre strict partielle entre objets). Il y en a
déjà une, issue des langages non objet, c'est l'agrégation (faible ou
forte, peut importe pour ce qui nous occupe). Dans l'approche objet
"classique", il y a une autre notion de hiérarchie, c'est l'héritage
qui permet le polymorphisme d'héritage
En quoi ce polymorphisme apporte-t'il quoi que ce soit à celui plus
générique déjà offert par la séparation entre message et comportement ?
En quoi est-il nécessaire qu'un objet doive "hériter" d'un autre pour
comprendre un sous-ensemble commun de messages ?
Ce n'est pas pour "comprendre" un sous-ensemble commun de messages que
l'héritage existe mais pour identifier une classe d'abstraction ayant
des caractéristiques communes.
Post by Bruno Desthuilliers
Post by Wykaaa
(qui se distingue du polymorphisme "ad'hoc" de type surcharge ou du
polymorphisme universel à la ML). Alors, en remplacement de
l'héritage, certains, dont Bruno, parlent de délégation (c'est plutôt
le vocabulaire des langages d'acteurs que des langages p"purement objet")
La notion de composition/délégation est assez fréquemment évoquée dans
la littérature, et notamment citée comme préférable à l'héritage
d'implémentation dans le GoF.
Je ne parle pas de l'héritage d'implémentation mais de l'héritage au
sens conceptuel du terme. Il est étroitement lié au concept d'abstraction.
Post by Bruno Desthuilliers
Post by Wykaaa
mais cette délégation doit tout de même respecter la notion de
hiérarchie sur les objets
Ah bon ? Et pourquoi donc ?
Post by Wykaaa
(on ne délègue pas à n'importe quel objet, n'importe comment).
Du moment que l'objet auquel on délègue comprend les messages qu'on lui
envoie, je ne vois pas où est le problème.
Je comprends pourquoi tu n'est pas "pour" l'encapsulation. La délégation
pure peut conduire aux pires dérivent concernant la sûreté de
fonctionnement.
Post by Bruno Desthuilliers
Post by Wykaaa
La délégation ne peut se faire correctement qu'en respectant cette
notion d'ordre strict entre les objets, objets de la délégation.
On a déjà eu l'occasion de comparer nos points de vues et approches du
génie logiciel - et les raisons (notamment contextuelle) pour lesquelles
ces points de vues et approches diffèrent sensiblement. En ce qui me
concerne - et même si je peux comprendre son intérêt de ton point de vue
- cette "notion d'ordre strict" n'est (AMHA etc...) pas absolument
(voire absolument pas) nécessaire, et parfois (voire souvent) tout
simplement nuisible.
Elle est nuisible uniquement quand on souhaite que les objets puissent
changer de nature dynamiquement mais ceci conduit souvent à ce que les
objets ne soient plus intègrent ce qui peut nuire à la fiabilité du
logiciel et complique le style de programmation dit "sure" (safe
programming)
Post by Bruno Desthuilliers
En tout état de cause, je ne vois pas en quoi cette notion est
constitutive de l'OO - même si elle constitutive du modèle objet
dominant, avec pour résultat tout un (célèbre) livre de recettes dont le
but principal est de contourner les limitations imposées par ce modèle !-)
Ceci est une autre discussion car je ne suis pas certain que les auteurs
du livre en question aient tenu compte de tous les aspects de l'OO.
Post by Bruno Desthuilliers
PS : avant de vous précipiter sur vos claviers, n'oubliez pas que je
suis un joyeux troll !-)))
Faute avouée, à moitié pardonnée :-))
Bruno Desthuilliers
2009-11-12 20:17:58 UTC
Permalink
(snip)
Post by Wykaaa
Post by Bruno Desthuilliers
Post by Wykaaa
Post by ld
le subtyping vient ensuite comme moyen d'etendre et de modulariser un
systeme ferme par l'encapsulation (sous certaines conditions, cf
Liskov). En particulier je vois le subtyping comme une projection d'un
type sur un autre, ni plus ni moins.
Ce qui implique pour commencer une notion de type. Quel est le type
d'un objet dans un langage à prototype ? Et même, pour commencer,
qu'est-ce qu'un type ?-)
Un type définit un ensemble de "valeurs" et d'opérations autorisées sur
ces valeurs. Les valeurs d'un objet sont en fait l'ensemble de ses états
autorisés
A tu conscience que dans un langage comme javascript, ce que tu dis n'a
aucun sens ?

var obj = {foo: 42, bar: "allo"};

quel est le "type" de cet objet selon ta définition ?

obj.foo = "whatever";
obj.yadda = function(x) { return this.foo + x; }

Et maintenant ?

Bref, merci pour le cours pour grand débutant... ça fait plus de 10 ans
que je programme, donc ce genre de définitions de base pour étudiant en
première année, c'est bon, je peux te les sortir moi-même.
Post by Wykaaa
(l'ensemble des n-uplets autorisés sur les valeurs de ses
attributs).
Dans un langage fonctionnel tel que ML, les fonctions elles-mêmes ont un
type, ce qui permet l'inférence de types.
Merci, je connais ML, et OCaml, et Haskell, et d'autres encore.
Post by Wykaaa
Post by Bruno Desthuilliers
Post by Wykaaa
Post by ld
Et en general c'est la que les
choses se compliquent ;-)
Indeed !-)
Comme je disais, donc, c'est là que les choses se compliquent. Quand je
pose des questions comme "qu'est-ce qu'un type", c'est bien parce que je
sais qu'il n'y a *pas* UNE réponse simple et universellement applicable.
Comme dit Laurent, "c'est là que les choses se compliquent".
Post by Wykaaa
Post by Bruno Desthuilliers
Post by Wykaaa
Le subtyping permet de particulariser les objets, pas de les étendre.
Les étendre passe par la généricité.
par ailleurs dans ce fil, j'ai vu que Bruno ne tient pas compte de
l'héritage dans l'approche objet, soit.
J'en tiens bien sûr compte - je précisais juste que l'héritage, au
moins dans le sens où il existe comme fonctionnalité de la plupart des
langages objets, n'est pas AMHA un concept *nécessaire* à la
définition de l'OO.
L'héritage est lié au principe de classification (la taxonomie ou
taxinomie). Il permet de regrouper dans une même hiérarchie des
abstractions ayant des caractéristiques communes mais aussi des
particularismes.
Ce qui impliquent entre autres que les caractéristiques en question
soient invariantes - ce qui n'est pas le cas dans certains langages
dynamiques.
Post by Wykaaa
Classer les éléments de l'univers du discours (en
l'occurrence, en informatique, les objets de l'application) est
essentiel pour savoir de quoi l'on parle.
Mmm... Je dirais plutôt qu'un classement peut être utile pour se repérer
- comme une carte, quoi. Qui, comme on sait, n'est pas le territoire !-)
Post by Wykaaa
Post by Bruno Desthuilliers
Post by Wykaaa
Mais on a besoin, dans l'approche objet d'une notion de "hiérarchie"
(au sens de relation d'ordre strict partielle entre objets). Il y en
a déjà une, issue des langages non objet, c'est l'agrégation (faible
ou forte, peut importe pour ce qui nous occupe). Dans l'approche
objet "classique", il y a une autre notion de hiérarchie, c'est
l'héritage qui permet le polymorphisme d'héritage
En quoi ce polymorphisme apporte-t'il quoi que ce soit à celui plus
générique déjà offert par la séparation entre message et comportement
? En quoi est-il nécessaire qu'un objet doive "hériter" d'un autre
pour comprendre un sous-ensemble commun de messages ?
Ce n'est pas pour "comprendre" un sous-ensemble commun de messages que
l'héritage existe mais pour identifier une classe d'abstraction ayant
des caractéristiques communes.
Dans ce cas, ce n'est donc pas la classification qui "permet le
polymorphisme d'héritage", comme tu l'écrivais n'est-ce pas, mais le
polymorphisme qui définit la (les) classification(s). Dis voir, tu n'a
pas un peu l'impression d'inverser l'effet et la cause ?-)
Post by Wykaaa
Post by Bruno Desthuilliers
Post by Wykaaa
(qui se distingue du polymorphisme "ad'hoc" de type surcharge ou du
polymorphisme universel à la ML). Alors, en remplacement de
l'héritage, certains, dont Bruno, parlent de délégation (c'est plutôt
le vocabulaire des langages d'acteurs que des langages p"purement objet")
La notion de composition/délégation est assez fréquemment évoquée dans
la littérature, et notamment citée comme préférable à l'héritage
d'implémentation dans le GoF.
Je ne parle pas de l'héritage d'implémentation mais de l'héritage au
sens conceptuel du terme. Il est étroitement lié au concept d'abstraction.
L'héritage "au sens conceptuel du terme" - la relation "est un" en
réalité - n'est pas déterminante du polymorphisme mais au contraire
déterminée par lui. Et ce type de classification, dans un système
vraiment "orienté *objet*" - dans le sens où l'abstraction centrale est
l'objet et non la classe, laquelle n'est au mieux qu'un épiphénomène -
est généralement assez flou, voir mouvant (un même objet pouvant changer
de "classe" durant son cycle de vie).

De ce point de vue là, ni la notion de classe ni la notion d'héritage ne
sont fondamentales de l'approche *objet*.
Post by Wykaaa
Post by Bruno Desthuilliers
Post by Wykaaa
mais cette délégation doit tout de même respecter la notion de
hiérarchie sur les objets
Ah bon ? Et pourquoi donc ?
Post by Wykaaa
(on ne délègue pas à n'importe quel objet, n'importe comment).
Du moment que l'objet auquel on délègue comprend les messages qu'on
lui envoie, je ne vois pas où est le problème.
Je comprends pourquoi tu n'est pas "pour" l'encapsulation.
Mais si, bien au contraire.
Post by Wykaaa
La délégation
pure peut conduire aux pires dérivent concernant la sûreté de
fonctionnement.
Mauvaise nouvelle : Y a pas de balle en argent.

De ce point de vue là, aucun système de type connu ne garanti à lui seul
la correction du programme. Ce n'est pas parce qu'un objet est
effectivement une instance d'un sous-type de XXX que son comportement en
réponse au message YYY est celui attendu.
Post by Wykaaa
Post by Bruno Desthuilliers
Post by Wykaaa
La délégation ne peut se faire correctement qu'en respectant cette
notion d'ordre strict entre les objets, objets de la délégation.
On a déjà eu l'occasion de comparer nos points de vues et approches du
génie logiciel - et les raisons (notamment contextuelle) pour
lesquelles ces points de vues et approches diffèrent sensiblement. En
ce qui me concerne - et même si je peux comprendre son intérêt de ton
point de vue - cette "notion d'ordre strict" n'est (AMHA etc...) pas
absolument (voire absolument pas) nécessaire, et parfois (voire
souvent) tout simplement nuisible.
Elle est nuisible uniquement quand on souhaite que les objets puissent
changer de nature dynamiquement
Non. Elle est nuisible en ce qu'elle impose des contraintes inutiles qui
ne font qu'ajouter de la complexité accidentelle sans rien garantir
quand à la correction du programme.
Post by Wykaaa
mais ceci conduit souvent à ce que les
objets ne soient plus intègrent ce qui peut nuire à la fiabilité du
logiciel et complique le style de programmation dit "sure" (safe
programming)
Désolé, mais je ne crois tout simplement pas qu'empiler des contraintes
résolve le problème. Crois moi, s'il suffisait de déclarer trois fois le
type d'une variable pour avoir la certitude absolue que mon programme
soit correct, je m'y plierais volontier. La réalité est que *ça ne
marche pas* - et non seulement ça ne marche pas, mais en plus ça
augmente de façon considérable la complexité du code, ce qui est *en
soi* une source d'erreurs.

Accessoirement, parmi les systèmes informatiques les plus fiables à
l'heure actuelle, certains sont implémentés dans un langage non
seulement dynamique, mais qui décourage explicitement la programmation
"défensive" (je pense bien sûr à Erlang). A mon très humble avis, il y a
là quelque chose à apprendre.
Post by Wykaaa
Post by Bruno Desthuilliers
En tout état de cause, je ne vois pas en quoi cette notion est
constitutive de l'OO - même si elle constitutive du modèle objet
dominant, avec pour résultat tout un (célèbre) livre de recettes dont
le but principal est de contourner les limitations imposées par ce
modèle !-)
Ceci est une autre discussion car je ne suis pas certain que les auteurs
du livre en question aient tenu compte de tous les aspects de l'OO.
Non, en effet - la majorité des recettes en question résolvent des
problèmes spécifiques au modèle C++/Java, et n'ont que peu de sens dans
un langage dynamique. Mais ce n'est certainement pas ce à quoi tu
pensais, et ça prouve bien qu'il y a presque autant d'approches de l'OO
que d'implémentations.
Post by Wykaaa
Post by Bruno Desthuilliers
PS : avant de vous précipiter sur vos claviers, n'oubliez pas que je
suis un joyeux troll !-)))
Faute avouée, à moitié pardonnée :-))
Mais ce n'est pas une faute !!! C'est une immense qualité, que je
revendique haut et fort !!!
Wykaaa
2009-11-13 14:50:15 UTC
Permalink
Post by Bruno Desthuilliers
(snip)
Post by Wykaaa
Post by Bruno Desthuilliers
Post by Wykaaa
Post by ld
le subtyping vient ensuite comme moyen d'etendre et de modulariser un
systeme ferme par l'encapsulation (sous certaines conditions, cf
Liskov). En particulier je vois le subtyping comme une projection d'un
type sur un autre, ni plus ni moins.
Ce qui implique pour commencer une notion de type. Quel est le type
d'un objet dans un langage à prototype ? Et même, pour commencer,
qu'est-ce qu'un type ?-)
Un type définit un ensemble de "valeurs" et d'opérations autorisées sur
ces valeurs. Les valeurs d'un objet sont en fait l'ensemble de ses états
autorisés
A tu conscience que dans un langage comme javascript, ce que tu dis n'a
aucun sens ?
var obj = {foo: 42, bar: "allo"};
quel est le "type" de cet objet selon ta définition ?
obj.foo = "whatever";
obj.yadda = function(x) { return this.foo + x; }
Et maintenant ?
Attention, tous les langages ne supportent pas la définition de types
utilisateur.
Qui a dit que JavaScript était un langage objet?
Qui a dit que JavaScript permettait de définir des types ?
Certainement pas moi. JavaScript n'est pas un langage objet (il en a
juste certaines caractéristiques). JavaScript est plutôt un langage
d'acteur non objet.
Il est donc normal que la définition de ce qu'est un type ne s'applique
pas à JavaScript qui n'est pas un langage vraiment typé.
Post by Bruno Desthuilliers
Bref, merci pour le cours pour grand débutant... ça fait plus de 10 ans
que je programme, donc ce genre de définitions de base pour étudiant en
première année, c'est bon, je peux te les sortir moi-même.
C'est la définition d'un type, que tu le veuille ou non et ce n'est pas
une définition que tu dois traiter par le mépris car toute la
littérature sur les fondements des types sont d'accord avec cette
définition.

Je te conseille de (re)lire "On Understanding Types, Data Abstraction,
and Polymorphism" de Luca Cardelli et Peter Wegner (Computing Survey,
Vol 17, No. 4, Décembre 1985). Je peux te le fournir si tu ne l'as pas
et, bien que datant de 1985, cet article n'a pas vieilli. Il pose les
fondements de ce dont nous discutons ici.
Extrait :
Objects of a given type have a representation that respects the expected
properties of the data type. The representation is chosen to make it
easy to perform expected operations on data objects. For example,
positional notation is favored for numbers because it allows arithmetic
operations to be easily defined.
But there are, nevertheless, many possible alternatives in choosing data
representations.
Breaking the type system allows a data representation to be manipulated
in ways that were not intended, with potentially disastrous results. For
example, use of an integer as a pointer can cause arbitrary
modifications to programs and data.
...
Thus we say that a language is object
oriented if and only if it satisfies the following requirements:
l) It supports objects that are data abstractions with an interface of
named operations and a hidden local state.
2) Objects have an associated object type.
3) Types may inherit attributes from supertypes.
These requirements may be summarized as
object oriented = data abstractions + object types + type inheritance.
Post by Bruno Desthuilliers
Post by Wykaaa
(l'ensemble des n-uplets autorisés sur les valeurs de ses
attributs).
Dans un langage fonctionnel tel que ML, les fonctions elles-mêmes ont un
type, ce qui permet l'inférence de types.
Merci, je connais ML, et OCaml, et Haskell, et d'autres encore.
Tu les connais mais les as-tu pratiqués ?
J'ai écrit un programme de 3000 lignes de ML. C'est un langage
extraordinaire (mon langage favori en fait).
J'ai aussi pratiqué KRC et Miranda avec David Turner (leur auteur).
Post by Bruno Desthuilliers
Post by Wykaaa
Post by Bruno Desthuilliers
Post by Wykaaa
Post by ld
Et en general c'est la que les
choses se compliquent ;-)
Indeed !-)
Comme je disais, donc, c'est là que les choses se compliquent. Quand je
pose des questions comme "qu'est-ce qu'un type", c'est bien parce que je
sais qu'il n'y a *pas* UNE réponse simple et universellement applicable.
Comme dit Laurent, "c'est là que les choses se compliquent".
Non, non, il n'y a rien de compliqué sauf à vouloir faire rentrer des
langages dans l'approche objet alors qu'ils ne sont pas objet, comme
beaucoup de langages d'acteurs et JavaScript en particulier :-)
Post by Bruno Desthuilliers
Post by Wykaaa
Post by Bruno Desthuilliers
Post by Wykaaa
Le subtyping permet de particulariser les objets, pas de les étendre.
Les étendre passe par la généricité.
par ailleurs dans ce fil, j'ai vu que Bruno ne tient pas compte de
l'héritage dans l'approche objet, soit.
J'en tiens bien sûr compte - je précisais juste que l'héritage, au
moins dans le sens où il existe comme fonctionnalité de la plupart des
langages objets, n'est pas AMHA un concept *nécessaire* à la
définition de l'OO.
L'héritage est lié au principe de classification (la taxonomie ou
taxinomie). Il permet de regrouper dans une même hiérarchie des
abstractions ayant des caractéristiques communes mais aussi des
particularismes.
Ce qui impliquent entre autres que les caractéristiques en question
soient invariantes - ce qui n'est pas le cas dans certains langages
dynamiques.
On parle de l'approche objet. Si les caractéristiques des objets ne sont
pas invariantes, on ne peut pas définir l'abstraction et on n'est donc
plus dans une approche objet.
Post by Bruno Desthuilliers
Post by Wykaaa
Classer les éléments de l'univers du discours (en
l'occurrence, en informatique, les objets de l'application) est
essentiel pour savoir de quoi l'on parle.
Mmm... Je dirais plutôt qu'un classement peut être utile pour se repérer
- comme une carte, quoi. Qui, comme on sait, n'est pas le territoire !-)
Moi aussi je connais la sémantique générale, fondée par Alfred Korzybski...
Post by Bruno Desthuilliers
Post by Wykaaa
Post by Bruno Desthuilliers
Post by Wykaaa
Mais on a besoin, dans l'approche objet d'une notion de "hiérarchie"
(au sens de relation d'ordre strict partielle entre objets). Il y en
a déjà une, issue des langages non objet, c'est l'agrégation (faible
ou forte, peut importe pour ce qui nous occupe). Dans l'approche
objet "classique", il y a une autre notion de hiérarchie, c'est
l'héritage qui permet le polymorphisme d'héritage
En quoi ce polymorphisme apporte-t'il quoi que ce soit à celui plus
générique déjà offert par la séparation entre message et comportement
? En quoi est-il nécessaire qu'un objet doive "hériter" d'un autre
pour comprendre un sous-ensemble commun de messages ?
Ce n'est pas pour "comprendre" un sous-ensemble commun de messages que
l'héritage existe mais pour identifier une classe d'abstraction ayant
des caractéristiques communes.
Dans ce cas, ce n'est donc pas la classification qui "permet le
polymorphisme d'héritage", comme tu l'écrivais n'est-ce pas, mais le
polymorphisme qui définit la (les) classification(s). Dis voir, tu n'a
pas un peu l'impression d'inverser l'effet et la cause ?-)
Peut-être me suis-je mal exprimé mais il ne faut pas confondre
l'héritage d'un point de vue conceptuel et le "polymorphisme d'héritage"
qui a besoin de quelque chose de plus pour fonctionner (le typage fort
statique ou dynamique);
Lorsqu'on définit une classe et ses sous-classes, on ne définit en fait
qu'une abstraction avec des "spécialisations", c'est ce que je voulais dire.
Post by Bruno Desthuilliers
Post by Wykaaa
Post by Bruno Desthuilliers
Post by Wykaaa
(qui se distingue du polymorphisme "ad'hoc" de type surcharge ou du
polymorphisme universel à la ML). Alors, en remplacement de
l'héritage, certains, dont Bruno, parlent de délégation (c'est plutôt
le vocabulaire des langages d'acteurs que des langages p"purement objet")
La notion de composition/délégation est assez fréquemment évoquée dans
la littérature, et notamment citée comme préférable à l'héritage
d'implémentation dans le GoF.
Je ne parle pas de l'héritage d'implémentation mais de l'héritage au
sens conceptuel du terme. Il est étroitement lié au concept d'abstraction.
L'héritage "au sens conceptuel du terme" - la relation "est un" en
réalité - n'est pas déterminante du polymorphisme mais au contraire
déterminée par lui. Et ce type de classification, dans un système
vraiment "orienté *objet*" - dans le sens où l'abstraction centrale est
l'objet et non la classe, laquelle n'est au mieux qu'un épiphénomène -
est généralement assez flou, voir mouvant (un même objet pouvant changer
de "classe" durant son cycle de vie).
Ce n'est donc plus la même abstraction et, dans une pure approche objet
on ne peut donc pas dire qu'il s'agit du même objet. Il doit être
"re-créé" comme instance d'une autre classe.
Post by Bruno Desthuilliers
De ce point de vue là, ni la notion de classe ni la notion d'héritage ne
sont fondamentales de l'approche *objet*.
Ben si.
Post by Bruno Desthuilliers
Post by Wykaaa
Post by Bruno Desthuilliers
Post by Wykaaa
mais cette délégation doit tout de même respecter la notion de
hiérarchie sur les objets
Ah bon ? Et pourquoi donc ?
Par rapport à ce que j'ai dit ci-dessus
Post by Bruno Desthuilliers
Post by Wykaaa
Post by Bruno Desthuilliers
Post by Wykaaa
(on ne délègue pas à n'importe quel objet, n'importe comment).
Du moment que l'objet auquel on délègue comprend les messages qu'on
lui envoie, je ne vois pas où est le problème.
Je comprends pourquoi tu n'est pas "pour" l'encapsulation.
Mais si, bien au contraire.
Post by Wykaaa
La délégation
pure peut conduire aux pires dérivent concernant la sûreté de
fonctionnement.
Mauvaise nouvelle : Y a pas de balle en argent.
De ce point de vue là, aucun système de type connu ne garanti à lui seul
la correction du programme. Ce n'est pas parce qu'un objet est
effectivement une instance d'un sous-type de XXX que son comportement en
réponse au message YYY est celui attendu.
Je suis d'accord mais au moins, on conserve la cohérence des types, ce
qui réduit les erreurs potentiels sur les actions associés aux objets
(et ce, dès la compilation pour les langages à typage statique mais on
ne va pas rouvrir ce débat là... dont on a déjà longuement débattu dans
le passé)
Post by Bruno Desthuilliers
Post by Wykaaa
Post by Bruno Desthuilliers
Post by Wykaaa
La délégation ne peut se faire correctement qu'en respectant cette
notion d'ordre strict entre les objets, objets de la délégation.
On a déjà eu l'occasion de comparer nos points de vues et approches du
génie logiciel - et les raisons (notamment contextuelle) pour
lesquelles ces points de vues et approches diffèrent sensiblement. En
ce qui me concerne - et même si je peux comprendre son intérêt de ton
point de vue - cette "notion d'ordre strict" n'est (AMHA etc...) pas
absolument (voire absolument pas) nécessaire, et parfois (voire
souvent) tout simplement nuisible.
Elle est nuisible uniquement quand on souhaite que les objets puissent
changer de nature dynamiquement
Non. Elle est nuisible en ce qu'elle impose des contraintes inutiles qui
ne font qu'ajouter de la complexité accidentelle sans rien garantir
quand à la correction du programme.
La correction de programme n'est effectivement pas garantie "que" par le
typage et la notion de hiérarchie. Ca se saurait et nous n'aurions pas à
débattre mais je t'affirme qu'un programme de 3000 lignes de ML qui
passe le contrôle de type a beaucoup moins de chance d'être erroné qu'un
programme écrit, par exemple, en C.
Post by Bruno Desthuilliers
Post by Wykaaa
mais ceci conduit souvent à ce que les
objets ne soient plus intègrent ce qui peut nuire à la fiabilité du
logiciel et complique le style de programmation dit "sure" (safe
programming)
Désolé, mais je ne crois tout simplement pas qu'empiler des contraintes
résolve le problème. Crois moi, s'il suffisait de déclarer trois fois le
type d'une variable pour avoir la certitude absolue que mon programme
soit correct, je m'y plierais volontier.
Tu exagères en résumant de cette façon le typage...

La réalité est que *ça ne
Post by Bruno Desthuilliers
marche pas* - et non seulement ça ne marche pas, mais en plus ça
augmente de façon considérable la complexité du code, ce qui est *en
soi* une source d'erreurs.
Si tu crois que ça augmente la complexité du code sans raison, c'est que
tu as "mal" pratiqué cette approche car je n'y ai vu, pour ma part, que
des simplifications.
Post by Bruno Desthuilliers
Accessoirement, parmi les systèmes informatiques les plus fiables à
l'heure actuelle, certains sont implémentés dans un langage non
seulement dynamique, mais qui décourage explicitement la programmation
"défensive" (je pense bien sûr à Erlang). A mon très humble avis, il y a
là quelque chose à apprendre.
Mais Erlang n'est pas un langage objet. C'est plutôt un langage
fonctionnel d'acteur. Ici nous parlons de ce qui caractérise l'approche
objet. Erlang (qui est par ailleurs un très bon langage) n'a rien à
faire dans cette discussion.
Post by Bruno Desthuilliers
Post by Wykaaa
Post by Bruno Desthuilliers
En tout état de cause, je ne vois pas en quoi cette notion est
constitutive de l'OO - même si elle constitutive du modèle objet
dominant, avec pour résultat tout un (célèbre) livre de recettes dont
le but principal est de contourner les limitations imposées par ce
modèle !-)
Ceci est une autre discussion car je ne suis pas certain que les auteurs
du livre en question aient tenu compte de tous les aspects de l'OO.
Non, en effet - la majorité des recettes en question résolvent des
problèmes spécifiques au modèle C++/Java, et n'ont que peu de sens dans
un langage dynamique. Mais ce n'est certainement pas ce à quoi tu
pensais, et ça prouve bien qu'il y a presque autant d'approches de l'OO
que d'implémentations.
Non conceptuellement, l'approche objet est quelque chose de précis. La
confusion est entretenue par certains courants qui veulent se rattacher
à l'objet tout en le détournant. La preuve dans cette discussion.
Post by Bruno Desthuilliers
Post by Wykaaa
Post by Bruno Desthuilliers
PS : avant de vous précipiter sur vos claviers, n'oubliez pas que je
suis un joyeux troll !-)))
Faute avouée, à moitié pardonnée :-))
Mais ce n'est pas une faute !!! C'est une immense qualité, que je
revendique haut et fort !!!
Alors moi aussi :-)
Bruno Desthuilliers
2009-11-13 20:14:52 UTC
Permalink
(snip)
Post by Wykaaa
Post by Bruno Desthuilliers
Post by Wykaaa
Post by Bruno Desthuilliers
Ce qui implique pour commencer une notion de type. Quel est le type
d'un objet dans un langage à prototype ? Et même, pour commencer,
qu'est-ce qu'un type ?-)
Un type définit un ensemble de "valeurs" et d'opérations autorisées sur
ces valeurs. Les valeurs d'un objet sont en fait l'ensemble de ses états
autorisés
A tu conscience que dans un langage comme javascript, ce que tu dis n'a
aucun sens ?
var obj = {foo: 42, bar: "allo"};
quel est le "type" de cet objet selon ta définition ?
obj.foo = "whatever";
obj.yadda = function(x) { return this.foo + x; }
Et maintenant ?
Attention, tous les langages ne supportent pas la définition de types
utilisateur.
T'a vu un utilisateur ???
Post by Wykaaa
Qui a dit que JavaScript était un langage objet?
D'abord, c'est javascript, pas "JavaScript". Ensuite, javascript permet
de créer des objets définis par une identité, un état et un
comportement, et commnuniquants par envoi de messages. Donc javascript
est un langage objet, CQFD.

Accessoirement, à part David Flanagan et toi, tout le monde s'accorde à
définir javascript comme un langage objet à prototype - et
accessoirement le seul langage à prototype universellement connu et utilisé.
Post by Wykaaa
Qui a dit que JavaScript permettait de définir des types ?
En fonction de quelle définition du terme "type" ?
Post by Wykaaa
Certainement pas moi. JavaScript n'est pas un langage objet
Bin si.
Post by Wykaaa
(il en a
juste certaines caractéristiques).
Il en a toutes les caractéristiques, sauf si on considère que les
messages eux même doivent être des objets, auquel cas seuls Smalltalk et
Self sont des langages objets.
Post by Wykaaa
JavaScript est plutôt un langage
d'acteur non objet.
A tes souhaits.
Post by Wykaaa
Il est donc normal que la définition de ce qu'est un type ne s'applique
pas à JavaScript qui n'est pas un langage vraiment typé.
Pour quelle définition de "type" ?

J'ai déjà vu passer toutes ces discussions sur pas mal de ng anglophones
(où il y a quand même un peu plus d'animation qu'ici), et il y a au
moins un point qui ressort clairement: il n'y a pas de définition
universellement acceptée de ce qu'est un "type" en informatique. Il y a
plusieurs théories, qui se rejoignent sur certains points et divergent
sur d'autre, certaines sont plus "mainstream" que d'autre, mais il n'y
a, je répète, aucun fondement théorique universellement accepté.
Post by Wykaaa
Post by Bruno Desthuilliers
Bref, merci pour le cours pour grand débutant... ça fait plus de 10 ans
que je programme, donc ce genre de définitions de base pour étudiant en
première année, c'est bon, je peux te les sortir moi-même.
C'est la définition d'un type, que tu le veuille ou non et ce n'est pas
une définition que tu dois traiter par le mépris car toute la
littérature sur les fondements des types sont d'accord avec cette
définition.
A tes souhaits.
Post by Wykaaa
Je te conseille de (re)lire "On Understanding Types, Data Abstraction,
and Polymorphism" de Luca Cardelli et Peter Wegner (Computing Survey,
Vol 17, No. 4, Décembre 1985).
(snip)

En cherchant un peu, je pourrais te sortir plusieurs articles au moins
aussi "sérieux" qui contredisent celui ci.

Autre chose ?
Post by Wykaaa
Post by Bruno Desthuilliers
Post by Wykaaa
(l'ensemble des n-uplets autorisés sur les valeurs de ses
attributs).
Dans un langage fonctionnel tel que ML, les fonctions elles-mêmes ont un
type, ce qui permet l'inférence de types.
Merci, je connais ML, et OCaml, et Haskell, et d'autres encore.
Tu les connais mais les as-tu pratiqués ?
Je n'en n'ai hélas pas eu l'occasion (j'entends par là, dans le cadre
d'un projet sérieux et non trivial), mais je te prie de me créditer
d'assez d'intelligence pour être capable de comprendre - d'après ce que
je connais de ces langages et d'autres - ce qu'est l'inférence de type
en théorie et en pratique.
Post by Wykaaa
J'ai écrit un programme de 3000 lignes de ML. C'est un langage
extraordinaire (mon langage favori en fait).
J'ai écrit plusieurs programme de 15000 lignes en Python - qui en aurait
probablement nécessité plus du sextuple en Java. C'est un langage
extraordinaire (Python, je veux dire, pas Java) - mon langage favori en
fait.

Sinon, j'ai aussi écrit un programme de 75000 lignes en "W-langage" (la
parodie de langage de cette parodie d'outil de dev qu'est Windev), et
c'est vraiment un langage de MERDE. Le pire que j'ai jamais eu à subir,
j'en venais, tiens toi bien, à regretter VB. Si si, je te jure.

Autre chose ?
Post by Wykaaa
Post by Bruno Desthuilliers
Post by Wykaaa
Post by Bruno Desthuilliers
Post by Wykaaa
Post by ld
Et en general c'est la que les
choses se compliquent ;-)
Indeed !-)
Comme je disais, donc, c'est là que les choses se compliquent. Quand je
pose des questions comme "qu'est-ce qu'un type", c'est bien parce que je
sais qu'il n'y a *pas* UNE réponse simple et universellement applicable.
Comme dit Laurent, "c'est là que les choses se compliquent".
Non, non, il n'y a rien de compliqué sauf à vouloir faire rentrer des
langages dans l'approche objet alors qu'ils ne sont pas objet, comme
beaucoup de langages d'acteurs et JavaScript en particulier :-)
Autrement dit, il n'y a rien de compliqué à condition d'écarter d'un
revers de main tout ce qui vient contredire ton propos.

Désolé, mais là tu me déçois. Beaucoup. J'attendais mieux de ta part.
Post by Wykaaa
Post by Bruno Desthuilliers
Post by Wykaaa
Post by Bruno Desthuilliers
Post by Wykaaa
Le subtyping permet de particulariser les objets, pas de les étendre.
Les étendre passe par la généricité.
par ailleurs dans ce fil, j'ai vu que Bruno ne tient pas compte de
l'héritage dans l'approche objet, soit.
J'en tiens bien sûr compte - je précisais juste que l'héritage, au
moins dans le sens où il existe comme fonctionnalité de la plupart des
langages objets, n'est pas AMHA un concept *nécessaire* à la
définition de l'OO.
L'héritage est lié au principe de classification (la taxonomie ou
taxinomie). Il permet de regrouper dans une même hiérarchie des
abstractions ayant des caractéristiques communes mais aussi des
particularismes.
Ce qui impliquent entre autres que les caractéristiques en question
soient invariantes - ce qui n'est pas le cas dans certains langages
dynamiques.
On parle de l'approche objet. Si les caractéristiques des objets ne sont
pas invariantes, on ne peut pas définir l'abstraction et on n'est donc
plus dans une approche objet.
Ah bon ? et en vertu de quelles règles ? Chapitre et verset, je te prie ?

Accessoirement, tu viens de décreter qu'aucun langage dynamique n'était
objet, puisqu'une des caractéristiques fondamentales des langages
dynamiques - je dirais même leur définition première et essentielle -
est que les objets sont eux-même dynamiques.

Je pense que ça suffit à disqualifier ta définition de "l'objet". En
fait - comme hélas la majorité des gens -, tu confond "orienté objet" et
"orienté classe".
Post by Wykaaa
Post by Bruno Desthuilliers
Post by Wykaaa
Post by Bruno Desthuilliers
Post by Wykaaa
Mais on a besoin, dans l'approche objet d'une notion de "hiérarchie"
(au sens de relation d'ordre strict partielle entre objets). Il y en
a déjà une, issue des langages non objet, c'est l'agrégation (faible
ou forte, peut importe pour ce qui nous occupe). Dans l'approche
objet "classique", il y a une autre notion de hiérarchie, c'est
l'héritage qui permet le polymorphisme d'héritage
En quoi ce polymorphisme apporte-t'il quoi que ce soit à celui plus
générique déjà offert par la séparation entre message et comportement
? En quoi est-il nécessaire qu'un objet doive "hériter" d'un autre
pour comprendre un sous-ensemble commun de messages ?
Ce n'est pas pour "comprendre" un sous-ensemble commun de messages que
l'héritage existe mais pour identifier une classe d'abstraction ayant
des caractéristiques communes.
Dans ce cas, ce n'est donc pas la classification qui "permet le
polymorphisme d'héritage", comme tu l'écrivais n'est-ce pas, mais le
polymorphisme qui définit la (les) classification(s). Dis voir, tu n'a
pas un peu l'impression d'inverser l'effet et la cause ?-)
Peut-être me suis-je mal exprimé mais il ne faut pas confondre
l'héritage d'un point de vue conceptuel et le "polymorphisme d'héritage"
qui a besoin de quelque chose de plus pour fonctionner (le typage fort
statique ou dynamique);
s/le typage fort statique ou dynamique/le typage statique/

Et encore une fois, tu inverse la cause et l'effet. Le "plymorphisme
d'héritage" est un effet du (ou plus exactement "une restriction imposée
par") le typage statique.
Post by Wykaaa
Post by Bruno Desthuilliers
Post by Wykaaa
Post by Bruno Desthuilliers
Post by Wykaaa
(qui se distingue du polymorphisme "ad'hoc" de type surcharge ou du
polymorphisme universel à la ML). Alors, en remplacement de
l'héritage, certains, dont Bruno, parlent de délégation (c'est plutôt
le vocabulaire des langages d'acteurs que des langages p"purement objet")
La notion de composition/délégation est assez fréquemment évoquée dans
la littérature, et notamment citée comme préférable à l'héritage
d'implémentation dans le GoF.
Je ne parle pas de l'héritage d'implémentation mais de l'héritage au
sens conceptuel du terme. Il est étroitement lié au concept d'abstraction.
L'héritage "au sens conceptuel du terme" - la relation "est un" en
réalité - n'est pas déterminante du polymorphisme mais au contraire
déterminée par lui. Et ce type de classification, dans un système
vraiment "orienté *objet*" - dans le sens où l'abstraction centrale est
l'objet et non la classe, laquelle n'est au mieux qu'un épiphénomène -
est généralement assez flou, voir mouvant (un même objet pouvant changer
de "classe" durant son cycle de vie).
Ce n'est donc plus la même abstraction et, dans une pure approche objet
J'aime bien les gens qui parlent de "vrai langage objet" et de "pure
approche objet" pour signifier "selon ma définition à moi de l'objet que
c'est la seule vraie même si ça contredit la moitié de la littérature
sur le sujet".
Post by Wykaaa
on ne peut donc pas dire qu'il s'agit du même objet.
Ah bon, pourquoi ?
Post by Wykaaa
Il doit être
"re-créé" comme instance d'une autre classe.
Ah bon, pourquoi ?

Outre le fait que les notions d'"instance" et de "classe" sont
particulières à un sous-ensemble des langages objets - ces notions
n'existent pas dans les langages à prototype -, le fait pour un objet de
changer radicalement de comportement selon son état n'est pas une
nouveauté, loin s'en faut. Tu a déjà entendu parler du pattern "State" ?
Post by Wykaaa
Post by Bruno Desthuilliers
De ce point de vue là, ni la notion de classe ni la notion d'héritage ne
sont fondamentales de l'approche *objet*.
Ben si.
Bin non. Ces notions sont centrales dans le modèle objet dominant -
celui de, entre autres, Java et C++ (et donc d'UML etc) - mais, dois-je
le rappeler, n'existent pas dans certains langages objet, et ne sont que
des épiphénomènes. Au risque de me répéter, on parle d'orienté *objet*,
pas d'"orienté classe".
Post by Wykaaa
Post by Bruno Desthuilliers
Post by Wykaaa
Post by Bruno Desthuilliers
Post by Wykaaa
mais cette délégation doit tout de même respecter la notion de
hiérarchie sur les objets
Ah bon ? Et pourquoi donc ?
Par rapport à ce que j'ai dit ci-dessus
Faudra trouver autre chose alors.
Post by Wykaaa
Post by Bruno Desthuilliers
Post by Wykaaa
Post by Bruno Desthuilliers
Post by Wykaaa
(on ne délègue pas à n'importe quel objet, n'importe comment).
Du moment que l'objet auquel on délègue comprend les messages qu'on
lui envoie, je ne vois pas où est le problème.
Je comprends pourquoi tu n'est pas "pour" l'encapsulation.
Mais si, bien au contraire.
Post by Wykaaa
La délégation
pure peut conduire aux pires dérivent concernant la sûreté de
fonctionnement.
Mauvaise nouvelle : Y a pas de balle en argent.
De ce point de vue là, aucun système de type connu ne garanti à lui seul
la correction du programme. Ce n'est pas parce qu'un objet est
effectivement une instance d'un sous-type de XXX que son comportement en
réponse au message YYY est celui attendu.
Je suis d'accord mais au moins, on conserve la cohérence des types,
D'un point de vue formel uniquement. Si je définis une sous-classe de
File dont la méthode "write" envoie des mails d'insultes à tout ton
carnet d'adresse avant d'effacer ton disque dur, je ne suis pas sûr que
"cohérence des types" soit vraiment le terme adapté. Le fait que ce soit
techniqument une sous-classe de File nous fait une belle jambe...
Post by Wykaaa
ce
qui réduit les erreurs potentiels sur les actions associés aux objets
Il n'y a pas d'"actions associées aux objets", il y a des objets
auxquels on envoie des messages, à eu d'en faire ce que bon leur semble
- même éventuellement de lever la main en disant "j'ai pas compris". Si
tu ne comprends pas ça, tu ne comprend pas *le* principe fondamental de
la POO, celui qui fonde Smalltalk.

Hé, moi aussi je peux asséner des grandes vérités et dire à l'autre
qu'il a rien compris simplement parce qu'il n'est pas d'accord avec moi.

Sérieusement, tu ne crois pas que plus cette discussion
s'enlise^Mavance, plus ça illustre bien mon propos premier, qui est
qu'il n'y a aucune définition théorique formelle *sérieuse et
universelle* de la POO ? Tout ça, c'est de la soupe aux cailloux... d'un
côté comme de l'autre, hein - tu a raison selon *ta* définition, j'ai
raison selon la mienne, nos définitions valent chacune ce qu'elles
valent, là n'est pas le problème, simplement elles sont incompatibles.
La seule conclusion *sérieuse* qu'on peut en tirer, c'est qu'aucune des
deux "définitions" n'a la moindre valeur scientifique (contrairement à
la théorie relationnelle, par example, qui est très clairement et
mathématiquement définie).
Post by Wykaaa
(et ce, dès la compilation pour les langages à typage statique mais on
ne va pas rouvrir ce débat là... dont on a déjà longuement débattu dans
le passé)
oh bin au moins ça aide à passer les longues soirées d'hiver. Dommage
qu'on ne puisse pas en profiter pour partager une bonne bouteille en
regardant le feu !-p
Post by Wykaaa
Post by Bruno Desthuilliers
Post by Wykaaa
Post by Bruno Desthuilliers
Post by Wykaaa
La délégation ne peut se faire correctement qu'en respectant cette
notion d'ordre strict entre les objets, objets de la délégation.
On a déjà eu l'occasion de comparer nos points de vues et approches du
génie logiciel - et les raisons (notamment contextuelle) pour
lesquelles ces points de vues et approches diffèrent sensiblement. En
ce qui me concerne - et même si je peux comprendre son intérêt de ton
point de vue - cette "notion d'ordre strict" n'est (AMHA etc...) pas
absolument (voire absolument pas) nécessaire, et parfois (voire
souvent) tout simplement nuisible.
Elle est nuisible uniquement quand on souhaite que les objets puissent
changer de nature dynamiquement
Non. Elle est nuisible en ce qu'elle impose des contraintes inutiles qui
ne font qu'ajouter de la complexité accidentelle sans rien garantir
quand à la correction du programme.
La correction de programme n'est effectivement pas garantie "que" par le
typage et la notion de hiérarchie. Ca se saurait et nous n'aurions pas à
débattre mais je t'affirme qu'un programme de 3000 lignes de ML qui
passe le contrôle de type a beaucoup moins de chance d'être erroné qu'un
programme écrit, par exemple, en C.
Qui est un langage à typage statique déclaratif. Et pas spécialement OO,
accessoirement. Pas plus que ML, d'ailleurs, qui reste quand même un
langage fonctionnel. Quoique, les fermetures et les objets, somme
toutes, y a quand même quelques points communs !-)
Post by Wykaaa
Post by Bruno Desthuilliers
Post by Wykaaa
mais ceci conduit souvent à ce que les
objets ne soient plus intègrent ce qui peut nuire à la fiabilité du
logiciel et complique le style de programmation dit "sure" (safe
programming)
Désolé, mais je ne crois tout simplement pas qu'empiler des contraintes
résolve le problème. Crois moi, s'il suffisait de déclarer trois fois le
type d'une variable pour avoir la certitude absolue que mon programme
soit correct, je m'y plierais volontier.
Tu exagères en résumant de cette façon le typage...
Je n'exagère pas en résumant de cette façon la faillite du typage
statique déclaratif, spécialement dans le cadre d'une approche objet.

Pour le reste, je suis content que tu remarques - enfin -que j'exagère.
J'ai cru un moment que ça t'échappait.
Post by Wykaaa
Post by Bruno Desthuilliers
La réalité est que *ça ne
marche pas* - et non seulement ça ne marche pas, mais en plus ça
augmente de façon considérable la complexité du code, ce qui est *en
soi* une source d'erreurs.
Si tu crois que ça augmente la complexité du code sans raison, c'est que
tu as "mal" pratiqué cette approche
Bin voyons. Cet argument là, mon garçon, il est un peu facile. Je me
permets certes de te taquiner, mais pas de te prendre pour un crétin, et
je te serais reconnaissant de me créditer d'un minimum d'intelligence.
Post by Wykaaa
car je n'y ai vu, pour ma part, que
des simplifications.
Ah bin oui, c'est évident. Désolé, je ne sais pas comment j'ai fait pour
ne pas me rendre compte plus tôt qu'écrire 250 lignes de boilerplate
juste pour faire plaisir au compilateur alors que mon objet, en
pratique, supportait *déjà* toutes les conditions requises
(explicitement requises - par la documentation) pour être utilisé dans
tel cas de figure. Franchement, là, je me demande.
Post by Wykaaa
Post by Bruno Desthuilliers
Accessoirement, parmi les systèmes informatiques les plus fiables à
l'heure actuelle, certains sont implémentés dans un langage non
seulement dynamique, mais qui décourage explicitement la programmation
"défensive" (je pense bien sûr à Erlang). A mon très humble avis, il y a
là quelque chose à apprendre.
Mais Erlang n'est pas un langage objet.
Non. Encore que...
Post by Wykaaa
C'est plutôt un langage
fonctionnel d'acteur.
C'est toi le spécialiste des classifications et taxonomies, n'est-ce
pas. Pour ma part, tant que ça fait le boulot...
Post by Wykaaa
Ici nous parlons de ce qui caractérise l'approche
objet. Erlang (qui est par ailleurs un très bon langage) n'a rien à
faire dans cette discussion.
Pourquoi ? Parce que ça contredit tes propos sur la nécessité du codage
défensif ?
Post by Wykaaa
Post by Bruno Desthuilliers
Post by Wykaaa
Post by Bruno Desthuilliers
En tout état de cause, je ne vois pas en quoi cette notion est
constitutive de l'OO - même si elle constitutive du modèle objet
dominant, avec pour résultat tout un (célèbre) livre de recettes dont
le but principal est de contourner les limitations imposées par ce
modèle !-)
Ceci est une autre discussion car je ne suis pas certain que les auteurs
du livre en question aient tenu compte de tous les aspects de l'OO.
Non, en effet - la majorité des recettes en question résolvent des
problèmes spécifiques au modèle C++/Java, et n'ont que peu de sens dans
un langage dynamique. Mais ce n'est certainement pas ce à quoi tu
pensais, et ça prouve bien qu'il y a presque autant d'approches de l'OO
que d'implémentations.
Non conceptuellement, l'approche objet est quelque chose de précis.
Mon cul sur la commode.
Post by Wykaaa
La
confusion est entretenue par certains courants qui veulent se rattacher
à l'objet tout en le détournant.
Ah, les affreux hérétiques, brûlons les vif. Et qu'importe s'il ne font
que nous citer les enseignement du prophète.
Post by Wykaaa
La preuve dans cette discussion.
Pour moi, tout ce que cette discussion prouve, c'est que *tu* penses
qu'il y a réellement *une* définition *précise et universelle* de l'OO.
Bon, t'es un peu tout seul à le penser, mais c'est pas grave, hein...
Post by Wykaaa
Post by Bruno Desthuilliers
Post by Wykaaa
Post by Bruno Desthuilliers
PS : avant de vous précipiter sur vos claviers, n'oubliez pas que je
suis un joyeux troll !-)))
Faute avouée, à moitié pardonnée :-))
Mais ce n'est pas une faute !!! C'est une immense qualité, que je
revendique haut et fort !!!
Alors moi aussi :-)
DansMesBras(tm) !-)
Wykaaa
2009-11-14 11:37:35 UTC
Permalink
Post by Bruno Desthuilliers
(snip)
Post by Wykaaa
Post by Bruno Desthuilliers
Post by Wykaaa
Post by Bruno Desthuilliers
Ce qui implique pour commencer une notion de type. Quel est le type
d'un objet dans un langage à prototype ? Et même, pour commencer,
qu'est-ce qu'un type ?-)
Un type définit un ensemble de "valeurs" et d'opérations autorisées sur
ces valeurs. Les valeurs d'un objet sont en fait l'ensemble de ses états
autorisés
A tu conscience que dans un langage comme javascript, ce que tu dis n'a
aucun sens ?
var obj = {foo: 42, bar: "allo"};
quel est le "type" de cet objet selon ta définition ?
obj.foo = "whatever";
obj.yadda = function(x) { return this.foo + x; }
Et maintenant ?
Attention, tous les langages ne supportent pas la définition de types
utilisateur.
T'a vu un utilisateur ???
Post by Wykaaa
Qui a dit que JavaScript était un langage objet?
D'abord, c'est javascript, pas "JavaScript". Ensuite, javascript permet
de créer des objets définis par une identité, un état et un
comportement, et commnuniquants par envoi de messages. Donc javascript
est un langage objet, CQFD.
Non pas du tout (voir la fin de mon autre post)
Post by Bruno Desthuilliers
Accessoirement, à part David Flanagan et toi, tout le monde s'accorde à
définir javascript comme un langage objet à prototype - et
accessoirement le seul langage à prototype universellement connu et utilisé.
javascript est un très bon langage dont beaucoup n'avaient pas vu toute
la puissance (jusqu'à Ajax, et encore...) mais ce n'est pas un langage
objet (et je suis d'accord avec David Flanagan)
Post by Bruno Desthuilliers
Post by Wykaaa
Qui a dit que JavaScript permettait de définir des types ?
En fonction de quelle définition du terme "type" ?
Je l'ai déjà donnée par ailleurs.
Post by Bruno Desthuilliers
Post by Wykaaa
Certainement pas moi. JavaScript n'est pas un langage objet
Bin si.
Post by Wykaaa
(il en a
juste certaines caractéristiques).
Il en a toutes les caractéristiques, sauf si on considère que les
messages eux même doivent être des objets, auquel cas seuls Smalltalk et
Self sont des langages objets.
Non il lui manque d'autres choses comme les contrôles d'accès
Post by Bruno Desthuilliers
Post by Wykaaa
JavaScript est plutôt un langage
d'acteur non objet.
A tes souhaits.
Post by Wykaaa
Il est donc normal que la définition de ce qu'est un type ne s'applique
pas à JavaScript qui n'est pas un langage vraiment typé.
Pour quelle définition de "type" ?
Je l'ai déjà donnée par ailleurs.
Post by Bruno Desthuilliers
J'ai déjà vu passer toutes ces discussions sur pas mal de ng anglophones
(où il y a quand même un peu plus d'animation qu'ici), et il y a au
moins un point qui ressort clairement: il n'y a pas de définition
universellement acceptée de ce qu'est un "type" en informatique. Il y a
plusieurs théories, qui se rejoignent sur certains points et divergent
sur d'autre, certaines sont plus "mainstream" que d'autre, mais il n'y
a, je répète, aucun fondement théorique universellement accepté.
Ce que je connais de mieux (J. Reynolds) mais je ne connais pas tout :
- 1983, “Types, Abstraction and Parametric Polymorphism” IFIP Congress,
Paris, 513–523.
- 1985, “Three approaches to type structure. Mathematical foundations of
software development,”, in Lecture Notes in Comput. Sci., 185, Springer,
Berlin, 97–138
Post by Bruno Desthuilliers
Post by Wykaaa
Post by Bruno Desthuilliers
Bref, merci pour le cours pour grand débutant... ça fait plus de 10 ans
que je programme, donc ce genre de définitions de base pour étudiant en
première année, c'est bon, je peux te les sortir moi-même.
C'est la définition d'un type, que tu le veuille ou non et ce n'est pas
une définition que tu dois traiter par le mépris car toute la
littérature sur les fondements des types sont d'accord avec cette
définition.
A tes souhaits.
Post by Wykaaa
Je te conseille de (re)lire "On Understanding Types, Data Abstraction,
and Polymorphism" de Luca Cardelli et Peter Wegner (Computing Survey,
Vol 17, No. 4, Décembre 1985).
(snip)
En cherchant un peu, je pourrais te sortir plusieurs articles au moins
aussi "sérieux" qui contredisent celui ci.
Et bien cherche...
Post by Bruno Desthuilliers
Autre chose ?
Post by Wykaaa
Post by Bruno Desthuilliers
Post by Wykaaa
(l'ensemble des n-uplets autorisés sur les valeurs de ses
attributs).
Dans un langage fonctionnel tel que ML, les fonctions elles-mêmes ont un
type, ce qui permet l'inférence de types.
Merci, je connais ML, et OCaml, et Haskell, et d'autres encore.
Tu les connais mais les as-tu pratiqués ?
Je n'en n'ai hélas pas eu l'occasion (j'entends par là, dans le cadre
d'un projet sérieux et non trivial), mais je te prie de me créditer
d'assez d'intelligence pour être capable de comprendre - d'après ce que
je connais de ces langages et d'autres - ce qu'est l'inférence de type
en théorie et en pratique.
Mais je n'en doute pas. Ce n'était pas une question piège.
Post by Bruno Desthuilliers
Post by Wykaaa
J'ai écrit un programme de 3000 lignes de ML. C'est un langage
extraordinaire (mon langage favori en fait).
J'ai écrit plusieurs programme de 15000 lignes en Python - qui en aurait
probablement nécessité plus du sextuple en Java. C'est un langage
extraordinaire (Python, je veux dire, pas Java) - mon langage favori en
fait.
Alors 1 partout.
Post by Bruno Desthuilliers
Sinon, j'ai aussi écrit un programme de 75000 lignes en "W-langage" (la
parodie de langage de cette parodie d'outil de dev qu'est Windev), et
c'est vraiment un langage de MERDE. Le pire que j'ai jamais eu à subir,
j'en venais, tiens toi bien, à regretter VB. Si si, je te jure.
Je pense que Windev bat tous les records des environnements de
développement débiles.
Il n'y a pas de mot assez fort pour le qualifier.
Post by Bruno Desthuilliers
Autre chose ?
Post by Wykaaa
Post by Bruno Desthuilliers
Post by Wykaaa
Post by Bruno Desthuilliers
Post by Wykaaa
Post by ld
Et en general c'est la que les
choses se compliquent ;-)
Indeed !-)
Comme je disais, donc, c'est là que les choses se compliquent. Quand je
pose des questions comme "qu'est-ce qu'un type", c'est bien parce que je
sais qu'il n'y a *pas* UNE réponse simple et universellement applicable.
Comme dit Laurent, "c'est là que les choses se compliquent".
Non, non, il n'y a rien de compliqué sauf à vouloir faire rentrer des
langages dans l'approche objet alors qu'ils ne sont pas objet, comme
beaucoup de langages d'acteurs et JavaScript en particulier :-)
Autrement dit, il n'y a rien de compliqué à condition d'écarter d'un
revers de main tout ce qui vient contredire ton propos.
Ce ne sont pas "mes" propos mes ceux des experts de tous ces domaines :
Grady Booch, Reynolds, Barbara Liskov, etc.
Post by Bruno Desthuilliers
Désolé, mais là tu me déçois. Beaucoup. J'attendais mieux de ta part.
Bouh :-((
Post by Bruno Desthuilliers
Post by Wykaaa
Post by Bruno Desthuilliers
Post by Wykaaa
Post by Bruno Desthuilliers
Post by Wykaaa
Le subtyping permet de particulariser les objets, pas de les étendre.
Les étendre passe par la généricité.
par ailleurs dans ce fil, j'ai vu que Bruno ne tient pas compte de
l'héritage dans l'approche objet, soit.
J'en tiens bien sûr compte - je précisais juste que l'héritage, au
moins dans le sens où il existe comme fonctionnalité de la plupart des
langages objets, n'est pas AMHA un concept *nécessaire* à la
définition de l'OO.
L'héritage est lié au principe de classification (la taxonomie ou
taxinomie). Il permet de regrouper dans une même hiérarchie des
abstractions ayant des caractéristiques communes mais aussi des
particularismes.
Ce qui impliquent entre autres que les caractéristiques en question
soient invariantes - ce qui n'est pas le cas dans certains langages
dynamiques.
On parle de l'approche objet. Si les caractéristiques des objets ne sont
pas invariantes, on ne peut pas définir l'abstraction et on n'est donc
plus dans une approche objet.
Ah bon ? et en vertu de quelles règles ? Chapitre et verset, je te prie ?
Grady Booch, par exemple.
Post by Bruno Desthuilliers
Accessoirement, tu viens de décreter qu'aucun langage dynamique n'était
objet, puisqu'une des caractéristiques fondamentales des langages
dynamiques - je dirais même leur définition première et essentielle -
est que les objets sont eux-même dynamiques.
Je ne sais pas ce qu'est un langage dynamique. Je sais ce qu'est le
typage dynamique. Je ne sais pas ce qu'est un objet dynamique. Je
connais seulement les objets passifs et les objets actifs (ceux qui
contiennent leur propre processus)
Post by Bruno Desthuilliers
Je pense que ça suffit à disqualifier ta définition de "l'objet". En
fait - comme hélas la majorité des gens -, tu confond "orienté objet" et
"orienté classe".
Non, la classe est un moyen de dénoter une abstraction. Il y a peut-être
d'autres moyens mais celui-ci me semble le meilleur dans l'approche OO.

J'en profite pour rappeler que "objet" n'a pas le même sens dans les
locutions "conception objet" et "programmation objet". Dans le premier
cas, objet signifie abstraction (donc la plupart du temps "classe", dans
le second il signifie "instance de classe").
Post by Bruno Desthuilliers
Post by Wykaaa
Post by Bruno Desthuilliers
Post by Wykaaa
Post by Bruno Desthuilliers
Post by Wykaaa
Mais on a besoin, dans l'approche objet d'une notion de "hiérarchie"
(au sens de relation d'ordre strict partielle entre objets). Il y en
a déjà une, issue des langages non objet, c'est l'agrégation (faible
ou forte, peut importe pour ce qui nous occupe). Dans l'approche
objet "classique", il y a une autre notion de hiérarchie, c'est
l'héritage qui permet le polymorphisme d'héritage
En quoi ce polymorphisme apporte-t'il quoi que ce soit à celui plus
générique déjà offert par la séparation entre message et comportement
? En quoi est-il nécessaire qu'un objet doive "hériter" d'un autre
pour comprendre un sous-ensemble commun de messages ?
Ce n'est pas pour "comprendre" un sous-ensemble commun de messages que
l'héritage existe mais pour identifier une classe d'abstraction ayant
des caractéristiques communes.
Dans ce cas, ce n'est donc pas la classification qui "permet le
polymorphisme d'héritage", comme tu l'écrivais n'est-ce pas, mais le
polymorphisme qui définit la (les) classification(s). Dis voir, tu n'a
pas un peu l'impression d'inverser l'effet et la cause ?-)
Peut-être me suis-je mal exprimé mais il ne faut pas confondre
l'héritage d'un point de vue conceptuel et le "polymorphisme d'héritage"
qui a besoin de quelque chose de plus pour fonctionner (le typage fort
statique ou dynamique);
s/le typage fort statique ou dynamique/le typage statique/
Absolument pas. Il y a heureusement des langages à typage fort dynamique.
Post by Bruno Desthuilliers
Et encore une fois, tu inverse la cause et l'effet. Le "plymorphisme
d'héritage" est un effet du (ou plus exactement "une restriction imposée
par") le typage statique.
Le polymorphisme d'héritage découle de l'héritage et du typage fort
statique ou dynamique.
Post by Bruno Desthuilliers
Post by Wykaaa
Post by Bruno Desthuilliers
Post by Wykaaa
Post by Bruno Desthuilliers
Post by Wykaaa
(qui se distingue du polymorphisme "ad'hoc" de type surcharge ou du
polymorphisme universel à la ML). Alors, en remplacement de
l'héritage, certains, dont Bruno, parlent de délégation (c'est plutôt
le vocabulaire des langages d'acteurs que des langages p"purement objet")
La notion de composition/délégation est assez fréquemment évoquée dans
la littérature, et notamment citée comme préférable à l'héritage
d'implémentation dans le GoF.
Je ne parle pas de l'héritage d'implémentation mais de l'héritage au
sens conceptuel du terme. Il est étroitement lié au concept d'abstraction.
L'héritage "au sens conceptuel du terme" - la relation "est un" en
réalité - n'est pas déterminante du polymorphisme mais au contraire
déterminée par lui. Et ce type de classification, dans un système
vraiment "orienté *objet*" - dans le sens où l'abstraction centrale est
l'objet et non la classe, laquelle n'est au mieux qu'un épiphénomène -
est généralement assez flou, voir mouvant (un même objet pouvant changer
de "classe" durant son cycle de vie).
Ce n'est donc plus la même abstraction et, dans une pure approche objet
J'aime bien les gens qui parlent de "vrai langage objet" et de "pure
approche objet" pour signifier "selon ma définition à moi de l'objet que
c'est la seule vraie même si ça contredit la moitié de la littérature
sur le sujet".
<troll>
La moitié de la littérature que ça contredit n'a pas d'importance car
elle a été écrite par des gens qui n'y comprennent rien de toute façon
et qui ne connaissent pas les fondements : SIMULA et les écrits de Grady
Booch et Ivar Jacobson
</troll>
Post by Bruno Desthuilliers
Post by Wykaaa
on ne peut donc pas dire qu'il s'agit du même objet.
Ah bon, pourquoi ?
S'il n'y a pas d'invariant.
Tes empreintes digitales ne varient pas.
Post by Bruno Desthuilliers
Post by Wykaaa
Il doit être
"re-créé" comme instance d'une autre classe.
Ah bon, pourquoi ?
Parce qu'il a changé de nature. Il a une nouvelle "identité".
Post by Bruno Desthuilliers
Outre le fait que les notions d'"instance" et de "classe" sont
particulières à un sous-ensemble des langages objets - ces notions
n'existent pas dans les langages à prototype -, le fait pour un objet de
changer radicalement de comportement selon son état n'est pas une
nouveauté, loin s'en faut. Tu a déjà entendu parler du pattern "State" ?
Oui, je connais tout ça par coeur et les arguments aussi. Mais mettre
dans le "même sac" tous les langages à prototype et les langages à objet
n'est pas d'une grande rigueur et permet tous les amalgames...
Post by Bruno Desthuilliers
Post by Wykaaa
Post by Bruno Desthuilliers
De ce point de vue là, ni la notion de classe ni la notion d'héritage ne
sont fondamentales de l'approche *objet*.
Ben si.
Bin non. Ces notions sont centrales dans le modèle objet dominant -
celui de, entre autres, Java et C++ (et donc d'UML etc) - mais, dois-je
le rappeler, n'existent pas dans certains langages objet, et ne sont que
des épiphénomènes. Au risque de me répéter, on parle d'orienté *objet*,
pas d'"orienté classe".
Les langages dans l'esquels ces notions n'existent pas ne sont pas des
langages objet. Point barre.
Post by Bruno Desthuilliers
Post by Wykaaa
Post by Bruno Desthuilliers
Post by Wykaaa
Post by Bruno Desthuilliers
Post by Wykaaa
mais cette délégation doit tout de même respecter la notion de
hiérarchie sur les objets
Ah bon ? Et pourquoi donc ?
Par rapport à ce que j'ai dit ci-dessus
Faudra trouver autre chose alors.
Post by Wykaaa
Post by Bruno Desthuilliers
Post by Wykaaa
Post by Bruno Desthuilliers
Post by Wykaaa
(on ne délègue pas à n'importe quel objet, n'importe comment).
Du moment que l'objet auquel on délègue comprend les messages qu'on
lui envoie, je ne vois pas où est le problème.
Je comprends pourquoi tu n'est pas "pour" l'encapsulation.
Mais si, bien au contraire.
Post by Wykaaa
La délégation
pure peut conduire aux pires dérivent concernant la sûreté de
fonctionnement.
Mauvaise nouvelle : Y a pas de balle en argent.
De ce point de vue là, aucun système de type connu ne garanti à lui seul
la correction du programme. Ce n'est pas parce qu'un objet est
effectivement une instance d'un sous-type de XXX que son comportement en
réponse au message YYY est celui attendu.
Je suis d'accord mais au moins, on conserve la cohérence des types,
D'un point de vue formel uniquement. Si je définis une sous-classe de
File dont la méthode "write" envoie des mails d'insultes à tout ton
carnet d'adresse avant d'effacer ton disque dur, je ne suis pas sûr que
"cohérence des types" soit vraiment le terme adapté. Le fait que ce soit
techniqument une sous-classe de File nous fait une belle jambe...
On peut en dire autant sur tous les langages, à ce compte là. Si je ne
respecte pas le cahier des charges...
Post by Bruno Desthuilliers
Post by Wykaaa
ce
qui réduit les erreurs potentiels sur les actions associés aux objets
Il n'y a pas d'"actions associées aux objets", il y a des objets
auxquels on envoie des messages, à eu d'en faire ce que bon leur semble
- même éventuellement de lever la main en disant "j'ai pas compris". Si
tu ne comprends pas ça, tu ne comprend pas *le* principe fondamental de
la POO, celui qui fonde Smalltalk.
J'aurais dû dire : qui réduit les erreurs potentielles (2 l e !) sur le
comportement des objets en réponse aux messages.
Post by Bruno Desthuilliers
Hé, moi aussi je peux asséner des grandes vérités et dire à l'autre
qu'il a rien compris simplement parce qu'il n'est pas d'accord avec moi.
Sérieusement, tu ne crois pas que plus cette discussion
s'enlise^Mavance, plus ça illustre bien mon propos premier, qui est
qu'il n'y a aucune définition théorique formelle *sérieuse et
universelle* de la POO ? Tout ça, c'est de la soupe aux cailloux... d'un
côté comme de l'autre, hein - tu a raison selon *ta* définition, j'ai
raison selon la mienne, nos définitions valent chacune ce qu'elles
valent, là n'est pas le problème, simplement elles sont incompatibles.
La seule conclusion *sérieuse* qu'on peut en tirer, c'est qu'aucune des
deux "définitions" n'a la moindre valeur scientifique (contrairement à
la théorie relationnelle, par example, qui est très clairement et
mathématiquement définie).
Non, il y a des écrits tout à fait sérieux sur la POO, les types, etc.
et j'en ai cité quelques-uns. IL y en a beaucoup d'autres.
Post by Bruno Desthuilliers
Post by Wykaaa
(et ce, dès la compilation pour les langages à typage statique mais on
ne va pas rouvrir ce débat là... dont on a déjà longuement débattu dans
le passé)
oh bin au moins ça aide à passer les longues soirées d'hiver. Dommage
qu'on ne puisse pas en profiter pour partager une bonne bouteille en
regardant le feu !-p
Ben chiche. On pourrait peut-être le faire.
Post by Bruno Desthuilliers
Post by Wykaaa
Post by Bruno Desthuilliers
Post by Wykaaa
Post by Bruno Desthuilliers
Post by Wykaaa
La délégation ne peut se faire correctement qu'en respectant cette
notion d'ordre strict entre les objets, objets de la délégation.
On a déjà eu l'occasion de comparer nos points de vues et approches du
génie logiciel - et les raisons (notamment contextuelle) pour
lesquelles ces points de vues et approches diffèrent sensiblement. En
ce qui me concerne - et même si je peux comprendre son intérêt de ton
point de vue - cette "notion d'ordre strict" n'est (AMHA etc...) pas
absolument (voire absolument pas) nécessaire, et parfois (voire
souvent) tout simplement nuisible.
Elle est nuisible uniquement quand on souhaite que les objets puissent
changer de nature dynamiquement
Non. Elle est nuisible en ce qu'elle impose des contraintes inutiles qui
ne font qu'ajouter de la complexité accidentelle sans rien garantir
quand à la correction du programme.
La correction de programme n'est effectivement pas garantie "que" par le
typage et la notion de hiérarchie. Ca se saurait et nous n'aurions pas à
débattre mais je t'affirme qu'un programme de 3000 lignes de ML qui
passe le contrôle de type a beaucoup moins de chance d'être erroné qu'un
programme écrit, par exemple, en C.
Qui est un langage à typage statique déclaratif. Et pas spécialement OO,
accessoirement. Pas plus que ML, d'ailleurs, qui reste quand même un
langage fonctionnel. Quoique, les fermetures et les objets, somme
toutes, y a quand même quelques points communs !-)
J'avais pris C à dessein.
Post by Bruno Desthuilliers
Post by Wykaaa
Post by Bruno Desthuilliers
Post by Wykaaa
mais ceci conduit souvent à ce que les
objets ne soient plus intègrent ce qui peut nuire à la fiabilité du
logiciel et complique le style de programmation dit "sure" (safe
programming)
Désolé, mais je ne crois tout simplement pas qu'empiler des contraintes
résolve le problème. Crois moi, s'il suffisait de déclarer trois fois le
type d'une variable pour avoir la certitude absolue que mon programme
soit correct, je m'y plierais volontier.
Tu exagères en résumant de cette façon le typage...
Je n'exagère pas en résumant de cette façon la faillite du typage
statique déclaratif, spécialement dans le cadre d'une approche objet.
Pour le reste, je suis content que tu remarques - enfin -que j'exagère.
J'ai cru un moment que ça t'échappait.
Bien sûr que non et je suis sûr que sur la philosophie (c'est un grand
mot) de développement logiciel, en général, nous avons énormément de
points d'accord.
Post by Bruno Desthuilliers
Post by Wykaaa
Post by Bruno Desthuilliers
La réalité est que *ça ne
marche pas* - et non seulement ça ne marche pas, mais en plus ça
augmente de façon considérable la complexité du code, ce qui est *en
soi* une source d'erreurs.
Si tu crois que ça augmente la complexité du code sans raison, c'est que
tu as "mal" pratiqué cette approche
Bin voyons. Cet argument là, mon garçon, il est un peu facile. Je me
permets certes de te taquiner, mais pas de te prendre pour un crétin, et
je te serais reconnaissant de me créditer d'un minimum d'intelligence.
J'avais mis "mal" entre guillemets pour ne pas froisser ta
susceptibilité ;-)
Post by Bruno Desthuilliers
Post by Wykaaa
car je n'y ai vu, pour ma part, que
des simplifications.
Ah bin oui, c'est évident. Désolé, je ne sais pas comment j'ai fait pour
ne pas me rendre compte plus tôt qu'écrire 250 lignes de boilerplate
juste pour faire plaisir au compilateur alors que mon objet, en
pratique, supportait *déjà* toutes les conditions requises
(explicitement requises - par la documentation) pour être utilisé dans
tel cas de figure. Franchement, là, je me demande.
Peut-être que 2 vérifications valent mieux qu'une ?
Post by Bruno Desthuilliers
Post by Wykaaa
Post by Bruno Desthuilliers
Accessoirement, parmi les systèmes informatiques les plus fiables à
l'heure actuelle, certains sont implémentés dans un langage non
seulement dynamique, mais qui décourage explicitement la programmation
"défensive" (je pense bien sûr à Erlang). A mon très humble avis, il y a
là quelque chose à apprendre.
Mais Erlang n'est pas un langage objet.
Non. Encore que...
Post by Wykaaa
C'est plutôt un langage
fonctionnel d'acteur.
C'est toi le spécialiste des classifications et taxonomies, n'est-ce
pas. Pour ma part, tant que ça fait le boulot...
Oui mais pas n'importe comment !
Post by Bruno Desthuilliers
Post by Wykaaa
Ici nous parlons de ce qui caractérise l'approche
objet. Erlang (qui est par ailleurs un très bon langage) n'a rien à
faire dans cette discussion.
Pourquoi ? Parce que ça contredit tes propos sur la nécessité du codage
défensif ?
Je n'ai jamais dit que l'approche objet était nécessaire pour mettre en
oeuvre la programmation défensive.
Post by Bruno Desthuilliers
Post by Wykaaa
Post by Bruno Desthuilliers
Post by Wykaaa
Post by Bruno Desthuilliers
En tout état de cause, je ne vois pas en quoi cette notion est
constitutive de l'OO - même si elle constitutive du modèle objet
dominant, avec pour résultat tout un (célèbre) livre de recettes dont
le but principal est de contourner les limitations imposées par ce
modèle !-)
Ceci est une autre discussion car je ne suis pas certain que les auteurs
du livre en question aient tenu compte de tous les aspects de l'OO.
Non, en effet - la majorité des recettes en question résolvent des
problèmes spécifiques au modèle C++/Java, et n'ont que peu de sens dans
un langage dynamique. Mais ce n'est certainement pas ce à quoi tu
pensais, et ça prouve bien qu'il y a presque autant d'approches de l'OO
que d'implémentations.
Non conceptuellement, l'approche objet est quelque chose de précis.
Mon cul sur la commode.
Post by Wykaaa
La
confusion est entretenue par certains courants qui veulent se rattacher
à l'objet tout en le détournant.
Ah, les affreux hérétiques, brûlons les vif. Et qu'importe s'il ne font
que nous citer les enseignement du prophète.
Non, ça s'appelle "noyer le poisson".
Post by Bruno Desthuilliers
Post by Wykaaa
La preuve dans cette discussion.
Pour moi, tout ce que cette discussion prouve, c'est que *tu* penses
qu'il y a réellement *une* définition *précise et universelle* de l'OO.
Bon, t'es un peu tout seul à le penser, mais c'est pas grave, hein...
Je ne suis pas le seul, loin de là.
Veux-tu une bibliographie exhaustive ?
Ca va me prendre un peu de temps :-)
Post by Bruno Desthuilliers
Post by Wykaaa
Post by Bruno Desthuilliers
Post by Wykaaa
Post by Bruno Desthuilliers
PS : avant de vous précipiter sur vos claviers, n'oubliez pas que je
suis un joyeux troll !-)))
Faute avouée, à moitié pardonnée :-))
Mais ce n'est pas une faute !!! C'est une immense qualité, que je
revendique haut et fort !!!
Alors moi aussi :-)
DansMesBras(tm) !-)
Bruno Desthuilliers
2009-11-14 22:44:04 UTC
Permalink
Post by Wykaaa
Post by Bruno Desthuilliers
(snip)
Post by Wykaaa
Post by Bruno Desthuilliers
Post by Wykaaa
Post by Bruno Desthuilliers
Ce qui implique pour commencer une notion de type. Quel est le type
d'un objet dans un langage à prototype ? Et même, pour commencer,
qu'est-ce qu'un type ?-)
Un type définit un ensemble de "valeurs" et d'opérations autorisées sur
ces valeurs. Les valeurs d'un objet sont en fait l'ensemble de ses états
autorisés
A tu conscience que dans un langage comme javascript, ce que tu dis n'a
aucun sens ?
var obj = {foo: 42, bar: "allo"};
quel est le "type" de cet objet selon ta définition ?
obj.foo = "whatever";
obj.yadda = function(x) { return this.foo + x; }
Et maintenant ?
Attention, tous les langages ne supportent pas la définition de types
utilisateur.
T'a vu un utilisateur ???
Post by Wykaaa
Qui a dit que JavaScript était un langage objet?
D'abord, c'est javascript, pas "JavaScript". Ensuite, javascript permet
de créer des objets définis par une identité, un état et un
comportement, et commnuniquants par envoi de messages. Donc javascript
est un langage objet, CQFD.
Non pas du tout (voir la fin de mon autre post)
Post by Bruno Desthuilliers
Accessoirement, à part David Flanagan et toi, tout le monde s'accorde à
définir javascript comme un langage objet à prototype - et
accessoirement le seul langage à prototype universellement connu et utilisé.
javascript est un très bon langage dont beaucoup n'avaient pas vu toute
la puissance (jusqu'à Ajax, et encore...) mais ce n'est pas un langage
objet (et je suis d'accord avec David Flanagan)
Post by Bruno Desthuilliers
Post by Wykaaa
Qui a dit que JavaScript permettait de définir des types ?
En fonction de quelle définition du terme "type" ?
Je l'ai déjà donnée par ailleurs.
Et je l'ai rejetée. Autre chose ?
Post by Wykaaa
Post by Bruno Desthuilliers
Post by Wykaaa
Certainement pas moi. JavaScript n'est pas un langage objet
Bin si.
Post by Wykaaa
(il en a
juste certaines caractéristiques).
Il en a toutes les caractéristiques, sauf si on considère que les
messages eux même doivent être des objets, auquel cas seuls Smalltalk et
Self sont des langages objets.
Non il lui manque d'autres choses comme les contrôles d'accès
Les contrôles d'accès n'ont jamais été nécessaires. Ce qui est
important, c'est la distinction entre implémentation et interface.

Ceci étant, il est très facile d'avoir des attributs "privés" en
javascript - il suffit d'utiliser les fermetures.
Post by Wykaaa
Post by Bruno Desthuilliers
J'ai déjà vu passer toutes ces discussions sur pas mal de ng anglophones
(où il y a quand même un peu plus d'animation qu'ici), et il y a au
moins un point qui ressort clairement: il n'y a pas de définition
universellement acceptée de ce qu'est un "type" en informatique. Il y a
plusieurs théories, qui se rejoignent sur certains points et divergent
sur d'autre, certaines sont plus "mainstream" que d'autre, mais il n'y
a, je répète, aucun fondement théorique universellement accepté.
- 1983, “Types, Abstraction and Parametric Polymorphism” IFIP Congress,
Paris, 513–523.
- 1985, “Three approaches to type structure. Mathematical foundations of
software development,”, in Lecture Notes in Comput. Sci., 185, Springer,
Berlin, 97–138
Qui ne sont pas universellement acceptés. Merci, bonsoir.
Post by Wykaaa
Post by Bruno Desthuilliers
Post by Wykaaa
Post by Bruno Desthuilliers
Post by Wykaaa
Dans un langage fonctionnel tel que ML, les fonctions elles-mêmes ont un
type, ce qui permet l'inférence de types.
Merci, je connais ML, et OCaml, et Haskell, et d'autres encore.
Tu les connais mais les as-tu pratiqués ?
Je n'en n'ai hélas pas eu l'occasion (j'entends par là, dans le cadre
d'un projet sérieux et non trivial), mais je te prie de me créditer
d'assez d'intelligence pour être capable de comprendre - d'après ce que
je connais de ces langages et d'autres - ce qu'est l'inférence de type
en théorie et en pratique.
Mais je n'en doute pas. Ce n'était pas une question piège.
Alors pourquoi me demande tu si je les ai pratiqué ?
Post by Wykaaa
Post by Bruno Desthuilliers
Post by Wykaaa
J'ai écrit un programme de 3000 lignes de ML. C'est un langage
extraordinaire (mon langage favori en fait).
J'ai écrit plusieurs programme de 15000 lignes en Python - qui en aurait
probablement nécessité plus du sextuple en Java. C'est un langage
extraordinaire (Python, je veux dire, pas Java) - mon langage favori en
fait.
Alors 1 partout.
La balle au centre ?-)
Post by Wykaaa
Post by Bruno Desthuilliers
Sinon, j'ai aussi écrit un programme de 75000 lignes en "W-langage" (la
parodie de langage de cette parodie d'outil de dev qu'est Windev), et
c'est vraiment un langage de MERDE. Le pire que j'ai jamais eu à subir,
j'en venais, tiens toi bien, à regretter VB. Si si, je te jure.
Je pense que Windev bat tous les records des environnements de
développement débiles.
Il n'y a pas de mot assez fort pour le qualifier.
Là au moins, on est d'accord à 100%.
Post by Wykaaa
Post by Bruno Desthuilliers
Post by Wykaaa
Post by Bruno Desthuilliers
Post by Wykaaa
Post by Bruno Desthuilliers
Post by Wykaaa
Post by ld
Et en general c'est la que les
choses se compliquent ;-)
Indeed !-)
Comme je disais, donc, c'est là que les choses se compliquent. Quand je
pose des questions comme "qu'est-ce qu'un type", c'est bien parce que je
sais qu'il n'y a *pas* UNE réponse simple et universellement applicable.
Comme dit Laurent, "c'est là que les choses se compliquent".
Non, non, il n'y a rien de compliqué sauf à vouloir faire rentrer des
langages dans l'approche objet alors qu'ils ne sont pas objet, comme
beaucoup de langages d'acteurs et JavaScript en particulier :-)
Autrement dit, il n'y a rien de compliqué à condition d'écarter d'un
revers de main tout ce qui vient contredire ton propos.
Grady Booch, Reynolds, Barbara Liskov, etc.
donc, les mots des experts avec lesquels tu es d'accord. Ce qui revient
au même.
Post by Wykaaa
Post by Bruno Desthuilliers
Post by Wykaaa
Post by Bruno Desthuilliers
Ce qui impliquent entre autres que les caractéristiques en question
soient invariantes - ce qui n'est pas le cas dans certains langages
dynamiques.
On parle de l'approche objet. Si les caractéristiques des objets ne sont
pas invariantes, on ne peut pas définir l'abstraction et on n'est donc
plus dans une approche objet.
Ah bon ? et en vertu de quelles règles ? Chapitre et verset, je te prie ?
Grady Booch, par exemple.
Excuse moi, mais on en reviens toujours au même point. Tu peux me citer
autant d'"experts" que tu veux, dans la mesure où l'approche objet ne se
fonde pas sur une théorie *mathématique* bien établie *antérieure à
toute implémentation*, ces braves "experts" peuvent théoriser (après
coup) autant qu'ils le veulent, en ne retenant que ce qui va dans le
sens de leurs convictions personnelles.

Bref, ils sont autant experts que ma petite soeur, puisqu'il n'existe
pas de domaine d'experise dûment délimité en l'occurrence.
Post by Wykaaa
Post by Bruno Desthuilliers
Accessoirement, tu viens de décreter qu'aucun langage dynamique n'était
objet, puisqu'une des caractéristiques fondamentales des langages
dynamiques - je dirais même leur définition première et essentielle -
est que les objets sont eux-même dynamiques.
Je ne sais pas ce qu'est un langage dynamique.
Un langage dans lequel les classes (ou prototypes) sont définis à
l'exécution, et donc modifiables à l'exécution.
Post by Wykaaa
Je sais ce qu'est le
typage dynamique. Je ne sais pas ce qu'est un objet dynamique.
Un objet dont l'implémentation et l'interface peuvent changer à l'exécution.
Post by Wykaaa
Je
connais seulement les objets passifs et les objets actifs (ceux qui
contiennent leur propre processus)
Aucun rapport.
Post by Wykaaa
Post by Bruno Desthuilliers
Je pense que ça suffit à disqualifier ta définition de "l'objet". En
fait - comme hélas la majorité des gens -, tu confond "orienté objet" et
"orienté classe".
Non, la classe est un moyen de dénoter une abstraction.
s/une abstraction/une famille d'abstractions/

Un objet est déjà, en soi, une abstraction.
Post by Wykaaa
Il y a peut-être
d'autres moyens mais celui-ci me semble le meilleur dans l'approche OO.
Qu'il te semble le meilleur n'exclu pas que d'autre existent.
Post by Wykaaa
J'en profite pour rappeler que "objet" n'a pas le même sens dans les
locutions "conception objet" et "programmation objet".
Si si. D'ailleurs les deux concepts existent en (beurk) UML.
Post by Wykaaa
Dans le premier
cas, objet signifie abstraction
<bis>un objet *est* une abstraction</bis>, qu'on parle de conception ou
d'implémentation.
Post by Wykaaa
(donc la plupart du temps "classe",
Le fait qu'une classe puisse être un objet par elle-même (et devrait
l'être, dans l'absolu) n'implique pas qu'un objet soit une classe.
Conception ou implémentation, même combat.
Post by Wykaaa
dans
le second il signifie "instance de classe").
Il n'y a pas d'instances de classes dans un langage à prototypes, et
pourtant il y a des objets.

Faudrait peut-être enlever tes oeillères, un jour.
Post by Wykaaa
Post by Bruno Desthuilliers
Post by Wykaaa
Post by Bruno Desthuilliers
Dans ce cas, ce n'est donc pas la classification qui "permet le
polymorphisme d'héritage", comme tu l'écrivais n'est-ce pas, mais le
polymorphisme qui définit la (les) classification(s). Dis voir, tu n'a
pas un peu l'impression d'inverser l'effet et la cause ?-)
Peut-être me suis-je mal exprimé mais il ne faut pas confondre
l'héritage d'un point de vue conceptuel et le "polymorphisme d'héritage"
qui a besoin de quelque chose de plus pour fonctionner (le typage fort
statique ou dynamique);
s/le typage fort statique ou dynamique/le typage statique/
Absolument pas. Il y a heureusement des langages à typage fort dynamique.
Par définition, dans un langage à typage dynamique, le polymorphisme ne
dépend pas de l'héritage - le fait que le typage soit fort ou faible n'y
change rien. Donc je maintains :

s/le typage fort statique ou dynamique/le typage statique/
Post by Wykaaa
Post by Bruno Desthuilliers
Post by Wykaaa
Post by Bruno Desthuilliers
L'héritage "au sens conceptuel du terme" - la relation "est un" en
réalité - n'est pas déterminante du polymorphisme mais au contraire
déterminée par lui. Et ce type de classification, dans un système
vraiment "orienté *objet*" - dans le sens où l'abstraction centrale est
l'objet et non la classe, laquelle n'est au mieux qu'un épiphénomène -
est généralement assez flou, voir mouvant (un même objet pouvant changer
de "classe" durant son cycle de vie).
Ce n'est donc plus la même abstraction et, dans une pure approche objet
J'aime bien les gens qui parlent de "vrai langage objet" et de "pure
approche objet" pour signifier "selon ma définition à moi de l'objet que
c'est la seule vraie même si ça contredit la moitié de la littérature
sur le sujet".
<troll>
La moitié de la littérature que ça contredit n'a pas d'importance car
elle a été écrite par des gens qui n'y comprennent rien de toute façon
et qui ne connaissent pas les fondements : SIMULA et les écrits de Grady
Booch et Ivar Jacobson
</troll>
Post by Bruno Desthuilliers
Post by Wykaaa
on ne peut donc pas dire qu'il s'agit du même objet.
Ah bon, pourquoi ?
S'il n'y a pas d'invariant.
Tes empreintes digitales ne varient pas.
L'id de l'objet en question non plus. L'id est le seul invariant
clairement défini par les deux axiomes de bases de l'OO.

Accessoirement, si on pousse ton raisonnement jusqu'au bout, un objet ne
devrait pas changer de comportement en fonction de son état, ni même
changer d'état tout court.

Amis de la PF, bonsoir !-)
Post by Wykaaa
Post by Bruno Desthuilliers
Post by Wykaaa
Il doit être
"re-créé" comme instance d'une autre classe.
Ah bon, pourquoi ?
Parce qu'il a changé de nature. Il a une nouvelle "identité".
Non, il n'a *pas* changé d'identité. C'est incroyable cette résistance
au changement. Réveille toi, *tout* change sans arrêt autour de toi.
Post by Wykaaa
Post by Bruno Desthuilliers
Outre le fait que les notions d'"instance" et de "classe" sont
particulières à un sous-ensemble des langages objets - ces notions
n'existent pas dans les langages à prototype -, le fait pour un objet de
changer radicalement de comportement selon son état n'est pas une
nouveauté, loin s'en faut. Tu a déjà entendu parler du pattern "State" ?
Oui, je connais tout ça par coeur et les arguments aussi. Mais mettre
dans le "même sac" tous les langages à prototype et les langages à objet
n'est pas d'une grande rigueur et permet tous les amalgames...
Encore une fois: le terme est "orienté *objet*", pas "orienté *classe*".
Les langages à prototypes *sont* des langages objets. Si tu veux
définir un sous-ensemble de la POO portant uniquement sur les langages à
classe (et à typage statique), et discourir et théoriser sur ce
sous-ensemble, libre à toi, mais tu ne *peux* pas prétendre restreindre
l'OO à ce sous-ensemble. C'est tout simplement de la malhonnêteté
intellectuelle.
Post by Wykaaa
Post by Bruno Desthuilliers
Post by Wykaaa
Post by Bruno Desthuilliers
De ce point de vue là, ni la notion de classe ni la notion
d'héritage ne
sont fondamentales de l'approche *objet*.
Ben si.
Bin non. Ces notions sont centrales dans le modèle objet dominant -
celui de, entre autres, Java et C++ (et donc d'UML etc) - mais, dois-je
le rappeler, n'existent pas dans certains langages objet, et ne sont que
des épiphénomènes. Au risque de me répéter, on parle d'orienté *objet*,
pas d'"orienté classe".
Les langages dans l'esquels ces notions n'existent pas ne sont pas des
langages objet. Point barre.
Et c'est où le Grand Livre Sacré dans lequel c'est écrit, ça ?

Bon, ouvre grand tes oreilles:

IL N'Y A PAS DE THEORIE UNIVERSELLE DE LA POO PREEXISTENTE AUX DIVERSES
IMPLEMENTATIONS.

Ok ?

Tout ce qu'on a, au mieux, c'est quelques vagues concepts, dont deux *et
seulement deux* sont universellement applicables à tous les langages
objets. Le terme "classe" n'apparaît dans aucun des deux. Si c'était la
notion de "classe" qui était déterminante, ça s'appellerait de la
"programmation orienté classe", pas de la programmation orientée *objet*.

Ca y est, t'a compris ?
Post by Wykaaa
Post by Bruno Desthuilliers
Post by Wykaaa
Post by Bruno Desthuilliers
Post by Wykaaa
Post by Bruno Desthuilliers
Post by Wykaaa
mais cette délégation doit tout de même respecter la notion de
hiérarchie sur les objets
Ah bon ? Et pourquoi donc ?
Par rapport à ce que j'ai dit ci-dessus
Faudra trouver autre chose alors.
Post by Wykaaa
Post by Bruno Desthuilliers
Post by Wykaaa
Post by Bruno Desthuilliers
Post by Wykaaa
(on ne délègue pas à n'importe quel objet, n'importe comment).
Du moment que l'objet auquel on délègue comprend les messages qu'on
lui envoie, je ne vois pas où est le problème.
Je comprends pourquoi tu n'est pas "pour" l'encapsulation.
Mais si, bien au contraire.
Post by Wykaaa
La délégation
pure peut conduire aux pires dérivent concernant la sûreté de
fonctionnement.
Mauvaise nouvelle : Y a pas de balle en argent.
De ce point de vue là, aucun système de type connu ne garanti à lui seul
la correction du programme. Ce n'est pas parce qu'un objet est
effectivement une instance d'un sous-type de XXX que son
comportement en
réponse au message YYY est celui attendu.
Je suis d'accord mais au moins, on conserve la cohérence des types,
D'un point de vue formel uniquement. Si je définis une sous-classe de
File dont la méthode "write" envoie des mails d'insultes à tout ton
carnet d'adresse avant d'effacer ton disque dur, je ne suis pas sûr que
"cohérence des types" soit vraiment le terme adapté. Le fait que ce soit
techniqument une sous-classe de File nous fait une belle jambe...
On peut en dire autant sur tous les langages, à ce compte là.
Oui. Et ? Tu en tire quoi comme conclusion ?
Post by Wykaaa
Si je ne
respecte pas le cahier des charges...
Eh bin ça risque de pas donner le résultat attendu. Bref, au final, on
en revient là: le code est écrit par des humains, et avec une sémantique
bien trop complexe pour être "comprise" par un crétin de compilateur.
Donc ce qui compte, c'est que les humains, eux, respectent le cahier des
charges.
Post by Wykaaa
Post by Bruno Desthuilliers
Post by Wykaaa
ce
qui réduit les erreurs potentiels sur les actions associés aux objets
Il n'y a pas d'"actions associées aux objets", il y a des objets
auxquels on envoie des messages, à eu d'en faire ce que bon leur semble
- même éventuellement de lever la main en disant "j'ai pas compris". Si
tu ne comprends pas ça, tu ne comprend pas *le* principe fondamental de
la POO, celui qui fonde Smalltalk.
J'aurais dû dire : qui réduit les erreurs potentielles (2 l e !) sur le
comportement des objets en réponse aux messages.
Tu aurais dû dire : "qui réduit le risque potentiel d'envoyer à un objet
un message qu'il ne comprend pas". Pour ce qui est du comportement,
relis un peu plus haut.

Et le problème réel, ce n'est pas que l'objet comprenne ou non le
message, mais ce qui se passe dans ce cas là. Je sais bien que Erlang
n'est pas un langage objet, mais l'approche des situations comparables
en Erlang est intéressante.
Post by Wykaaa
Post by Bruno Desthuilliers
Hé, moi aussi je peux asséner des grandes vérités et dire à l'autre
qu'il a rien compris simplement parce qu'il n'est pas d'accord avec moi.
Sérieusement, tu ne crois pas que plus cette discussion
s'enlise^Mavance, plus ça illustre bien mon propos premier, qui est
qu'il n'y a aucune définition théorique formelle *sérieuse et
universelle* de la POO ? Tout ça, c'est de la soupe aux cailloux... d'un
côté comme de l'autre, hein - tu a raison selon *ta* définition, j'ai
raison selon la mienne, nos définitions valent chacune ce qu'elles
valent, là n'est pas le problème, simplement elles sont incompatibles.
La seule conclusion *sérieuse* qu'on peut en tirer, c'est qu'aucune des
deux "définitions" n'a la moindre valeur scientifique (contrairement à
la théorie relationnelle, par example, qui est très clairement et
mathématiquement définie).
Non, il y a des écrits tout à fait sérieux sur la POO, les types, etc.
et j'en ai cité quelques-uns. IL y en a beaucoup d'autres.
Ah, oui, ça, des écrits, il y en a, des écrits. Dont certains sérieux,
certes. Mais tous venant après la bagarre, la plupart n'étudiant qu'un
sous-ensemble de l'OO, et pas mal se contredisant les uns les autres.
Post by Wykaaa
Post by Bruno Desthuilliers
Post by Wykaaa
(et ce, dès la compilation pour les langages à typage statique mais on
ne va pas rouvrir ce débat là... dont on a déjà longuement débattu dans
le passé)
oh bin au moins ça aide à passer les longues soirées d'hiver. Dommage
qu'on ne puisse pas en profiter pour partager une bonne bouteille en
regardant le feu !-p
Ben chiche. On pourrait peut-être le faire.
Amène la bouteille !-)
Post by Wykaaa
Post by Bruno Desthuilliers
Post by Wykaaa
Post by Bruno Desthuilliers
Désolé, mais je ne crois tout simplement pas qu'empiler des contraintes
résolve le problème. Crois moi, s'il suffisait de déclarer trois fois le
type d'une variable pour avoir la certitude absolue que mon programme
soit correct, je m'y plierais volontier.
Tu exagères en résumant de cette façon le typage...
Je n'exagère pas en résumant de cette façon la faillite du typage
statique déclaratif, spécialement dans le cadre d'une approche objet.
Pour le reste, je suis content que tu remarques - enfin -que j'exagère.
J'ai cru un moment que ça t'échappait.
Bien sûr que non et je suis sûr que sur la philosophie (c'est un grand
mot) de développement logiciel, en général, nous avons énormément de
points d'accord.
Hmmm... Pour le moment, j'ai l'impression nous sommes surtout d'accord
sur le fait que, d'une manière générale, nous ne sommes pas d'accord !-)
Post by Wykaaa
Post by Bruno Desthuilliers
Post by Wykaaa
Si tu crois que ça augmente la complexité du code sans raison, c'est que
tu as "mal" pratiqué cette approche
Bin voyons. Cet argument là, mon garçon, il est un peu facile. Je me
permets certes de te taquiner, mais pas de te prendre pour un crétin, et
je te serais reconnaissant de me créditer d'un minimum d'intelligence.
J'avais mis "mal" entre guillemets pour ne pas froisser ta
susceptibilité ;-)
Raté. Maintenant, va falloir sortir le fer à repasser.
Post by Wykaaa
Post by Bruno Desthuilliers
Post by Wykaaa
car je n'y ai vu, pour ma part, que
des simplifications.
Ah bin oui, c'est évident. Désolé, je ne sais pas comment j'ai fait pour
ne pas me rendre compte plus tôt qu'écrire 250 lignes de boilerplate
juste pour faire plaisir au compilateur alors que mon objet, en
pratique, supportait *déjà* toutes les conditions requises
(explicitement requises - par la documentation) pour être utilisé dans
tel cas de figure. Franchement, là, je me demande.
Peut-être que 2 vérifications valent mieux qu'une ?
Peut-être que 250 lignes de codes pour permettre à ce crétin de compilo
de "vérifier" que je sais bien ce que je fais, alors qu'il est lui-même
infoutu de vérifier ce que fait *effectivement* mon code, ça ne vaut pas
grand chose à part du temps perdu ?
Post by Wykaaa
Post by Bruno Desthuilliers
Post by Wykaaa
Post by Bruno Desthuilliers
Accessoirement, parmi les systèmes informatiques les plus fiables à
l'heure actuelle, certains sont implémentés dans un langage non
seulement dynamique, mais qui décourage explicitement la programmation
"défensive" (je pense bien sûr à Erlang). A mon très humble avis, il y a
là quelque chose à apprendre.
Mais Erlang n'est pas un langage objet.
Non. Encore que...
Post by Wykaaa
C'est plutôt un langage
fonctionnel d'acteur.
C'est toi le spécialiste des classifications et taxonomies, n'est-ce
pas. Pour ma part, tant que ça fait le boulot...
Oui mais pas n'importe comment !
Non, si possible sans erreur, si possible lisiblement, et si possible à
peu près efficacement c'est mieux. En dehors de ça, honnêtement...
Post by Wykaaa
Post by Bruno Desthuilliers
Post by Wykaaa
Ici nous parlons de ce qui caractérise l'approche
objet. Erlang (qui est par ailleurs un très bon langage) n'a rien à
faire dans cette discussion.
Pourquoi ? Parce que ça contredit tes propos sur la nécessité du codage
défensif ?
Je n'ai jamais dit que l'approche objet était nécessaire pour mettre en
oeuvre la programmation défensive.
Je n'ai pas dir que tu avais dit que l'approche objet était nécessaire à
la programmation défensive. Par contre, tu a clairement dit que la
programmation défensive était nécessaire, et s'il me souvient bien que
le typage statique était nécessaire à la programmation défensive.
Post by Wykaaa
Post by Bruno Desthuilliers
Post by Wykaaa
Non conceptuellement, l'approche objet est quelque chose de précis.
Mon cul sur la commode.
Post by Wykaaa
La
confusion est entretenue par certains courants qui veulent se rattacher
à l'objet tout en le détournant.
Ah, les affreux hérétiques, brûlons les vif. Et qu'importe s'il ne font
que nous citer les enseignement du prophète.
Non, ça s'appelle "noyer le poisson".
Quoi ? Prétendre que l'OO est "quelque chose de précis" et que ce qui ne
rentre pas dans le cadre étriqué d'une certaine conception de l'OO n'est
pas de l'OO ?
Post by Wykaaa
Post by Bruno Desthuilliers
Post by Wykaaa
La preuve dans cette discussion.
Pour moi, tout ce que cette discussion prouve, c'est que *tu* penses
qu'il y a réellement *une* définition *précise et universelle* de l'OO.
Bon, t'es un peu tout seul à le penser, mais c'est pas grave, hein...
Je ne suis pas le seul, loin de là.
Non, c'est vrai, hélas. Il y a une foultitude d'"experts" (plus ou moins
autoproclamés) qui résument l'objet au modèle Java/C++/UML (avec un peu
chance ils connaissent ADA et/ou Simula).

Ca me rappelle cette prof du CNAM, membre éminent du LABRI, enseignant
(mal) UML (qu'elle n'a d'ailleurs pas bien compris), et qui se
prétendait experte en OO alors qu'elle ne connaissait que Java et
pensait que les multiméthode de CLOS était de la programmation
fonctionnelle. Je ne doute pas qu'elle soit d'accord avec toi.
Post by Wykaaa
Veux-tu une bibliographie exhaustive ?
Ca va me prendre un peu de temps :-)
Je ne doutes pas que tu sois capable de me sortir une bibliothèque
entière d'écrits sur le sujet. Comme aucun d'eux n'est antérieur aux
langages objets, et qu'ils ne traitent tous que d'un sous-ensemble de
l'OO telle qu'elle existe de fait, ça n'a pas plus de valeur que ça - en
tant que définition de ce qu'est ou n'est pas l'OO, j'entends.
Statistiquement, j'ai vu à peu près autant de définitions de l'OO que
j'ai lu d'articles théoriques sur le sujet. Alors si tu veux, ta
bibliographie exhaustive (dont j'ai probablement déjà lu une partie
avant de me rendre compte que c'était essentiellement de l'huile de
serpent), je n'en vois guère l'utilité.

Mais c'est vrai, tu a raison, tu n'es (hélas) pas le seul à penser que
ce petit sous-ensemble de l'OO est La Vérité Révélée.
Wykaaa
2009-11-15 21:09:31 UTC
Permalink
Préambule : j'ai beaucoup taillé dans la discussion.
Post by Bruno Desthuilliers
Post by Wykaaa
Post by Bruno Desthuilliers
(snip)
[snip]
Post by Bruno Desthuilliers
Post by Wykaaa
Post by Bruno Desthuilliers
Post by Wykaaa
Qui a dit que JavaScript permettait de définir des types ?
En fonction de quelle définition du terme "type" ?
Je l'ai déjà donnée par ailleurs.
Et je l'ai rejetée. Autre chose ?
Tu n'as pas argumenté...
Post by Bruno Desthuilliers
Post by Wykaaa
Post by Bruno Desthuilliers
Post by Wykaaa
Certainement pas moi. JavaScript n'est pas un langage objet
Bin si.
Post by Wykaaa
(il en a
juste certaines caractéristiques).
Il en a toutes les caractéristiques, sauf si on considère que les
messages eux même doivent être des objets, auquel cas seuls Smalltalk et
Self sont des langages objets.
Non il lui manque d'autres choses comme les contrôles d'accès
Les contrôles d'accès n'ont jamais été nécessaires. Ce qui est
important, c'est la distinction entre implémentation et interface.
Via l'encapsulation. Qu'elle se fasse avec contrôle d'accès ou d'autres
mécanismes...

J'aime la notion d'interface en Java. c'est ce qui manque à C++ car les
classes abstraites c'est différents.
Post by Bruno Desthuilliers
Ceci étant, il est très facile d'avoir des attributs "privés" en
javascript - il suffit d'utiliser les fermetures.
Exact
Post by Bruno Desthuilliers
Post by Wykaaa
Post by Bruno Desthuilliers
J'ai déjà vu passer toutes ces discussions sur pas mal de ng anglophones
(où il y a quand même un peu plus d'animation qu'ici), et il y a au
moins un point qui ressort clairement: il n'y a pas de définition
universellement acceptée de ce qu'est un "type" en informatique. Il y a
plusieurs théories, qui se rejoignent sur certains points et divergent
sur d'autre, certaines sont plus "mainstream" que d'autre, mais il n'y
a, je répète, aucun fondement théorique universellement accepté.
- 1983, “Types, Abstraction and Parametric Polymorphism” IFIP Congress,
Paris, 513–523.
- 1985, “Three approaches to type structure. Mathematical foundations of
software development,”, in Lecture Notes in Comput. Sci., 185, Springer,
Berlin, 97–138
Qui ne sont pas universellement acceptés. Merci, bonsoir.
Donne des exemples. Reynolds n'est pas le premier venu.
Post by Bruno Desthuilliers
Post by Wykaaa
Post by Bruno Desthuilliers
Post by Wykaaa
Post by Bruno Desthuilliers
Post by Wykaaa
Dans un langage fonctionnel tel que ML, les fonctions elles-mêmes ont un
type, ce qui permet l'inférence de types.
Merci, je connais ML, et OCaml, et Haskell, et d'autres encore.
Tu les connais mais les as-tu pratiqués ?
[snip]
Post by Bruno Desthuilliers
Post by Wykaaa
Post by Bruno Desthuilliers
je connais de ces langages et d'autres - ce qu'est l'inférence de type
en théorie et en pratique.
Mais je n'en doute pas. Ce n'était pas une question piège.
Alors pourquoi me demande tu si je les ai pratiqué ?
On découvre toujours des subtilités dans la pratique qui nous avaient
échappé juste en lisant les specs.

[snip]
Post by Bruno Desthuilliers
Post by Wykaaa
Grady Booch, Reynolds, Barbara Liskov, etc.
donc, les mots des experts avec lesquels tu es d'accord. Ce qui revient
au même.
Ben Grady Booch n'est pas un ex-père :-)
puisque c'est le père de l'approche objet (en conception) car SIMULA
existait avant.

[snip]
Post by Bruno Desthuilliers
Post by Wykaaa
Post by Bruno Desthuilliers
Post by Wykaaa
On parle de l'approche objet. Si les caractéristiques des objets ne sont
pas invariantes, on ne peut pas définir l'abstraction et on n'est donc
plus dans une approche objet.
Ah bon ? et en vertu de quelles règles ? Chapitre et verset, je te prie ?
Grady Booch, par exemple.
Excuse moi, mais on en reviens toujours au même point. Tu peux me citer
autant d'"experts" que tu veux, dans la mesure où l'approche objet ne se
fonde pas sur une théorie *mathématique* bien établie *antérieure à
toute implémentation*, ces braves "experts" peuvent théoriser (après
coup) autant qu'ils le veulent, en ne retenant que ce qui va dans le
sens de leurs convictions personnelles.
Je me base sur les fondements de l'approche établis par Grady Booch et
développés ensuite par des milliers d'articles dans la littérature (ACM
et IEEE, par exemple) et finalisés dans UML (que tu n'aimes pas mais
c'est aujourd'hui la seule méthode de conception standardisée.
Post by Bruno Desthuilliers
Bref, ils sont autant experts que ma petite soeur, puisqu'il n'existe
pas de domaine d'experise dûment délimité en l'occurrence.
Merci pour Grady Booch...
Le domaine d'expertise est aujourd'hui, UML pour l'ingénierie
logicielle, SysML pour l'ingénierie des systèmes complexes à logiciel
prépondérant (ou plus simplement l'ingénierie système), le tout récent
SoaML, sans oublier le MDA (Model Driven Architecture) et quelques
autres "babioles" du même style.
Post by Bruno Desthuilliers
Post by Wykaaa
Post by Bruno Desthuilliers
Accessoirement, tu viens de décreter qu'aucun langage dynamique n'était
objet, puisqu'une des caractéristiques fondamentales des langages
dynamiques
[snip]
Post by Bruno Desthuilliers
Post by Wykaaa
Post by Bruno Desthuilliers
Je pense que ça suffit à disqualifier ta définition de "l'objet". En
fait - comme hélas la majorité des gens -, tu confond "orienté objet" et
"orienté classe".
Non, la classe est un moyen de dénoter une abstraction.
s/une abstraction/une famille d'abstractions/
Un objet est déjà, en soi, une abstraction.
Je cite Bertrand Meyer (dans Conception et programmation orientées objet
- p25 : La méthode et le langage devraient utiliser la notion de classe
comme concept central
Post by Bruno Desthuilliers
Définition d'une classe : type abstrait de données partiellement ou
complètement implémenté. Il sert à la fois de module et de type (ou
schéma de type si la classe est générique)
Post by Bruno Desthuilliers
Définition d'un objet : Structure de données, _présente à
l'exécution_, constituée de zéro ou plusieurs valeurs, appelées champs,
et qui sert de représentation informatique d'un objet abstrait. Chaque
objet est l'instance d'une classe.
Post by Bruno Desthuilliers
Définition d'une instance de classe : objet construit selon selon le
modèle défini par la classe ou par l'un de ses descendants propres
Post by Bruno Desthuilliers
Définition d'un descendant propre (de classe) : héritier direct ou
indirect d'une classe.

Je te conseille de (re)lire le chapitre 2 de ce livre qui définit les
critères d'orientation objet. Tu verras que c'est relativement précis.
Post by Bruno Desthuilliers
Post by Wykaaa
Il y a peut-être
d'autres moyens mais celui-ci me semble le meilleur dans l'approche OO.
Qu'il te semble le meilleur n'exclu pas que d'autre existent.
Voir Grady Booch, James Rumbaugh, Ivar Jacobson, Bertrand Meyer.
Post by Bruno Desthuilliers
Post by Wykaaa
J'en profite pour rappeler que "objet" n'a pas le même sens dans les
locutions "conception objet" et "programmation objet".
Si si. D'ailleurs les deux concepts existent en (beurk) UML.
Post by Wykaaa
Dans le premier
cas, objet signifie abstraction
<bis>un objet *est* une abstraction</bis>, qu'on parle de conception ou
d'implémentation.
Je parle d'abstraction au sens de Grady Booch
Définition d'une abstraction (Grady Booch) : fait ressortir les
caractéristiques essentielles d'un objet (qui le distinguent de tous les
autres genres d'objets) et donc procure des frontières conceptuelles
rigoureusement définies, relativement au point de vue de l'observateur.
Post by Bruno Desthuilliers
Post by Wykaaa
(donc la plupart du temps "classe",
Le fait qu'une classe puisse être un objet par elle-même (et devrait
l'être, dans l'absolu) n'implique pas qu'un objet soit une classe.
Conception ou implémentation, même combat.
Non, les classes sont le moyen de définir des abstractions en conception
(ce sont donc des objets de conception)
Les objets de programmation sont des instances de classes. En SmallTalk,
les classes sont elles-mêmes des objets (langage auto-référent), ce qui
oblige à parler de "métaclasse".
Post by Bruno Desthuilliers
Post by Wykaaa
dans
le second il signifie "instance de classe").
Il n'y a pas d'instances de classes dans un langage à prototypes, et
pourtant il y a des objets.
On joue avec les mots car un prototype peut être vu comme un exemplaire
modèle d'une famille d'objets. Je te rappelle que dans ActionScript 3.0,
l’héritage de prototype ne constitue pas le principal mécanisme
d’héritage car ce rôle incombe également à l'héritage de classe
désormais présent dans cette version. Ceci a été fait pour séparer le
langage de programmation lui-même et Flash
Post by Bruno Desthuilliers
Faudrait peut-être enlever tes oeillères, un jour.
Je n'en ai pas mais j'essaie d'être rigoureux, ce qui se traduit, pour
ceux qui ne le sont pas, par ta remarque :-)
[snip]
Post by Bruno Desthuilliers
Accessoirement, si on pousse ton raisonnement jusqu'au bout, un objet ne
devrait pas changer de comportement en fonction de son état, ni même
changer d'état tout court.
Amis de la PF, bonsoir !-)
Ce n'est pas ce que j'ai dit et je suis un fervent adepte de la PF (mes
langages favoris sont ML et Ocaml)

[snip]
Post by Bruno Desthuilliers
Encore une fois: le terme est "orienté *objet*", pas "orienté *classe*".
Les langages à prototypes *sont* des langages objets. Si tu veux
définir un sous-ensemble de la POO portant uniquement sur les langages à
classe (et à typage statique), et discourir et théoriser sur ce
sous-ensemble, libre à toi, mais tu ne *peux* pas prétendre restreindre
l'OO à ce sous-ensemble. C'est tout simplement de la malhonnêteté
intellectuelle.
Merci mais je fais de l'OO depuis le début de la conception objet en 83
et j'ai réalisé des logiciels en ADA, C++, Java, enseigné C++, Java,
ADA, Lisp, Prologue, javascript ainsi que la conception objet et UML des
centaines d'heures, audité des très gros logiciels (supérieurs à 500K
lignes de code) en C++ et Java principalement.
Post by Bruno Desthuilliers
Tout ce qu'on a, au mieux, c'est quelques vagues concepts, dont deux *et
seulement deux* sont universellement applicables à tous les langages
objets. Le terme "classe" n'apparaît dans aucun des deux. Si c'était la
notion de "classe" qui était déterminante, ça s'appellerait de la
"programmation orienté classe", pas de la programmation orientée *objet*.
Ce n'est pas ce que disent ni Grady Booch (père de l'approche objet, je
te le rappelle), ni Bertrand Meyer (père du langage Eiffel) ni des
centaines d'autres.
Post by Bruno Desthuilliers
Ca y est, t'a compris ?
Non car tu es dans l'erreur.

[snip]
Post by Bruno Desthuilliers
Post by Wykaaa
Non, il y a des écrits tout à fait sérieux sur la POO, les types, etc.
et j'en ai cité quelques-uns. IL y en a beaucoup d'autres.
Ah, oui, ça, des écrits, il y en a, des écrits. Dont certains sérieux,
certes. Mais tous venant après la bagarre, la plupart n'étudiant qu'un
sous-ensemble de l'OO, et pas mal se contredisant les uns les autres.
Grady Booch est venu après la bagarre ?
Allons donc, c'est lui le père de la conception objet. Et Bertrand Meyer
a inventé Eiffel bien avant que C++ ne devienne populaire...
Post by Bruno Desthuilliers
Post by Wykaaa
Post by Bruno Desthuilliers
Post by Wykaaa
(et ce, dès la compilation pour les langages à typage statique mais on
ne va pas rouvrir ce débat là... dont on a déjà longuement débattu dans
le passé)
oh bin au moins ça aide à passer les longues soirées d'hiver. Dommage
qu'on ne puisse pas en profiter pour partager une bonne bouteille en
regardant le feu !-p
Ben chiche. On pourrait peut-être le faire.
Amène la bouteille !-)
OK. Quoi?
De l'Alox Corton, ça te va ?

[snip]
Post by Bruno Desthuilliers
Post by Wykaaa
Je n'ai jamais dit que l'approche objet était nécessaire pour mettre en
oeuvre la programmation défensive.
Je n'ai pas dir que tu avais dit que l'approche objet était nécessaire à
la programmation défensive. Par contre, tu a clairement dit que la
programmation défensive était nécessaire, et s'il me souvient bien que
le typage statique était nécessaire à la programmation défensive.
Toujours dans les critères d'orientation objet, je cite Bertrand Meyer :
Il devrait être possible de déterminer, au moment de l'exécution, si le
type d'un objet est conforme à un type statique donné.
Post by Bruno Desthuilliers
Post by Wykaaa
Post by Bruno Desthuilliers
Post by Wykaaa
Non conceptuellement, l'approche objet est quelque chose de précis.
Mon cul sur la commode.
Post by Wykaaa
La
confusion est entretenue par certains courants qui veulent se rattacher
à l'objet tout en le détournant.
Ah, les affreux hérétiques, brûlons les vif. Et qu'importe s'il ne font
que nous citer les enseignement du prophète.
Non, ça s'appelle "noyer le poisson".
Quoi ? Prétendre que l'OO est "quelque chose de précis" et que ce qui ne
rentre pas dans le cadre étriqué d'une certaine conception de l'OO n'est
pas de l'OO ?
Post by Wykaaa
Post by Bruno Desthuilliers
Post by Wykaaa
La preuve dans cette discussion.
Pour moi, tout ce que cette discussion prouve, c'est que *tu* penses
qu'il y a réellement *une* définition *précise et universelle* de l'OO.
Bon, t'es un peu tout seul à le penser, mais c'est pas grave, hein...
Je ne suis pas le seul, loin de là.
Non, c'est vrai, hélas. Il y a une foultitude d'"experts" (plus ou moins
autoproclamés) qui résument l'objet au modèle Java/C++/UML (avec un peu
chance ils connaissent ADA et/ou Simula).
On ne peut pas dire que Grady Booch, Bertrand Meyer ou Barbara Liskov
(qui vient d'être distinguée par l'ACM) soit des experts "autoproclamés" !
Post by Bruno Desthuilliers
Mais c'est vrai, tu a raison, tu n'es (hélas) pas le seul à penser que
ce petit sous-ensemble de l'OO est La Vérité Révélée.
:-))
ld
2009-11-15 22:49:23 UTC
Permalink
Post by Wykaaa
Préambule : j'ai beaucoup taillé dans la discussion.
moi aussi ;-)
Post by Wykaaa
J'aime la notion d'interface en Java. c'est ce qui manque à C++ car les
classes abstraites c'est différents.
Les classes abstraites de C++ sont un (tres gros) sur-ensemble des
interfaces Java. Ce que l'on peut faire avec les interfaces Java est
strictement inclu dans ce qu'on peut faire avec les classes abstraites
de C++, la reciproque est biensur largement fausse. Je suis etonne de
la part d'un expert C++ de ne pas savoir cela, et encore plus de la
part de quelqu'un qui attache de l'importance au design.
Post by Wykaaa
Non, les classes sont le moyen de définir des abstractions en conception
(ce sont donc des objets de conception)
Les objets de programmation sont des instances de classes. En SmallTalk,
les classes sont elles-mêmes des objets (langage auto-référent), ce qui
oblige à parler de "métaclasse".
SmallTalk (et Objective-C) n'utilise pas une hierarchie de classe-
metaclasse consistante. On s'en apercoit quand on ecrit un
compilateur Objective-C par exemple ou il faut que le compilateur
traite les classes racines comme des cas (tres) speciaux ou la meta-
classe racine pointe sur Object (ou NSObject), c'est-a-dire sur son
_instance_. Donc dans cette hierarchie, les meta-classes sont des
objets sans "existance concrete", et ne sont pas des classes. Cherchez
l'erreur...

Pour une hierarchie coherente et "self-consistent", vous pourvez
regarder les commentaires au debut du fichier

http://cos.cvs.sourceforge.net/viewvc/cos/CosBase/include/cos/cos/coscls.h?view=markup
ou la figure 4 page 5 dans
http://cos.cvs.sourceforge.net/viewvc/*checkout*/cos/doc/cos-draft-dls09.pdf

Vous y trouverez notament (dans le header):

1) Behaviors are Objects
2) Classes and Generics are Behaviors
3) Meta classes are Classes
4) Property classes are Meta classes
Post by Wykaaa
Post by Bruno Desthuilliers
Encore une fois: le terme est "orienté *objet*", pas "orienté *classe*".
    Les langages à prototypes *sont* des langages objets. Si tu veux
définir un sous-ensemble de la POO portant uniquement sur les langages à
classe (et à typage statique), et discourir et théoriser sur ce
sous-ensemble, libre à toi, mais tu ne *peux* pas prétendre restreindre
l'OO à ce sous-ensemble. C'est tout simplement de la malhonnêteté
intellectuelle.
Merci mais je fais de l'OO depuis le début de la conception objet en 83
et j'ai réalisé des logiciels en ADA, C++, Java, enseigné C++, Java,
ADA, Lisp, Prologue, javascript ainsi que la conception objet et UML des
centaines d'heures, audité des très gros logiciels (supérieurs à 500K
lignes de code) en C++ et Java principalement.
Donc vous savez que:

"la notion d'interface en Java _ne manque pas_ à C++"

Dans le Lakos, cette pattern a meme recu le nom de Protocol, avec
beaucoup plus de flexibilite (et de subtilite) dans son utilisation.

a+, ld.
Wykaaa
2009-11-16 00:21:05 UTC
Permalink
Post by ld
Post by Wykaaa
Préambule : j'ai beaucoup taillé dans la discussion.
moi aussi ;-)
Post by Wykaaa
J'aime la notion d'interface en Java. c'est ce qui manque à C++ car les
classes abstraites c'est différents.
Les classes abstraites de C++ sont un (tres gros) sur-ensemble des
interfaces Java. Ce que l'on peut faire avec les interfaces Java est
strictement inclu dans ce qu'on peut faire avec les classes abstraites
de C++, la reciproque est biensur largement fausse. Je suis etonne de
la part d'un expert C++ de ne pas savoir cela, et encore plus de la
part de quelqu'un qui attache de l'importance au design.
En C++, je ne suis jamais garanti qu'une classe abstraite n'a pas défini
une méthode dont je vais hériter. Avec une interface "à la Java" je suis
sûr qu'il ne "traîne" pas une implémentation de méthode. c'est cela que
j'aime bien avec les interfaces "à la Java". Ceci dit, je n'ai pas
regardé les tous derniers développements de C++. Il y a peut-être des
nouveautés que j'ignore...
Et puis une interface ne peut pas posséder de constructeur.

J'aime ces restrictions sur les interfaces Java. Les classes abstraites
C++ sont trop "piégeantes".

Donc, même si les clases abstraites de C++ sont un surensemble des
interfaces Java, ce n'est pas pour autant que les interfaces Java
doivent être dénigrées car du point de vue sémantique, il y a une
différence entre interface "à la Java" et classe abstraite "à la C++".
Post by ld
Post by Wykaaa
Non, les classes sont le moyen de définir des abstractions en conception
(ce sont donc des objets de conception)
Les objets de programmation sont des instances de classes. En SmallTalk,
les classes sont elles-mêmes des objets (langage auto-référent), ce qui
oblige à parler de "métaclasse".
SmallTalk (et Objective-C) n'utilise pas une hierarchie de classe-
metaclasse consistante. On s'en apercoit quand on ecrit un
compilateur Objective-C par exemple ou il faut que le compilateur
traite les classes racines comme des cas (tres) speciaux ou la meta-
classe racine pointe sur Object (ou NSObject), c'est-a-dire sur son
_instance_. Donc dans cette hierarchie, les meta-classes sont des
objets sans "existance concrete", et ne sont pas des classes. Cherchez
l'erreur...
Oui, bien sur. Mais je ne mettrais pas SmallTalk et Objective-C sur le
même plan car Objective-C est quand même plus "bricolé".

[snip]
Post by ld
Post by Wykaaa
Post by Bruno Desthuilliers
Encore une fois: le terme est "orienté *objet*", pas "orienté *classe*".
Les langages à prototypes *sont* des langages objets. Si tu veux
définir un sous-ensemble de la POO portant uniquement sur les langages à
classe (et à typage statique), et discourir et théoriser sur ce
sous-ensemble, libre à toi, mais tu ne *peux* pas prétendre restreindre
l'OO à ce sous-ensemble. C'est tout simplement de la malhonnêteté
intellectuelle.
Merci mais je fais de l'OO depuis le début de la conception objet en 83
et j'ai réalisé des logiciels en ADA, C++, Java, enseigné C++, Java,
ADA, Lisp, Prologue, javascript ainsi que la conception objet et UML des
centaines d'heures, audité des très gros logiciels (supérieurs à 500K
lignes de code) en C++ et Java principalement.
"la notion d'interface en Java _ne manque pas_ à C++"
Du strict point de vue sémantique, si.
Post by ld
Dans le Lakos, cette pattern a meme recu le nom de Protocol, avec
beaucoup plus de flexibilite (et de subtilite) dans son utilisation.
Désolé, je ne connais pas ce livre.
ld
2009-11-16 10:06:39 UTC
Permalink
Post by Wykaaa
Post by ld
Post by Wykaaa
J'aime la notion d'interface en Java. c'est ce qui manque à C++ car les
classes abstraites c'est différents.
Les classes abstraites de C++ sont un (tres gros) sur-ensemble des
interfaces Java. Ce que l'on peut faire avec les interfaces Java est
strictement inclu dans ce qu'on peut faire avec les classes abstraites
de C++, la reciproque est biensur largement fausse. Je suis etonne de
la part d'un expert C++ de ne pas savoir cela, et encore plus de la
part de quelqu'un qui attache de l'importance au design.
En C++, je ne suis jamais garanti qu'une classe abstraite n'a pas défini
une méthode dont je vais hériter.
Ou est le probleme? C'est au contraire un enorme avantage. D'autre
langage tire parti abondament de cet avantage comme les classes en
Haskell (qui ne sont pas des classes au sens OO du terme).
Post by Wykaaa
Avec une interface "à la Java" je suis
sûr qu'il ne "traîne" pas une implémentation de méthode. c'est cela que
j'aime bien avec les interfaces "à la Java". Ceci dit, je n'ai pas
Vous preferez devoir toujours tout ecrire? Meme si une methode est
generique et peut s'exprimer en fonction des autres methode de la meme
interface?
Post by Wykaaa
regardé les tous derniers développements de C++. Il y a peut-être des
nouveautés que j'ignore...
Rien de neuf depuis C++98 sur ce point.
Post by Wykaaa
Et puis une interface ne peut pas posséder de constructeur.
On peut empecher une "interface" d'avoir un constructeur public, ou
d'etre copiable. C'est meme conseille.
Post by Wykaaa
J'aime ces restrictions sur les interfaces Java. Les classes abstraites
C++ sont trop "piégeantes".
Il suffit d'apprendre a s'en servir. Elles sont moins "piegeantes" que
d'autres aspects de C++ qui paraissent simples au premier abord.
Post by Wykaaa
Donc, même si les clases abstraites de C++ sont un surensemble des
interfaces Java, ce n'est pas pour autant que les interfaces Java
doivent être dénigrées car du point de vue sémantique, il y a une
Je ne les denigre pas, je dis seulement que "qui peu le plus peu le
moins".
Post by Wykaaa
différence entre interface "à la Java" et classe abstraite "à la C++".
difference univoque.
Post by Wykaaa
Post by ld
Post by Wykaaa
Post by Bruno Desthuilliers
Encore une fois: le terme est "orienté *objet*", pas "orienté *classe*".
    Les langages à prototypes *sont* des langages objets. Si tu veux
définir un sous-ensemble de la POO portant uniquement sur les langages à
classe (et à typage statique), et discourir et théoriser sur ce
sous-ensemble, libre à toi, mais tu ne *peux* pas prétendre restreindre
l'OO à ce sous-ensemble. C'est tout simplement de la malhonnêteté
intellectuelle.
Merci mais je fais de l'OO depuis le début de la conception objet en 83
et j'ai réalisé des logiciels en ADA, C++, Java, enseigné C++, Java,
ADA, Lisp, Prologue, javascript ainsi que la conception objet et UML des
centaines d'heures, audité des très gros logiciels (supérieurs à 500K
lignes de code) en C++ et Java principalement.
"la notion d'interface en Java _ne manque pas_ à C++"
Du strict point de vue sémantique, si.
Rien n'empeche d'utiliser les classes abstraites de C++ comme des
interfaces Java avec _exactement_ la meme semantique. C'est un peu
dommage. J'ai meme lu (je sais plus ou) que James Gosling avait dit
qu'une des erreurs de design de Java etait de ne pas avoir permit au
interface Java d'avoir des implementation par defaut en faisant
reference a C++.
Post by Wykaaa
Post by ld
Dans le Lakos, cette pattern a meme recu le nom de Protocol, avec
beaucoup plus de flexibilite (et de subtilite) dans son utilisation.
Désolé, je ne connais pas ce livre.
pourtant il est de 1996

http://www.amazon.com/Large-Scale-Software-Design-John-Lakos/dp/0201633620/ref=sr_1_1?ie=UTF8&s=books&qid=1258365369&sr=8-1

a+, ld.
Wykaaa
2009-11-16 11:35:08 UTC
Permalink
Post by ld
Post by Wykaaa
Post by ld
Post by Wykaaa
J'aime la notion d'interface en Java. c'est ce qui manque à C++ car les
classes abstraites c'est différents.
Les classes abstraites de C++ sont un (tres gros) sur-ensemble des
interfaces Java. Ce que l'on peut faire avec les interfaces Java est
strictement inclu dans ce qu'on peut faire avec les classes abstraites
de C++, la reciproque est biensur largement fausse. Je suis etonne de
la part d'un expert C++ de ne pas savoir cela, et encore plus de la
part de quelqu'un qui attache de l'importance au design.
En C++, je ne suis jamais garanti qu'une classe abstraite n'a pas défini
une méthode dont je vais hériter.
Ou est le probleme? C'est au contraire un enorme avantage. D'autre
langage tire parti abondament de cet avantage comme les classes en
Haskell (qui ne sont pas des classes au sens OO du terme).
Ce n'est pas un avantage du point de vue sûreté de fonctionnement,
encapsulation, etc.
Je veux être certain, que les dizaines de développeurs qui codent en
parallèle mon logiciel de plusieurs centaines de milliers de lignes
n'introduisent pas indûment de l'implémentation dans les interfaces qui
sont autant de "contrats" et qui contiennent, justement, les pré et post
conditions sur l'utilisation des fonctions dont l'interface ne contient
que la spécification.
Post by ld
Post by Wykaaa
Avec une interface "à la Java" je suis
sûr qu'il ne "traîne" pas une implémentation de méthode. c'est cela que
j'aime bien avec les interfaces "à la Java". Ceci dit, je n'ai pas
Vous preferez devoir toujours tout ecrire? Meme si une methode est
generique et peut s'exprimer en fonction des autres methode de la meme
interface?
C'est une question de qualité logicielle. Dans le cas que vous dites, je
ferai (en Java) une classe abstraite relai qui implémente l'interface et
dont toutes les sous-classes dérivent.
C'est ce qui me garantira la prédicabilité sur les fonctionnalités de
toutes les abstractions de ma hiérarchie.
Post by ld
Post by Wykaaa
regardé les tous derniers développements de C++. Il y a peut-être des
nouveautés que j'ignore...
Rien de neuf depuis C++98 sur ce point.
Post by Wykaaa
Et puis une interface ne peut pas posséder de constructeur.
On peut empecher une "interface" d'avoir un constructeur public, ou
d'etre copiable. C'est meme conseille.
Dans ce cas, je dois écrire des choses en plus (en C++) comme un
constructeur vide dans la partie privée, ce dont je suis dispensé en
utilisant une interface Java.
Post by ld
Post by Wykaaa
J'aime ces restrictions sur les interfaces Java. Les classes abstraites
C++ sont trop "piégeantes".
Il suffit d'apprendre a s'en servir. Elles sont moins "piegeantes" que
d'autres aspects de C++ qui paraissent simples au premier abord.
Apprendre à programmer correctement en C++ requiert plusieurs années
(j'en sais quelque chose car pendant une période je donnais des cours
C++ une fois par mois et je voyais comme même des programmeurs aguerris
en C souffraient...
Post by ld
Post by Wykaaa
Donc, même si les clases abstraites de C++ sont un surensemble des
interfaces Java, ce n'est pas pour autant que les interfaces Java
doivent être dénigrées car du point de vue sémantique, il y a une
Je ne les denigre pas, je dis seulement que "qui peu le plus peu le
moins".
Mais le plus est quelques fois l'ennemi du bien. C'est le cas avec C++.

[snip]
Post by ld
Post by Wykaaa
Post by ld
Post by Wykaaa
Post by Bruno Desthuilliers
Encore une fois: le terme est "orienté *objet*", pas "orienté *classe*".
Les langages à prototypes *sont* des langages objets. Si tu veux
définir un sous-ensemble de la POO portant uniquement sur les langages à
classe (et à typage statique), et discourir et théoriser sur ce
sous-ensemble, libre à toi, mais tu ne *peux* pas prétendre restreindre
l'OO à ce sous-ensemble. C'est tout simplement de la malhonnêteté
intellectuelle.
Merci mais je fais de l'OO depuis le début de la conception objet en 83
et j'ai réalisé des logiciels en ADA, C++, Java, enseigné C++, Java,
ADA, Lisp, Prologue, javascript ainsi que la conception objet et UML des
centaines d'heures, audité des très gros logiciels (supérieurs à 500K
lignes de code) en C++ et Java principalement.
"la notion d'interface en Java _ne manque pas_ à C++"
Du strict point de vue sémantique, si.
Rien n'empeche d'utiliser les classes abstraites de C++ comme des
interfaces Java avec _exactement_ la meme semantique. C'est un peu
dommage. J'ai meme lu (je sais plus ou) que James Gosling avait dit
qu'une des erreurs de design de Java etait de ne pas avoir permit au
interface Java d'avoir des implementation par defaut en faisant
reference a C++.
Encore une fois, "on peut" mais on n'est pas forcé...
Donc il faut introduire des règles de programmation supplémentaires (qui
ne seront pas forcément suivies) pour indiquer aux développeurs comment
faire, en C++, des interfaces "à la Java".
Rappelez-vous que je suis dans une démarche très ingénierie du logiciel
de par le contexte dans lequel j'évoluais.
Post by ld
Post by Wykaaa
Post by ld
Dans le Lakos, cette pattern a meme recu le nom de Protocol, avec
beaucoup plus de flexibilite (et de subtilite) dans son utilisation.
Désolé, je ne connais pas ce livre.
pourtant il est de 1996
http://www.amazon.com/Large-Scale-Software-Design-John-Lakos/dp/0201633620/ref=sr_1_1?ie=UTF8&s=books&qid=1258365369&sr=8-1
Personne n'est obligé d'avoir une connaissance exhaustive de toute la
littérature sur l'objet (probablement plusieurs milliers de livres...).
ld
2009-11-16 14:12:46 UTC
Permalink
Post by Wykaaa
Post by ld
Post by Wykaaa
Post by ld
Post by Wykaaa
J'aime la notion d'interface en Java. c'est ce qui manque à C++ car les
classes abstraites c'est différents.
Les classes abstraites de C++ sont un (tres gros) sur-ensemble des
interfaces Java. Ce que l'on peut faire avec les interfaces Java est
strictement inclu dans ce qu'on peut faire avec les classes abstraites
de C++, la reciproque est biensur largement fausse. Je suis etonne de
la part d'un expert C++ de ne pas savoir cela, et encore plus de la
part de quelqu'un qui attache de l'importance au design.
En C++, je ne suis jamais garanti qu'une classe abstraite n'a pas défini
une méthode dont je vais hériter.
Ou est le probleme? C'est au contraire un enorme avantage. D'autre
langage tire parti abondament de cet avantage comme les classes en
Haskell (qui ne sont pas des classes au sens OO du terme).
Ce n'est pas un avantage du point de vue sûreté de fonctionnement,
encapsulation, etc.
Vous avez un exemple concret de ce que vous dites (quelques lignes
devraient suffire)?
Post by Wykaaa
Je veux être certain, que les dizaines de développeurs qui codent en
parallèle mon logiciel de plusieurs centaines de milliers de lignes
n'introduisent pas indûment de l'implémentation dans les interfaces qui
Je ne vois pas comment. Une fois que l'interface est definie, on ne
doit plus la modifier. C'est son role...
Post by Wykaaa
Post by ld
Post by Wykaaa
Avec une interface "à la Java" je suis
sûr qu'il ne "traîne" pas une implémentation de méthode.
Et vous etes aussi sur qu'il y a aura autant d'implementation de la
meme chose que de developpeur. Ce n'est pas plus un gage de qualite.
D'autre part, fournir des implementations generiques dans les
interfaces permet de verifier que les services a redefinir sont bien
orthogonaux.
Post by Wykaaa
Post by ld
Vous preferez devoir toujours tout ecrire? Meme si une methode est
generique et peut s'exprimer en fonction des autres methode de la meme
interface?
C'est une question de qualité logicielle. Dans le cas que vous dites, je
ferai (en Java) une classe abstraite relai qui implémente l'interface et
dont toutes les sous-classes dérivent.
Je ne peux pas croire que vous aillez utilise cette approche dans de
grand projets. Que ce passe-t-il lorsque le code evoluant, vous avez
besoin de fusionner plusieurs interfaces? Ce qui d'ailleurs devrait
etre le cas tres souvent pour que les interfaces restes simples,
orthogonales et composable (par heritage).
Post by Wykaaa
C'est ce qui me garantira la prédicabilité sur les fonctionnalités de
toutes les abstractions de ma hiérarchie.
Ca ne garantit rien du tout, bien au contraire. Vous laissez le
developpeur une plus grande liberte sur l'interpretation qu'il fera du
role de l'interface et de son implementation. Fournir les
implementations generiques (quand c'est possible) donne au moins un
denominateur commun a toutes les classes qui en deriveront. En fait,
ca peut meme s'apparenter aux Concepts pour les templates suivant
comment ces implementations generiques sont designees (et/ou si elles
utilisent le CRTP).
Post by Wykaaa
Dans ce cas, je dois écrire des choses en plus (en C++) comme un
constructeur vide dans la partie privée, ce dont je suis dispensé en
utilisant une interface Java.
J'espere que c'est une blague. D'abord vous n'avez pas besoin d'ecrire
quoi que ce soit pour la construction et si vous voulez interdire la
copie, il suffit de deriver d'une classe appropriee sur le meme modele
de

http://www.boost.org/doc/libs/1_40_0/libs/utility/utility.htm#Class_noncopyable

Et vous considerez que de cela demande plus de travail et est moins
securise que de reecrire toute les methodes generiques dans les
classes derivees?
Post by Wykaaa
Post by ld
Post by Wykaaa
J'aime ces restrictions sur les interfaces Java. Les classes abstraites
C++ sont trop "piégeantes".
Il suffit d'apprendre a s'en servir. Elles sont moins "piegeantes" que
d'autres aspects de C++ qui paraissent simples au premier abord.
Apprendre à programmer correctement en C++ requiert plusieurs années
je ne vous le fais pas dire...
Post by Wykaaa
Post by ld
Post by Wykaaa
Donc, même si les clases abstraites de C++ sont un surensemble des
interfaces Java, ce n'est pas pour autant que les interfaces Java
doivent être dénigrées car du point de vue sémantique, il y a une
Je ne les denigre pas, je dis seulement que "qui peu le plus peu le
moins".
Mais le plus est quelques fois l'ennemi du bien. C'est le cas avec C++.
A ceux qui definissent les "interfaces" de savoir le faire
correctement. Et ca ne demande pas plus de code qu'en Java.
Post by Wykaaa
Post by ld
Rien n'empeche d'utiliser les classes abstraites de C++ comme des
interfaces Java avec _exactement_ la meme semantique. C'est un peu
dommage. J'ai meme lu (je sais plus ou) que James Gosling avait dit
qu'une des erreurs de design de Java etait de ne pas avoir permit au
interface Java d'avoir des implementation par defaut en faisant
reference a C++.
Encore une fois, "on peut" mais on n'est pas forcé...
On n'est pas force non plus d'ecrire du code errone.
Post by Wykaaa
Donc il faut introduire des règles de programmation supplémentaires (qui
ne seront pas forcément suivies) pour indiquer aux développeurs comment
faire, en C++, des interfaces "à la Java".
La definition des interfaces est normalement un travail d'equipe (en
particulier vous que venez apparement de grosses structures ou les
roles et les specs sont clairement definis). Ne pas respecter les
regles, c'est ne pas respecter ses collaborateurs. Et deriver d'une
classe Interface quand on veut ecrire une interface ne me parait pas
etre tres complique, c'est plutot une indication claire d'intention.
Post by Wykaaa
Rappelez-vous que je suis dans une démarche très ingénierie du logiciel
de par le contexte dans lequel j'évoluais.
Je crois surtout que vous avez un peu trop abuser des outils
d'architecture logicielle (votre liste d'acronym dans un autre post me
fait penser a ca) qui vous eloigne du langage pour eviter d'apprendre
a s'en servir correctement (certain diront pour se concentrer sur
l'essentiel ;-).
Post by Wykaaa
Post by ld
Post by Wykaaa
Post by ld
Dans le Lakos, cette pattern a meme recu le nom de Protocol, avec
beaucoup plus de flexibilite (et de subtilite) dans son utilisation.
Désolé, je ne connais pas ce livre.
pourtant il est de 1996
http://www.amazon.com/Large-Scale-Software-Design-John-Lakos/dp/02016...
Personne n'est obligé d'avoir une connaissance exhaustive de toute la
littérature sur l'objet (probablement plusieurs milliers de livres...).
Il n'y a pas des milliers d'ouvrages de reference en C++, tout au plus
une centaine (et je vois large). Et le livre ci-dessus en fait parti
parce que c'est un des seuls qui traite de C++ (post ARM mais pre C+
+98) dans les grands projets (donc fortement influences par le
design). Ne pas l'avoir lu est une lacune, meme si de nombeux point
son obsolete (un peut comme le Barton et Nackman, 1994). Cela rejoint
mon propos comme quoi on peut certainement enseigner la syntaxe et la
semantique d'un vingtaine de langages de programmation, mais
certainement pas etre expert dans tous. L'expertise (pour moi) inclu
aussi comment et pourquoi l'utiliser dans de nombreux cas de figures.

a+, ld.
Wykaaa
2009-11-16 16:31:02 UTC
Permalink
Post by ld
Post by Wykaaa
Post by ld
Post by Wykaaa
Post by ld
Post by Wykaaa
J'aime la notion d'interface en Java. c'est ce qui manque à C++ car les
classes abstraites c'est différents.
Les classes abstraites de C++ sont un (tres gros) sur-ensemble des
interfaces Java. Ce que l'on peut faire avec les interfaces Java est
strictement inclu dans ce qu'on peut faire avec les classes abstraites
de C++, la reciproque est biensur largement fausse. Je suis etonne de
la part d'un expert C++ de ne pas savoir cela, et encore plus de la
part de quelqu'un qui attache de l'importance au design.
En C++, je ne suis jamais garanti qu'une classe abstraite n'a pas défini
une méthode dont je vais hériter.
Ou est le probleme? C'est au contraire un enorme avantage. D'autre
langage tire parti abondament de cet avantage comme les classes en
Haskell (qui ne sont pas des classes au sens OO du terme).
Ce n'est pas un avantage du point de vue sûreté de fonctionnement,
encapsulation, etc.
Vous avez un exemple concret de ce que vous dites (quelques lignes
devraient suffire)?
Ce n'est pas un exemple qu'il faut, c'est du "bon sens" (bien que je
n'aime pas ce terme). Si dans un objet qui est une interface, j'ai une
fonction qui est implémentée (donc une classe abstraite C++, pas une
interface Java), tous ceux qui vont utiliser cette interface vont
hériter de cette implémentation. J'ai donc mélangé spécification
(interface) et implémentation. Je n'ai donc pas encapsuler et je laisse
la porte ouverte à des utilisations non voulues, dans certains
contextes, de cette fonction.
Post by ld
Post by Wykaaa
Je veux être certain, que les dizaines de développeurs qui codent en
parallèle mon logiciel de plusieurs centaines de milliers de lignes
n'introduisent pas indûment de l'implémentation dans les interfaces qui
Je ne vois pas comment. Une fois que l'interface est definie, on ne
doit plus la modifier. C'est son role...
On ne s'est pas compris. Je parlais de celui qui construit l'interface.
Il ne doit pas avoir la possibilité de définir l'implémentation de
certaines fonctions de l'interface. En ADA (même ADA 83) dans la partie
spécification d'un package, je ne peux pas définir l'implémentation. je
peux compiler un ensemble de spécification de packages (sans aucun
"body") et ainsi vérifier la cohérence de ma spécification. En quelque
sorte, la conception globale est compilable.
Post by ld
Post by Wykaaa
Post by ld
Post by Wykaaa
Avec une interface "à la Java" je suis
sûr qu'il ne "traîne" pas une implémentation de méthode.
Et vous etes aussi sur qu'il y a aura autant d'implementation de la
meme chose que de developpeur. Ce n'est pas plus un gage de qualite.
D'autre part, fournir des implementations generiques dans les
interfaces permet de verifier que les services a redefinir sont bien
orthogonaux.
Non. Ce n'est pas au niveau des implémentation, soient-elles génériques,
que je vais m'assurer que les services sont orthogonaux mais bien en
amont... grâce à des outils d'ingénierie des exigences de type DOORS
(afin de tracer les exigences tout au long du développement), du MDA
(Modèle Driven Architecture), par exemple .
Post by ld
Post by Wykaaa
Post by ld
Vous preferez devoir toujours tout ecrire? Meme si une methode est
generique et peut s'exprimer en fonction des autres methode de la meme
interface?
C'est une question de qualité logicielle. Dans le cas que vous dites, je
ferai (en Java) une classe abstraite relai qui implémente l'interface et
dont toutes les sous-classes dérivent.
Je ne peux pas croire que vous aillez utilise cette approche dans de
grand projets. Que ce passe-t-il lorsque le code evoluant, vous avez
besoin de fusionner plusieurs interfaces? Ce qui d'ailleurs devrait
etre le cas tres souvent pour que les interfaces restes simples,
orthogonales et composable (par heritage).
En fonction du découpage fonctionnel (en fait l'architecture de
l'application), on va définir des interfaces (à la Java ou à la façon
des spécifications de package à la ADA), les plus modulaires et simples
possibles. Ensuite, si plusieurs "modules" (regroupement de packages :
pour matérialiser un objet métier, par exemple) ont besoin de cette
interface mais n'ont pas tout à fait les mêmes besoins, on définira
autant de classes abstraites qu'il faut (qui implémentent l'interface)
avec certaines des fonctions qui seront implémentées : en fait toutes
celles qui ne devront pas, en général, être redéfinies (elles seront
marquées finales en Java).
Ce que je décrit là, c'est ce qu'il faut pratiquer aux niveaux
supérieurs d'une architecture globale. Je ne parle pas des interfaces au
niveau d'un package.

Fusionner des interfaces est beaucoup moins fréquent qu'on l'imagine
car, dans une approche SOA, par exemple, cela revient à changer les
caractéristiques des objets métiers (aux plus hauts niveaux de
l'architecture). Ca change donc aussi l'orchestration des services
métiers, dans ce cas...
Post by ld
Post by Wykaaa
C'est ce qui me garantira la prédicabilité sur les fonctionnalités de
toutes les abstractions de ma hiérarchie.
Ca ne garantit rien du tout, bien au contraire. Vous laissez le
developpeur une plus grande liberte sur l'interpretation qu'il fera du
role de l'interface et de son implementation. Fournir les
implementations generiques (quand c'est possible) donne au moins un
denominateur commun a toutes les classes qui en deriveront. En fait,
ca peut meme s'apparenter aux Concepts pour les templates suivant
comment ces implementations generiques sont designees (et/ou si elles
utilisent le CRTP).
Non, il est fortement contraint pas la classe abstraite qui sert
d'intermédiaire et où les fonctions qu'il DOIT utiliser telles quelles
sont marquées "final".
Pour celle qu'il doit coder, bien évidemment il doit respecter les
spécifications.
Post by ld
Post by Wykaaa
Dans ce cas, je dois écrire des choses en plus (en C++) comme un
constructeur vide dans la partie privée, ce dont je suis dispensé en
utilisant une interface Java.
J'espere que c'est une blague. D'abord vous n'avez pas besoin d'ecrire
quoi que ce soit pour la construction et si vous voulez interdire la
copie, il suffit de deriver d'une classe appropriee sur le meme modele
de
http://www.boost.org/doc/libs/1_40_0/libs/utility/utility.htm#Class_noncopyable
Je lis : Class noncopyable has protected constructor and destructor
members to emphasize that it is to be used only as a base class
Donc c'est bien ce que je disais, sauf qu'on a fait une classe "exprès"
dans l'environnement de développement C++...
En Java, je n'ai rien à faire si je dis "interface".
Post by ld
Et vous considerez que de cela demande plus de travail et est moins
securise que de reecrire toute les methodes generiques dans les
classes derivees?
Les méthodes "génériques" (je préfèrerais dire réutilisable telles
quelles dans les sous-classes) seront définies dans une classe abstraite
relai comme je l'ai indiqué plus haut (qui sera fournie aux développeurs)
Post by ld
Post by Wykaaa
Post by ld
Post by Wykaaa
J'aime ces restrictions sur les interfaces Java. Les classes abstraites
C++ sont trop "piégeantes".
Il suffit d'apprendre a s'en servir. Elles sont moins "piegeantes" que
d'autres aspects de C++ qui paraissent simples au premier abord.
Apprendre à programmer correctement en C++ requiert plusieurs années
je ne vous le fais pas dire...
Post by Wykaaa
Post by ld
Post by Wykaaa
Donc, même si les clases abstraites de C++ sont un surensemble des
interfaces Java, ce n'est pas pour autant que les interfaces Java
doivent être dénigrées car du point de vue sémantique, il y a une
Je ne les denigre pas, je dis seulement que "qui peu le plus peu le
moins".
Mais le plus est quelques fois l'ennemi du bien. C'est le cas avec C++.
A ceux qui definissent les "interfaces" de savoir le faire
correctement. Et ca ne demande pas plus de code qu'en Java.
N'oubliez pas que dans une interface Java, je ne peux définir aussi que
des attributs "public static final".

[snip]
Post by ld
Post by Wykaaa
Donc il faut introduire des règles de programmation supplémentaires (qui
ne seront pas forcément suivies) pour indiquer aux développeurs comment
faire, en C++, des interfaces "à la Java".
La definition des interfaces est normalement un travail d'equipe (en
particulier vous que venez apparement de grosses structures ou les
roles et les specs sont clairement definis).
Non, la définition d'une (pas "des") interface est, dans mes domaines,
un travail de spécialiste (et en général, il n'y a pas 36 experts d'un
domaine particulier). Ce spécialiste n'est pas, en général, informaticien.
Vous raisonnez en développeur, mais les interfaces, en particulier les
interfaces dites "critiques", sont définies bien en amont du
développement et lorsqu'elles sont traduites dans du code, elles sont
vérifiées et validées.
Post by ld
Post by Wykaaa
Rappelez-vous que je suis dans une démarche très ingénierie du logiciel
de par le contexte dans lequel j'évoluais.
Je crois surtout que vous avez un peu trop abuser des outils
d'architecture logicielle (votre liste d'acronym dans un autre post me
fait penser a ca) qui vous eloigne du langage pour eviter d'apprendre
a s'en servir correctement (certain diront pour se concentrer sur
l'essentiel ;-).
Dans les projets dans lesquels j'ai "trempé", le code représente à peine
20% de l'activité même s'il est très volumineux (environ entre 300 000
et 4 millions de lignes de code). Dans ces types de projet, le codage
n'est qu'une "translation" dans un langage de programmation, de choses
qui sont déjà décrites très précisément par ailleurs. En clair, les
"programmeurs" n'inventent rien par rapport à la conception et aux
spécifications. Il leur ait même quasiment interdit d'inventer de
nouveaux objets par rapport à ce qui est spécifié et conçu !
Post by ld
Post by Wykaaa
Post by ld
Post by Wykaaa
Post by ld
Dans le Lakos, cette pattern a meme recu le nom de Protocol, avec
beaucoup plus de flexibilite (et de subtilite) dans son utilisation.
Désolé, je ne connais pas ce livre.
pourtant il est de 1996
http://www.amazon.com/Large-Scale-Software-Design-John-Lakos/dp/02016...
Personne n'est obligé d'avoir une connaissance exhaustive de toute la
littérature sur l'objet (probablement plusieurs milliers de livres...).
Il n'y a pas des milliers d'ouvrages de reference en C++, tout au plus
une centaine (et je vois large). Et le livre ci-dessus en fait parti
parce que c'est un des seuls qui traite de C++ (post ARM mais pre C+
+98) dans les grands projets (donc fortement influences par le
design). Ne pas l'avoir lu est une lacune, meme si de nombeux point
son obsolete (un peut comme le Barton et Nackman, 1994). Cela rejoint
mon propos comme quoi on peut certainement enseigner la syntaxe et la
semantique d'un vingtaine de langages de programmation, mais
certainement pas etre expert dans tous. L'expertise (pour moi) inclu
aussi comment et pourquoi l'utiliser dans de nombreux cas de figures.
Je parlais de milliers concernant tout le vaste univers de l'objet (y
compris tous les bouquins sur les langages). En ce qui concerne C++,
c'est quasiment ma deuxième langue naturelle...

De plus, le livre de Lakos ne figure dans aucun des référentiels de mes
clients (j'ai vérifié). Il doit y avoir une raison.
Dans mes presque 200 Go de documents de veille technologique, je n'ai
que 4 références à ce livre.
Par contre je connais ce livre : Coplien, James O. Multi-paradigm design
for C++ (Addison-Wesley, 1999). ISBN 0-201-82467-1, absolument
indispensable.
Bruno Desthuilliers
2009-11-16 20:29:30 UTC
Permalink
Wykaaa a écrit :
(snip)
Post by Wykaaa
Dans ces types de projet, le codage
n'est qu'une "translation" dans un langage de programmation, de choses
qui sont déjà décrites très précisément par ailleurs. En clair, les
"programmeurs"
n'inventent rien par rapport à la conception et aux
spécifications. Il leur ait même quasiment interdit d'inventer de
nouveaux objets par rapport à ce qui est spécifié et conçu
C'est pas des développeurs, c'est des pisseurs de code. Un boulot comme
ça, moi, je me pends.
ld
2009-11-17 15:47:21 UTC
Permalink
Post by Wykaaa
Post by ld
Post by Wykaaa
Post by ld
Post by Wykaaa
Post by ld
Post by Wykaaa
J'aime la notion d'interface en Java. c'est ce qui manque à C++ car les
classes abstraites c'est différents.
Les classes abstraites de C++ sont un (tres gros) sur-ensemble des
interfaces Java. Ce que l'on peut faire avec les interfaces Java est
strictement inclu dans ce qu'on peut faire avec les classes abstraites
de C++, la reciproque est biensur largement fausse. Je suis etonne de
la part d'un expert C++ de ne pas savoir cela, et encore plus de la
part de quelqu'un qui attache de l'importance au design.
En C++, je ne suis jamais garanti qu'une classe abstraite n'a pas défini
une méthode dont je vais hériter.
Ou est le probleme? C'est au contraire un enorme avantage. D'autre
langage tire parti abondament de cet avantage comme les classes en
Haskell (qui ne sont pas des classes au sens OO du terme).
Ce n'est pas un avantage du point de vue sûreté de fonctionnement,
encapsulation, etc.
Vous avez un exemple concret de ce que vous dites (quelques lignes
devraient suffire)?
Ce n'est pas un exemple qu'il faut,
Je vous demande un exemple en connaissance de cause. Donc sans
exemple, ce que vous dites est pure speculation.
Post by Wykaaa
c'est du "bon sens" (bien que je
n'aime pas ce terme). Si dans un objet qui est une interface, j'ai une
fonction qui est implémentée (donc une classe abstraite C++, pas une
interface Java), tous ceux qui vont utiliser cette interface vont
hériter de cette implémentation.
C'est le but. Mais rien n'empeche de la redefinir si le besoin s'en
fait sentir.
Post by Wykaaa
J'ai donc mélangé spécification
(interface) et implémentation.
Encore une fois, specification (declaratif) <> interface (imperatif).
Vous melanger deux choses differentes.
Post by Wykaaa
Je n'ai donc pas encapsuler et je laisse
la porte ouverte à des utilisations non voulues, dans certains
contextes, de cette fonction.
Comme? Encore une fois un exemple serait le bienvenu.
Post by Wykaaa
Post by ld
Post by Wykaaa
Je veux être certain, que les dizaines de développeurs qui codent en
parallèle mon logiciel de plusieurs centaines de milliers de lignes
n'introduisent pas indûment de l'implémentation dans les interfaces qui
Je ne vois pas comment. Une fois que l'interface est definie, on ne
doit plus la modifier. C'est son role...
On ne s'est pas compris. Je parlais de celui qui construit l'interface.
Il ne doit pas avoir la possibilité de définir l'implémentation de
certaines fonctions de l'interface.
Celui (plutot ceux) qui construit l'interface a autorite a le faire.
Si en plus (option) il specifie une implementation, c'est qu'il a
aussi autorite a le faire. C'est un outils en plus a sa disposition
qui lui permet de forcer/proposer une implementation par defaut et/ou
generique.
Post by Wykaaa
Post by ld
Post by Wykaaa
Post by ld
Post by Wykaaa
Avec une interface "à la Java" je suis
sûr qu'il ne "traîne" pas une implémentation de méthode.
Et vous etes aussi sur qu'il y a aura autant d'implementation de la
meme chose que de developpeur. Ce n'est pas plus un gage de qualite.
D'autre part, fournir des implementations generiques dans les
interfaces permet de verifier que les services a redefinir sont bien
orthogonaux.
Non. Ce n'est pas au niveau des implémentation, soient-elles génériques,
que je vais m'assurer que les services sont orthogonaux mais bien en
amont...
C'est ce que je dit.
Post by Wykaaa
grâce à des outils d'ingénierie des exigences de type DOORS
(afin de tracer les exigences tout au long du développement), du MDA
(Modèle Driven Architecture), par exemple .
Ah, on en revient au programmeur qui programme avec sa souri.
Post by Wykaaa
Post by ld
Post by Wykaaa
Post by ld
Vous preferez devoir toujours tout ecrire? Meme si une methode est
generique et peut s'exprimer en fonction des autres methode de la meme
interface?
C'est une question de qualité logicielle. Dans le cas que vous dites, je
ferai (en Java) une classe abstraite relai qui implémente l'interface et
dont toutes les sous-classes dérivent.
Je ne peux pas croire que vous aillez utilise cette approche dans de
grand projets. Que ce passe-t-il lorsque le code evoluant, vous avez
besoin de fusionner plusieurs interfaces? Ce qui d'ailleurs devrait
etre le cas tres souvent pour que les interfaces restes simples,
orthogonales et composable (par heritage).
En fonction du découpage fonctionnel (en fait l'architecture de
l'application), on va définir des interfaces (à la Java ou à la façon
des spécifications de package à la ADA), les plus modulaires et simples
pour matérialiser un objet métier, par exemple) ont besoin de cette
interface mais n'ont pas tout à fait les mêmes besoins, on définira
autant de classes abstraites qu'il faut (qui implémentent l'interface)
avec certaines des fonctions qui seront implémentées : en fait toutes
celles qui ne devront pas, en général, être redéfinies (elles seront
marquées finales en Java).
Ce que je décrit là, c'est ce qu'il faut pratiquer aux niveaux
supérieurs d'une architecture globale. Je ne parle pas des interfaces au
niveau d'un package.
Joli HS. Il me semblait qu'on parlait de POO, pas d'architecture
logicielle... Ceci dit, j'ai de nombreux exemples en memoire ou cette
approche "super encadrer" par des methodologies "super etablies" ont
"super fouares". La raison: ignorance du modele et des specifites du
langage cible (C++ en l'occurence).
Post by Wykaaa
Fusionner des interfaces est beaucoup moins fréquent qu'on l'imagine
car, dans une approche SOA, par exemple, cela revient à changer les
caractéristiques des objets métiers (aux plus hauts niveaux de
l'architecture). Ca change donc aussi l'orchestration des services
métiers, dans ce cas...
C'est ce que je vous explique depuis le debut. Les approches dites de
haut niveau (Architecture software) ne debouche pas sur des frameworks
(du code reutilisable). Ils ne sont capables que de construire des
applications en reutilisant des frameworks. Vos applications en
millions de lignes tombent tout a fait dans ce schema ou le code est
un traduction quasi automatique de l'architecture dans un langage en
se basant sur des frameworks. Bref, c'est du Lego, pas de l'engenerie
software.
Post by Wykaaa
Post by ld
Post by Wykaaa
C'est ce qui me garantira la prédicabilité sur les fonctionnalités de
toutes les abstractions de ma hiérarchie.
Ca ne garantit rien du tout, bien au contraire. Vous laissez le
developpeur une plus grande liberte sur l'interpretation qu'il fera du
role de l'interface et de son implementation. Fournir les
implementations generiques (quand c'est possible) donne au moins un
denominateur commun a toutes les classes qui en deriveront. En fait,
ca peut meme s'apparenter aux Concepts pour les templates suivant
comment ces implementations generiques sont designees (et/ou si elles
utilisent le CRTP).
Non, il est fortement contraint pas la classe abstraite qui sert
d'intermédiaire et où les fonctions qu'il DOIT utiliser telles quelles
sont marquées "final".
Rien n'empeche de faire la meme chose en C++, si c'est la solution la
plus adaptee.
Post by Wykaaa
Pour celle qu'il doit coder, bien évidemment il doit respecter les
spécifications.
Donc plutot que de faire en sorte que l'interface garantisse (si c'est
adapte) une partie des specs, maintenant vous demandez a ce pauvre
programmeur d'etre intelligent et de savoir interpreter les specs?
Attention, vous prenez des risques et cela pourra vous etre reproche.
Post by Wykaaa
Post by ld
Post by Wykaaa
Dans ce cas, je dois écrire des choses en plus (en C++) comme un
constructeur vide dans la partie privée, ce dont je suis dispensé en
utilisant une interface Java.
J'espere que c'est une blague. D'abord vous n'avez pas besoin d'ecrire
quoi que ce soit pour la construction et si vous voulez interdire la
copie, il suffit de deriver d'une classe appropriee sur le meme modele
de
http://www.boost.org/doc/libs/1_40_0/libs/utility/utility.htm#Class_n...
Je lis : Class noncopyable has protected constructor and destructor
members to emphasize that it is to be used only as a base class
Donc c'est bien ce que je disais, sauf qu'on a fait une classe "exprès"
dans l'environnement de développement C++...
Donc ce n'est pas ce que vous disiez. Un mot clef Java, devient en C++
une classe. C'est ce qui s'appelle l'expressivite d'un langage.
Post by Wykaaa
En Java, je n'ai rien à faire si je dis "interface".
interface comparable { .. }

vous parait enormement plus clair que

class comparable : interface { ... };

Si ce n'est pas de la mauvaise foi!
Post by Wykaaa
Post by ld
A ceux qui definissent les "interfaces" de savoir le faire
correctement. Et ca ne demande pas plus de code qu'en Java.
N'oubliez pas que dans une interface Java, je ne peux définir aussi que
des attributs "public static final".
Quel est le rapport?
Post by Wykaaa
Post by ld
Post by Wykaaa
Donc il faut introduire des règles de programmation supplémentaires (qui
ne seront pas forcément suivies) pour indiquer aux développeurs comment
faire, en C++, des interfaces "à la Java".
La definition des interfaces est normalement un travail d'equipe (en
particulier vous que venez apparement de grosses structures ou les
roles et les specs sont clairement definis).
Non, la définition d'une (pas "des") interface est, dans mes domaines,
un travail de spécialiste (et en général, il n'y a pas 36 experts d'un
domaine particulier). Ce spécialiste n'est pas, en général, informaticien.
Vous raisonnez en développeur, mais les interfaces, en particulier les
interfaces dites "critiques", sont définies bien en amont du
développement et lorsqu'elles sont traduites dans du code, elles sont
vérifiées et validées.
Ce qui est interessant, c'est que dans les projets on considere cette
etape comme la plus prestigieuse, faite par des experts qui sont "au-
dessus" du code. Et dans la plupart des projets cette etape est
claire, tres bien concue et ne pose pas de probleme. C'est ensuite que
ca se gate, lorsque les chefs de projets (et/ou) les developpeurs ne
savent pas (n'arrive pas a) concretiser cette magnifique interface de
"tres" haut niveau en une implementation fiable, stable, evolutive et
performante et que tout le projet se plante.

Etes-vous sur que vos specialistes sont en charge de la partie la plus
difficile du projet?
Post by Wykaaa
Post by ld
Post by Wykaaa
Rappelez-vous que je suis dans une démarche très ingénierie du logiciel
de par le contexte dans lequel j'évoluais.
Je crois surtout que vous avez un peu trop abuser des outils
d'architecture logicielle (votre liste d'acronym dans un autre post me
fait penser a ca) qui vous eloigne du langage pour eviter d'apprendre
a s'en servir correctement (certain diront pour se concentrer sur
l'essentiel ;-).
Dans les projets dans lesquels j'ai "trempé", le code représente à peine
20% de l'activité même s'il est très volumineux (environ entre 300 000
et 4 millions de lignes de code).
C'est ce qui arrive quand on ne sait pas/plus programmer et qu'on
laisse des outils le faire a sa place. Puisque vous aimez les noms,
permettez moi de cite R.E. Johnson (du GoF) dans un de ses papier:

``If a system is continually changing, or if you want users to be able
to extend it, then the Dynamic Object Model architecture is often
useful. [...] Systems based on Dynamic Object Models can be much
smaller than alternatives. [...] I am working on replacing a system
with several millions lines of code with a system based on a dynamic
object model that I predict will require about 20,000 lines of code.
[...] This makes these systems easier to change by experts, and (in
theory) should make them easier to understand and maintain. But a
Dynamic Object Model is hard to build. [...] A system based on a
Dynamic Object Model is an interpreter, and can be slow.''

Comme a peu pres tous les projets evoluent ou meurts, le probleme est
relativement frequent.
Post by Wykaaa
Dans ces types de projet, le codage
n'est qu'une "translation" dans un langage de programmation, de choses
qui sont déjà décrites très précisément par ailleurs. En clair, les
"programmeurs" n'inventent rien par rapport à la conception et aux
spécifications. Il leur ait même quasiment interdit d'inventer de
nouveaux objets par rapport à ce qui est spécifié et conçu !
Ben voyons. Cette approche a montrer plus qu'il n'etait necessaire son
absudite et ses echecs. De meme pour les strutures ou le developpeur
est roi et controle tout et ou personne a par lui comprend le code.
Nous sommes bientot en 2010 et les choses bougent.
Post by Wykaaa
Post by ld
Post by Wykaaa
Post by ld
Post by Wykaaa
Post by ld
Dans le Lakos, cette pattern a meme recu le nom de Protocol, avec
beaucoup plus de flexibilite (et de subtilite) dans son utilisation.
Désolé, je ne connais pas ce livre.
pourtant il est de 1996
http://www.amazon.com/Large-Scale-Software-Design-John-Lakos/dp/02016...
Personne n'est obligé d'avoir une connaissance exhaustive de toute la
littérature sur l'objet (probablement plusieurs milliers de livres...).
Il n'y a pas des milliers d'ouvrages de reference en C++, tout au plus
une centaine (et je vois large). Et le livre ci-dessus en fait parti
parce que c'est un des seuls qui traite de C++ (post ARM mais pre C+
+98) dans les grands projets (donc fortement influences par le
design). Ne pas l'avoir lu est une lacune, meme si de nombeux point
son obsolete (un peut comme le Barton et Nackman, 1994). Cela rejoint
mon propos comme quoi on peut certainement enseigner la syntaxe et la
semantique d'un vingtaine de langages de programmation, mais
certainement pas etre expert dans tous. L'expertise (pour moi) inclu
aussi comment et pourquoi l'utiliser dans de nombreux cas de figures.
Je parlais de milliers concernant tout le vaste univers de l'objet (y
compris tous les bouquins sur les langages).
Vous etes situe vers Marseille?
Post by Wykaaa
En ce qui concerne C++,
c'est quasiment ma deuxième langue naturelle...
Ah non, plutot Paris.
Post by Wykaaa
De plus, le livre de Lakos ne figure dans aucun des référentiels de mes
clients (j'ai vérifié). Il doit y avoir une raison.
Leur ignorance?
Post by Wykaaa
Dans mes presque 200 Go de documents de veille technologique, je n'ai
que 4 références à ce livre.
Par contre je connais ce livre : Coplien, James O. Multi-paradigm design
for C++ (Addison-Wesley, 1999). ISBN 0-201-82467-1, absolument
indispensable.
C'est bien de connaitre un livre. Vous parliez d'un millier je crois.
Pour ce qui est de cette reference, vous pourrez constater dans

http://cos.cvs.sourceforge.net/viewvc/*checkout*/cos/doc/slides-design.pdf

que je suis d'accord avec lui sur l'approche, mais que les conclusions
ne sont pas forcement les memes (le slide 67 peut aussi vous
interesser).

a+, ld.
Wykaaa
2009-11-17 22:01:05 UTC
Permalink
Post by ld
Post by Wykaaa
Post by ld
Post by Wykaaa
Post by ld
Post by Wykaaa
Post by ld
Post by Wykaaa
J'aime la notion d'interface en Java. c'est ce qui manque à C++ car les
classes abstraites c'est différents.
Les classes abstraites de C++ sont un (tres gros) sur-ensemble des
interfaces Java. Ce que l'on peut faire avec les interfaces Java est
strictement inclu dans ce qu'on peut faire avec les classes abstraites
de C++, la reciproque est biensur largement fausse. Je suis etonne de
la part d'un expert C++ de ne pas savoir cela, et encore plus de la
part de quelqu'un qui attache de l'importance au design.
En C++, je ne suis jamais garanti qu'une classe abstraite n'a pas défini
une méthode dont je vais hériter.
Ou est le probleme? C'est au contraire un enorme avantage. D'autre
langage tire parti abondament de cet avantage comme les classes en
Haskell (qui ne sont pas des classes au sens OO du terme).
Ce n'est pas un avantage du point de vue sûreté de fonctionnement,
encapsulation, etc.
Vous avez un exemple concret de ce que vous dites (quelques lignes
devraient suffire)?
Ce n'est pas un exemple qu'il faut,
Je vous demande un exemple en connaissance de cause. Donc sans
exemple, ce que vous dites est pure speculation.
Alors allons-y. Comme je ne veux pas montrer trop de lignes de code,
l'exemple peut ne pas sembler pertinent.

Cet exemple est tiré d'un simulateur d'assembleur (en C++). Mille
excuses pour les tabulations à cause du copier/coller...

Voci la classe abstraite Instruction (racine de la hiérarchie Instruction.
class Instruction
{
public :
virtual void exec() const =0;
virtual int is_halt() const {return 0;}
};

On remarque qu'il y aune fonction is_halt() qui est définie.

Evidemment, toutes les instruction ne sont pas "halt" sauf l'instruction
"Halt", donc toutes les instruction héritent de cette implémentation de
is_halt.
Maintenant voici la classe Halt :

class Halt : public Instruction
{
public :
void exec() const; //jamais appelee mais redefinie sinon la //
classe serait abstraite
int is_halt() const {return 1;}
};

Si jamais le développeur de la classe Halt ne fait pas attention
(évidemment là c'est trivial car j'ai juste isolé ce qui nous
préoccupe), il peut ne pas redéfinir la fonction is_halt ce qui est
catastrophique pour la boucle principale de simulation (dans le "main")
que voici (le programme est dans un tableau... de type Instruction*)

// Boucle de simulation :
while (!MemProg[co]->is_halt())
{
MemProg[co]->exec();

}
co est le compteur ordinal.
Bien que cet exemple soit trivial, on voit bien les catastrophes que ça
peut engendrer de ne pas faire de la classe Instruction, une vraie
interface (sans aucune définition de fonction).
Donc, je préconise dans ce cas de faire de Instruction une vraie
interface (is_halt est abstraite) et fournir 2 classes abstraites qui
implémentent cette interface : l'une dans laquelle is_halt est définie
en renvoyant 0 et l'autre où is_halt renvoie 1. La fonction exec
n'étant implémentée ni dans l'une, ni dans l'autre évidemment puisque
l'exec est spécifique de chaque instructions.
Post by ld
Post by Wykaaa
c'est du "bon sens" (bien que je
n'aime pas ce terme). Si dans un objet qui est une interface, j'ai une
fonction qui est implémentée (donc une classe abstraite C++, pas une
interface Java), tous ceux qui vont utiliser cette interface vont
hériter de cette implémentation.
C'est le but. Mais rien n'empeche de la redefinir si le besoin s'en
fait sentir.
Post by Wykaaa
J'ai donc mélangé spécification
(interface) et implémentation.
Encore une fois, specification (declaratif) <> interface (imperatif).
Vous melanger deux choses differentes.
Oui, désolé, j'ai voulu aller vite.

[snip]
Post by ld
Post by Wykaaa
Post by ld
Post by Wykaaa
Je veux être certain, que les dizaines de développeurs qui codent en
parallèle mon logiciel de plusieurs centaines de milliers de lignes
n'introduisent pas indûment de l'implémentation dans les interfaces qui
Je ne vois pas comment. Une fois que l'interface est definie, on ne
doit plus la modifier. C'est son role...
On ne s'est pas compris. Je parlais de celui qui construit l'interface.
Il ne doit pas avoir la possibilité de définir l'implémentation de
certaines fonctions de l'interface.
Celui (plutot ceux) qui construit l'interface a autorite a le faire.
Si en plus (option) il specifie une implementation, c'est qu'il a
aussi autorite a le faire. C'est un outils en plus a sa disposition
qui lui permet de forcer/proposer une implementation par defaut et/ou
generique.
Non, dans mon environnement, ceux qui définissent (au sens de coder) les
interfaces ne peuvent pas le faire car dans la conception, ce n'est déjà
pas permis qu'une interface implémente quelque chose.

[snip]
Post by ld
Post by Wykaaa
grâce à des outils d'ingénierie des exigences de type DOORS
(afin de tracer les exigences tout au long du développement), du MDA
(Modèle Driven Architecture), par exemple .
Ah, on en revient au programmeur qui programme avec sa souri.
Là vous abusez. J'ai participé à une pré-étude qui a débouché, pour la
maîtrise d'oeuvre, sur un cahier des charges comportant plus de 8 000
besoins, exigences, contraintes. Si vous n'avez pas d'outil d'ingénierie
des exigences, expliquez-moi comment vous faites pour leur traçabilité
tout au long du développement et comment vous gérer l'évolution des
besoins ?

Ce n'est d'ailleurs pas un job de programmeur. Il y a, en général, une
personne dédiée à cette tâche dans le projet + un administrateur de l'outil.
Ce n'est pas "le programmeur qui programme avec la souris" !

D'ailleurs, pour coder, vous utilisez toujours vi ?

[snip]
Post by ld
Post by Wykaaa
En fonction du découpage fonctionnel (en fait l'architecture de
l'application), on va définir des interfaces (à la Java ou à la façon
des spécifications de package à la ADA), les plus modulaires et simples
pour matérialiser un objet métier, par exemple) ont besoin de cette
interface mais n'ont pas tout à fait les mêmes besoins, on définira
autant de classes abstraites qu'il faut (qui implémentent l'interface)
avec certaines des fonctions qui seront implémentées : en fait toutes
celles qui ne devront pas, en général, être redéfinies (elles seront
marquées finales en Java).
Ce que je décrit là, c'est ce qu'il faut pratiquer aux niveaux
supérieurs d'une architecture globale. Je ne parle pas des interfaces au
niveau d'un package.
Joli HS. Il me semblait qu'on parlait de POO, pas d'architecture
logicielle...
Bin on était sur la COO, il me semble (?) dans cette partie du fil

Ceci dit, j'ai de nombreux exemples en memoire ou cette
Post by ld
approche "super encadrer" par des methodologies "super etablies" ont
"super fouares". La raison: ignorance du modele et des specifites du
langage cible (C++ en l'occurence).
J'ai entendu ces arguments fallacieux des centaines de fois. Bien sûr
qu'il faut des personnes, en amont, qui connaissent les spécificités et
les caractéristiques du ou des langages cibles utilisés (au moins à
partir de la définition de l'architecture).
Dans mon environnement, il y a d'ailleurs d'un côté des équipes
fonctionnelles (métier) et des équipes techniques avec des coordinations
définies dans la méthodologie. On fait souvent du "2TUP" comme ceci :
Loading Image.../view
Post by ld
Post by Wykaaa
Fusionner des interfaces est beaucoup moins fréquent qu'on l'imagine
car, dans une approche SOA, par exemple, cela revient à changer les
caractéristiques des objets métiers (aux plus hauts niveaux de
l'architecture). Ca change donc aussi l'orchestration des services
métiers, dans ce cas...
C'est ce que je vous explique depuis le debut. Les approches dites de
haut niveau (Architecture software) ne debouche pas sur des frameworks
(du code reutilisable). Ils ne sont capables que de construire des
applications en reutilisant des frameworks. Vos applications en
millions de lignes tombent tout a fait dans ce schema ou le code est
un traduction quasi automatique de l'architecture dans un langage en
se basant sur des frameworks. Bref, c'est du Lego, pas de l'engenerie
software.
Enfin, tout de même pas si automatique que ça...
C'est de la pure ingénierie système (et pas software) et heureusement
qu'on fait un peu de "Lego", comme vous dites, sinon on n'arriverait
jamais à construire et faire fonctionner une centrale nucléaire, par
exemple.

[snip]
Post by ld
Post by Wykaaa
Post by ld
Post by Wykaaa
Dans ce cas, je dois écrire des choses en plus (en C++) comme un
constructeur vide dans la partie privée, ce dont je suis dispensé en
utilisant une interface Java.
J'espere que c'est une blague. D'abord vous n'avez pas besoin d'ecrire
quoi que ce soit pour la construction et si vous voulez interdire la
copie, il suffit de deriver d'une classe appropriee sur le meme modele
de
http://www.boost.org/doc/libs/1_40_0/libs/utility/utility.htm#Class_n...
Je lis : Class noncopyable has protected constructor and destructor
members to emphasize that it is to be used only as a base class
Donc c'est bien ce que je disais, sauf qu'on a fait une classe "exprès"
dans l'environnement de développement C++...
Donc ce n'est pas ce que vous disiez. Un mot clef Java, devient en C++
une classe. C'est ce qui s'appelle l'expressivite d'un langage.
C'est exactement ce que je disais. Je doit remplacer le mot clé Java par
une classe en C++, donc j'écris plus de choses...

[snip]
Post by ld
Post by Wykaaa
Post by ld
A ceux qui definissent les "interfaces" de savoir le faire
correctement. Et ca ne demande pas plus de code qu'en Java.
N'oubliez pas que dans une interface Java, je ne peux définir aussi que
des attributs "public static final".
Quel est le rapport?
Dans une classe abstraite C++, je peux définir des attributs qui seront
hérités. Ce n'est pas ce que je veux si je veux faire une interface...
Il faut donc décrire des règles méthodologiques, dans un environnement
C++, pour indiquer comment faire une interface...
Post by ld
Post by Wykaaa
Post by ld
Post by Wykaaa
Donc il faut introduire des règles de programmation supplémentaires (qui
ne seront pas forcément suivies) pour indiquer aux développeurs comment
faire, en C++, des interfaces "à la Java".
La definition des interfaces est normalement un travail d'equipe (en
particulier vous que venez apparement de grosses structures ou les
roles et les specs sont clairement definis).
Non, la définition d'une (pas "des") interface est, dans mes domaines,
un travail de spécialiste (et en général, il n'y a pas 36 experts d'un
domaine particulier). Ce spécialiste n'est pas, en général, informaticien.
Vous raisonnez en développeur, mais les interfaces, en particulier les
interfaces dites "critiques", sont définies bien en amont du
développement et lorsqu'elles sont traduites dans du code, elles sont
vérifiées et validées.
Ce qui est interessant, c'est que dans les projets on considere cette
etape comme la plus prestigieuse, faite par des experts qui sont "au-
dessus" du code. Et dans la plupart des projets cette etape est
claire, tres bien concue et ne pose pas de probleme. C'est ensuite que
ca se gate, lorsque les chefs de projets (et/ou) les developpeurs ne
savent pas (n'arrive pas a) concretiser cette magnifique interface de
"tres" haut niveau en une implementation fiable, stable, evolutive et
performante et que tout le projet se plante.
C'est l'objet des revues auxquelles des développeurs participent car
sinon, je suis d'accord avec vous, il a les risques que vous énumérez.
Post by ld
Etes-vous sur que vos specialistes sont en charge de la partie la plus
difficile du projet?
Je n'ai jamais dit cela. Dans chaque activité d'un projet il y a (ou il
peut y avoir) des parties difficiles.
Post by ld
Post by Wykaaa
Post by ld
Post by Wykaaa
Rappelez-vous que je suis dans une démarche très ingénierie du logiciel
de par le contexte dans lequel j'évoluais.
Je crois surtout que vous avez un peu trop abuser des outils
d'architecture logicielle (votre liste d'acronym dans un autre post me
fait penser a ca) qui vous eloigne du langage pour eviter d'apprendre
a s'en servir correctement (certain diront pour se concentrer sur
l'essentiel ;-).
Dans les projets dans lesquels j'ai "trempé", le code représente à peine
20% de l'activité même s'il est très volumineux (environ entre 300 000
et 4 millions de lignes de code).
C'est ce qui arrive quand on ne sait pas/plus programmer et qu'on
laisse des outils le faire a sa place.
Non, regardez tous les chiffres que vous voudrez dans la littérature
concernant les projets (du type de ceux dont je parle) et vous verrez
que le % de l'activité de codage diminue avec la taille du projet pour
atteindre un minimum d'environ 20% dans les très gros projets.

Puisque vous aimez les noms,
Post by ld
``If a system is continually changing, or if you want users to be able
to extend it, then the Dynamic Object Model architecture is often
useful. [...] Systems based on Dynamic Object Models can be much
smaller than alternatives. [...] I am working on replacing a system
with several millions lines of code with a system based on a dynamic
object model that I predict will require about 20,000 lines of code.
[...] This makes these systems easier to change by experts, and (in
theory) should make them easier to understand and maintain. But a
Dynamic Object Model is hard to build. [...] A system based on a
Dynamic Object Model is an interpreter, and can be slow.''
Ca c'est typiquement du pipotage et du marketing (c'est presuqe pareil
d'ailleurs...). Je n'ai JAMAIS vu un logiciel de plusieurs millions de
lignes "maigrir" jusqu'à 20K lignes à fonctionnalités égales. Le mieux
que j'ai vu c'est une diminution de moitié (et encore, le programme
d'origine était assez mal codé).

[snip]
Post by ld
Post by Wykaaa
Post by ld
Post by Wykaaa
Post by ld
Post by Wykaaa
Post by ld
Dans le Lakos, cette pattern a meme recu le nom de Protocol, avec
beaucoup plus de flexibilite (et de subtilite) dans son utilisation.
Désolé, je ne connais pas ce livre.
pourtant il est de 1996
http://www.amazon.com/Large-Scale-Software-Design-John-Lakos/dp/02016...
Personne n'est obligé d'avoir une connaissance exhaustive de toute la
littérature sur l'objet (probablement plusieurs milliers de livres...).
Il n'y a pas des milliers d'ouvrages de reference en C++, tout au plus
une centaine (et je vois large). Et le livre ci-dessus en fait parti
parce que c'est un des seuls qui traite de C++ (post ARM mais pre C+
+98) dans les grands projets (donc fortement influences par le
design). Ne pas l'avoir lu est une lacune, meme si de nombeux point
son obsolete (un peut comme le Barton et Nackman, 1994). Cela rejoint
mon propos comme quoi on peut certainement enseigner la syntaxe et la
semantique d'un vingtaine de langages de programmation, mais
certainement pas etre expert dans tous. L'expertise (pour moi) inclu
aussi comment et pourquoi l'utiliser dans de nombreux cas de figures.
Je parlais de milliers concernant tout le vaste univers de l'objet (y
compris tous les bouquins sur les langages).
Vous etes situe vers Marseille?
Calculez :-)
Post by ld
Post by Wykaaa
En ce qui concerne C++,
c'est quasiment ma deuxième langue naturelle...
Ah non, plutot Paris.
??
Post by ld
Post by Wykaaa
De plus, le livre de Lakos ne figure dans aucun des référentiels de mes
clients (j'ai vérifié). Il doit y avoir une raison.
Leur ignorance?
Peut-être.
Post by ld
Post by Wykaaa
Dans mes presque 200 Go de documents de veille technologique, je n'ai
que 4 références à ce livre.
Par contre je connais ce livre : Coplien, James O. Multi-paradigm design
for C++ (Addison-Wesley, 1999). ISBN 0-201-82467-1, absolument
indispensable.
C'est bien de connaitre un livre.
Je ne vais pas vous citer tous les livres que j'ai lu sur le sujet ni
tous les documents de l'OTAN ou du DoD (comme DoDAF : DoD Architecture
Framework) ou les spécifications du MIP (Multilateral Interoperability
Program)...

Vous parliez d'un millier je crois.
Post by ld
Pour ce qui est de cette reference, vous pourrez constater dans
http://cos.cvs.sourceforge.net/viewvc/*checkout*/cos/doc/slides-design.pdf
que je suis d'accord avec lui sur l'approche, mais que les conclusions
ne sont pas forcement les memes (le slide 67 peut aussi vous
interesser).
J'ai lu attentivement (enfin autant que le temps me le permettait) votre
document.

Si je puis me permettre j'ai relevé quelques erreurs ou imprécisions:
- slide 14 "what to do" et "how to do" sont inversés
- on parle plutôt de polymorphisme d'héritage que de type polymorphe,
terme plutôt utilisé dans le lambda-calcul polymorphe du second ordre.
- slide 40 : dans Logic programming vous mentionnez SQL qui n'est pas du
même niveau que les autre langages de la page car il n'est pas "Turing
Complet"
- slide 43 : citer la source
- à partir du slide 53 (exemple des matrices), quelle est la
justification des "notes" (comment sont-elles calculées ?)
- slide 56 : l'argument mtx2 de add devrait être "const"
- slide 62 : l'argument de add devrait être "const"

En quoi le slide 67 doit-il m'intéresser particulièrement ?
Je suis d'accord avec les 3 remarques en particulier celle sur
l'héritage multiple;
- slide 69 : Est-on d'accord que l'héritage multiple, en C++, ne
devrait être utilisé qu'avec des classes abstraites pour base (jamais
avec des classes concrètes) ?
Oooops: je n'avais pas vu que dans le slide 71 vous le disiez.
Le downcast en C++ devrait être, si possible, évité.

Finalement, je suis d'accord avec le slide 71 (même concernant
l'agrégation vs l'héritage). Dailleurs, dans les logiciels que j'ai
audités, la profondeur moyenne d'héritage était généralement inférieure
à 3 (je parle de la partie applicative, pas de certaines librairies
"système").
ld
2009-11-18 12:25:51 UTC
Permalink
Post by Wykaaa
Post by ld
Post by Wykaaa
Post by ld
Post by Wykaaa
Post by ld
Post by Wykaaa
Post by ld
Post by Wykaaa
J'aime la notion d'interface en Java. c'est ce qui manque à C++ car les
classes abstraites c'est différents.
Les classes abstraites de C++ sont un (tres gros) sur-ensemble des
interfaces Java. Ce que l'on peut faire avec les interfaces Java est
strictement inclu dans ce qu'on peut faire avec les classes abstraites
de C++, la reciproque est biensur largement fausse. Je suis etonne de
la part d'un expert C++ de ne pas savoir cela, et encore plus de la
part de quelqu'un qui attache de l'importance au design.
En C++, je ne suis jamais garanti qu'une classe abstraite n'a pas défini
une méthode dont je vais hériter.
Ou est le probleme? C'est au contraire un enorme avantage. D'autre
langage tire parti abondament de cet avantage comme les classes en
Haskell (qui ne sont pas des classes au sens OO du terme).
Ce n'est pas un avantage du point de vue sûreté de fonctionnement,
encapsulation, etc.
Vous avez un exemple concret de ce que vous dites (quelques lignes
devraient suffire)?
Ce n'est pas un exemple qu'il faut,
Je vous demande un exemple en connaissance de cause. Donc sans
exemple, ce que vous dites est pure speculation.
Alors allons-y. Comme je ne veux pas montrer trop de lignes de code,
l'exemple peut ne pas sembler pertinent.
Cet exemple est tiré d'un simulateur d'assembleur (en C++). Mille
excuses pour les tabulations à cause du copier/coller...
Voci la classe abstraite Instruction (racine de la hiérarchie Instruction.
class Instruction
{
                virtual void exec() const =0;
                virtual int is_halt() const {return 0;}
};
Ca commence mal. Elle melange deux roles differents, l'execution et
l'identification. Les interfaces (roles) de base, c'est a dire avant
composition par heritage, doivent correspondre a un seul role.
Post by Wykaaa
On remarque qu'il y aune fonction is_halt() qui est définie.
Elle ne devrait meme pas etre la. Ensuite (en supposant une autre
action), elle n'est pas generique, elle est constante. Ce n'est pas la
meme chose. Une methode generique va utiliser les autres methodes de
la meme interface (et uniquement) pour achever un objectif de plus
haut niveau. Cet objectif est souvent le role meme de l'interface et
les autres methodes sont les briques de base configurables par la
classe derivee. Regarder les definitions des classes de Haskell dans
Haskell98, ca vous donnera de nombreux exemple de ce que je dis. Sinon
les slides 65-67 du lien cite montrent aussi un exemple simple.
Post by Wykaaa
Evidemment, toutes les instruction ne sont pas "halt" sauf l'instruction
"Halt", donc toutes les instruction héritent de cette implémentation de
is_halt.
C'est donc un probleme. Cette conclusion vous conduit directement a la
case depart ou il faut redefinir le role de l'interface.
Post by Wykaaa
class Halt : public Instruction
{
        void exec() const; //jamais appelee mais redefinie sinon la                                        //
classe serait abstraite
        int is_halt() const {return 1;}
C'est pire que ce que je pensais. Cette fois ci c'est dans l'autre
sens. Ce type de code va droit a la catastrophe.
Post by Wykaaa
Si jamais le développeur de la classe Halt ne fait pas attention
(évidemment là c'est trivial car j'ai juste isolé ce qui nous
préoccupe), il peut ne pas redéfinir la fonction is_halt ce qui est
Ce n'est pas que c'est trivial (au contraire, c'est plutot positif),
c'est seulement que c'est completement bancal.
Post by Wykaaa
catastrophique pour la boucle principale de simulation (dans le "main")
que voici (le programme est dans un tableau... de type Instruction*)
        while (!MemProg[co]->is_halt())
        {
                MemProg[co]->exec();
        }
co est le compteur ordinal.
Bien que cet exemple soit trivial, on voit bien les catastrophes que ça
peut engendrer de ne pas faire de la classe Instruction, une vraie
interface (sans aucune définition de fonction).
Non, le probleme est ailleurs. L'interface elle-meme est completement
bancale.

struct intruction : interface {
virtual bool exec() const = 0;
};

struct halt : instruction {
bool exec() { return false; }
};

struct nop : instruction {
bool exec() { return true; }
};

// etc...

while (MemProg[co]->exec()) {
... // si besoin.
}

Ca sera aussi plus efficace si vous voulez simuler un processeur...
Post by Wykaaa
Donc, je préconise dans ce cas de faire de Instruction une vraie
interface (is_halt est abstraite) et fournir 2 classes abstraites qui
implémentent cette interface : l'une dans laquelle is_halt est définie
en renvoyant 0 et l'autre où is_halt renvoie 1.  La fonction exec
n'étant implémentée ni dans l'une, ni dans l'autre évidemment puisque
l'exec est spécifique de chaque instructions.
Ce que vous preconisez ne fait que deplacer le probleme. Le probleme
est ailleurs.
Post by Wykaaa
Post by ld
Post by Wykaaa
Post by ld
Post by Wykaaa
Je veux être certain, que les dizaines de développeurs qui codent en
parallèle mon logiciel de plusieurs centaines de milliers de lignes
n'introduisent pas indûment de l'implémentation dans les interfaces qui
Je ne vois pas comment. Une fois que l'interface est definie, on ne
doit plus la modifier. C'est son role...
On ne s'est pas compris. Je parlais de celui qui construit l'interface.
Il ne doit pas avoir la possibilité de définir l'implémentation de
certaines fonctions de l'interface.
Celui (plutot ceux) qui construit l'interface a autorite a le faire.
Si en plus (option) il specifie une implementation, c'est qu'il a
aussi autorite a le faire. C'est un outils en plus a sa disposition
qui lui permet de forcer/proposer une implementation par defaut et/ou
generique.
Non, dans mon environnement, ceux qui définissent (au sens de coder) les
interfaces ne peuvent pas le faire car dans la conception, ce n'est déjà
pas permis qu'une interface implémente quelque chose.
Post by ld
Post by Wykaaa
grâce à des outils d'ingénierie des exigences de type DOORS
(afin de tracer les exigences tout au long du développement), du MDA
(Modèle Driven Architecture), par exemple .
Ca sens l'outil qui doit generer du code Java. Le nivellement par le
bas n'est pas la solution. Pendre Java comme langage cible veut dire
limiter les fonctionnalites de (presque) tous les autres langages dans
la traduction design-code.
Post by Wykaaa
Post by ld
 Ceci dit, j'ai de nombreux exemples en memoire ou cette
approche "super encadrer" par des methodologies "super etablies" ont
"super fouares". La raison: ignorance du modele et des specifites du
langage cible (C++ en l'occurence).
J'ai entendu ces arguments fallacieux des centaines de fois.
Ce sont des constations, pas des arguments.
Post by Wykaaa
Bien sûr
qu'il faut des personnes, en amont, qui connaissent les spécificités et
les caractéristiques du ou des langages cibles utilisés (au moins à
partir de la définition de l'architecture).
Le probleme, c'est qu'ils pensaient connaitre les specificites (malgre
mes avertissements).
Post by Wykaaa
Dans mon environnement, il y a d'ailleurs d'un côté des équipes
fonctionnelles (métier) et des équipes techniques avec des coordinations
définies dans la méthodologie. On fait souvent du "2TUP" comme ceci :http://www.uml-sysml.org/images-du-site/2tup/2TUP_cylce.jpg/view
Un tres beau diagramme de Waterfall. Seul les tres grosses structures
(peu importe le domaine) peuvent suivre ces methodes a la lettre.
Post by Wykaaa
Post by ld
Post by Wykaaa
Fusionner des interfaces est beaucoup moins fréquent qu'on l'imagine
car, dans une approche SOA, par exemple, cela revient à changer les
caractéristiques des objets métiers (aux plus hauts niveaux de
l'architecture). Ca change donc aussi l'orchestration des services
métiers, dans ce cas...
C'est ce que je vous explique depuis le debut. Les approches dites de
haut niveau (Architecture software) ne debouche pas sur des frameworks
(du code reutilisable). Ils ne sont capables que de construire des
applications en reutilisant des frameworks. Vos applications en
millions de lignes tombent tout a fait dans ce schema ou le code est
un traduction quasi automatique de l'architecture dans un langage en
se basant sur des frameworks. Bref, c'est du Lego, pas de l'engenerie
software.
Enfin, tout de même pas si automatique que ça...
C'est de la pure ingénierie système (et pas software) et heureusement
qu'on fait un peu de "Lego", comme vous dites, sinon on n'arriverait
jamais à construire et faire fonctionner une centrale nucléaire, par
exemple.
Le probleme, c'est que les briques sont rarement adaptees a tous les
cas de figure. Il faut donc commencer a bidouiller le design ou le
code generer, ou reecrire une partie du framework d'ou les briques
viennent. Probleme frequent, notamment a Java (point de vue non
personnel vu que je ne developpe pas en Java).
Post by Wykaaa
Post by ld
Post by Wykaaa
Post by ld
Post by Wykaaa
Dans ce cas, je dois écrire des choses en plus (en C++) comme un
constructeur vide dans la partie privée, ce dont je suis dispensé en
utilisant une interface Java.
J'espere que c'est une blague. D'abord vous n'avez pas besoin d'ecrire
quoi que ce soit pour la construction et si vous voulez interdire la
copie, il suffit de deriver d'une classe appropriee sur le meme modele
de
http://www.boost.org/doc/libs/1_40_0/libs/utility/utility.htm#Class_n...
Je lis : Class noncopyable has protected constructor and destructor
members to emphasize that it is to be used only as a base class
Donc c'est bien ce que je disais, sauf qu'on a fait une classe "exprès"
dans l'environnement de développement C++...
Donc ce n'est pas ce que vous disiez. Un mot clef Java, devient en C++
une classe. C'est ce qui s'appelle l'expressivite d'un langage.
C'est exactement ce que je disais. Je doit remplacer le mot clé Java par
une classe en C++, donc j'écris plus de choses...
Pris en flagrant delit de mauvaise foi. Tres rare sont les
professionnels qui preferent un mot clef a une solution bibliotheque
(a fonctionnalites egales).
Post by Wykaaa
Post by ld
Post by Wykaaa
Post by ld
A ceux qui definissent les "interfaces" de savoir le faire
correctement. Et ca ne demande pas plus de code qu'en Java.
N'oubliez pas que dans une interface Java, je ne peux définir aussi que
des attributs "public static final".
Quel est le rapport?
Dans une classe abstraite C++, je peux définir des attributs qui seront
hérités. Ce n'est pas ce que je veux si je veux faire une interface...
Effectivement. Et d'ailleurs ce n'est plus le role de cette classe
abstraite qui n'est donc plus une interface. Dans le slide 67, c'est
le role de class2 pour class21.
Post by Wykaaa
Il faut donc décrire des règles méthodologiques, dans un environnement
C++, pour indiquer comment faire une interface...
Non, juste apprendre a programmer correctement. Comme pour tout le
reste d'ailleurs.
Post by Wykaaa
Post by ld
Post by Wykaaa
Post by ld
Post by Wykaaa
Rappelez-vous que je suis dans une démarche très ingénierie du logiciel
de par le contexte dans lequel j'évoluais.
Je crois surtout que vous avez un peu trop abuser des outils
d'architecture logicielle (votre liste d'acronym dans un autre post me
fait penser a ca) qui vous eloigne du langage pour eviter d'apprendre
a s'en servir correctement (certain diront pour se concentrer sur
l'essentiel ;-).
Dans les projets dans lesquels j'ai "trempé", le code représente à peine
20% de l'activité même s'il est très volumineux (environ entre 300 000
et 4 millions de lignes de code).
C'est ce qui arrive quand on ne sait pas/plus programmer et qu'on
laisse des outils le faire a sa place.
Non, regardez tous les chiffres que vous voudrez dans la littérature
concernant les projets (du type de ceux dont je parle) et vous verrez
que le % de l'activité de codage diminue avec la taille du projet pour
atteindre un minimum d'environ 20% dans les très gros projets.
C'est normale, c'est le nombre de lignes qui augmentent
exponentiellement. Avec ce type d'approche on ne maitrise plus le
code.
Post by Wykaaa
Puisque vous aimez les noms,
Post by ld
``If a system is continually changing, or if you want users to be able
to extend it, then the Dynamic Object Model architecture is often
useful. [...] Systems based on Dynamic Object Models can be much
smaller than alternatives. [...] I am working on replacing a system
with several millions lines of code with a system based on a dynamic
object model that I predict will require about 20,000 lines of code.
[...] This makes these systems easier to change by experts, and (in
theory) should make them easier to understand and maintain. But a
Dynamic Object Model is hard to build. [...] A system based on a
Dynamic Object Model is an interpreter, and can be slow.''
Ca c'est typiquement du pipotage et du marketing (c'est presuqe pareil
d'ailleurs...).
C'etait un papier de synthese sur OOPSLA97 (ou 98 je sais plus), pour
les papiers de recherche.
Post by Wykaaa
Post by ld
Pour ce qui est de cette reference, vous pourrez constater dans
http://cos.cvs.sourceforge.net/viewvc/*checkout*/cos/doc/slides-desig...
que je suis d'accord avec lui sur l'approche, mais que les conclusions
ne sont pas forcement les memes (le slide 67 peut aussi vous
interesser).
J'ai lu attentivement (enfin autant que le temps me le permettait) votre
document.
- slide 14 "what to do" et "how to do" sont inversés
Non. C'est meme la thematique de la section... Si un developpeur se
focalise sur comment faire, c'est que l'outil n'est pas approprie. Il
doit seulement savoir ce qu'il a a faire et se concentrer sur le faire
correctement. Cela implique que le comment faire doit etre naturel
(pour lui, professionnel). S'il passe son temps a chercher comment
faire, c'est que soit l'analyse est incomplete/imprecise, soit
l'outils est trop complique et/ou impose trop de contraintes, soit il
ne maitrise pas l'outils (se qui revient au meme que la cause
precedente en supposant un professionnel competent).
Post by Wykaaa
- on parle plutôt de polymorphisme d'héritage que de type polymorphe,
terme plutôt utilisé dans le lambda-calcul polymorphe du second ordre.
Non. Au cas ou vous ne l'auriez pas remarque, j'ai intentionnellement
casse la classification de Cardelli qui n'est pas orthogonale.
J'utilise moins de definition de polymorphisme (une seule en fait)
dont on abuse tellement que plus personne ne sait ce que cela veut
dire et je requalifie certains abus. Principalement parce que je fais
la difference entre type parametrique et type polymorphique, entre
genericite par generation (= generative programming: template C++) et
genericite par effacement de type (= type erasure: ~tous les autres).
L'avantage, c'est que cela fonctionne pour les types, les objet, les
classes ET les fonctions. Et donc ca marche a la fois sur du dynamique
dispatch, du preticate dispatch, sur les generiques de Java, sur les
templates C++ et ca ecarte l'overloading et la coercion.
Post by Wykaaa
- slide 40 : dans Logic programming vous mentionnez SQL qui n'est pas du
même niveau que les autre langages de la page car il n'est pas "Turing
Complet"
Ce n'est pas le sujet de la presentation. PL/SQL est Turing complet,
mais PL n'est pas relationel et n'apporte donc rien au sujet. C'est
aussi la categorie qui interessait le moins l'audience et que tout le
monde connaissait plus ou moins (en tout cas de nom), ce qui n'etait
pas le cas de Prolog.
Post by Wykaaa
- slide 43 : citer la source
Je l'ai oublie depuis. Surement un de ces articles (ou site web) sur
la popularite des langages. Meme si les valeurs ne sont pas exactes,
il y a un concensus sur les tendances montrees.
Post by Wykaaa
- à partir du slide 53 (exemple des matrices), quelle est la
justification des "notes" (comment sont-elles calculées ?)
C'est une evaluation relative (sur une echelle de 5) entre les
approches dont certaines ne sont pas decrite dans cette presentation
(celle de COS).
Post by Wykaaa
- slide 56 : l'argument mtx2 de add devrait être "const"
Vous remarquerez qu'il n'y a pas un seul const dans toute la
presentation et c'est fait expres. La semantique est plus subtile que
le simple mot clef const, et elle etait expliquee dans une autre
presentation. Je parle d'un point de vu design, parce que
semantiquement, ca releve du commentaire pour signifier une intention.
Post by Wykaaa
- slide 62 : l'argument de add devrait être "const"
idem.
Post by Wykaaa
En quoi le slide 67 doit-il m'intéresser particulièrement ?
Parce qu'il montre comment utiliser les interfaces en partant de roles
elementaires pour les composer des roles plus complexes (plus haut
niveau, plus specifique, etc...) a gauche et comment les classes
doivent etre surtout utilisees pour le RAII (a droite). Les cones vert
(le plus important dans le slide) sont les cones de visibilite
statique essentiel pour comprendre les difficultes que les langages a
typage statique imposent lors du design de framework (inclu les Monad
dans Haskell). C'est la meme chose que le cone de lumiere en
relativite.
Post by Wykaaa
Je suis d'accord avec les 3 remarques en particulier celle sur
l'héritage multiple;
  - slide 69 : Est-on d'accord que l'héritage multiple, en C++, ne
devrait être utilisé qu'avec des classes abstraites pour base (jamais
avec des classes concrètes) ?
Non. L'heritage d'implementation (heritage prive) est un cas essentiel
qui peut utiliser l'heritage multiple de classes concretes (ex: les
streams de la STL). Mais je suis d'accord si vous pensiez au sous-
ensemble des "interfaces".
Post by Wykaaa
Oooops: je n'avais pas vu que dans le slide 71 vous le disiez.
Le downcast en C++ devrait être, si possible, évité.
Je l'ecris mais je precise oralement pour ce qui est de l'heritage
d'implementation. L'audience visee n'etait pas des programmeurs (des
physiciens et ingenieurs de mon domaine) donc j'evite de les noyers
pas les cas rares.
Post by Wykaaa
Finalement, je suis d'accord avec le slide 71 (même concernant
l'agrégation vs l'héritage). Dailleurs, dans les logiciels que j'ai
audités, la profondeur moyenne d'héritage était généralement inférieure
à 3 (je parle de la partie applicative, pas de certaines librairies
"système").
COS n'est que le resultat de des conclusions de cette presentation
dont j'ai pousse l'analyse beaucoup plus loin. D'ou le sous-titre dans
le slide 1.

Merci pour le feedback (meme si finallement je n'ai rien a changer,
dommage ;-)

a+, ld.
Wykaaa
2009-11-18 14:01:32 UTC
Permalink
Post by ld
Post by Wykaaa
Post by ld
Post by Wykaaa
Post by ld
Post by Wykaaa
Post by ld
Post by Wykaaa
Post by ld
Post by Wykaaa
J'aime la notion d'interface en Java. c'est ce qui manque à C++ car les
classes abstraites c'est différents.
Les classes abstraites de C++ sont un (tres gros) sur-ensemble des
interfaces Java. Ce que l'on peut faire avec les interfaces Java est
strictement inclu dans ce qu'on peut faire avec les classes abstraites
de C++, la reciproque est biensur largement fausse. Je suis etonne de
la part d'un expert C++ de ne pas savoir cela, et encore plus de la
part de quelqu'un qui attache de l'importance au design.
En C++, je ne suis jamais garanti qu'une classe abstraite n'a pas défini
une méthode dont je vais hériter.
Ou est le probleme? C'est au contraire un enorme avantage. D'autre
langage tire parti abondament de cet avantage comme les classes en
Haskell (qui ne sont pas des classes au sens OO du terme).
Ce n'est pas un avantage du point de vue sûreté de fonctionnement,
encapsulation, etc.
Vous avez un exemple concret de ce que vous dites (quelques lignes
devraient suffire)?
Ce n'est pas un exemple qu'il faut,
Je vous demande un exemple en connaissance de cause. Donc sans
exemple, ce que vous dites est pure speculation.
Alors allons-y. Comme je ne veux pas montrer trop de lignes de code,
l'exemple peut ne pas sembler pertinent.
Cet exemple est tiré d'un simulateur d'assembleur (en C++). Mille
excuses pour les tabulations à cause du copier/coller...
Voci la classe abstraite Instruction (racine de la hiérarchie Instruction.
class Instruction
{
virtual void exec() const =0;
virtual int is_halt() const {return 0;}
};
Ca commence mal. Elle melange deux roles differents, l'execution et
l'identification. Les interfaces (roles) de base, c'est a dire avant
composition par heritage, doivent correspondre a un seul role.
Je suis d'accord avec vous mais en réduisant considérablement l'exemple,
je vous avais prévenu que l'exemple ne serait plus pertinent. Je voulais
juste montrer un exemple avec une fonction définie dans une classe
abstraite (en fait il faut "oublier" le rôle des fonctions...)
Post by ld
Post by Wykaaa
On remarque qu'il y aune fonction is_halt() qui est définie.
Elle ne devrait meme pas etre la.
Encore d'accord, mais... voir ci-dessus.

[snip]
Post by ld
Post by Wykaaa
Evidemment, toutes les instruction ne sont pas "halt" sauf l'instruction
"Halt", donc toutes les instruction héritent de cette implémentation de
is_halt.
C'est donc un probleme. Cette conclusion vous conduit directement a la
case depart ou il faut redefinir le role de l'interface.
Justement, c'est le danger de pouvoir définir une fonction dans une
classe abstraite C++ qui joue le rôle d'une interface (oubliez que
is_halt n'a pas sa place ici et imaginez une autre fonction (peut-être
qu'une fonction trace serait plus adéquate.
Post by ld
Post by Wykaaa
class Halt : public Instruction
{
void exec() const; //jamais appelee mais redefinie sinon la //
classe serait abstraite
int is_halt() const {return 1;}
C'est pire que ce que je pensais. Cette fois ci c'est dans l'autre
sens. Ce type de code va droit a la catastrophe.
Bin oui, l'exemple est fait pour ça !
Post by ld
Post by Wykaaa
Si jamais le développeur de la classe Halt ne fait pas attention
(évidemment là c'est trivial car j'ai juste isolé ce qui nous
préoccupe), il peut ne pas redéfinir la fonction is_halt ce qui est
Ce n'est pas que c'est trivial (au contraire, c'est plutot positif),
c'est seulement que c'est completement bancal.
C'est ce que je vous dit. Dans le "vrai" simulateur ce n'est pas comme
ça mais ça me demande trop de travail d'isoler le "cas qui va bien" en
quelques lignes.
Post by ld
Post by Wykaaa
catastrophique pour la boucle principale de simulation (dans le "main")
que voici (le programme est dans un tableau... de type Instruction*)
while (!MemProg[co]->is_halt())
{
MemProg[co]->exec();
}
co est le compteur ordinal.
Bien que cet exemple soit trivial, on voit bien les catastrophes que ça
peut engendrer de ne pas faire de la classe Instruction, une vraie
interface (sans aucune définition de fonction).
Non, le probleme est ailleurs. L'interface elle-meme est completement
bancale.
Oui je sais mais c'était juste un exemple.
Post by ld
struct intruction : interface {
virtual bool exec() const = 0;
};
struct halt : instruction {
bool exec() { return false; }
};
struct nop : instruction {
bool exec() { return true; }
};
// etc...
while (MemProg[co]->exec()) {
... // si besoin.
}
Ca sera aussi plus efficace si vous voulez simuler un processeur...
Bien sur.
Post by ld
Post by Wykaaa
Donc, je préconise dans ce cas de faire de Instruction une vraie
interface (is_halt est abstraite) et fournir 2 classes abstraites qui
implémentent cette interface : l'une dans laquelle is_halt est définie
en renvoyant 0 et l'autre où is_halt renvoie 1. La fonction exec
n'étant implémentée ni dans l'une, ni dans l'autre évidemment puisque
l'exec est spécifique de chaque instructions.
Ce que vous preconisez ne fait que deplacer le probleme. Le probleme
est ailleurs.
L'exemple n'était là que pour illustrer ce que je voulais dire, pas pour
disserter sur le bien fondé de l'interface.
Post by ld
Post by Wykaaa
Post by ld
Post by Wykaaa
Post by ld
Post by Wykaaa
Je veux être certain, que les dizaines de développeurs qui codent en
parallèle mon logiciel de plusieurs centaines de milliers de lignes
n'introduisent pas indûment de l'implémentation dans les interfaces qui
Je ne vois pas comment. Une fois que l'interface est definie, on ne
doit plus la modifier. C'est son role...
On ne s'est pas compris. Je parlais de celui qui construit l'interface.
Il ne doit pas avoir la possibilité de définir l'implémentation de
certaines fonctions de l'interface.
Celui (plutot ceux) qui construit l'interface a autorite a le faire.
Si en plus (option) il specifie une implementation, c'est qu'il a
aussi autorite a le faire. C'est un outils en plus a sa disposition
qui lui permet de forcer/proposer une implementation par defaut et/ou
generique.
Non, dans mon environnement, ceux qui définissent (au sens de coder) les
interfaces ne peuvent pas le faire car dans la conception, ce n'est déjà
pas permis qu'une interface implémente quelque chose.
Post by ld
Post by Wykaaa
grâce à des outils d'ingénierie des exigences de type DOORS
(afin de tracer les exigences tout au long du développement), du MDA
(Modèle Driven Architecture), par exemple .
Ca sens l'outil qui doit generer du code Java. Le nivellement par le
bas n'est pas la solution. Pendre Java comme langage cible veut dire
limiter les fonctionnalites de (presque) tous les autres langages dans
la traduction design-code.
Je suis désolé de vous dire que dans mon environnement (systèmes
militaires, 95% des projets sont codés en C++ et Java, avec une
prépondérance de Java aujourd'hui à cause des architectures SOA
(présentes ou futures).
Post by ld
Post by Wykaaa
Post by ld
Ceci dit, j'ai de nombreux exemples en memoire ou cette
approche "super encadrer" par des methodologies "super etablies" ont
"super fouares". La raison: ignorance du modele et des specifites du
langage cible (C++ en l'occurence).
J'ai entendu ces arguments fallacieux des centaines de fois.
Ce sont des constations, pas des arguments.
Post by Wykaaa
Bien sûr
qu'il faut des personnes, en amont, qui connaissent les spécificités et
les caractéristiques du ou des langages cibles utilisés (au moins à
partir de la définition de l'architecture).
Le probleme, c'est qu'ils pensaient connaitre les specificites (malgre
mes avertissements).
C'est plus grave mais c'est souvent le cas, hélas !
Post by ld
Post by Wykaaa
Dans mon environnement, il y a d'ailleurs d'un côté des équipes
fonctionnelles (métier) et des équipes techniques avec des coordinations
définies dans la méthodologie. On fait souvent du "2TUP" comme ceci :http://www.uml-sysml.org/images-du-site/2tup/2TUP_cylce.jpg/view
Un tres beau diagramme de Waterfall. Seul les tres grosses structures
(peu importe le domaine) peuvent suivre ces methodes a la lettre.
Mais je suis dans des projets énormes (un projet c'est environ 10 ans en
elapse depuis la pré-étude jusqu'à la livraison). Il est hors de
question d'adopter un cycle de vie autre. Ce schéma en Y est lui-même
dans des cycles d'itérations (à cause de l'urbanisation des systèmes et
de la construction et/ou l'évolution des systèmes de systèmes qu'on
trouve sur les théâtres d'opérations).
Post by ld
Post by Wykaaa
Post by ld
Post by Wykaaa
Fusionner des interfaces est beaucoup moins fréquent qu'on l'imagine
car, dans une approche SOA, par exemple, cela revient à changer les
caractéristiques des objets métiers (aux plus hauts niveaux de
l'architecture). Ca change donc aussi l'orchestration des services
métiers, dans ce cas...
C'est ce que je vous explique depuis le debut. Les approches dites de
haut niveau (Architecture software) ne debouche pas sur des frameworks
(du code reutilisable). Ils ne sont capables que de construire des
applications en reutilisant des frameworks. Vos applications en
millions de lignes tombent tout a fait dans ce schema ou le code est
un traduction quasi automatique de l'architecture dans un langage en
se basant sur des frameworks. Bref, c'est du Lego, pas de l'engenerie
software.
Enfin, tout de même pas si automatique que ça...
C'est de la pure ingénierie système (et pas software) et heureusement
qu'on fait un peu de "Lego", comme vous dites, sinon on n'arriverait
jamais à construire et faire fonctionner une centrale nucléaire, par
exemple.
Le probleme, c'est que les briques sont rarement adaptees a tous les
cas de figure. Il faut donc commencer a bidouiller le design ou le
code generer, ou reecrire une partie du framework d'ou les briques
viennent. Probleme frequent, notamment a Java (point de vue non
personnel vu que je ne developpe pas en Java).
S'il n'y avait qu'un framework...
Dans les systèmes dont je vous parle, il est totalement impossible
d'adapter toutes les briques à tous les cas de figures. C'est comme
vouloir vider la mer avec une petite cuillère.

Ceci dit, vous vous méprenez sur Java, sinon comment imaginer que ces
systèmes soient surtout codés dans ce genre de langage ?
Post by ld
Post by Wykaaa
Post by ld
Post by Wykaaa
Post by ld
Post by Wykaaa
Dans ce cas, je dois écrire des choses en plus (en C++) comme un
constructeur vide dans la partie privée, ce dont je suis dispensé en
utilisant une interface Java.
J'espere que c'est une blague. D'abord vous n'avez pas besoin d'ecrire
quoi que ce soit pour la construction et si vous voulez interdire la
copie, il suffit de deriver d'une classe appropriee sur le meme modele
de
http://www.boost.org/doc/libs/1_40_0/libs/utility/utility.htm#Class_n...
Je lis : Class noncopyable has protected constructor and destructor
members to emphasize that it is to be used only as a base class
Donc c'est bien ce que je disais, sauf qu'on a fait une classe "exprès"
dans l'environnement de développement C++...
Donc ce n'est pas ce que vous disiez. Un mot clef Java, devient en C++
une classe. C'est ce qui s'appelle l'expressivite d'un langage.
C'est exactement ce que je disais. Je doit remplacer le mot clé Java par
une classe en C++, donc j'écris plus de choses...
Pris en flagrant delit de mauvaise foi. Tres rare sont les
professionnels qui preferent un mot clef a une solution bibliotheque
(a fonctionnalites egales).
Ca c'est vous qui le dites... car dans les projets dont je vous parle,
on étouffe sous le poids des bibliothèques de tous ordres et on aimerait
bien les réduire.
Post by ld
Post by Wykaaa
Post by ld
Post by Wykaaa
Post by ld
A ceux qui definissent les "interfaces" de savoir le faire
correctement. Et ca ne demande pas plus de code qu'en Java.
N'oubliez pas que dans une interface Java, je ne peux définir aussi que
des attributs "public static final".
Quel est le rapport?
Dans une classe abstraite C++, je peux définir des attributs qui seront
hérités. Ce n'est pas ce que je veux si je veux faire une interface...
Effectivement. Et d'ailleurs ce n'est plus le role de cette classe
abstraite qui n'est donc plus une interface. Dans le slide 67, c'est
le role de class2 pour class21.
Ah mais c'est le transparent 68 chez moi, celui-là.
Post by ld
Post by Wykaaa
Il faut donc décrire des règles méthodologiques, dans un environnement
C++, pour indiquer comment faire une interface...
Non, juste apprendre a programmer correctement. Comme pour tout le
reste d'ailleurs.
Dans un projet qui implique des programmeurs répartis géographiquement
sur toute l'Europe (au moins) et qui peuvent une centaine voir beaucoup
plus, vous me direz comment vous faites sans règles méthodologiques de
programmation :-)
Post by ld
Post by Wykaaa
Post by ld
Post by Wykaaa
Post by ld
Post by Wykaaa
Rappelez-vous que je suis dans une démarche très ingénierie du logiciel
de par le contexte dans lequel j'évoluais.
Je crois surtout que vous avez un peu trop abuser des outils
d'architecture logicielle (votre liste d'acronym dans un autre post me
fait penser a ca) qui vous eloigne du langage pour eviter d'apprendre
a s'en servir correctement (certain diront pour se concentrer sur
l'essentiel ;-).
Dans les projets dans lesquels j'ai "trempé", le code représente à peine
20% de l'activité même s'il est très volumineux (environ entre 300 000
et 4 millions de lignes de code).
C'est ce qui arrive quand on ne sait pas/plus programmer et qu'on
laisse des outils le faire a sa place.
Non, regardez tous les chiffres que vous voudrez dans la littérature
concernant les projets (du type de ceux dont je parle) et vous verrez
que le % de l'activité de codage diminue avec la taille du projet pour
atteindre un minimum d'environ 20% dans les très gros projets.
C'est normale, c'est le nombre de lignes qui augmentent
exponentiellement. Avec ce type d'approche on ne maitrise plus le
code.
Non et non !
C'est la nature des problèmes qui conduit à un code volumineux. L'ISS,
en prenant en compte les logiciels du noyau, les applicatifs autour, les
programmes de tests, les simulateurs, etc. représente 80 millions de
lignes de code !
Post by ld
Post by Wykaaa
Puisque vous aimez les noms,
Post by ld
``If a system is continually changing, or if you want users to be able
to extend it, then the Dynamic Object Model architecture is often
useful. [...] Systems based on Dynamic Object Models can be much
smaller than alternatives. [...] I am working on replacing a system
with several millions lines of code with a system based on a dynamic
object model that I predict will require about 20,000 lines of code.
[...] This makes these systems easier to change by experts, and (in
theory) should make them easier to understand and maintain. But a
Dynamic Object Model is hard to build. [...] A system based on a
Dynamic Object Model is an interpreter, and can be slow.''
Ca c'est typiquement du pipotage et du marketing (c'est presuqe pareil
d'ailleurs...).
C'etait un papier de synthese sur OOPSLA97 (ou 98 je sais plus), pour
les papiers de recherche.
Ça ne me fait rien retirer à ce que j'ai dit.
Post by ld
Post by Wykaaa
Post by ld
Pour ce qui est de cette reference, vous pourrez constater dans
http://cos.cvs.sourceforge.net/viewvc/*checkout*/cos/doc/slides-desig...
que je suis d'accord avec lui sur l'approche, mais que les conclusions
ne sont pas forcement les memes (le slide 67 peut aussi vous
interesser).
J'ai lu attentivement (enfin autant que le temps me le permettait) votre
document.
- slide 14 "what to do" et "how to do" sont inversés
Non. C'est meme la thematique de la section... Si un developpeur se
focalise sur comment faire, c'est que l'outil n'est pas approprie. Il
doit seulement savoir ce qu'il a a faire et se concentrer sur le faire
correctement. Cela implique que le comment faire doit etre naturel
(pour lui, professionnel). S'il passe son temps a chercher comment
faire, c'est que soit l'analyse est incomplete/imprecise, soit
l'outils est trop complique et/ou impose trop de contraintes, soit il
ne maitrise pas l'outils (se qui revient au meme que la cause
precedente en supposant un professionnel competent).
Je n'ai lu que le support, je n'ai pas eu les commentaires ;-)
Post by ld
Post by Wykaaa
- on parle plutôt de polymorphisme d'héritage que de type polymorphe,
terme plutôt utilisé dans le lambda-calcul polymorphe du second ordre.
Non. Au cas ou vous ne l'auriez pas remarque, j'ai intentionnellement
casse la classification de Cardelli qui n'est pas orthogonale.
J'utilise moins de definition de polymorphisme (une seule en fait)
dont on abuse tellement que plus personne ne sait ce que cela veut
dire et je requalifie certains abus. Principalement parce que je fais
la difference entre type parametrique et type polymorphique, entre
genericite par generation (= generative programming: template C++) et
genericite par effacement de type (= type erasure: ~tous les autres).
L'avantage, c'est que cela fonctionne pour les types, les objet, les
classes ET les fonctions. Et donc ca marche a la fois sur du dynamique
dispatch, du preticate dispatch, sur les generiques de Java, sur les
templates C++ et ca ecarte l'overloading et la coercion.
Alors ce passage, dans l'optique que vous dites, mériterait plus de
développement.
Post by ld
Post by Wykaaa
- slide 40 : dans Logic programming vous mentionnez SQL qui n'est pas du
même niveau que les autre langages de la page car il n'est pas "Turing
Complet"
Ce n'est pas le sujet de la presentation. PL/SQL est Turing complet,
mais PL n'est pas relationel et n'apporte donc rien au sujet.
Donc c'est trompeur. Un langage purement relationnel n'est pas "Turing
complet" et n'est pas non plus un langage déclaratif.
Post by ld
C'est
aussi la categorie qui interessait le moins l'audience et que tout le
monde connaissait plus ou moins (en tout cas de nom), ce qui n'etait
pas le cas de Prolog.
D'ailleurs c'est un abus de langage de classer Prolog dans la
programmation logique, c'est un langage déclaratif.
Post by ld
Post by Wykaaa
- slide 43 : citer la source
Je l'ai oublie depuis. Surement un de ces articles (ou site web) sur
la popularite des langages. Meme si les valeurs ne sont pas exactes,
il y a un concensus sur les tendances montrees.
Post by Wykaaa
- à partir du slide 53 (exemple des matrices), quelle est la
justification des "notes" (comment sont-elles calculées ?)
C'est une evaluation relative (sur une echelle de 5) entre les
approches dont certaines ne sont pas decrite dans cette presentation
(celle de COS).
[snip (const)]
Post by ld
Post by Wykaaa
En quoi le slide 67 doit-il m'intéresser particulièrement ?
Parce qu'il montre comment utiliser les interfaces en partant de roles
elementaires pour les composer des roles plus complexes (plus haut
niveau, plus specifique, etc...) a gauche et comment les classes
doivent etre surtout utilisees pour le RAII (a droite). Les cones vert
(le plus important dans le slide) sont les cones de visibilite
statique essentiel pour comprendre les difficultes que les langages a
typage statique imposent lors du design de framework (inclu les Monad
dans Haskell). C'est la meme chose que le cone de lumiere en
relativite.
C'est le slide 68 dont vous parlez, pas le 67.
Post by ld
Post by Wykaaa
Je suis d'accord avec les 3 remarques en particulier celle sur
l'héritage multiple;
- slide 69 : Est-on d'accord que l'héritage multiple, en C++, ne
devrait être utilisé qu'avec des classes abstraites pour base (jamais
avec des classes concrètes) ?
Non. L'heritage d'implementation (heritage prive) est un cas essentiel
qui peut utiliser l'heritage multiple de classes concretes (ex: les
streams de la STL). Mais je suis d'accord si vous pensiez au sous-
ensemble des "interfaces".
Ok.
Post by ld
Post by Wykaaa
Oooops: je n'avais pas vu que dans le slide 71 vous le disiez.
Le downcast en C++ devrait être, si possible, évité.
Je l'ecris mais je precise oralement pour ce qui est de l'heritage
d'implementation. L'audience visee n'etait pas des programmeurs (des
physiciens et ingenieurs de mon domaine) donc j'evite de les noyers
pas les cas rares.
Attention aux pièges de l'héritage multiple sur les classes concrètes,
même avec la virtualisation. On doit court-circuiter l'appel des
constructeurs dans la hiérarchie, il peut y avoir des "trous" (garbage)
dans les structures C sous-jacentes aux classes lorsqu'on "projette" des
instances de classes dérivées sur leur classe de base. Ceci est
extrêmement dangereux !

[snip]
ld
2009-11-18 14:59:01 UTC
Permalink
Post by Wykaaa
Post by ld
Ca commence mal. Elle melange deux roles differents, l'execution et
l'identification. Les interfaces (roles) de base, c'est a dire avant
composition par heritage, doivent correspondre a un seul role.
Je suis d'accord avec vous mais en réduisant considérablement l'exemple,
je vous avais prévenu que l'exemple ne serait plus pertinent. Je voulais
juste montrer un exemple avec une fonction définie dans une classe
abstraite (en fait il faut "oublier" le rôle des fonctions...)
Je vais surement pas oublie le role des fonctions dans une interface,
que l'exemple soit petit ou gros, ca fait parti du bon sens comme vous
dites (du design en fait) ! Je pense que vous avez pris a la legere ma
premiere remarque sur les interfaces en C++. Respectez ce que j'ai
dis, en particulier sur le(s) methode(s) generique(s) de l'interface
et montrez moi un exemple qui ne marche pas. Ca ne sera pas facile en
raison du cone (vert sur les slides) de visibilite statique dont j'ai
deja parle, ma demande n'etait donc pas naive. On peut biensur
toujours faire n'importe quoi mais ce n'est pas specifique aux
interfaces mais plutot a la nature humaine.

Mes commentaires visaient a montrer que la methologie pour definir une
interface montre immediatement que c'etait bancal. Dans ce cas, on
jette tout et on recommence.
Post by Wykaaa
Post by ld
Non, le probleme est ailleurs. L'interface elle-meme est completement
bancale.
Oui je sais mais c'était juste un exemple.
Alors donnez un exemple qui-va-bien pour contredire ce que je dis ou
argumenter ce que vous dites.
Post by Wykaaa
Post by ld
struct intruction : interface {
  virtual bool exec() const = 0;
};
struct halt : instruction {
  bool exec() { return false; }
};
struct nop : instruction {
  bool exec() { return true; }
};
// etc...
while (MemProg[co]->exec()) {
  ... // si besoin.
}
Ca sera aussi plus efficace si vous voulez simuler un processeur...
Bien sur.
Donc on peut faire simple, efficace et elegant sans passer par un
design bancal. Toute l'expertise consiste a deduire ce design et a le
convertir dans le code qui-va-bien.
Post by Wykaaa
Post by ld
Post by Wykaaa
Donc, je préconise dans ce cas de faire de Instruction une vraie
interface (is_halt est abstraite) et fournir 2 classes abstraites qui
implémentent cette interface : l'une dans laquelle is_halt est définie
en renvoyant 0 et l'autre où is_halt renvoie 1.  La fonction exec
n'étant implémentée ni dans l'une, ni dans l'autre évidemment puisque
l'exec est spécifique de chaque instructions.
Ce que vous preconisez ne fait que deplacer le probleme. Le probleme
est ailleurs.
L'exemple n'était là que pour illustrer ce que je voulais dire
Ce que vous avez dit est qu'une implementation _meme_ generique (au
sens ou je l'ai precise) ne devrait pas etre dans l'interface. Votre
exemple ne montre pas que c'est un probleme, et la correction proposee
est pire que le mal lui-meme (tout comme je l'ai precise).
Post by Wykaaa
Post by ld
Post by Wykaaa
Post by ld
Post by Wykaaa
Post by ld
Post by Wykaaa
Je veux être certain, que les dizaines de développeurs qui codent en
parallèle mon logiciel de plusieurs centaines de milliers de lignes
n'introduisent pas indûment de l'implémentation dans les interfaces qui
Je ne vois pas comment. Une fois que l'interface est definie, on ne
doit plus la modifier. C'est son role...
On ne s'est pas compris. Je parlais de celui qui construit l'interface.
Il ne doit pas avoir la possibilité de définir l'implémentation de
certaines fonctions de l'interface.
Celui (plutot ceux) qui construit l'interface a autorite a le faire.
Si en plus (option) il specifie une implementation, c'est qu'il a
aussi autorite a le faire. C'est un outils en plus a sa disposition
qui lui permet de forcer/proposer une implementation par defaut et/ou
generique.
Non, dans mon environnement, ceux qui définissent (au sens de coder) les
interfaces ne peuvent pas le faire car dans la conception, ce n'est déjà
pas permis qu'une interface implémente quelque chose.
Post by ld
Post by Wykaaa
grâce à des outils d'ingénierie des exigences de type DOORS
(afin de tracer les exigences tout au long du développement), du MDA
(Modèle Driven Architecture), par exemple .
Ca sens l'outil qui doit generer du code Java. Le nivellement par le
bas n'est pas la solution. Pendre Java comme langage cible veut dire
limiter les fonctionnalites de (presque) tous les autres langages dans
la traduction design-code.
Je suis désolé de vous dire que dans mon environnement (systèmes
militaires, 95% des projets sont codés en C++ et Java, avec une
prépondérance de Java aujourd'hui à cause des architectures SOA
(présentes ou futures).
Ca ne contradit pas ce que je dis. Les modeles compatibles C++ et Java
n'utilise pas l'expressivite de C++. D'ou le nombre de lignes (et
encore C++ n'est pas tres concis quand cela devient autement dynamique
(DB, spreadsheet, etc...)
Post by Wykaaa
Post by ld
Post by Wykaaa
Post by ld
 Ceci dit, j'ai de nombreux exemples en memoire ou cette
approche "super encadrer" par des methodologies "super etablies" ont
"super fouares". La raison: ignorance du modele et des specifites du
langage cible (C++ en l'occurence).
J'ai entendu ces arguments fallacieux des centaines de fois.
Ce sont des constations, pas des arguments.
Post by Wykaaa
Bien sûr
qu'il faut des personnes, en amont, qui connaissent les spécificités et
les caractéristiques du ou des langages cibles utilisés (au moins à
partir de la définition de l'architecture).
Le probleme, c'est qu'ils pensaient connaitre les specificites (malgre
mes avertissements).
C'est plus grave mais c'est souvent le cas, hélas !
Oui. La reponse classique etait "Pourquoi pensez vous que le langage
de programmation ait autant d'importance?". Auquel cas je repond "Il
n'en a pas (tant que ca), mais l'expertise qu'on en a l'est
enormement". Ce qui en particulier pour C++ est critique, ne l'ai plus
pour Java (beaucoup plus simple). Ca ne veut pas dire qu'il ne faut
pas utiliser C++, simplement que le niveau des developpeurs doit un ou
deux niveaux au dessus de la moyenne.
Post by Wykaaa
Post by ld
Post by Wykaaa
Dans mon environnement, il y a d'ailleurs d'un côté des équipes
fonctionnelles (métier) et des équipes techniques avec des coordinations
définies dans la méthodologie. On fait souvent du "2TUP" comme ceci :http://www.uml-sysml.org/images-du-site/2tup/2TUP_cylce.jpg/view
Un tres beau diagramme de Waterfall. Seul les tres grosses structures
(peu importe le domaine) peuvent suivre ces methodes a la lettre.
Mais je suis dans des projets énormes (un projet c'est environ 10 ans en
elapse depuis la pré-étude jusqu'à la livraison). Il est hors de
question d'adopter un cycle de vie autre. Ce schéma en Y est lui-même
dans des cycles d'itérations (à cause de l'urbanisation des systèmes et
de la construction et/ou l'évolution des systèmes de systèmes qu'on
trouve sur les théâtres d'opérations).
Le shema en Y decompose la branche de gauche du cycle en V. Ce n'est
pas un modele iteratif. Meme dans un modele Waterfall, l'evolution a
long terme provoque des iterations, c'est evident. Mais les echelles
de temps de chacun des modeles change tout: Waterfall = iteration
(annees), Iteratif = iteration(semaines) (Agile) ou iteration(jours)
(extreme programming). Ce n'est pas du tout la meme chose ni meme les
memes methodes/moyens.
Post by Wykaaa
Ceci dit, vous vous méprenez sur Java, sinon comment imaginer que ces
systèmes soient surtout codés dans ce genre de langage ?
Parce que la semantique de Java est tres basique et donc il est plus
facile de faire des generateurs/verificateurs/refacteurs de code
correct. D'autre part Java tourne sur une JVM qui est generalement
optimisee pour enlever les appels suivant (forward) typique des
facades et autres adaptateurs qui permettent de changer et/ou
synthetiser une interface en une autre. On peut donc ajouter des
couches a volonter, ce que les MDA font tres bien d'ailleurs. C'est
aussi un bon moyen pour perdre le controle sur la complexite du code
(et des ressources consommees, et des bugs d'implementations).
Post by Wykaaa
Post by ld
Pris en flagrant delit de mauvaise foi. Tres rare sont les
professionnels qui preferent un mot clef a une solution bibliotheque
(a fonctionnalites egales).
Ca c'est vous qui le dites... car dans les projets dont je vous parle,
on étouffe sous le poids des bibliothèques de tous ordres et on aimerait
bien les réduire.
Et vous croyez qu'ajouter des dizaines de mots clef au langage
resoudra votre probleme? Ce dont vous parlez est un autre probleme. Je
maintien ce que j'ai dit. Plus le noyau (kernel) du langage est petit
et expressif, moins il y aura de probleme pour ecrire des composants
reutilisables.
Post by Wykaaa
Post by ld
Post by Wykaaa
Post by ld
Post by Wykaaa
Post by ld
A ceux qui definissent les "interfaces" de savoir le faire
correctement. Et ca ne demande pas plus de code qu'en Java.
N'oubliez pas que dans une interface Java, je ne peux définir aussi que
des attributs "public static final".
Quel est le rapport?
Dans une classe abstraite C++, je peux définir des attributs qui seront
hérités. Ce n'est pas ce que je veux si je veux faire une interface...
Effectivement. Et d'ailleurs ce n'est plus le role de cette classe
abstraite qui n'est donc plus une interface. Dans le slide 67, c'est
le role de class2 pour class21.
Ah mais c'est le transparent 68 chez moi, celui-là.
oups, chez moi aussi ;-)
Post by Wykaaa
Post by ld
Post by Wykaaa
Il faut donc décrire des règles méthodologiques, dans un environnement
C++, pour indiquer comment faire une interface...
Non, juste apprendre a programmer correctement. Comme pour tout le
reste d'ailleurs.
Dans un projet qui implique des programmeurs répartis géographiquement
sur toute l'Europe (au moins) et qui peuvent une centaine voir beaucoup
plus, vous me direz comment vous faites sans règles méthodologiques de
programmation :-)
Ou ai-je dis qu'il n'en fallait pas? Mon propos de depart portait sur
la possibilite de mettre des methodes generiques (ou sens ou je l'ai
precise) dans les interfaces en C++, ce que Java ne permet et que
Haskell utilise abondament. Rien de plus.
Post by Wykaaa
Post by ld
C'est normale, c'est le nombre de lignes qui augmentent
exponentiellement. Avec ce type d'approche on ne maitrise plus le
code.
Non et non !
C'est la nature des problèmes qui conduit à un code volumineux. L'ISS,
en prenant en compte les logiciels du noyau, les applicatifs autour, les
programmes de tests, les simulateurs, etc. représente 80 millions de
lignes de code !
Et si vous le faites tourner sur une distribution Linux ca monte a 300
millions? C'est ca?

Lorsqu'une application se base sur des frameworks stratifies, il n'y a
pas besoin de 80 millions de lignes. Aucune application ne devrait
avoir besoin d'autant de lignes de code (effective). Si vous avez
abouti a cela, c'est qu'il y a un serieux probleme qqpart et il serait
temps de fragmenter les objectifs et de le tranformer en environement
et/ou plateforme.
Post by Wykaaa
Post by ld
Post by Wykaaa
Post by ld
``If a system is continually changing, or if you want users to be able
to extend it, then the Dynamic Object Model architecture is often
useful. [...] Systems based on Dynamic Object Models can be much
smaller than alternatives. [...] I am working on replacing a system
with several millions lines of code with a system based on a dynamic
object model that I predict will require about 20,000 lines of code.
[...] This makes these systems easier to change by experts, and (in
theory) should make them easier to understand and maintain. But a
Dynamic Object Model is hard to build. [...] A system based on a
Dynamic Object Model is an interpreter, and can be slow.''
Ca c'est typiquement du pipotage et du marketing (c'est presuqe pareil
d'ailleurs...).
C'etait un papier de synthese sur OOPSLA97 (ou 98 je sais plus), pour
les papiers de recherche.
Ça ne me fait rien retirer à ce que j'ai dit.
peut-etre deviez vous lire le papier avant de porter un jugement?
Post by Wykaaa
Post by ld
Post by Wykaaa
Post by ld
Pour ce qui est de cette reference, vous pourrez constater dans
http://cos.cvs.sourceforge.net/viewvc/*checkout*/cos/doc/slides-desig...
que je suis d'accord avec lui sur l'approche, mais que les conclusions
ne sont pas forcement les memes (le slide 67 peut aussi vous
interesser).
J'ai lu attentivement (enfin autant que le temps me le permettait) votre
document.
- slide 14 "what to do" et "how to do" sont inversés
Non. C'est meme la thematique de la section... Si un developpeur se
focalise sur comment faire, c'est que l'outil n'est pas approprie. Il
doit seulement savoir ce qu'il a a faire et se concentrer sur le faire
correctement. Cela implique que le comment faire doit etre naturel
(pour lui, professionnel). S'il passe son temps a chercher comment
faire, c'est que soit l'analyse est incomplete/imprecise, soit
l'outils est trop complique et/ou impose trop de contraintes, soit il
ne maitrise pas l'outils (se qui revient au meme que la cause
precedente en supposant un professionnel competent).
Je n'ai lu que le support, je n'ai pas eu les commentaires ;-)
Post by ld
Post by Wykaaa
- on parle plutôt de polymorphisme d'héritage que de type polymorphe,
terme plutôt utilisé dans le lambda-calcul polymorphe du second ordre.
Non. Au cas ou vous ne l'auriez pas remarque, j'ai intentionnellement
casse la classification de Cardelli qui n'est pas orthogonale.
J'utilise moins de definition de polymorphisme (une seule en fait)
dont on abuse tellement que plus personne ne sait ce que cela veut
dire et je requalifie certains abus. Principalement parce que je fais
la difference entre type parametrique et type polymorphique, entre
genericite par generation (= generative programming: template C++) et
genericite par effacement de type (= type erasure: ~tous les autres).
L'avantage, c'est que cela fonctionne pour les types, les objet, les
classes ET les fonctions. Et donc ca marche a la fois sur du dynamique
dispatch, du preticate dispatch, sur les generiques de Java, sur les
templates C++ et ca ecarte l'overloading et la coercion.
Alors ce passage, dans l'optique que vous dites, mériterait plus de
développement.
Ce sont des transparents, pas un manuel. Le fait que je redefini la
classification de Cardelli est une des premieres chose que je dis
lorsque je commence cette section.
Post by Wykaaa
Post by ld
Post by Wykaaa
- slide 40 : dans Logic programming vous mentionnez SQL qui n'est pas du
même niveau que les autre langages de la page car il n'est pas "Turing
Complet"
Ce n'est pas le sujet de la presentation. PL/SQL est Turing complet,
mais PL n'est pas relationel et n'apporte donc rien au sujet.
Donc c'est trompeur. Un langage purement relationnel n'est pas "Turing
complet" et n'est pas non plus un langage déclaratif.
Ce n'est pas ce que j'ai dit, ni ici, ni dans les slides.
Post by Wykaaa
Post by ld
aussi la categorie qui interessait le moins l'audience et que tout le
monde connaissait plus ou moins (en tout cas de nom), ce qui n'etait
pas le cas de Prolog.
D'ailleurs c'est un abus de langage de classer Prolog dans la
programmation logique, c'est un langage déclaratif.
La plupart des langages fonctionnels aussi sont declaratifs et je ne
le dis pas non plus. Declaratif n'est pas un critere de cette
classification et je ne vois pas en quoi elle devrait en faire partie.
Post by Wykaaa
Post by ld
Post by Wykaaa
En quoi le slide 67 doit-il m'intéresser particulièrement ?
Parce qu'il montre comment utiliser les interfaces en partant de roles
elementaires pour les composer des roles plus complexes (plus haut
niveau, plus specifique, etc...) a gauche et comment les classes
doivent etre surtout utilisees pour le RAII (a droite). Les cones vert
(le plus important dans le slide) sont les cones de visibilite
statique essentiel pour comprendre les difficultes que les langages a
typage statique imposent lors du design de framework (inclu les Monad
dans Haskell). C'est la meme chose que le cone de lumiere en
relativite.
C'est le slide 68 dont vous parlez, pas le 67.
Oui, desole. Cela ne change pas son interet (le 68!).
Post by Wykaaa
Post by ld
Post by Wykaaa
Oooops: je n'avais pas vu que dans le slide 71 vous le disiez.
Le downcast en C++ devrait être, si possible, évité.
Je l'ecris mais je precise oralement pour ce qui est de l'heritage
d'implementation. L'audience visee n'etait pas des programmeurs (des
physiciens et ingenieurs de mon domaine) donc j'evite de les noyers
pas les cas rares.
Attention aux pièges de l'héritage multiple sur les classes concrètes,
même avec la virtualisation. On doit court-circuiter l'appel des
constructeurs dans la hiérarchie, il peut y avoir des "trous" (garbage)
dans les structures C sous-jacentes aux classes lorsqu'on "projette" des
instances de classes dérivées sur leur classe de base. Ceci est
extrêmement dangereux !
Je ne vois pas de quoi vous parlez (un exemple?). Je pense de plus que
vous faites erreur sur le langage C++.

a+, ld.
Wykaaa
2009-11-18 18:10:57 UTC
Permalink
Post by ld
Post by Wykaaa
Post by ld
Ca commence mal. Elle melange deux roles differents, l'execution et
l'identification. Les interfaces (roles) de base, c'est a dire avant
composition par heritage, doivent correspondre a un seul role.
Je suis d'accord avec vous mais en réduisant considérablement l'exemple,
je vous avais prévenu que l'exemple ne serait plus pertinent. Je voulais
juste montrer un exemple avec une fonction définie dans une classe
abstraite (en fait il faut "oublier" le rôle des fonctions...)
Je vais surement pas oublie le role des fonctions dans une interface,
que l'exemple soit petit ou gros, ca fait parti du bon sens comme vous
dites (du design en fait) ! Je pense que vous avez pris a la legere ma
premiere remarque sur les interfaces en C++. Respectez ce que j'ai
dis, en particulier sur le(s) methode(s) generique(s) de l'interface
et montrez moi un exemple qui ne marche pas. Ca ne sera pas facile en
raison du cone (vert sur les slides) de visibilite statique dont j'ai
deja parle, ma demande n'etait donc pas naive. On peut biensur
toujours faire n'importe quoi mais ce n'est pas specifique aux
interfaces mais plutot a la nature humaine.
Mes commentaires visaient a montrer que la methologie pour definir une
interface montre immediatement que c'etait bancal. Dans ce cas, on
jette tout et on recommence.
OK. J'avais mal compris et, effectivement, j'ai omis la condition
méthode(s) *générique(s)*. Je n'ai pas le temps de construire un exemple
qui ne marcherait pas dans votre cadre (j'ai de la musique à faire pour
dans "pas longtemps).
Post by ld
Post by Wykaaa
Post by ld
Non, le probleme est ailleurs. L'interface elle-meme est completement
bancale.
Oui je sais mais c'était juste un exemple.
Alors donnez un exemple qui-va-bien pour contredire ce que je dis ou
argumenter ce que vous dites.
Il doit bien en exister mais je n'ai pas le temps de chercher
actuellement. Désolé :-(
Post by ld
Post by Wykaaa
Post by ld
struct intruction : interface {
virtual bool exec() const = 0;
};
struct halt : instruction {
bool exec() { return false; }
};
struct nop : instruction {
bool exec() { return true; }
};
// etc...
while (MemProg[co]->exec()) {
... // si besoin.
}
Ca sera aussi plus efficace si vous voulez simuler un processeur...
Bien sur.
Donc on peut faire simple, efficace et elegant sans passer par un
design bancal. Toute l'expertise consiste a deduire ce design et a le
convertir dans le code qui-va-bien.
Pensez-vous réellement que n'importe quel développeur C++ est capable
d'écrire le code des slides 65 et 66 ?
La plupart ont déjà du mal avec le polymorphisme, en général...
Post by ld
Post by Wykaaa
Post by ld
Post by Wykaaa
Donc, je préconise dans ce cas de faire de Instruction une vraie
interface (is_halt est abstraite) et fournir 2 classes abstraites qui
implémentent cette interface : l'une dans laquelle is_halt est définie
en renvoyant 0 et l'autre où is_halt renvoie 1. La fonction exec
n'étant implémentée ni dans l'une, ni dans l'autre évidemment puisque
l'exec est spécifique de chaque instructions.
Ce que vous preconisez ne fait que deplacer le probleme. Le probleme
est ailleurs.
L'exemple n'était là que pour illustrer ce que je voulais dire
Ce que vous avez dit est qu'une implementation _meme_ generique (au
sens ou je l'ai precise) ne devrait pas etre dans l'interface. Votre
exemple ne montre pas que c'est un probleme, et la correction proposee
est pire que le mal lui-meme (tout comme je l'ai precise).
Je n'ai pas pu vraiment dire cela puisque le qualificatif "générique"
m'avait échappé et que je n'utilise pas "générique" pour ce genre de
chose. La généricité, pour moi, ce sont les templates C++ ou les
packages génériques ADA (désolé mais j'ai appris ADA en 1982... et il en
reste des traces !
Post by ld
Post by Wykaaa
Post by ld
Post by Wykaaa
Post by ld
Post by Wykaaa
Post by ld
Post by Wykaaa
Je veux être certain, que les dizaines de développeurs qui codent en
parallèle mon logiciel de plusieurs centaines de milliers de lignes
n'introduisent pas indûment de l'implémentation dans les interfaces qui
Je ne vois pas comment. Une fois que l'interface est definie, on ne
doit plus la modifier. C'est son role...
On ne s'est pas compris. Je parlais de celui qui construit l'interface.
Il ne doit pas avoir la possibilité de définir l'implémentation de
certaines fonctions de l'interface.
Celui (plutot ceux) qui construit l'interface a autorite a le faire.
Si en plus (option) il specifie une implementation, c'est qu'il a
aussi autorite a le faire. C'est un outils en plus a sa disposition
qui lui permet de forcer/proposer une implementation par defaut et/ou
generique.
Non, dans mon environnement, ceux qui définissent (au sens de coder) les
interfaces ne peuvent pas le faire car dans la conception, ce n'est déjà
pas permis qu'une interface implémente quelque chose.
Post by ld
Post by Wykaaa
grâce à des outils d'ingénierie des exigences de type DOORS
(afin de tracer les exigences tout au long du développement), du MDA
(Modèle Driven Architecture), par exemple .
Ca sens l'outil qui doit generer du code Java. Le nivellement par le
bas n'est pas la solution. Pendre Java comme langage cible veut dire
limiter les fonctionnalites de (presque) tous les autres langages dans
la traduction design-code.
Je suis désolé de vous dire que dans mon environnement (systèmes
militaires, 95% des projets sont codés en C++ et Java, avec une
prépondérance de Java aujourd'hui à cause des architectures SOA
(présentes ou futures).
Ca ne contradit pas ce que je dis. Les modeles compatibles C++ et Java
n'utilise pas l'expressivite de C++. D'ou le nombre de lignes (et
encore C++ n'est pas tres concis quand cela devient autement dynamique
(DB, spreadsheet, etc...)
Non mais vous aviez l'air méprisant sur Java...
Post by ld
Post by Wykaaa
Post by ld
Post by Wykaaa
Post by ld
Ceci dit, j'ai de nombreux exemples en memoire ou cette
approche "super encadrer" par des methodologies "super etablies" ont
"super fouares". La raison: ignorance du modele et des specifites du
langage cible (C++ en l'occurence).
J'ai entendu ces arguments fallacieux des centaines de fois.
Ce sont des constations, pas des arguments.
Post by Wykaaa
Bien sûr
qu'il faut des personnes, en amont, qui connaissent les spécificités et
les caractéristiques du ou des langages cibles utilisés (au moins à
partir de la définition de l'architecture).
Le probleme, c'est qu'ils pensaient connaitre les specificites (malgre
mes avertissements).
C'est plus grave mais c'est souvent le cas, hélas !
Oui. La reponse classique etait "Pourquoi pensez vous que le langage
de programmation ait autant d'importance?". Auquel cas je repond "Il
n'en a pas (tant que ca), mais l'expertise qu'on en a l'est
enormement". Ce qui en particulier pour C++ est critique, ne l'ai plus
pour Java (beaucoup plus simple). Ca ne veut pas dire qu'il ne faut
pas utiliser C++, simplement que le niveau des developpeurs doit un ou
deux niveaux au dessus de la moyenne.
Nous sommes totalement d'accord sur ce point. Ce n'est, hélas, pas la
réalité dans l'industrie.
Post by ld
Post by Wykaaa
Post by ld
Post by Wykaaa
Dans mon environnement, il y a d'ailleurs d'un côté des équipes
fonctionnelles (métier) et des équipes techniques avec des coordinations
définies dans la méthodologie. On fait souvent du "2TUP" comme ceci :http://www.uml-sysml.org/images-du-site/2tup/2TUP_cylce.jpg/view
Un tres beau diagramme de Waterfall. Seul les tres grosses structures
(peu importe le domaine) peuvent suivre ces methodes a la lettre.
Mais je suis dans des projets énormes (un projet c'est environ 10 ans en
elapse depuis la pré-étude jusqu'à la livraison). Il est hors de
question d'adopter un cycle de vie autre. Ce schéma en Y est lui-même
dans des cycles d'itérations (à cause de l'urbanisation des systèmes et
de la construction et/ou l'évolution des systèmes de systèmes qu'on
trouve sur les théâtres d'opérations).
Le shema en Y decompose la branche de gauche du cycle en V. Ce n'est
pas un modele iteratif. Meme dans un modele Waterfall, l'evolution a
long terme provoque des iterations, c'est evident. Mais les echelles
de temps de chacun des modeles change tout: Waterfall = iteration
(annees), Iteratif = iteration(semaines) (Agile) ou iteration(jours)
(extreme programming). Ce n'est pas du tout la meme chose ni meme les
memes methodes/moyens.
Il y a, bien sûr, des itérations dans le Y lui-même mais elles s'étalent
sur des années, effectivement. Je voulais dire que les Y eux-mêmes sont
dans des itérations. Ces itérations ne sont pas faciles à faire à cause
du code des marchés publics et la façon dont ils se déclenchent (il peut
s'écouler plusieurs années, je l'ai vu, entre le moment où le marché est
accepté et le moment où l'ordre de le réaliser est donné !).
Dans un projet (donc un marché), qui s'étend lui-même sur plusieurs
années, il faut donc prévoir...l'impévisible !
Post by ld
Post by Wykaaa
Ceci dit, vous vous méprenez sur Java, sinon comment imaginer que ces
systèmes soient surtout codés dans ce genre de langage ?
Parce que la semantique de Java est tres basique et donc il est plus
facile de faire des generateurs/verificateurs/refacteurs de code
correct. D'autre part Java tourne sur une JVM qui est generalement
optimisee pour enlever les appels suivant (forward) typique des
facades et autres adaptateurs qui permettent de changer et/ou
synthetiser une interface en une autre. On peut donc ajouter des
couches a volonter, ce que les MDA font tres bien d'ailleurs.
Ce que vous dites est vrai mais l'argument principal est l'énorme
activité, dans le domaine militaire autour de XML, les schémas XML, etc.
facilement manipulable en Java (il y a des APIs standards pour tout ça).
Aujourd'hui, tous les schémas de données (genre "MCD") dans le domaine
militaire sont en train d'être réécrits en XML et les messageries
militaires aussi (les pièces jointes aux ordres de commandements sont en
XML pour faciliter l'interopérabilité des systèmes nationaux, alliés,
OTAN. Par exemple les positions amis/ennemis sur une carte d'état-major
informatisée sont visualisées à partir de messages et de données en XML.
Et je vous passe les problèmes de sécurité et de confidentialité
multiniveaux sur un théâtre d'opération multinational.
Post by ld
C'est
aussi un bon moyen pour perdre le controle sur la complexite du code
(et des ressources consommees, et des bugs d'implementations).
Les problèmes à résoudre sont d'une complexité que vous n'imaginez même
pas, sachant qu'il faut absolument maîtriser la complexité du code, sa
fiabilité, son évolutivité, etc.
Post by ld
Post by Wykaaa
Post by ld
Pris en flagrant delit de mauvaise foi. Tres rare sont les
professionnels qui preferent un mot clef a une solution bibliotheque
(a fonctionnalites egales).
Ca c'est vous qui le dites... car dans les projets dont je vous parle,
on étouffe sous le poids des bibliothèques de tous ordres et on aimerait
bien les réduire.
Et vous croyez qu'ajouter des dizaines de mots clef au langage
resoudra votre probleme? Ce dont vous parlez est un autre probleme. Je
maintien ce que j'ai dit. Plus le noyau (kernel) du langage est petit
et expressif, moins il y aura de probleme pour ecrire des composants
reutilisables.
Peut-être mais ça rend plus difficile l'AOP (Aspect Oriented
Programming), en particulier sur les aspects qualité qui sont
transversaux aux modules, sous-systèmes et systèmes (quand ils sont
intégrés dans un système de système).
Post by ld
Post by Wykaaa
Post by ld
Post by Wykaaa
Post by ld
Post by Wykaaa
Post by ld
A ceux qui definissent les "interfaces" de savoir le faire
correctement. Et ca ne demande pas plus de code qu'en Java.
N'oubliez pas que dans une interface Java, je ne peux définir aussi que
des attributs "public static final".
Quel est le rapport?
Dans une classe abstraite C++, je peux définir des attributs qui seront
hérités. Ce n'est pas ce que je veux si je veux faire une interface...
Effectivement. Et d'ailleurs ce n'est plus le role de cette classe
abstraite qui n'est donc plus une interface. Dans le slide 67, c'est
le role de class2 pour class21.
Ah mais c'est le transparent 68 chez moi, celui-là.
oups, chez moi aussi ;-)
Post by Wykaaa
Post by ld
Post by Wykaaa
Il faut donc décrire des règles méthodologiques, dans un environnement
C++, pour indiquer comment faire une interface...
Non, juste apprendre a programmer correctement. Comme pour tout le
reste d'ailleurs.
Dans un projet qui implique des programmeurs répartis géographiquement
sur toute l'Europe (au moins) et qui peuvent une centaine voir beaucoup
plus, vous me direz comment vous faites sans règles méthodologiques de
programmation :-)
Ou ai-je dis qu'il n'en fallait pas? Mon propos de depart portait sur
la possibilite de mettre des methodes generiques (ou sens ou je l'ai
precise) dans les interfaces en C++, ce que Java ne permet et que
Haskell utilise abondament. Rien de plus.
Je suis désolé de vous dire que votre méthodologie n'est pas vraiment
réaliste dans certains systèmes (en particulier les systèmes d'armes).
Post by ld
Post by Wykaaa
Post by ld
C'est normale, c'est le nombre de lignes qui augmentent
exponentiellement. Avec ce type d'approche on ne maitrise plus le
code.
Non et non !
C'est la nature des problèmes qui conduit à un code volumineux. L'ISS,
en prenant en compte les logiciels du noyau, les applicatifs autour, les
programmes de tests, les simulateurs, etc. représente 80 millions de
lignes de code !
Et si vous le faites tourner sur une distribution Linux ca monte a 300
millions? C'est ca?
ce n'est pas un seul logiciel hein...

Certains de ses logiciels tournent sur des systèmes qui n'ont qu'un OS
ultra allégé (certains logiciels embarqué sont "claqués dans des proms).
Post by ld
Lorsqu'une application se base sur des frameworks stratifies, il n'y a
pas besoin de 80 millions de lignes. Aucune application ne devrait
avoir besoin d'autant de lignes de code (effective). Si vous avez
abouti a cela, c'est qu'il y a un serieux probleme qqpart et il serait
temps de fragmenter les objectifs et de le tranformer en environement
et/ou plateforme.
Heureusement que ce n'est pas d'un seul tenant...
Du temps des missions Apollo, les équipes de programmeurs se montaient à
1200 personnes.

[snip]
Post by ld
Post by Wykaaa
Post by ld
Post by Wykaaa
- slide 40 : dans Logic programming vous mentionnez SQL qui n'est pas du
même niveau que les autre langages de la page car il n'est pas "Turing
Complet"
Ce n'est pas le sujet de la presentation. PL/SQL est Turing complet,
mais PL n'est pas relationel et n'apporte donc rien au sujet.
Donc c'est trompeur. Un langage purement relationnel n'est pas "Turing
complet" et n'est pas non plus un langage déclaratif.
Ce n'est pas ce que j'ai dit, ni ici, ni dans les slides.
Non mais vous le dites implicitement dans les slides puisque vous le
placez avec Prolog dans la programmation logique et tous (sauf erreur ou
omission) les autres langages du slide sont "Turing-complets", mais je
ne connais pas F#...
Post by ld
Post by Wykaaa
Post by ld
aussi la categorie qui interessait le moins l'audience et que tout le
monde connaissait plus ou moins (en tout cas de nom), ce qui n'etait
pas le cas de Prolog.
D'ailleurs c'est un abus de langage de classer Prolog dans la
programmation logique, c'est un langage déclaratif.
La plupart des langages fonctionnels aussi sont declaratifs et je ne
le dis pas non plus. Declaratif n'est pas un critere de cette
classification et je ne vois pas en quoi elle devrait en faire partie.
OK, c'est VOTRE classification.

[snip]
Post by ld
Post by Wykaaa
Attention aux pièges de l'héritage multiple sur les classes concrètes,
même avec la virtualisation. On doit court-circuiter l'appel des
constructeurs dans la hiérarchie, il peut y avoir des "trous" (garbage)
dans les structures C sous-jacentes aux classes lorsqu'on "projette" des
instances de classes dérivées sur leur classe de base. Ceci est
extrêmement dangereux !
Je ne vois pas de quoi vous parlez (un exemple?). Je pense de plus que
vous faites erreur sur le langage C++.
Pour la représentation en mémoire dans le cadre de l'héritage multiple,
c'est là :
http://dchaffiol.free.fr/info/langages/art_cpp_heritageMultiple_q.htm
(il faut utiliser l'ascenseur car c'est vers la fin. et les explications
sont dans une autres page html (le lien est tout en bas)

Appels aux constructeurs dans l'héritage multiple :

class A
{
A(arg1, arg2): ....;
};
class B:virtual public A
{
...
};
class C:virtual public A
{
...
};
class D:public B, public C
{
...
};
En cas d'héritage multiple avec des constructeur à arguments (la classe
A), la classe D doit appeler explicitement le constructeur de A :

D::D(int a, int b, int c, int d):A(int a), B (int b), C (int c)
{
...
}
Si la hiérarchie est plus conséquente (et dans une bibliothèque), cela
oblige le développeur de la classe D à connaître toute la hiérarchie
pour connaître tous les constructeurs à appeler !
ld
2009-11-18 22:42:08 UTC
Permalink
Post by Wykaaa
Post by ld
Donc on peut faire simple, efficace et elegant sans passer par un
design bancal. Toute l'expertise consiste a deduire ce design et a le
convertir dans le code qui-va-bien.
Pensez-vous réellement que n'importe quel développeur C++ est capable
d'écrire le code des slides 65 et 66 ?
Oui. Ca me parait un minimum sinon ce n'est pas un programmeur C++. De
plus il est essentiel qu'il explique le pourquoi de la decomposition
(e.g. les cones de visibilite statique) sinon cela veut aussi dire
qu'il ne sera pas capable de detecter les problemes de design/
couplage.
Post by Wykaaa
La plupart ont déjà du mal avec le polymorphisme, en général...
Ce ne sont pas des programmeurs C++. Mieux vaut leur proposer Java ;-)
Post by Wykaaa
Post by ld
Post by Wykaaa
Post by ld
Post by Wykaaa
Donc, je préconise dans ce cas de faire de Instruction une vraie
interface (is_halt est abstraite) et fournir 2 classes abstraites qui
implémentent cette interface : l'une dans laquelle is_halt est définie
en renvoyant 0 et l'autre où is_halt renvoie 1.  La fonction exec
n'étant implémentée ni dans l'une, ni dans l'autre évidemment puisque
l'exec est spécifique de chaque instructions.
Ce que vous preconisez ne fait que deplacer le probleme. Le probleme
est ailleurs.
L'exemple n'était là que pour illustrer ce que je voulais dire
Ce que vous avez dit est qu'une implementation _meme_ generique (au
sens ou je l'ai precise) ne devrait pas etre dans l'interface. Votre
exemple ne montre pas que c'est un probleme, et la correction proposee
est pire que le mal lui-meme (tout comme je l'ai precise).
Je n'ai pas pu vraiment dire cela puisque le qualificatif "générique"
m'avait échappé et que je n'utilise pas "générique" pour ce genre de
chose.
vous avez dit "aucune implementation", cela contredisait donc ce que
j'avais dit. Et formule comme tel, cela m'a apparu comme une formule
toute faite sortie d'un livre sans en comprendre l'essence.
Post by Wykaaa
Post by ld
Ca ne contradit pas ce que je dis. Les modeles compatibles C++ et Java
n'utilise pas l'expressivite de C++. D'ou le nombre de lignes (et
encore C++ n'est pas tres concis quand cela devient autement dynamique
(DB, spreadsheet, etc...)
Non mais vous aviez l'air méprisant sur Java...
Non. La simplicite de la semantique d'un langage est a mon avis le
_premier_ critere pour du code sans bug et Java est plutot bien place
(COS aussi ;-).
Post by Wykaaa
Post by ld
Post by Wykaaa
Post by ld
Pris en flagrant delit de mauvaise foi. Tres rare sont les
professionnels qui preferent un mot clef a une solution bibliotheque
(a fonctionnalites egales).
Ca c'est vous qui le dites... car dans les projets dont je vous parle,
on étouffe sous le poids des bibliothèques de tous ordres et on aimerait
bien les réduire.
Et vous croyez qu'ajouter des dizaines de mots clef au langage
resoudra votre probleme? Ce dont vous parlez est un autre probleme. Je
maintien ce que j'ai dit. Plus le noyau (kernel) du langage est petit
et expressif, moins il y aura de probleme pour ecrire des composants
reutilisables.
Peut-être mais ça rend plus difficile l'AOP (Aspect Oriented
Programming), en particulier sur les aspects qualité qui sont
transversaux aux modules, sous-systèmes et systèmes (quand ils sont
intégrés dans un système de système).
AOP n'est qu'une couche de plus, un subset de ce que peut faire la
delagation et les multimethodes. Deplus cote securite, c'est pas le
top. Rien de tel pour modifier le comportement d'un code sans s'en
appercevoir (probleme des wildcards).
Post by Wykaaa
Post by ld
Post by Wykaaa
Post by ld
Post by Wykaaa
Il faut donc décrire des règles méthodologiques, dans un environnement
C++, pour indiquer comment faire une interface...
Non, juste apprendre a programmer correctement. Comme pour tout le
reste d'ailleurs.
Dans un projet qui implique des programmeurs répartis géographiquement
sur toute l'Europe (au moins) et qui peuvent une centaine voir beaucoup
plus, vous me direz comment vous faites sans règles méthodologiques de
programmation :-)
Ou ai-je dis qu'il n'en fallait pas? Mon propos de depart portait sur
la possibilite de mettre des methodes generiques (ou sens ou je l'ai
precise) dans les interfaces en C++, ce que Java ne permet et que
Haskell utilise abondament. Rien de plus.
Je suis désolé de vous dire que votre méthodologie n'est pas vraiment
réaliste dans certains systèmes (en particulier les systèmes d'armes).
De quelle methode parlez vous? Le fait que quand quelque chose est
bancal il faut recommencer? Le fait que les interfaces de bases ne
doivent correspondre qu'a un seul role? Ce ne sont pas des methodes
mais des principes qui ne sont pas de moi. Mais les generateurs de
code auront beaucoup de mal a les definir pour vous, ca c'est sur.
Post by Wykaaa
Post by ld
Lorsqu'une application se base sur des frameworks stratifies, il n'y a
pas besoin de 80 millions de lignes. Aucune application ne devrait
avoir besoin d'autant de lignes de code (effective). Si vous avez
abouti a cela, c'est qu'il y a un serieux probleme qqpart et il serait
temps de fragmenter les objectifs et de le tranformer en environement
et/ou plateforme.
Heureusement que ce n'est pas d'un seul tenant...
Du temps des missions Apollo, les équipes de programmeurs se montaient à
1200 personnes.
Fallait du monde pour perforer les cartes et des bras pour les
transporter (sans les melanger svp)...
Post by Wykaaa
Post by ld
Post by Wykaaa
Post by ld
Post by Wykaaa
- slide 40 : dans Logic programming vous mentionnez SQL qui n'est pas du
même niveau que les autre langages de la page car il n'est pas "Turing
Complet"
Ce n'est pas le sujet de la presentation. PL/SQL est Turing complet,
mais PL n'est pas relationel et n'apporte donc rien au sujet.
Donc c'est trompeur. Un langage purement relationnel n'est pas "Turing
complet" et n'est pas non plus un langage déclaratif.
Ce n'est pas ce que j'ai dit, ni ici, ni dans les slides.
Non mais vous le dites implicitement dans les slides puisque vous le
placez avec Prolog dans la programmation logique et tous (sauf erreur ou
omission) les autres langages du slide sont "Turing-complets", mais je
ne connais pas F#...
Pour faire court, c'est un OCaml sur .Net
Post by Wykaaa
Post by ld
Post by Wykaaa
Post by ld
aussi la categorie qui interessait le moins l'audience et que tout le
monde connaissait plus ou moins (en tout cas de nom), ce qui n'etait
pas le cas de Prolog.
D'ailleurs c'est un abus de langage de classer Prolog dans la
programmation logique, c'est un langage déclaratif.
La plupart des langages fonctionnels aussi sont declaratifs et je ne
le dis pas non plus. Declaratif n'est pas un critere de cette
classification et je ne vois pas en quoi elle devrait en faire partie.
OK, c'est VOTRE classification.
La question n'est pas la. Opposer ses categories avec declaratif et/ou
imperatif c'est comme melanger les couleurs et les formes. _Toutes_
les categories de ce slide enumerent au moins un langage declaratif
(ou qui peut etre utilise sous forme declarative). Un meme langage
peut etre utilise de facon declarative et/ou imperative, cela depend
de sa syntaxe et de son expressivite, et seulement tres partiellement
de son modele de programmation. Haskell peut se programmer en
imperatif ("do" notation), C++ peut se programmer en declaratif
(template specialisation, overloading, et+) et Scala melange les deux
(il est d'ailleurs dans deux categories). Je ne vois pas en quoi cela
apporte une information au slide. Je crois qu'une nouvelle fois vous
melanger les choses. Quand au critere Turing complet qui "fait bien"
sur le slide, cela n'apporte pas d'information sur le modele d'un
langage, meme si c'est un DSL comme SQL. En pratique, aucune
implementation de langage informatique n'est Turing complet (memoire
finie).
Post by Wykaaa
Post by ld
Post by Wykaaa
Attention aux pièges de l'héritage multiple sur les classes concrètes,
même avec la virtualisation. On doit court-circuiter l'appel des
constructeurs dans la hiérarchie, il peut y avoir des "trous" (garbage)
dans les structures C sous-jacentes aux classes lorsqu'on "projette" des
instances de classes dérivées sur leur classe de base. Ceci est
extrêmement dangereux !
Je ne vois pas de quoi vous parlez (un exemple?). Je pense de plus que
vous faites erreur sur le langage C++.
Pour la représentation en mémoire dans le cadre de l'héritage multiple,
c'est là :http://dchaffiol.free.fr/info/langages/art_cpp_heritageMultiple_q.htm
Ce site est une blague, bourre de fautes et d'incoherences. J'espere
que vous ne tirez pas votre expertise C++ de ce site. Vous avez
quelque chose de plus serieux?
Post by Wykaaa
(il faut utiliser l'ascenseur car c'est vers la fin. et les explications
sont dans une autres page html (le lien est tout en bas)
class A
   {
     A(arg1, arg2): ....;
   };
   class B:virtual public A
   {
     ...
   };
   class C:virtual public A
   {
     ...
   };
   class D:public B, public C
   {
     ...
   };
En cas d'héritage multiple avec des constructeur à arguments
(la classe
   D::D(int a, int b, int c, int d):A(int a), B (int b), C (int c)
   {
       ...
   }
Si la hiérarchie est plus conséquente (et dans une bibliothèque), cela
oblige le développeur de la classe D à connaître toute la hiérarchie
pour connaître tous les constructeurs à appeler !
Seulement ceux des bases virtuelles et des bases directes. La raison
donnee dans le site est complement abracadabrante (et surtout fausse!)
sans compter que ca n'a rien a voir avec C++ (le langage). Pour la
bonne raison, voir [class.base.init]

<<
All subobjects representing virtual base classes are initialized by
the constructor of the most derived class (1.8). If the constructor of
the most derived class does not specify a mem-initializer for a
virtual base class V, then V’s default constructor is called to
initialize the virtual base class subobject. If V does not have an
accessible default constructor, the initialization is ill-formed. A
mem-initializer naming a virtual base class shall be ignored during
execution of the constructor of any class that is not the most derived
class.
Si la raison technique liee a _l'implementation_ vous interesse, cela
a a voir avec les constructeurs partiels (si vous savez ce que c'est
et dont le site que vous mentionnez ne parle pas) mais on ne parle
plus de C++ mais de l'implementation d'un _compilateur_. A titre
indicatif, vous trouverez un package complet detaillant et
implementant (en C) le modele object C++ utilise par GCC dans

http://cern.ch/laurent.deniau/html/cpp_object_model.tgz

mais ce n'est pas trivial, meme si le C++ est une "langue naturelle"
pour vous. Les fichiers README et object_model.html sont les points de
depart. L'implementation du dynamic_cast<>, bien que naive, etait 3x
plus rapide que celle de GCC la derniere fois que j'avais mesure (~2
ans).

a+, ld.
Wykaaa
2009-11-19 14:25:26 UTC
Permalink
Post by ld
Post by Wykaaa
Post by ld
Donc on peut faire simple, efficace et elegant sans passer par un
design bancal. Toute l'expertise consiste a deduire ce design et a le
convertir dans le code qui-va-bien.
Pensez-vous réellement que n'importe quel développeur C++ est capable
d'écrire le code des slides 65 et 66 ?
Oui. Ca me parait un minimum sinon ce n'est pas un programmeur C++.
Alors vous n'avez certainement jamais eu à faire à des programmeurs C++
lambda dans l'industrie !
Post by ld
De
plus il est essentiel qu'il explique le pourquoi de la decomposition
(e.g. les cones de visibilite statique) sinon cela veut aussi dire
qu'il ne sera pas capable de detecter les problemes de design/
couplage.
Là vous demandez vraiment beaucoup au programmeur lambda...
Post by ld
Post by Wykaaa
La plupart ont déjà du mal avec le polymorphisme, en général...
Ce ne sont pas des programmeurs C++. Mieux vaut leur proposer Java ;-)
Hélas, c'est pareil, croyez-moi.
Post by ld
Post by Wykaaa
Post by ld
Post by Wykaaa
Post by ld
Post by Wykaaa
Donc, je préconise dans ce cas de faire de Instruction une vraie
interface (is_halt est abstraite) et fournir 2 classes abstraites qui
implémentent cette interface : l'une dans laquelle is_halt est définie
en renvoyant 0 et l'autre où is_halt renvoie 1. La fonction exec
n'étant implémentée ni dans l'une, ni dans l'autre évidemment puisque
l'exec est spécifique de chaque instructions.
Ce que vous preconisez ne fait que deplacer le probleme. Le probleme
est ailleurs.
L'exemple n'était là que pour illustrer ce que je voulais dire
Ce que vous avez dit est qu'une implementation _meme_ generique (au
sens ou je l'ai precise) ne devrait pas etre dans l'interface. Votre
exemple ne montre pas que c'est un probleme, et la correction proposee
est pire que le mal lui-meme (tout comme je l'ai precise).
Je n'ai pas pu vraiment dire cela puisque le qualificatif "générique"
m'avait échappé et que je n'utilise pas "générique" pour ce genre de
chose.
vous avez dit "aucune implementation", cela contredisait donc ce que
j'avais dit. Et formule comme tel, cela m'a apparu comme une formule
toute faite sortie d'un livre sans en comprendre l'essence.
Je me suis certainement mal exprimé.
Post by ld
Post by Wykaaa
Post by ld
Ca ne contradit pas ce que je dis. Les modeles compatibles C++ et Java
n'utilise pas l'expressivite de C++. D'ou le nombre de lignes (et
encore C++ n'est pas tres concis quand cela devient autement dynamique
(DB, spreadsheet, etc...)
Non mais vous aviez l'air méprisant sur Java...
Non. La simplicite de la semantique d'un langage est a mon avis le
_premier_ critere pour du code sans bug et Java est plutot bien place
(COS aussi ;-).
Je ne suis pas certain, à traits de langage équivalents, que la
sémantique de Java soit plus simple que celle de C++. Disons qu'il y a
beaucoup plus de traits de langage dans C++ :
- Fonctions friend
- conversions implicites due aux constructeurs à un seul argument (ça
s'est arrangé au prix du mot clé "explicit")
- héritage multiple
- surcharge des opérateurs
- et beaucoup d'autre choses encore (je ne mentionne que les plus
"visibles" immédiatement.
Post by ld
Post by Wykaaa
Post by ld
Post by Wykaaa
Post by ld
Pris en flagrant delit de mauvaise foi. Tres rare sont les
professionnels qui preferent un mot clef a une solution bibliotheque
(a fonctionnalites egales).
Ca c'est vous qui le dites... car dans les projets dont je vous parle,
on étouffe sous le poids des bibliothèques de tous ordres et on aimerait
bien les réduire.
Et vous croyez qu'ajouter des dizaines de mots clef au langage
resoudra votre probleme? Ce dont vous parlez est un autre probleme. Je
maintien ce que j'ai dit. Plus le noyau (kernel) du langage est petit
et expressif, moins il y aura de probleme pour ecrire des composants
reutilisables.
Peut-être mais ça rend plus difficile l'AOP (Aspect Oriented
Programming), en particulier sur les aspects qualité qui sont
transversaux aux modules, sous-systèmes et systèmes (quand ils sont
intégrés dans un système de système).
AOP n'est qu'une couche de plus, un subset de ce que peut faire la
delagation et les multimethodes. Deplus cote securite, c'est pas le
top. Rien de tel pour modifier le comportement d'un code sans s'en
appercevoir (probleme des wildcards).
Oui mais, malgré tout, mieux vaut ceci que rien, pour certaines
vérifications concernant la qualité j'entends. Pour la sécurité, c'est
un tout autre (vaste) problème.
Post by ld
Post by Wykaaa
Post by ld
Post by Wykaaa
Post by ld
Post by Wykaaa
Il faut donc décrire des règles méthodologiques, dans un environnement
C++, pour indiquer comment faire une interface...
Non, juste apprendre a programmer correctement. Comme pour tout le
reste d'ailleurs.
Dans un projet qui implique des programmeurs répartis géographiquement
sur toute l'Europe (au moins) et qui peuvent une centaine voir beaucoup
plus, vous me direz comment vous faites sans règles méthodologiques de
programmation :-)
Ou ai-je dis qu'il n'en fallait pas? Mon propos de depart portait sur
la possibilite de mettre des methodes generiques (ou sens ou je l'ai
precise) dans les interfaces en C++, ce que Java ne permet et que
Haskell utilise abondament. Rien de plus.
Je suis désolé de vous dire que votre méthodologie n'est pas vraiment
réaliste dans certains systèmes (en particulier les systèmes d'armes).
De quelle methode parlez vous? Le fait que quand quelque chose est
bancal il faut recommencer? Le fait que les interfaces de bases ne
doivent correspondre qu'a un seul role? Ce ne sont pas des methodes
mais des principes qui ne sont pas de moi. Mais les generateurs de
code auront beaucoup de mal a les definir pour vous, ca c'est sur.
Ok pour les générateurs de code mais le "diable" est déjà largement dans
la place :-)

Qu'une interface de base ne corresponde qu'à un seul rôle, j'en suis
tout à fait d'accord puisque ce n'est rien d'autre que l'application du
principe de forte cohésion, appliqué (et renforcé) aux interfaces.
Post by ld
Post by Wykaaa
Post by ld
Lorsqu'une application se base sur des frameworks stratifies, il n'y a
pas besoin de 80 millions de lignes. Aucune application ne devrait
avoir besoin d'autant de lignes de code (effective). Si vous avez
abouti a cela, c'est qu'il y a un serieux probleme qqpart et il serait
temps de fragmenter les objectifs et de le tranformer en environement
et/ou plateforme.
Heureusement que ce n'est pas d'un seul tenant...
Du temps des missions Apollo, les équipes de programmeurs se montaient à
1200 personnes.
Fallait du monde pour perforer les cartes et des bras pour les
transporter (sans les melanger svp)...
La "blague" est un peu facile mais je l'accepte ;-)
Post by ld
Post by Wykaaa
Post by ld
Post by Wykaaa
Post by ld
Post by Wykaaa
- slide 40 : dans Logic programming vous mentionnez SQL qui n'est pas du
même niveau que les autre langages de la page car il n'est pas "Turing
Complet"
Ce n'est pas le sujet de la presentation. PL/SQL est Turing complet,
mais PL n'est pas relationel et n'apporte donc rien au sujet.
Donc c'est trompeur. Un langage purement relationnel n'est pas "Turing
complet" et n'est pas non plus un langage déclaratif.
Ce n'est pas ce que j'ai dit, ni ici, ni dans les slides.
Non mais vous le dites implicitement dans les slides puisque vous le
placez avec Prolog dans la programmation logique et tous (sauf erreur ou
omission) les autres langages du slide sont "Turing-complets", mais je
ne connais pas F#...
Pour faire court, c'est un OCaml sur .Net
Ah oui. J'avais effectivement lu des choses il y a un certain temps sur F#
Post by ld
Post by Wykaaa
Post by ld
Post by Wykaaa
Post by ld
aussi la categorie qui interessait le moins l'audience et que tout le
monde connaissait plus ou moins (en tout cas de nom), ce qui n'etait
pas le cas de Prolog.
D'ailleurs c'est un abus de langage de classer Prolog dans la
programmation logique, c'est un langage déclaratif.
La plupart des langages fonctionnels aussi sont declaratifs et je ne
le dis pas non plus. Declaratif n'est pas un critere de cette
classification et je ne vois pas en quoi elle devrait en faire partie.
OK, c'est VOTRE classification.
La question n'est pas la. Opposer ses categories avec declaratif et/ou
imperatif c'est comme melanger les couleurs et les formes. _Toutes_
les categories de ce slide enumerent au moins un langage declaratif
(ou qui peut etre utilise sous forme declarative). Un meme langage
peut etre utilise de facon declarative et/ou imperative, cela depend
de sa syntaxe et de son expressivite, et seulement tres partiellement
de son modele de programmation. Haskell peut se programmer en
imperatif ("do" notation), C++ peut se programmer en declaratif
(template specialisation, overloading, et+) et Scala melange les deux
(il est d'ailleurs dans deux categories).
J'ai fait de la programmation quasi purement fonctionnelle en C et même
en PL/1, dans l'optimisation des calculs flottants pour un compilateur
Fortran : chaque transformation sur l'arborescence du langage
intermédiaire représentant le code était un simple appel de fonctions
imbriquées pour transformer l'arbre.
Le slide (40) n'a donc sa pertinence que par rapport aux commentaires
associés aux différents styles de programmation. Dans ce cas, il
vaudrait mieux ne pas citer les langages.
Post by ld
Je ne vois pas en quoi cela
apporte une information au slide. Je crois qu'une nouvelle fois vous
melanger les choses.
Sauf que ce slide donne à penser, tel qu'il est présenté, que chaque
langage ne permet qu'un style de programmation (renforcé par le fait que
Scala se trouve à 2 endroits alors que ce n'est le cas pour aucun des
autres...

Quand au critere Turing complet qui "fait bien"
Post by ld
sur le slide, cela n'apporte pas d'information sur le modele d'un
langage, meme si c'est un DSL comme SQL. En pratique, aucune
implementation de langage informatique n'est Turing complet (memoire
finie).
Cette remarque est un peu facile car tous ceux qui savent ce que
signifie Turing complet connaissent cela...
Post by ld
Post by Wykaaa
Post by ld
Post by Wykaaa
Attention aux pièges de l'héritage multiple sur les classes concrètes,
même avec la virtualisation. On doit court-circuiter l'appel des
constructeurs dans la hiérarchie, il peut y avoir des "trous" (garbage)
dans les structures C sous-jacentes aux classes lorsqu'on "projette" des
instances de classes dérivées sur leur classe de base. Ceci est
extrêmement dangereux !
Je ne vois pas de quoi vous parlez (un exemple?). Je pense de plus que
vous faites erreur sur le langage C++.
Pour la représentation en mémoire dans le cadre de l'héritage multiple,
c'est là :http://dchaffiol.free.fr/info/langages/art_cpp_heritageMultiple_q.htm
Ce site est une blague, bourre de fautes et d'incoherences.
Oui j'en suis conscient mais en ce qui concerne la représentation
mémoire, il y a des schémas que je n'avais pas le temps de faire et
c'est le seul que j'ai trouvé qui exposait le problème (maladroitement
et avec des fautes, je vous l'accorde).
Mais le problème existe et lorsqu'on manipule finement les adresses des
objets, on peut tomber dans des pièges.
Post by ld
J'espere
que vous ne tirez pas votre expertise C++ de ce site. Vous avez
quelque chose de plus serieux?
Bien sûr que non et j'ai cité déjà de nombreuses sources dans d'autres
messages dont vous m'accorderez, même si vous n'êtes pas toujours
d'accord avec, qu'elles sont autrement plus sérieuses.

Une de mes premières lectures concernant l'OO _et_ C++ a été ce livre :
Data Abstraction and Object-Oriented Programming in C++ by Keith Gorlen,
Sanford Orlow, and Perry Plexico: (John Wiley & Sons, 1990)
C'est en fait la fameuse librairie NIHCL dont il est question.

Ayant utilisé et enseigné la librairie de composants ADA de Grady Booch
(Software Components With Ada: Structures, Tools, and Subsystems (The
Benjamin/Cummings Series in Ada and Software Engineering)), je voulais
comparer. La NIHCL est plutôt inspirée, en fait, des classes de
Smalltalk-80.

[snip]
Post by ld
Post by Wykaaa
class A
{
A(arg1, arg2): ....;
};
class B:virtual public A
{
...
};
class C:virtual public A
{
...
};
class D:public B, public C
{
...
};
En cas d'héritage multiple avec des constructeur à arguments (la classe
D::D(int a, int b, int c, int d):A(int a), B (int b), C (int c)
{
...
}
Si la hiérarchie est plus conséquente (et dans une bibliothèque), cela
oblige le développeur de la classe D à connaître toute la hiérarchie
pour connaître tous les constructeurs à appeler !
Seulement ceux des bases virtuelles et des bases directes.
Nous sommes d'accord mais il n'empêche, qu'en général, dans une
librairie C++, la classe racine d'une hiérarchie sera dérivée
virtuellement et j'ai vu des librairies systèmes, en particulier pour
les objets graphiques, fournir un niveau de profondeur d'héritage de 10
(c'est beaucoup trop mais ça existe !).
Post by ld
La raison
donnee dans le site est complement abracadabrante (et surtout fausse!)
sans compter que ca n'a rien a voir avec C++ (le langage). Pour la
bonne raison, voir [class.base.init]
Je ne faisais référence au site mentionné que pour le problème précédent
(représentation mémoire dans le cadre de l'héritage virtuel). Je suis
d'accord que, sur ce site, pour les constructeurs dans le cadre de
l'héritage virtuel, c'est du grand délire.
Post by ld
<<
All subobjects representing virtual base classes are initialized by
the constructor of the most derived class (1.8). If the constructor of
the most derived class does not specify a mem-initializer for a
virtual base class V, then V’s default constructor is called to
initialize the virtual base class subobject. If V does not have an
accessible default constructor, the initialization is ill-formed. A
mem-initializer naming a virtual base class shall be ignored during
execution of the constructor of any class that is not the most derived
class.
Si la raison technique liee a _l'implementation_ vous interesse, cela
a a voir avec les constructeurs partiels (si vous savez ce que c'est
et dont le site que vous mentionnez ne parle pas) mais on ne parle
plus de C++ mais de l'implementation d'un _compilateur_.
J'ai travaillé 10 ans sur des compilateurs (Pascal, PL/1, Fortran, C,
ADA) et j'ai été responsable du développement d'un compilateur C depuis
la page blanche jusqu'à la première livraison (c'était avant le C ANSI
et il n'y avait quasiment que le bouquin de K&R comme spec. Il y avait
aussi le Harbison & Steele, première édition...).
Post by ld
A titre
indicatif, vous trouverez un package complet detaillant et
implementant (en C) le modele object C++ utilise par GCC dans
http://cern.ch/laurent.deniau/html/cpp_object_model.tgz
mais ce n'est pas trivial, meme si le C++ est une "langue naturelle"
pour vous.
Merci pour ce lien. Je regarderai ceci ultérieurement.

Les fichiers README et object_model.html sont les points de
Post by ld
depart. L'implementation du dynamic_cast<>, bien que naive, etait 3x
plus rapide que celle de GCC la derniere fois que j'avais mesure (~2
ans).
Merci.
ld
2009-11-19 17:31:41 UTC
Permalink
Post by Wykaaa
Post by ld
De
plus il est essentiel qu'il explique le pourquoi de la decomposition
(e.g. les cones de visibilite statique) sinon cela veut aussi dire
qu'il ne sera pas capable de detecter les problemes de design/
couplage.
Là vous demandez vraiment beaucoup au programmeur lambda...
Les programmeurs lambda c'est pour les languages fonctionels ;-)

Ceci dit, cela prend quelques minutes a expliquer et une heure tout au
plus pour savoir s'en servir, c'est-a-dire comment elargir le cone de
visibilite statique (downcast) sans passer par dynamic_cast<>. Une
fois que le developpeur a bien compris cela, il lui reste encore pas
mal de "technique" a apprendre genre push+RAII plutot que getter/
setter, mais on peut eviter la catastrophe. Sans cela, je ne donne pas
cher de la qualite du design (et du code).
Post by Wykaaa
Qu'une interface de base ne corresponde qu'à un seul rôle, j'en suis
tout à fait d'accord puisque ce n'est rien d'autre que l'application du
principe de forte cohésion, appliqué (et renforcé) aux interfaces.
Pas vraiment. C'est le principe d'inversion des dependances comme le
titre du slide 68 le dit. La cohesion peut etre obtenue par des outils
de refactoring ou des generateurs de documentation. La cohesion
(locality of knowledge) n'a pas besoin d'etre necessairement dans le
code (certe c'est mieux). Dans COS par exemple on a generalement zero
(ou tres peu) de couplage de par le design du langage, mais il faut
etre discipline pour garder une bonne cohesion. C'est exactement
l'inverse des langages comme C++ ou Java ou il faut faire attention au
couplage, mais ou la cohesion vient naturellement avec les classes.
Post by Wykaaa
Le slide (40) n'a donc sa pertinence que par rapport aux commentaires
associés aux différents styles de programmation. Dans ce cas, il
vaudrait mieux ne pas citer les langages.
La classification est celle que l'on trouve dans la litterature. Pour
ce qui est des langages, c'etait pour montrer qu'il y avait autre
chose que Fortran77.
Post by Wykaaa
Post by ld
Je ne vois pas en quoi cela
apporte une information au slide. Je crois qu'une nouvelle fois vous
melanger les choses.
Sauf que ce slide donne à penser, tel qu'il est présenté, que chaque
langage ne permet qu'un style de programmation
il ne s'agit pas de "style", mais de modele de programmation. Cela
fait parti intreseque du langage. Le style peut venir d'un
detournement de la syntaxe, ce que l'on fait courament quand on ecrit
des DSL.
Post by Wykaaa
(renforcé par le fait que
Scala se trouve à 2 endroits alors que ce n'est le cas pour aucun des
autres...
Parce que c'est le seul langage "industriel" ou "mainstream" (comme
vous voulez) qui supporte les deux _modeles_ de programmation, OO et
fonctionnel. C'est ce qui justifie d'ailleurs son attrait grandissant.
Post by Wykaaa
Post by ld
Post by Wykaaa
Pour la représentation en mémoire dans le cadre de l'héritage multiple,
c'est là :http://dchaffiol.free.fr/info/langages/art_cpp_heritageMultiple_q.htm
Ce site est une blague, bourre de fautes et d'incoherences.
Oui j'en suis conscient mais en ce qui concerne la représentation
mémoire, il y a des schémas que je n'avais pas le temps de faire et
c'est le seul que j'ai trouvé qui exposait le problème (maladroitement
et avec des fautes, je vous l'accorde).
Mais le problème existe et lorsqu'on manipule finement les adresses des
objets, on peut tomber dans des pièges.
Non. On tombe sur un UB, c'est tres different. Le layout des objets
n'est pas defini par le langage C++, ce qui veut aussi dire que l'on
n'a pas besoin de le connaitre pour programmer correctement en C++. Et
comme je l'ai dit, ni le probleme (faux), ni la solution (fausse) ne
mentionne les bonnes raisons.
Post by Wykaaa
Data Abstraction and Object-Oriented Programming in C++ by Keith Gorlen,
Sanford Orlow, and Perry Plexico: (John Wiley & Sons, 1990)
C'est en fait la fameuse librairie NIHCL dont il est question.
Je ne connais pas. Le premier livre interessant que j'ai lu sur C++
c'est le Coplien de 1992. Avant C++ etait trop mouvant. Et tout ce qui
est pre-98 est a prendre avec des pincettes (encore plus pour pre-
ARM).
Post by Wykaaa
Post by ld
Post by Wykaaa
Si la hiérarchie est plus conséquente (et dans une bibliothèque), cela
oblige le développeur de la classe D à connaître toute la hiérarchie
pour connaître tous les constructeurs à appeler !
Seulement ceux des bases virtuelles et des bases directes.
Nous sommes d'accord mais il n'empêche, qu'en général, dans une
librairie C++, la classe racine d'une hiérarchie sera dérivée
virtuellement et j'ai vu des librairies systèmes, en particulier pour
les objets graphiques, fournir un niveau de profondeur d'héritage de 10
(c'est beaucoup trop mais ça existe !).
C'est un classique du mauvais design. On n'est plus a ca pret!
Post by Wykaaa
Post by ld
La raison
donnee dans le site est complement abracadabrante (et surtout fausse!)
sans compter que ca n'a rien a voir avec C++ (le langage). Pour la
bonne raison, voir [class.base.init]
Je ne faisais référence au site mentionné que pour le problème précédent
(représentation mémoire dans le cadre de l'héritage virtuel).
Comme je l'ai dit, le probleme aussi est faux. La raison est que les
constructeurs partiels generes par le compilateur recoivent un
argument cache suplementaire, une table de pointeur vers des vtables
de construction partielle. L'heritage virtuel requiert la generation
des constructeurs et destructeurs partiels ainsi que tout une gamme de
vtables associees. Parlez du layout des objets est un non-sens. Ce
sont les regles du systeme de type et de construction/destruction
partiel des objets qui le demandent, pas le layout des objets.
Post by Wykaaa
Post by ld
Si la raison technique liee a _l'implementation_ vous interesse, cela
a a voir avec les constructeurs partiels (si vous savez ce que c'est
et dont le site que vous mentionnez ne parle pas) mais on ne parle
plus de C++ mais de l'implementation d'un _compilateur_.
J'ai travaillé 10 ans sur des compilateurs (Pascal, PL/1, Fortran, C,
ADA) et j'ai été responsable du développement d'un compilateur C depuis
la page blanche jusqu'à la première livraison (c'était avant le C ANSI
et il n'y avait quasiment que le bouquin de K&R comme spec. Il y avait
aussi le Harbison & Steele, première édition...).
Les langages que vous citez on un modele trivial et non OO si c'etait
bien avant 1995, compare a C++. Ce qui veut sans doute dire que vous
ne connaissez pas d'implementation du modele objet de C++. Pour etre
honnete, je n'avais pas non plus conscience de ces problemes
d'implementation avant d'ecrire le code C equivalent (a la main svp,
vous apprecierez la motivation en voyant le code ;-).

a+, ld.
Wykaaa
2009-11-19 20:07:49 UTC
Permalink
Post by ld
Post by Wykaaa
Post by ld
De
plus il est essentiel qu'il explique le pourquoi de la decomposition
(e.g. les cones de visibilite statique) sinon cela veut aussi dire
qu'il ne sera pas capable de detecter les problemes de design/
couplage.
Là vous demandez vraiment beaucoup au programmeur lambda...
Les programmeurs lambda c'est pour les languages fonctionels ;-)
Ceci dit, cela prend quelques minutes a expliquer et une heure tout au
plus pour savoir s'en servir, c'est-a-dire comment elargir le cone de
visibilite statique (downcast) sans passer par dynamic_cast<>. Une
fois que le developpeur a bien compris cela, il lui reste encore pas
mal de "technique" a apprendre genre push+RAII plutot que getter/
setter, mais on peut eviter la catastrophe. Sans cela, je ne donne pas
cher de la qualite du design (et du code).
Voilà, il lui reste encore "pas mal de techniques à apprendre". Tout est
dit car, dans l'industrie, il ne les apprendra jamais, par manque de
temps, par le fait que son environnement humain n'est pas forcément
"riche" techniquement, etc.
Aujourd'hui, ce que je constate dans l'industrie, pas seulement dans mon
domaine de prédilection, mais même en informatique de gestion, c'est que
les programmeurs(remarquez que je ne dis même pas développeur) ont plus
un rôle d'ensemblier/intégrateur que de réel développeur (au sens noble
du terme) car ils utilisent (plus ou moins bien) des bibliothèques et
ils se contentent bien souvent de mettre simplement de la glue autour.
De plus l'utilisation de plus en plus intensive de générateurs de
squelette d'application ne leur facilite pas l'apprentissage des "bonnes
techniques".
Je ne parle pas de la "culture" de gestion de projet en général et
informatique en particulier qui est vraiment lamentable en France (mais
je ne peux parler qu'en comparant aux US).
Ce n'est pas pour les dédouaner mais les "développeurs" ont quelques
circonstances atténuantes...
Post by ld
Post by Wykaaa
Qu'une interface de base ne corresponde qu'à un seul rôle, j'en suis
tout à fait d'accord puisque ce n'est rien d'autre que l'application du
principe de forte cohésion, appliqué (et renforcé) aux interfaces.
Pas vraiment. C'est le principe d'inversion des dependances comme le
titre du slide 68 le dit. La cohesion peut etre obtenue par des outils
de refactoring ou des generateurs de documentation. La cohesion
(locality of knowledge) n'a pas besoin d'etre necessairement dans le
code (certe c'est mieux). Dans COS par exemple on a generalement zero
(ou tres peu) de couplage de par le design du langage, mais il faut
etre discipline pour garder une bonne cohesion. C'est exactement
l'inverse des langages comme C++ ou Java ou il faut faire attention au
couplage, mais ou la cohesion vient naturellement avec les classes.
Cette partie de notre discussion mériterait, à elle seule, d'assez longs
développements car tout ceci a un impact sur les aspects qualité et en
particulier, la maintenabilité mais aussi la testabilité et la
localisation des défauts. Si le principe de forte cohésion est respecté
dans le code, ça facilite la localisation des défauts (leur origine),
par exemple.
Je considère que c'est une bonne chose que la cohésion viennent
naturellement dans des langages comme C++ ou Java et, pour revenir à une
partie de la discussion initiale, à mon avis, les langages à prototype,
même s'ils permettent plus de souplesse et justement à cause de cela
nécessite une plus grande vigilance vis-à-vis de ces aspects.
Ceci dit, contrairement à ce que mes propos, quelques fois, peuvent
laisser penser, je ne suis pas pour des méthodologies "psycho rigides"
comme le dit Bruno, je pense même que les méthodologies sont là, comme
filet, pour essayer de "limiter les dégâts" occasionnés par la grande
masse des développeurs lambda. Quelqu'un qui a transcendé les "bons
principes" et qui maîtrise raisonnablement les techniques de
design/programmation n'a besoin que d'un soutien méthodologique léger
qui portera d'ailleurs plutôt sur les aspects de son
contexte/environnement métier.
Dans mon domaine, si vous ne connaissez pas l'organisation des armées,
des aspects important de ce qu'on appelle la "doctrine" (les aspects
métier en fait) vous ne ferez jamais un bon design ni des logiciels qui
satisfassent pleinement le "client". Le ticket d'entrée est tout de même
très élevé et c'est pour cela que, dans les réponses aux appels
d'offres, on trouve toujours les mêmes au grand dam, d'ailleurs, des
clients qui aimeraient plus de "diversité".
Post by ld
Post by Wykaaa
Le slide (40) n'a donc sa pertinence que par rapport aux commentaires
associés aux différents styles de programmation. Dans ce cas, il
vaudrait mieux ne pas citer les langages.
La classification est celle que l'on trouve dans la litterature. Pour
ce qui est des langages, c'etait pour montrer qu'il y avait autre
chose que Fortran77.
J'espère que vous commentez abondamment ce slide ;-)
Post by ld
Post by Wykaaa
Post by ld
Je ne vois pas en quoi cela
apporte une information au slide. Je crois qu'une nouvelle fois vous
melanger les choses.
Sauf que ce slide donne à penser, tel qu'il est présenté, que chaque
langage ne permet qu'un style de programmation
il ne s'agit pas de "style", mais de modele de programmation. Cela
fait parti intreseque du langage. Le style peut venir d'un
detournement de la syntaxe, ce que l'on fait courament quand on ecrit
des DSL.
Oui vous avez raison, je me suis mal exprimé.
Post by ld
Post by Wykaaa
(renforcé par le fait que
Scala se trouve à 2 endroits alors que ce n'est le cas pour aucun des
autres...
Parce que c'est le seul langage "industriel" ou "mainstream" (comme
vous voulez) qui supporte les deux _modeles_ de programmation, OO et
fonctionnel. C'est ce qui justifie d'ailleurs son attrait grandissant.
Je ne connais pas ses utilisations, dans quels domaines est-il le plus
utilisé ?

[snip]
Post by ld
Post by Wykaaa
Data Abstraction and Object-Oriented Programming in C++ by Keith Gorlen,
Sanford Orlow, and Perry Plexico: (John Wiley & Sons, 1990)
C'est en fait la fameuse librairie NIHCL dont il est question.
Je ne connais pas. Le premier livre interessant que j'ai lu sur C++
c'est le Coplien de 1992. Avant C++ etait trop mouvant. Et tout ce qui
est pre-98 est a prendre avec des pincettes (encore plus pour pre-
ARM).
Ce livre est probablement le premier livre sérieux qui parlait du design
lié au langage C++
Post by ld
Post by Wykaaa
Post by ld
Post by Wykaaa
Si la hiérarchie est plus conséquente (et dans une bibliothèque), cela
oblige le développeur de la classe D à connaître toute la hiérarchie
pour connaître tous les constructeurs à appeler !
Seulement ceux des bases virtuelles et des bases directes.
Nous sommes d'accord mais il n'empêche, qu'en général, dans une
librairie C++, la classe racine d'une hiérarchie sera dérivée
virtuellement et j'ai vu des librairies systèmes, en particulier pour
les objets graphiques, fournir un niveau de profondeur d'héritage de 10
(c'est beaucoup trop mais ça existe !).
C'est un classique du mauvais design. On n'est plus a ca pret!
cf. Microsoft (l'ancienne MFC) ou la (vieille) librairie Borland (vers
1991), mais il y en a certainement d'autres...
Post by ld
Post by Wykaaa
Post by ld
La raison
donnee dans le site est complement abracadabrante (et surtout fausse!)
sans compter que ca n'a rien a voir avec C++ (le langage). Pour la
bonne raison, voir [class.base.init]
Je ne faisais référence au site mentionné que pour le problème précédent
(représentation mémoire dans le cadre de l'héritage virtuel).
Comme je l'ai dit, le probleme aussi est faux. La raison est que les
constructeurs partiels generes par le compilateur recoivent un
argument cache suplementaire, une table de pointeur vers des vtables
de construction partielle. L'heritage virtuel requiert la generation
des constructeurs et destructeurs partiels ainsi que tout une gamme de
vtables associees. Parlez du layout des objets est un non-sens. Ce
sont les regles du systeme de type et de construction/destruction
partiel des objets qui le demandent, pas le layout des objets.
Le problème c'est que les développeurs veulent comprendre "comment ça
marche" et qu'ils ont des difficultés à comprendre la réponse...
Post by ld
Post by Wykaaa
Post by ld
Si la raison technique liee a _l'implementation_ vous interesse, cela
a a voir avec les constructeurs partiels (si vous savez ce que c'est
et dont le site que vous mentionnez ne parle pas) mais on ne parle
plus de C++ mais de l'implementation d'un _compilateur_.
J'ai travaillé 10 ans sur des compilateurs (Pascal, PL/1, Fortran, C,
ADA) et j'ai été responsable du développement d'un compilateur C depuis
la page blanche jusqu'à la première livraison (c'était avant le C ANSI
et il n'y avait quasiment que le bouquin de K&R comme spec. Il y avait
aussi le Harbison & Steele, première édition...).
Les langages que vous citez on un modele trivial et non OO si c'etait
bien avant 1995, compare a C++.
Oui. J'ai cessé de travailler sur les compilateurs en 88.
Post by ld
Ce qui veut sans doute dire que vous
ne connaissez pas d'implementation du modele objet de C++.
Exactement.
Post by ld
Pour etre
honnete, je n'avais pas non plus conscience de ces problemes
d'implementation avant d'ecrire le code C equivalent (a la main svp,
vous apprecierez la motivation en voyant le code ;-).
J'ai lu tout vos sources du fichier zip que vous avez référencé. C'est
comme du code de compilateur (ce n'est pas étonnant). Je n'ai pas eu de
mal à le comprendre et je l'ai trouvé plaisant ;-)

Maintenant, j'ai une question, si ce n'est pas indiscret, quel est votre
job et environnement ainsi que le niveau de connaissances des
informaticiens que vous côtoyez ?

A une époque, j'ai dû former des développeur Fortran77 directement à C++
(une initiation, pas un cours avancé). Bien qu'ayant doublé le volume du
cours, ils ont eu les plus grandes difficultés à apprendre car ils ne
connaissaient pas les types, pas les pointeurs, ni même les enums ou le
passage par valeur... alors l'approche objet, le polymorphisme et les
classes abstraites ... hum, hum...
ld
2009-11-20 10:11:16 UTC
Permalink
Post by Wykaaa
Dans mon domaine, si vous ne connaissez pas l'organisation des armées,
J'ai fait 4 ans a la DGA/DRET au CREA, mais c'etait il y a 18 ans.
Post by Wykaaa
des aspects important de ce qu'on appelle la "doctrine" (les aspects
métier en fait) vous ne ferez jamais un bon design ni des logiciels qui
satisfassent pleinement le "client". Le ticket d'entrée est tout de même
très élevé et c'est pour cela que, dans les réponses aux appels
d'offres, on trouve toujours les mêmes au grand dam, d'ailleurs, des
clients qui aimeraient plus de "diversité".
J'ai vu des cas similaires qui d'ailleurs fait des vagues a l'epoque.
Mais je n'ai plus aucun contact avec ce systeme depuis longtemps.
Post by Wykaaa
Post by ld
Post by Wykaaa
Le slide (40) n'a donc sa pertinence que par rapport aux commentaires
associés aux différents styles de programmation. Dans ce cas, il
vaudrait mieux ne pas citer les langages.
La classification est celle que l'on trouve dans la litterature. Pour
ce qui est des langages, c'etait pour montrer qu'il y avait autre
chose que Fortran77.
J'espère que vous commentez abondamment ce slide ;-)
La premiere presentation a mes collegues (physiciens, ingenieurs,
doctorant) a duree 8h. Ils voulaient tout savoir et tout comprendre,
et avec un background Fortran77, le chemin etait long... Une autre
presentation au un team "d'experts" avait duree 1h20, la plupart des
slides etant triviaux.
Post by Wykaaa
Post by ld
Parce que c'est le seul langage "industriel" ou "mainstream" (comme
vous voulez) qui supporte les deux _modeles_ de programmation, OO et
fonctionnel. C'est ce qui justifie d'ailleurs son attrait grandissant.
Je ne connais pas ses utilisations, dans quels domaines est-il le plus
utilisé ?
Pourquoi ne pas vous faire une idee vous meme ;-)

http://www.scala-lang.org/

D'un point de vue semantique, scala est beaucoup beaucoup mieux que
Java.

D'un point de vue implementation, le compilateur genere du code pour
la JVM.
Le point positif, c'est la complete compatibilite avec Java et les
bibs.
Les points negatifs sont les memes que pour Java, lenteur (tout
relative) et ressources.

Si je devais programmer en Java, j'utiliserais Scala immediatement.
Post by Wykaaa
Post by ld
Comme je l'ai dit, le probleme aussi est faux. La raison est que les
constructeurs partiels generes par le compilateur recoivent un
argument cache suplementaire, une table de pointeur vers des vtables
de construction partielle. L'heritage virtuel requiert la generation
des constructeurs et destructeurs partiels ainsi que tout une gamme de
vtables associees. Parlez du layout des objets est un non-sens. Ce
sont les regles du systeme de type et de construction/destruction
partiel des objets qui le demandent, pas le layout des objets.
Le problème c'est que les développeurs veulent comprendre "comment ça
marche" et qu'ils ont des difficultés à comprendre la réponse...
Pas etonnant qu'ils ne comprennent pas la reponse quand la question
aussi est fausse. D'ailleurs des que vous voyez un dessin de layout
d'objet dans un document qui parle du _langage_ C++, vous pouvez
laisser tomber. Tout developpement qui se basera dessus va droit dans
le mur.
Post by Wykaaa
Post by ld
Pour etre
honnete, je n'avais pas non plus conscience de ces problemes
d'implementation avant d'ecrire le code C equivalent (a la main svp,
vous apprecierez la motivation en voyant le code ;-).
J'ai lu tout vos sources du fichier zip que vous avez référencé. C'est
comme du code de compilateur (ce n'est pas étonnant). Je n'ai pas eu de
mal à le comprendre et je l'ai trouvé plaisant ;-)
Maintenant, j'ai une question, si ce n'est pas indiscret, quel est votre
job
Pour faire court, l'etude de la physique des aimants (supraconducteur)
pour le LHC (l'accelerateurs de particules).
Post by Wykaaa
et environnement
le CERN?

plus precisement, le groupe en charge de la conception et de la
realisation des aimants.

http://te-dep.web.cern.ch/te-dep/structure/MSC/

et a l'interieur, la section de design et d'analyse

https://te-dep.web.cern.ch/te-dep/structure/MSC/MDA
Post by Wykaaa
ainsi que le niveau de connaissances des
informaticiens que vous côtoyez ?
Je ne cotoie pas d'informaticiens (aucun). Mais tout le monde ecrit du
code par-ci par-la (principalement du VB sous Excel, du Fortran77 et
du Matlab).
Post by Wykaaa
A une époque, j'ai dû former des développeur Fortran77 directement à C++
(une initiation, pas un cours avancé). Bien qu'ayant doublé le volume du
cours, ils ont eu les plus grandes difficultés à apprendre car ils ne
connaissaient pas les types, pas les pointeurs, ni même les enums ou le
passage par valeur... alors l'approche objet, le polymorphisme et les
classes abstraites ... hum, hum...
Je n'ai pas vu ce probleme.

Ils ont beaucoup de difficulte a comprendre par eux-memes les
principes et les methodes car cela demande du temps et de l'experience
qu'ils n'ont pas. Mais globalement, j'ai vu deux categories apres mes
presentations de "sensibilisation":

- ceux qui pensent que ca ne sert a rien et reste en F77 ou VB, et ils
ont raison: mieux vaut rester sur un outils qui repond aux besoins que
de courir apres des chimeres. Mais globalement, il ne developpe pas de
framework ou d'application. Juste des bouts de code dont ils sont les
seuls utilisateurs.

- ceux qui pensent que ca sert vraiment et si on leur explique le
pourquoi du comment, comprennent et applique tres vite: mais ils sont
tres minoritaires a avoir ces besoins.

Attention, cela ne represente pas ce qui se passe globalement au CERN
ou Matlab, LabView, Python, C++ et surtout Java sont utilises
massivement (en plus de Fortran77 biensur ;-).

a+, ld.
Wykaaa
2009-11-20 14:50:17 UTC
Permalink
Post by ld
Post by Wykaaa
Dans mon domaine, si vous ne connaissez pas l'organisation des armées,
J'ai fait 4 ans a la DGA/DRET au CREA, mais c'etait il y a 18 ans.
Alors vous avez connu un peu le milieu...

[snip]
Post by ld
Pourquoi ne pas vous faire une idee vous meme ;-)
http://www.scala-lang.org/
Je suis allé faire un tour (rapide), ça semble intéressant et j'e vais
approfondir.
Post by ld
D'un point de vue semantique, scala est beaucoup beaucoup mieux que
Java.
D'un point de vue implementation, le compilateur genere du code pour
la JVM.
Le point positif, c'est la complete compatibilite avec Java et les
bibs.
Très intéressant.
Post by ld
Les points negatifs sont les memes que pour Java, lenteur (tout
relative) et ressources.
Je pense que ce problème de lenteur est très exagéré aujourd'hui. Nous
ne sommes plus avec les implémentations de 96...
Evidemment, à côté due code optimisé et compilé, il y a quelques
différences mais pas si énormes que cela, à part pour les calculs
scientifiques très intensifs où le temps réel "dur". Mais dans ce
dernier cas ni Java, ni C++, ni même C ne seront utilisés...
Post by ld
Si je devais programmer en Java, j'utiliserais Scala immediatement.
[snip]
Post by ld
Post by Wykaaa
Maintenant, j'ai une question, si ce n'est pas indiscret, quel est votre
job
Pour faire court, l'etude de la physique des aimants (supraconducteur)
pour le LHC (l'accelerateurs de particules).
Post by Wykaaa
et environnement
le CERN?
Le nouveau collisionneur est très (trop ?) médiatisé. Il est à nouveau
en test d'après ce que j'ai compris mais un volatile a déposé des
miettes je ne sais sur quel équipement, paraît-il.

Alors on va le "voir" ce boson de Higgs ?
(je m'intéresse beaucoup à la mécanique quantique et aux modèles
d'univers, encore plus depuis ma retraite).
Post by ld
plus precisement, le groupe en charge de la conception et de la
realisation des aimants.
http://te-dep.web.cern.ch/te-dep/structure/MSC/
et a l'interieur, la section de design et d'analyse
https://te-dep.web.cern.ch/te-dep/structure/MSC/MDA
Merci pour ces liens.
Post by ld
Post by Wykaaa
ainsi que le niveau de connaissances des
informaticiens que vous côtoyez ?
Je ne cotoie pas d'informaticiens (aucun). Mais tout le monde ecrit du
code par-ci par-la (principalement du VB sous Excel, du Fortran77 et
du Matlab).
Oui, dans tous ces environnements c'est le cas. J'ai connu cela avec le CEA.
Post by ld
Post by Wykaaa
A une époque, j'ai dû former des développeur Fortran77 directement à C++
(une initiation, pas un cours avancé). Bien qu'ayant doublé le volume du
cours, ils ont eu les plus grandes difficultés à apprendre car ils ne
connaissaient pas les types, pas les pointeurs, ni même les enums ou le
passage par valeur... alors l'approche objet, le polymorphisme et les
classes abstraites ... hum, hum...
Je n'ai pas vu ce probleme.
Ils ont beaucoup de difficulte a comprendre par eux-memes les
principes et les methodes car cela demande du temps et de l'experience
qu'ils n'ont pas.
Donc vous avez vu le problème ;-)

Mais globalement, j'ai vu deux categories apres mes
Post by ld
- ceux qui pensent que ca ne sert a rien et reste en F77 ou VB, et ils
ont raison: mieux vaut rester sur un outils qui repond aux besoins que
de courir apres des chimeres. Mais globalement, il ne developpe pas de
framework ou d'application. Juste des bouts de code dont ils sont les
seuls utilisateurs.
Ceux dont je parle étaient dans ce cas-là. De plus le passage de
Fortran77 à C++ leur était imposé...
Post by ld
- ceux qui pensent que ca sert vraiment et si on leur explique le
pourquoi du comment, comprennent et applique tres vite: mais ils sont
tres minoritaires a avoir ces besoins.
C'est toujours la motivation qui fait la différence !
Post by ld
Attention, cela ne represente pas ce qui se passe globalement au CERN
ou Matlab, LabView, Python, C++ et surtout Java sont utilises
massivement (en plus de Fortran77 biensur ;-).
Mais les "développeurs" sont majoritairement des ingénieurs de leur
spécialité et pas des informaticiens. C'est cela ?

Qu'est-ce qui vous a amené à développer COS ?
ld
2009-11-20 16:19:47 UTC
Permalink
Post by Wykaaa
Post by ld
Les points negatifs sont les memes que pour Java, lenteur (tout
relative) et ressources.
Je pense que ce problème de lenteur est très exagéré aujourd'hui. Nous
ne sommes plus avec les implémentations de 96...
Ce sont des mesures faites il y a quelque mois, Java vs COS par un pro-
expert-Java-et-JVM, et qui s'est donne du mal pour essaye de battre
COS. Pour du code trivial, c'est-a-dire quelques lignes sur des types
primitifs, Java taquine C/C++ (+20-40% plus lent). Pour du code
consequent, on a observe un facteur 2-3. Pour un code tres
polymorphique COS explose Java avec un facteur 3-10 entre autre a
cause des multimethodes. Pour un code tres dynamique ou Java doit
faire appel a la reflection, un facteur 10-100. D'apres le meme
expert, tous les cas "difficile" que je lui ai soumis faisait devait
faire appel a la reflection d'une maniere ou d'une autre. COS n'avait
pas ce probleme.
Post by Wykaaa
Evidemment, à côté due code optimisé et compilé, il y a quelques
différences mais pas si énormes que cela, à part pour les calculs
scientifiques très intensifs où le temps réel "dur". Mais dans ce
dernier cas ni Java, ni C++, ni même C ne seront utilisés...
C et C++ se comportent plutot bien. Java (ou Scala ou Haskell), le
probleme c'est surtout de maitriser les ressouces comme dans beaucoup
de langage avec GC.
Post by Wykaaa
Le nouveau collisionneur est très (trop ?) médiatisé. Il est à nouveau
en test d'après ce que j'ai compris mais un volatile a déposé des
miettes je ne sais sur quel équipement, paraît-il.
Comme vous dites, c'est un peu trop mediatise ;-)
Post by Wykaaa
Alors on va le "voir" ce boson de Higgs ?
L'avenir nous le dira.
Post by Wykaaa
Post by ld
Attention, cela ne represente pas ce qui se passe globalement au CERN
ou Matlab, LabView, Python, C++ et surtout Java sont utilises
massivement (en plus de Fortran77 biensur ;-).
Mais les "développeurs" sont majoritairement des ingénieurs de leur
spécialité et pas des informaticiens. C'est cela ?
Pas a l'echelle du CERN ou il y a de nombreux informaticiens dont
certains sont des physiciens reconvertit (un pourcentage mais je ne
sais pas exactement combien).
Post by Wykaaa
Qu'est-ce qui vous a amené à développer COS ?
C'est une longue histoire ;-) Le contexte et les raisons initiales,
vous les trouverez au debut du papier

http://cos.cvs.sourceforge.net/viewvc/*checkout*/cos/doc/cos-draft-oopsla09.pdf

et au debut des slides:

http://cos.cvs.sourceforge.net/viewvc/*checkout*/cos/doc/slides-cos.pdf

Globalement je dirais que je connaissais pas trop mal C++ que
j'utilisais depuis 1989, mais que ca ne me convenait plus (en 2006)
pour de multiples raisons 50% langage 50% implementation (et C++0X a
renforce ma position) et que mes collaborateurs etaient assez loin de
pouvoir l'utiliser. Les autres languages ne m'attiraient pas
specialement a part Haskell et plus tard Scala mais qui ne conviennent
pas pour le traitement numerique de GB de donnees. J'ai donc commence
a analyser les concepts fondamentaux d'environ 40 langages afin de
determiner un ensemble minimum orthogonal tres expressif et efficace
et je suis tombe sur les _deux_ concepts de base:

- les multi-methodes: _collaboration_ dynamique d'objets
polymorphiques
- la delegation: _composition_ dynamique d'objets polymorphiques

Comme programmer, c'est composer et faire collaborer des objets, on
comprend aisement la puissance applicative de cette combinaison de
concept, independament du domaine, sauf qu'aucun langage (a ma
connaissance mais j'ai chercher!) ne les implemente tout les _deux_ et
encore moins tres efficacement. Le papier

http://cos.cvs.sourceforge.net/viewvc/*checkout*/cos/doc/cos-draft-dls09.pdf

resume un peu la demarche. D'autre part, la delegation implique un
langage dynamique, j'ai donc cherche un langage efficace et
suffisament expressif pour implementer avec une syntaxe agreable le
DSL au dessus du runtime. Mon experience dans l'ecriture d'un
compilateur Objective-C (a mes heures perdues) m'avait montrer que
c'etait un travail sans fin et surtout que j'avais refait en C tout un
framework OO pour l'ecrire. Et finalement le C a ete la seule option
restante: suffisament simple et expressif, bas niveau et tres
efficace. Apres quelques tests de faisabilite et de performance, j'ai
commence a developper (toujours hors travail, je ne suis pas
developpeur professionnel) ce qui est devenu COS. Le langage est
stable (module CosBase) depuis un an et je travaille de temps en temps
sur la bib "standard" (module CosStd) qui est encore instable. Mais a
raison de 2-3 heures par semaines ca va prendre du temps. En ce moment
je reflechis a comment reorganiser les fermetures (closure) pour
qu'elles soient plus simples a utiliser et tout aussi efficaces. Pour
ce que je pense de COS, les deux papiers en diront plus long que
quelques lignes ;-)

Toute aide est la bienvenue!

a+, ld.
Wykaaa
2009-11-20 23:56:28 UTC
Permalink
Post by ld
Post by Wykaaa
Post by ld
Les points negatifs sont les memes que pour Java, lenteur (tout
relative) et ressources.
Je pense que ce problème de lenteur est très exagéré aujourd'hui. Nous
ne sommes plus avec les implémentations de 96...
Ce sont des mesures faites il y a quelque mois, Java vs COS par un pro-
expert-Java-et-JVM, et qui s'est donne du mal pour essaye de battre
COS. Pour du code trivial, c'est-a-dire quelques lignes sur des types
primitifs, Java taquine C/C++ (+20-40% plus lent). Pour du code
consequent, on a observe un facteur 2-3. Pour un code tres
polymorphique COS explose Java avec un facteur 3-10 entre autre a
cause des multimethodes. Pour un code tres dynamique ou Java doit
faire appel a la reflection, un facteur 10-100. D'apres le meme
expert, tous les cas "difficile" que je lui ai soumis faisait devait
faire appel a la reflection d'une maniere ou d'une autre. COS n'avait
pas ce probleme.
Je parlais de Java vs C++ mais les chiffres que vous donnez par rapport
à COS sont intéressants.
Post by ld
Post by Wykaaa
Evidemment, à côté due code optimisé et compilé, il y a quelques
différences mais pas si énormes que cela, à part pour les calculs
scientifiques très intensifs où le temps réel "dur". Mais dans ce
dernier cas ni Java, ni C++, ni même C ne seront utilisés...
C et C++ se comportent plutot bien. Java (ou Scala ou Haskell), le
probleme c'est surtout de maitriser les ressouces comme dans beaucoup
de langage avec GC.
Je suis d'accord que ça peut être un problème avec des langages qui gère
les ressources (ces mécanismes de GC sont, au moins, partiellement
débrayables dans les environnements, en général). La problématique c'est
que des "anciens" informaticiens, comme moi, vont peu se faire piéger
car on sait comment fonctionne un ordinateur (du moins "à la Von
Neumann") mais que les jeunes informaticiens ne le savent pas (il n'y a
quasiment plus de cours système ni d'assembleur dans les cursus...).

[snip]
Post by ld
Post by Wykaaa
Qu'est-ce qui vous a amené à développer COS ?
C'est une longue histoire ;-) Le contexte et les raisons initiales,
vous les trouverez au debut du papier
http://cos.cvs.sourceforge.net/viewvc/*checkout*/cos/doc/cos-draft-oopsla09.pdf
http://cos.cvs.sourceforge.net/viewvc/*checkout*/cos/doc/slides-cos.pdf
j'ai regardé ces deux documents (en diagonale)
Post by ld
Globalement je dirais que je connaissais pas trop mal C++ que
j'utilisais depuis 1989, mais que ca ne me convenait plus (en 2006)
pour de multiples raisons 50% langage 50% implementation (et C++0X a
renforce ma position) et que mes collaborateurs etaient assez loin de
pouvoir l'utiliser. Les autres languages ne m'attiraient pas
specialement a part Haskell et plus tard Scala mais qui ne conviennent
pas pour le traitement numerique de GB de donnees. J'ai donc commence
a analyser les concepts fondamentaux d'environ 40 langages afin de
determiner un ensemble minimum orthogonal tres expressif et efficace
- les multi-methodes: _collaboration_ dynamique d'objets
polymorphiques
- la delegation: _composition_ dynamique d'objets polymorphiques
Comme programmer, c'est composer et faire collaborer des objets, on
comprend aisement la puissance applicative de cette combinaison de
concept, independament du domaine, sauf qu'aucun langage (a ma
connaissance mais j'ai chercher!) ne les implemente tout les _deux_ et
encore moins tres efficacement. Le papier
http://cos.cvs.sourceforge.net/viewvc/*checkout*/cos/doc/cos-draft-dls09.pdf
resume un peu la demarche. D'autre part, la delegation implique un
langage dynamique, j'ai donc cherche un langage efficace et
suffisament expressif pour implementer avec une syntaxe agreable le
DSL au dessus du runtime. Mon experience dans l'ecriture d'un
compilateur Objective-C (a mes heures perdues) m'avait montrer que
c'etait un travail sans fin et surtout que j'avais refait en C tout un
framework OO pour l'ecrire. Et finalement le C a ete la seule option
restante: suffisament simple et expressif, bas niveau et tres
efficace. Apres quelques tests de faisabilite et de performance, j'ai
commence a developper (toujours hors travail, je ne suis pas
developpeur professionnel) ce qui est devenu COS. Le langage est
stable (module CosBase) depuis un an et je travaille de temps en temps
sur la bib "standard" (module CosStd) qui est encore instable. Mais a
raison de 2-3 heures par semaines ca va prendre du temps. En ce moment
je reflechis a comment reorganiser les fermetures (closure) pour
qu'elles soient plus simples a utiliser et tout aussi efficaces. Pour
ce que je pense de COS, les deux papiers en diront plus long que
quelques lignes ;-)
Je comprends bien votre démarche.
Post by ld
Toute aide est la bienvenue!
Hélas (pour vous), j'ai passé l'âge pour ce genre de chose... car la
plus grande partie de mon temps disponible est consacrée à la musique
(j'ai côtoyé Iannis Xenakis entre 72 et 78 et en 76 j'ai produit la
première musique par synthèse granulaire à l'aide des fameux "grains de
Gabor" : cf son article de 1946).

ld
2009-11-13 02:36:49 UTC
Permalink
Post by Wykaaa
Post by Bruno Desthuilliers
Post by Wykaaa
On Nov 10, 12:19 pm, Bruno Desthuilliers <bruno.
(snip)
Post by Wykaaa
Post by Bruno Desthuilliers
Post by ld
Ben non. Si c'etait aussi simple, ca serait deja fait. De plus il
manque deux points clef de la POO: l'encapsulation et le subtyping.
Pour quelles définitions de "encapsulation" et de "subtyping", et en
quoi - selon ces définitions - ces deux concepts sont-ils des "points
clés" ?
l'encapsulation permet de compartimenter 1/ et d'eviter une exposition
dangereuse pour le couplage (fermer les portees), et appliquer les
fameux "separation of concern" et "divide and conquer". C'est a mon
avis le point fondamental de la POO, separer l'interface de
l'implementation a l'echelle des objets (des classes), pas seulement
des modules. Par exemple en C, on peut utilise un ADT et une API, mais
les consequences sur le design a grande echelle sont differentes.
L'encapsulation est très certainement le concept clé de l'objet bien
que des langages non objet supportent correctement ce concept (je
pense, en particulier, à ADA 83). Vouloir faire l'impasse sur ce
concept quand on parle d'objet c'est ne pas prendre en compte toutes
les dimensions de l'approche objet.
L'encapsulation en tant que découplage entre interface et implémentation
est dans une certaine mesure sous-entendue par la distinction entre
messages (l'interface) et comportement (l'implémentation).
Post by Wykaaa
Sans encapsulation, on ne peut pas parler de réutilisabilité (du moins
sans prendre de grands risques).
En ce qui me concerne, la réutilisabilité est ici au mieux un bénéfice
secondaire - le bénéfice primaire attendu étant surtout une meilleure
gestion de la complexité.
Post by Wykaaa
le subtyping vient ensuite comme moyen d'etendre et de modulariser un
systeme ferme par l'encapsulation (sous certaines conditions, cf
Liskov). En particulier je vois le subtyping comme une projection d'un
type sur un autre,  ni plus ni moins.
Ce qui implique pour commencer une notion de type. Quel est le type d'un
objet dans un langage à prototype ? Et même, pour commencer, qu'est-ce
qu'un type ?-)
Un type définit un ensemble de "valeurs" et d'opérations autorisées sur
ces valeurs. Les valeurs d'un objet sont en fait l'ensemble de ses états
autorisés (l'ensemble des n-uplets autorisés sur les valeurs de ses
attributs).
Dans un langage fonctionnel tel que ML, les fonctions elles-mêmes ont un
type, ce qui permet l'inférence de types.
Jusque la Ok. Meme si le dernier point est aussi vrai dans les autres
langages.
Post by Wykaaa
Post by Bruno Desthuilliers
Post by Wykaaa
Et en general c'est la que les
choses se compliquent ;-)
Indeed !-)
Post by Wykaaa
Le subtyping permet de particulariser les objets, pas de les étendre.
Les étendre passe par la généricité.
par ailleurs dans ce fil, j'ai vu que Bruno ne tient pas compte de
l'héritage dans l'approche objet, soit.
J'en tiens bien sûr compte - je précisais juste que l'héritage, au moins
dans le sens où il existe comme fonctionnalité de la plupart des
langages objets, n'est pas AMHA un concept *nécessaire* à la définition
de l'OO.
L'héritage est lié au principe de classification (la taxonomie ou
taxinomie). Il permet de regrouper dans une même hiérarchie des
abstractions ayant des caractéristiques communes mais aussi des
particularismes. Classer les éléments de l'univers du discours (en
l'occurrence, en informatique, les objets de l'application) est
essentiel pour savoir de quoi l'on parle. Il permet d'éviter les
problèmes d'imprédictabilité au sens de Poincaré.
C'est justement ce genre de discours qui sont a l'origne d'articles du
type "Why OO Failed". L'heritage n'est pas un outils pour decrire une
taxonomie car celle-ci va dependre des particularites mise en avant
par ses utilisateurs. Autrement dit il faudrait un heritage dependant
du contexte d'utilisation. Et si meme certains langage "academique"
s'y essaye, cela reste inutilement complique/contraignant par rapport
au gain.
Post by Wykaaa
Post by Bruno Desthuilliers
Post by Wykaaa
Mais on a besoin, dans l'approche objet d'une notion de "hiérarchie"
(au sens de relation d'ordre strict partielle entre objets). Il y en a
déjà une, issue des langages non objet, c'est l'agrégation (faible ou
forte, peut importe pour ce qui nous occupe). Dans l'approche objet
"classique", il y a une autre notion  de hiérarchie, c'est l'héritage
qui permet le polymorphisme d'héritage
En quoi ce polymorphisme apporte-t'il quoi que ce soit à celui plus
générique déjà offert par la séparation entre message et comportement ?
En quoi est-il nécessaire qu'un objet doive "hériter" d'un autre pour
comprendre un sous-ensemble commun de messages ?
Ce n'est pas pour "comprendre" un sous-ensemble commun de messages que
l'héritage existe mais pour identifier une classe d'abstraction ayant
des caractéristiques communes.
Et ces caracterisques devraient se resumer a l'ensemble des
comportements commun. Tout autre approche posera des problemes de
different ordres (couplage, subtitution, extensibilite) devrait etre
reserve au un code "local"

Votre approche de la POO ressemble beaucoup a:

si ca nage, vole et caquette comme un canard, c'est un canard.

ce qui est completement faux. Il faut s'en tenir a ce que l'on sait
sans extrapoler:

si ca nage, vole et caquette comme un canard, et bien ca _nage_,
_vole_ et _caquette_ comme un canard (identification comportementale),
RIEN DE PLUS, et peu importe ce que c'est en realite si on sait que ce
qu'on peut en faire convient aux objectifs.
Post by Wykaaa
Post by Bruno Desthuilliers
Post by Wykaaa
(qui se distingue du polymorphisme "ad'hoc" de type surcharge ou du
polymorphisme universel à la ML). Alors, en remplacement de
l'héritage, certains, dont Bruno, parlent de délégation (c'est plutôt
le vocabulaire des langages d'acteurs que des langages p"purement objet")
La notion de composition/délégation est assez fréquemment évoquée dans
la littérature, et notamment citée comme préférable à l'héritage
d'implémentation dans le GoF.
Je ne parle pas de l'héritage d'implémentation mais de l'héritage au
sens conceptuel du terme. Il est étroitement lié au concept d'abstraction.
Moi aussi. L'heritage devrait surtout permettre de structurer des
groupes de comportements (classes abstraites en C++, interface en
Java). Essaye de tout classer par taxinomie est simplement utopique,
prend enormement de temps et reste difficilement extensible.
Post by Wykaaa
Post by Bruno Desthuilliers
Post by Wykaaa
mais cette délégation doit tout de même respecter la notion de
hiérarchie sur les objets
Ah bon ? Et pourquoi donc ?
Post by Wykaaa
(on ne délègue pas à n'importe quel objet, n'importe comment).
Du moment que l'objet auquel on délègue comprend les messages qu'on lui
envoie, je ne vois pas où est le problème.
Je comprends pourquoi tu n'est pas "pour" l'encapsulation. La délégation
pure peut conduire aux pires dérivent concernant la sûreté de
fonctionnement.
Ah Bon? C'est pourtant l'outil le plus flexible permettant de
"parametriser" un systeme "fermé" tout en respectant l'encapsulation
(on ne peut pas en dire autant de la parametrisation en C++). L'objet
Locker dans COS est l'exemple le plus avance (mais simple) que je
connaisse qui utilise la delegation pour eliminer les deadlocks de
facon non intrusive.
Post by Wykaaa
Post by Bruno Desthuilliers
Post by Wykaaa
La délégation ne peut se faire correctement qu'en respectant cette
notion d'ordre strict entre les objets, objets de la délégation.
On a déjà eu l'occasion de comparer nos points de vues et approches du
génie logiciel - et les raisons (notamment contextuelle) pour lesquelles
ces points de vues et approches diffèrent sensiblement. En ce qui me
concerne - et même si je peux comprendre son intérêt de ton point de vue
- cette "notion d'ordre strict" n'est (AMHA etc...) pas absolument
(voire absolument pas) nécessaire, et parfois (voire souvent) tout
simplement nuisible.
Elle est nuisible uniquement quand on souhaite que les objets puissent
changer de nature dynamiquement mais ceci conduit souvent à ce que les
objets ne soient plus intègrent ce qui peut nuire à la fiabilité du
logiciel et complique le style de programmation dit "sure" (safe
programming)
Pas plus que de croire aveuglement dans un systeme de typage statique.
Les bugs en seront d'autant plus subtiles et detectes tardivement
(peut-etre trop tard).

a+, ld.
Bruno Desthuilliers
2009-11-13 10:46:43 UTC
Permalink
ld a écrit :
(snip)
Post by ld
si ca nage, vole et caquette comme un canard, c'est un canard.
ce qui est completement faux. Il faut s'en tenir a ce que l'on sait
si ca nage, vole et caquette comme un canard, et bien ca _nage_,
_vole_ et _caquette_ comme un canard (identification comportementale),
RIEN DE PLUS, et peu importe ce que c'est en realite si on sait que ce
qu'on peut en faire convient aux objectifs.
DansMesBras(tm)
Wykaaa
2009-11-13 15:57:28 UTC
Permalink
Post by ld
Post by Wykaaa
Post by Bruno Desthuilliers
Post by Wykaaa
On Nov 10, 12:19 pm, Bruno Desthuilliers <bruno.
(snip)
Post by Wykaaa
Post by Bruno Desthuilliers
Post by ld
Ben non. Si c'etait aussi simple, ca serait deja fait. De plus il
manque deux points clef de la POO: l'encapsulation et le subtyping.
Pour quelles définitions de "encapsulation" et de "subtyping", et en
quoi - selon ces définitions - ces deux concepts sont-ils des "points
clés" ?
l'encapsulation permet de compartimenter 1/ et d'eviter une exposition
dangereuse pour le couplage (fermer les portees), et appliquer les
fameux "separation of concern" et "divide and conquer". C'est a mon
avis le point fondamental de la POO, separer l'interface de
l'implementation a l'echelle des objets (des classes), pas seulement
des modules. Par exemple en C, on peut utilise un ADT et une API, mais
les consequences sur le design a grande echelle sont differentes.
L'encapsulation est très certainement le concept clé de l'objet bien
que des langages non objet supportent correctement ce concept (je
pense, en particulier, à ADA 83). Vouloir faire l'impasse sur ce
concept quand on parle d'objet c'est ne pas prendre en compte toutes
les dimensions de l'approche objet.
L'encapsulation en tant que découplage entre interface et implémentation
est dans une certaine mesure sous-entendue par la distinction entre
messages (l'interface) et comportement (l'implémentation).
Post by Wykaaa
Sans encapsulation, on ne peut pas parler de réutilisabilité (du moins
sans prendre de grands risques).
En ce qui me concerne, la réutilisabilité est ici au mieux un bénéfice
secondaire - le bénéfice primaire attendu étant surtout une meilleure
gestion de la complexité.
Post by Wykaaa
le subtyping vient ensuite comme moyen d'etendre et de modulariser un
systeme ferme par l'encapsulation (sous certaines conditions, cf
Liskov). En particulier je vois le subtyping comme une projection d'un
type sur un autre, ni plus ni moins.
Ce qui implique pour commencer une notion de type. Quel est le type d'un
objet dans un langage à prototype ? Et même, pour commencer, qu'est-ce
qu'un type ?-)
Un type définit un ensemble de "valeurs" et d'opérations autorisées sur
ces valeurs. Les valeurs d'un objet sont en fait l'ensemble de ses états
autorisés (l'ensemble des n-uplets autorisés sur les valeurs de ses
attributs).
Dans un langage fonctionnel tel que ML, les fonctions elles-mêmes ont un
type, ce qui permet l'inférence de types.
Jusque la Ok. Meme si le dernier point est aussi vrai dans les autres
langages.
Post by Wykaaa
Post by Bruno Desthuilliers
Post by Wykaaa
Et en general c'est la que les
choses se compliquent ;-)
Indeed !-)
Post by Wykaaa
Le subtyping permet de particulariser les objets, pas de les étendre.
Les étendre passe par la généricité.
par ailleurs dans ce fil, j'ai vu que Bruno ne tient pas compte de
l'héritage dans l'approche objet, soit.
J'en tiens bien sûr compte - je précisais juste que l'héritage, au moins
dans le sens où il existe comme fonctionnalité de la plupart des
langages objets, n'est pas AMHA un concept *nécessaire* à la définition
de l'OO.
L'héritage est lié au principe de classification (la taxonomie ou
taxinomie). Il permet de regrouper dans une même hiérarchie des
abstractions ayant des caractéristiques communes mais aussi des
particularismes. Classer les éléments de l'univers du discours (en
l'occurrence, en informatique, les objets de l'application) est
essentiel pour savoir de quoi l'on parle. Il permet d'éviter les
problèmes d'imprédictabilité au sens de Poincaré.
C'est justement ce genre de discours qui sont a l'origne d'articles du
type "Why OO Failed". L'heritage n'est pas un outils pour decrire une
taxonomie car celle-ci va dependre des particularites mise en avant
par ses utilisateurs. Autrement dit il faudrait un heritage dependant
du contexte d'utilisation. Et si meme certains langage "academique"
s'y essaye, cela reste inutilement complique/contraignant par rapport
au gain.
Je connais parfaitement les arguments de ceux qui disent que l'orienté
objet a échoué. Ce sont de faux arguments. Ils avouent eux-mêmes qu'ils
ont de la peine à "penser objet". J'ai fait suffisamment de projets, de
conseil et de cours pour voir combien ceci était vrai. Car pour "penser
objet" il faut pratiquer une réelle démarche d'ingénierie, ce que,
finalement, peu d'informaticiens sont capables de faire.
L'ingénierie (civile, informatique, militaire, etc.) est un monde rempli
de contraintes pour "la bonne cause", celle de la fiabilité, de la
sûreté de fonctionnement. Quel informaticien logiciel a entendu parlé
des arbres de défaillances (utilisés dans l'ingénierie de systèmes
complexes). J'ai été spécialiste (je suis retraité) de l'ingénierie de
systèmes complexes à logiciel prépondérant et là, on voit les VRAIS
problèmes car il ne s'agit pas de coder un serveur machin-chose plus ou
moins bien spécifié ou "ficelé" mais bien de construire un ensemble
matériel/logiciel qui ne se crash pas à la moindre manip inattendue, qui
ne produise pas de catastrophe monstrueuse (centrale nucléaire, airbus,
etc.). Malgré les précautions prises, des accidents arrivent, mais qu'en
serait-il sans toutes ces précautions ?
Jusqu'à présent, "l'état de l'art", pour ces systèmes c'est d'utiliser
une démarche d'ingénierie extrêmement rigoureuse et, pour les logiciels,
d'appliquer strictement la démarche objet et d'utiliser des langages
objets à fort typage statique parce que, pour l'instant, c'est ce qui se
montre le plus fiable (encore une fois ceci n'élimine pas totalement les
erreurs, il n'y a pas de "silver bullet" comme dit Bruno).
Dans ces systèmes, il y a énormément de contraintes (et on ne complique
pas inutilement, loin de là car on n'en fait jamais assez...) et il est
faut de dire que c'est pour un gain minime.
Je crois juste que les uns et les autres nous ne pratiquons pas les
mêmes types d'applications logicielles et que toutes les applications
n'ont pas besoin de la même approche.
D'ailleurs je pense que les logiciels qui doivent être conçus avec une
approche objet sont assez minoritaires. Ce sont principalement ceux qui
relèvent de l'ingénierie système et non de la seule ingénierie
logicielle (pour faire court)
Post by ld
Post by Wykaaa
Post by Bruno Desthuilliers
Post by Wykaaa
Mais on a besoin, dans l'approche objet d'une notion de "hiérarchie"
(au sens de relation d'ordre strict partielle entre objets). Il y en a
déjà une, issue des langages non objet, c'est l'agrégation (faible ou
forte, peut importe pour ce qui nous occupe). Dans l'approche objet
"classique", il y a une autre notion de hiérarchie, c'est l'héritage
qui permet le polymorphisme d'héritage
En quoi ce polymorphisme apporte-t'il quoi que ce soit à celui plus
générique déjà offert par la séparation entre message et comportement ?
En quoi est-il nécessaire qu'un objet doive "hériter" d'un autre pour
comprendre un sous-ensemble commun de messages ?
Ce n'est pas pour "comprendre" un sous-ensemble commun de messages que
l'héritage existe mais pour identifier une classe d'abstraction ayant
des caractéristiques communes.
Et ces caracterisques devraient se resumer a l'ensemble des
comportements commun. Tout autre approche posera des problemes de
different ordres (couplage, subtitution, extensibilite) devrait etre
reserve au un code "local"
si ca nage, vole et caquette comme un canard, c'est un canard.
ce qui est completement faux. Il faut s'en tenir a ce que l'on sait
si ca nage, vole et caquette comme un canard, et bien ca _nage_,
_vole_ et _caquette_ comme un canard (identification comportementale),
RIEN DE PLUS, et peu importe ce que c'est en realite si on sait que ce
qu'on peut en faire convient aux objectifs.
Je rappelle que ce ne sont pas les informaticiens qui doivent décider
des abstractions mais le client (éventuellement avec l'aide des
informaticiens). Ceci relève de l'ingénierie des besoins et des exigences.
Donc si le client me dit ça nage, ça vole et caquette et c'est un
canard, je ne vois pas pourquoi je le contredirais sauf si je relève des
incohérences ou des contradictions.
Post by ld
Post by Wykaaa
Post by Bruno Desthuilliers
Post by Wykaaa
(qui se distingue du polymorphisme "ad'hoc" de type surcharge ou du
polymorphisme universel à la ML). Alors, en remplacement de
l'héritage, certains, dont Bruno, parlent de délégation (c'est plutôt
le vocabulaire des langages d'acteurs que des langages p"purement objet")
La notion de composition/délégation est assez fréquemment évoquée dans
la littérature, et notamment citée comme préférable à l'héritage
d'implémentation dans le GoF.
Je ne parle pas de l'héritage d'implémentation mais de l'héritage au
sens conceptuel du terme. Il est étroitement lié au concept d'abstraction.
Moi aussi. L'heritage devrait surtout permettre de structurer des
groupes de comportements (classes abstraites en C++, interface en
Java). Essaye de tout classer par taxinomie est simplement utopique,
prend enormement de temps et reste difficilement extensible.
Justement, tout "l'art" de l'objet consiste à faire des systèmes ouverts
(interopérables, facilement extensibles, etc.). J'ai constaté que très
peu de gens étaient capables de le faire et souvent ils se découragent
face à l'approche objet...
Je crois que les gens sont toujours partisans du moindre effort et de la
facilité. Il est certain qu'il est plus facile de coder en Visual Basic
qu'en ADA, Java, C++, etc. mais surtout, il est bien plus facile (a
priori parce que a posteriori c'est autre chose...) de réaliser un
logiciel sans tout spécifier et tout concevoir (la bonne vieille méthode
d'essai/erreur a encore de beaux jours devant elle...).

Nota : je voulais parlé de polymorphisme paramétrique à propos de ML et
non de polymorphisme universel qui englobe le polymorphisme paramétrique
et d'inclusion.
Post by ld
Post by Wykaaa
Post by Bruno Desthuilliers
Post by Wykaaa
mais cette délégation doit tout de même respecter la notion de
hiérarchie sur les objets
Ah bon ? Et pourquoi donc ?
Post by Wykaaa
(on ne délègue pas à n'importe quel objet, n'importe comment).
Du moment que l'objet auquel on délègue comprend les messages qu'on lui
envoie, je ne vois pas où est le problème.
Je comprends pourquoi tu n'est pas "pour" l'encapsulation. La délégation
pure peut conduire aux pires dérivent concernant la sûreté de
fonctionnement.
Ah Bon? C'est pourtant l'outil le plus flexible permettant de
"parametriser" un systeme "fermé" tout en respectant l'encapsulation
(on ne peut pas en dire autant de la parametrisation en C++). L'objet
Locker dans COS est l'exemple le plus avance (mais simple) que je
connaisse qui utilise la delegation pour eliminer les deadlocks de
facon non intrusive.
Je ne connais pas COS (dont vous êtes l'auteur, non ?) mais j'ai cru
comprendre que c'est "une couche" objet au-dessus de C; Ayant fait un
compilateur C, si vous voulez, je peux vous dire tout le mal que je
pense de ce langage qui rassemble à peu près tout ce qu'il faut pour
être sûr de faire des logiciels non fiables et contraires à toutes les
règles de l'ingénierie logicielle.
Post by ld
Post by Wykaaa
Post by Bruno Desthuilliers
Post by Wykaaa
La délégation ne peut se faire correctement qu'en respectant cette
notion d'ordre strict entre les objets, objets de la délégation.
On a déjà eu l'occasion de comparer nos points de vues et approches du
génie logiciel - et les raisons (notamment contextuelle) pour lesquelles
ces points de vues et approches diffèrent sensiblement. En ce qui me
concerne - et même si je peux comprendre son intérêt de ton point de vue
- cette "notion d'ordre strict" n'est (AMHA etc...) pas absolument
(voire absolument pas) nécessaire, et parfois (voire souvent) tout
simplement nuisible.
Elle est nuisible uniquement quand on souhaite que les objets puissent
changer de nature dynamiquement mais ceci conduit souvent à ce que les
objets ne soient plus intègrent ce qui peut nuire à la fiabilité du
logiciel et complique le style de programmation dit "sure" (safe
programming)
Pas plus que de croire aveuglement dans un systeme de typage statique.
Les bugs en seront d'autant plus subtiles et detectes tardivement
(peut-etre trop tard).
J'ai pratiqué plus de 30 langages de programmation de tout type. Ceux
qui conduisent aux logiciels les plus fiables, les moins "buggés" et les
plus sûrs en fonctionnement sur la durée sont effectivement les langages
à typage statique. Ce n'est qu'une constatation par l'expérience, et pas
une croyance aveugle ni un axiome ou un théorème.
Ceci, encore une fois, n'évite pas les bugs mais améliore les choses de
façon, quelques fois, spectaculaire.

Enfin, à mon sens, on ne devrait pas mélanger l'héritage et la
délégation dans une discussion sur l'approche objet car ce n'est pas de
même nature. James O. Coplien a montré comment faire de la délégation en
C++ mais on peut trouver des mécanismes directs de délégation dans des
langages qui ne sont pas objets et la délégation n'est pas un concept
clé, ni même mineur, dans l'approche objet.

Nombre de langages qui se disent objet ne le sont en fait pas car il
n'en possèdent pas toutes les caractéristiques.
ld
2009-11-13 17:44:43 UTC
Permalink
Post by Wykaaa
Je connais parfaitement les arguments de ceux qui disent que l'orienté
objet a échoué. Ce sont de faux arguments. Ils avouent eux-mêmes qu'ils
ont de la peine à "penser objet".
Il y a surtout plusieurs facon d'intepreter les formules "l'OO a
echoue" que je diviserais en trois categories:

- Ceux qui ne savent pas l'utiliser:
de loin la plus grande categorie, je suis d'accord.
- Ceux qui savent l'utiliser mais sont plus productif dans le "tout
objet":
souvent des developpeurs multi-langages experimentes
- Ceux qui veulent ameliorer l'OO d'un modele en particulier
souvent des experts d'un language particulier

Seule la premiere categorie a une approche negative de rejet, les deux
autres sont constructives, soit de facon transverse (2eme), soit de
facon specialisee (3eme). Dans ces deux dernieres on trouve des
experts de la POO mondialement reconnu... Je suis personnellement
passe de la 3eme a la 2eme il y a quelque annees mais paradoxalement,
je n'utilise plus qu'un seul langage (mais je m'inspire de nombeux
autres, notament Haskell).
Post by Wykaaa
J'ai fait suffisamment de projets, de
conseil et de cours pour voir combien ceci était vrai.
Vous avez peut-etre mis un peu trop vite tout le monde dans le meme
panier...
Post by Wykaaa
Car pour "penser
objet" il faut pratiquer une réelle démarche d'ingénierie, ce que,
finalement, peu d'informaticiens sont capables de faire.
L'ingénierie (civile, informatique, militaire, etc.) est un monde rempli
de contraintes pour "la bonne cause", celle de la fiabilité, de la
sûreté de fonctionnement. Quel informaticien logiciel a entendu parlé
des arbres de défaillances (utilisés dans l'ingénierie de systèmes
complexes). J'ai été spécialiste (je suis retraité) de l'ingénierie de
systèmes complexes à logiciel prépondérant et là, on voit les VRAIS
problèmes car il ne s'agit pas de coder un serveur machin-chose plus ou
moins bien spécifié ou "ficelé" mais bien de construire un ensemble
matériel/logiciel qui ne se crash pas à la moindre manip inattendue, qui
ne produise pas de catastrophe monstrueuse (centrale nucléaire, airbus,
etc.). Malgré les précautions prises, des accidents arrivent, mais qu'en
serait-il sans toutes ces précautions ?
Jusqu'à présent, "l'état de l'art", pour ces systèmes c'est d'utiliser
une démarche d'ingénierie extrêmement rigoureuse et, pour les logiciels,
d'appliquer strictement la démarche objet et d'utiliser des langages
objets à fort typage statique parce que, pour l'instant, c'est ce qui se
montre le plus fiable (encore une fois ceci n'élimine pas totalement les
erreurs, il n'y a pas de "silver bullet" comme dit Bruno).
Dans ces systèmes, il y a énormément de contraintes (et on ne complique
pas inutilement, loin de là car on n'en fait jamais assez...) et il est
faut de dire que c'est pour un gain minime.
Je parlais des langages qui incluent la notion de contexte dans leur
systeme de type statique, pas de statique vs dynamique comme vous
semblez le penser.
Post by Wykaaa
Je crois juste que les uns et les autres nous ne pratiquons pas les
mêmes types d'applications logicielles et que toutes les applications
n'ont pas besoin de la même approche.
Certe, mais j'ai l'impression que vous avez evoluer dans un
environnement ou le modele de developement "waterfall" etait dominant.
Dans beaucoup de cas (dont le mien), les specs son claires et precises
au debut, mais representent moins de 10 a 20% du produit final des
annees plus tard. La problematique n'est donc pas d'ecrire des
applications fiables a l'intant t mais qu'elle le reste a t+1, t+2,...
Et dans le modele de developement "iteratif", la gestion de la
complexite dans l'evolution est predonderante, avec en plus la gestion
de ressource (humaine) tres variantes, non expertes et en sous
effectifs prononces.
Post by Wykaaa
D'ailleurs je pense que les logiciels qui doivent être conçus avec une
approche objet sont assez minoritaires. Ce sont principalement ceux qui
relèvent de l'ingénierie système et non de la seule ingénierie
logicielle (pour faire court)
Pas d'accord (pour faire court). Ce n'est pas parce qu'on utilise la
POO que l'on ne peut pas utiliser aussi l'approche fonctionnelle.
Scala (et d'autres dont COS) cherche a utiliser le meilleur des deux
mondes. C'est meme la tendance des langages recents car l'un favorise
l'encapsulation et l'autre la composition.
Post by Wykaaa
Post by ld
Post by Wykaaa
Post by Bruno Desthuilliers
Post by Wykaaa
Mais on a besoin, dans l'approche objet d'une notion de "hiérarchie"
(au sens de relation d'ordre strict partielle entre objets). Il y en a
déjà une, issue des langages non objet, c'est l'agrégation (faible ou
forte, peut importe pour ce qui nous occupe). Dans l'approche objet
"classique", il y a une autre notion  de hiérarchie, c'est l'héritage
qui permet le polymorphisme d'héritage
En quoi ce polymorphisme apporte-t'il quoi que ce soit à celui plus
générique déjà offert par la séparation entre message et comportement ?
En quoi est-il nécessaire qu'un objet doive "hériter" d'un autre pour
comprendre un sous-ensemble commun de messages ?
Ce n'est pas pour "comprendre" un sous-ensemble commun de messages que
l'héritage existe mais pour identifier une classe d'abstraction ayant
des caractéristiques communes.
Et ces caracterisques devraient se resumer a l'ensemble des
comportements commun. Tout autre approche posera des problemes de
different ordres (couplage, subtitution, extensibilite) devrait etre
reserve au un code "local"
si ca nage, vole et caquette comme un canard, c'est un canard.
ce qui est completement faux. Il faut s'en tenir a ce que l'on sait
si ca nage, vole et caquette comme un canard, et bien ca _nage_,
_vole_ et _caquette_ comme un canard (identification comportementale),
RIEN DE PLUS, et peu importe ce que c'est en realite si on sait que ce
qu'on peut en faire convient aux objectifs.
Je rappelle que ce ne sont pas les informaticiens qui doivent décider
des abstractions mais le client (éventuellement avec l'aide des
informaticiens).
Si vous avez des clients qui vous specifient les besoins en terme de
message _et_ de type, ce ne sont plus des clients mais des
collaborateurs, ce qui est souvent le cas dans le modele waterfall
(tout specifier forever). Le client ne descend que tres tres rarement
a ce niveau de specification. Notament parce que les specs sont plutot
declarative qu'imperative, ca n'est donc pas une demarche naturelle.
Post by Wykaaa
Ceci relève de l'ingénierie des besoins et des exigences.
Donc si le client me dit ça nage, ça vole et caquette et c'est un
canard, je ne vois pas pourquoi je le contredirais sauf si je relève des
incohérences ou des contradictions.
Ce qui me choque ici, c'est le _et_. Dans ce que j'ai mentionne, il ne
s'agit pas de conjonction mais de deduction (pour l'approche erronee)
et d'induction (pour l'approche correcte).
Post by Wykaaa
Post by ld
Post by Wykaaa
Post by Bruno Desthuilliers
Post by Wykaaa
(qui se distingue du polymorphisme "ad'hoc" de type surcharge ou du
polymorphisme universel à la ML). Alors, en remplacement de
l'héritage, certains, dont Bruno, parlent de délégation (c'est plutôt
le vocabulaire des langages d'acteurs que des langages p"purement objet")
La notion de composition/délégation est assez fréquemment évoquée dans
la littérature, et notamment citée comme préférable à l'héritage
d'implémentation dans le GoF.
Je ne parle pas de l'héritage d'implémentation mais de l'héritage au
sens conceptuel du terme. Il est étroitement lié au concept d'abstraction.
Moi aussi. L'heritage devrait surtout permettre de structurer des
groupes de comportements (classes abstraites en C++, interface en
Java). Essaye de tout classer par taxinomie est simplement utopique,
prend enormement de temps et reste difficilement extensible.
Justement, tout "l'art" de l'objet consiste à faire des systèmes ouverts
(interopérables, facilement extensibles, etc.). J'ai constaté que très
peu de gens étaient capables de le faire et souvent ils se découragent
face à l'approche objet...
Je n'ai pas dis le contraire, mais pour obtenir ce resultat, il ne
faut surtout pas suivre une approche taxinomique.
Post by Wykaaa
Je crois que les gens sont toujours partisans du moindre effort et de la
facilité. Il est certain qu'il est plus facile de coder en Visual Basic
qu'en ADA, Java, C++, etc. mais surtout, il est bien plus facile (a
priori parce que a posteriori c'est autre chose...) de réaliser un
logiciel sans tout spécifier et tout concevoir (la bonne vieille méthode
d'essai/erreur a encore de beaux jours devant elle...).
Ca porte un nom ce modele de developement (iteratif), et il est
pretencieux de penser que ceux qui le mettent en place sont des
imbeciles. Il correspond a des besoins, des contraites et des
objectifs, comme le reste. Pour ce qui est de Visual Basic, quand je
parles de developpeurs, j'exclus de fait 95% des apprentits
developpeurs (estimation personnelle qui n'engage que moi) qu'on
rencontre dans le developpement software au sens large.
Post by Wykaaa
Post by ld
Post by Wykaaa
Post by Bruno Desthuilliers
Post by Wykaaa
mais cette délégation doit tout de même respecter la notion de
hiérarchie sur les objets
Ah bon ? Et pourquoi donc ?
Post by Wykaaa
(on ne délègue pas à n'importe quel objet, n'importe comment).
Du moment que l'objet auquel on délègue comprend les messages qu'on lui
envoie, je ne vois pas où est le problème.
Je comprends pourquoi tu n'est pas "pour" l'encapsulation. La délégation
pure peut conduire aux pires dérivent concernant la sûreté de
fonctionnement.
Ah Bon? C'est pourtant l'outil le plus flexible permettant de
"parametriser" un systeme "fermé" tout en respectant l'encapsulation
(on ne peut pas en dire autant de la parametrisation en C++). L'objet
Locker dans COS est l'exemple le plus avance (mais simple) que je
connaisse qui utilise la delegation pour eliminer les deadlocks de
facon non intrusive.
Je ne connais pas COS (dont vous êtes l'auteur, non ?)
oui.
Post by Wykaaa
mais j'ai cru
comprendre que c'est "une couche" objet au-dessus de C;
oui.
Post by Wykaaa
Ayant fait un
compilateur C, si vous voulez, je peux vous dire tout le mal que je
pense de ce langage qui rassemble à peu près tout ce qu'il faut pour
être sûr de faire des logiciels non fiables et contraires à toutes les
règles de l'ingénierie logicielle.
Interessant. Neanmois, la majorite du binaire present sur votre
machine vient probablement d'un code C a plus de 50% et vous arrivez
quand meme a lire en envoyer des emails, surfer sur internet, ecouter
de la musique, etc...

J'ai passer depuis longtemps le cap de dire que la fiabilite releve du
langage de programmation, en particulier quand celui-ci est de bas
niveau et donc offre un controle confortable des abstractions. Je le
concois d'avantage ce type de probleme avec des langages dit de haut-
niveau ou le controle est bien moindre et sur des sujets parfois tres
inattendus comme le changement de la complexite d'un algorithme de O
(n) a O(n^2) a cause du GC.
Post by Wykaaa
Post by ld
Post by Wykaaa
Post by Bruno Desthuilliers
Post by Wykaaa
La délégation ne peut se faire correctement qu'en respectant cette
notion d'ordre strict entre les objets, objets de la délégation.
On a déjà eu l'occasion de comparer nos points de vues et approches du
génie logiciel - et les raisons (notamment contextuelle) pour lesquelles
ces points de vues et approches diffèrent sensiblement. En ce qui me
concerne - et même si je peux comprendre son intérêt de ton point de vue
- cette "notion d'ordre strict" n'est (AMHA etc...) pas absolument
(voire absolument pas) nécessaire, et parfois (voire souvent) tout
simplement nuisible.
Elle est nuisible uniquement quand on souhaite que les objets puissent
changer de nature dynamiquement mais ceci conduit souvent à ce que les
objets ne soient plus intègrent ce qui peut nuire à la fiabilité du
logiciel et complique le style de programmation dit "sure" (safe
programming)
Pas plus que de croire aveuglement dans un systeme de typage statique.
Les bugs en seront d'autant plus subtiles et detectes tardivement
(peut-etre trop tard).
J'ai pratiqué plus de 30 langages de programmation de tout type.
On peux pratiquer 30 langages, mais mon experience est qu'on est
"expert" que dans une seule famille pour ce qui est du design. Cela
n'empeche pas d'utiliser de parfaitement comprendre les autres
languages, mais le design ne sera pas aussi bon car il est souvent
etroitement lie au modele(s) du langage.
Post by Wykaaa
Ceux
qui conduisent aux logiciels les plus fiables, les moins "buggés" et les
plus sûrs en fonctionnement sur la durée sont effectivement les langages
à typage statique. Ce n'est qu'une constatation par l'expérience, et pas
une croyance aveugle ni un axiome ou un théorème.
Ceci, encore une fois, n'évite pas les bugs mais améliore les choses de
façon, quelques fois, spectaculaire.
Je ne suis sans doute pas une reference, mais il m'arrive tres souvent
d'ecrire entre 2000 et 10000 lignes de code de C (COS) sans les tester
et me contenter de ca compile. La phase de debuuging me prend ensuite
rarement plus de quelques heures dans les cas les plus delicats. La
raison est que le design a plus d'importance pour moi que
l'implementation.
Post by Wykaaa
Enfin, à mon sens, on ne devrait pas mélanger l'héritage et la
délégation dans une discussion sur l'approche objet car ce n'est pas de
même nature.
Ce n'est effectivement pas la meme chose.
Post by Wykaaa
James O. Coplien a montré comment faire de la délégation en
C++ mais on peut trouver des mécanismes directs de délégation dans des
langages qui ne sont pas objets et la délégation n'est pas un concept
clé, ni même mineur, dans l'approche objet.
C'est un point de vue. Avec la delegation, 1/3 des design patterns du
GoF deviennent inutiles. Mais peut-etre que le GoF n'est pas OO.
Post by Wykaaa
Nombre de langages qui se disent objet ne le sont en fait pas car il
n'en possèdent pas toutes les caractéristiques.
Comme?

a+, ld.
Wykaaa
2009-11-14 10:01:56 UTC
Permalink
Post by ld
Post by Wykaaa
Je connais parfaitement les arguments de ceux qui disent que l'orienté
objet a échoué. Ce sont de faux arguments. Ils avouent eux-mêmes qu'ils
ont de la peine à "penser objet".
Il y a surtout plusieurs facon d'intepreter les formules "l'OO a
de loin la plus grande categorie, je suis d'accord.
- Ceux qui savent l'utiliser mais sont plus productif dans le "tout
souvent des developpeurs multi-langages experimentes
- Ceux qui veulent ameliorer l'OO d'un modele en particulier
souvent des experts d'un language particulier
Seule la premiere categorie a une approche negative de rejet, les deux
autres sont constructives, soit de facon transverse (2eme), soit de
facon specialisee (3eme). Dans ces deux dernieres on trouve des
experts de la POO mondialement reconnu... Je suis personnellement
passe de la 3eme a la 2eme il y a quelque annees mais paradoxalement,
je n'utilise plus qu'un seul langage (mais je m'inspire de nombeux
autres, notament Haskell).
Post by Wykaaa
J'ai fait suffisamment de projets, de
conseil et de cours pour voir combien ceci était vrai.
Vous avez peut-etre mis un peu trop vite tout le monde dans le meme
panier...
Effectivement, je ne faisais pas "de détail" ;-)
Post by ld
Post by Wykaaa
Car pour "penser
objet" il faut pratiquer une réelle démarche d'ingénierie, ce que,
finalement, peu d'informaticiens sont capables de faire.
L'ingénierie (civile, informatique, militaire, etc.) est un monde rempli
de contraintes pour "la bonne cause", celle de la fiabilité, de la
sûreté de fonctionnement. Quel informaticien logiciel a entendu parlé
des arbres de défaillances (utilisés dans l'ingénierie de systèmes
complexes). J'ai été spécialiste (je suis retraité) de l'ingénierie de
systèmes complexes à logiciel prépondérant et là, on voit les VRAIS
problèmes car il ne s'agit pas de coder un serveur machin-chose plus ou
moins bien spécifié ou "ficelé" mais bien de construire un ensemble
matériel/logiciel qui ne se crash pas à la moindre manip inattendue, qui
ne produise pas de catastrophe monstrueuse (centrale nucléaire, airbus,
etc.). Malgré les précautions prises, des accidents arrivent, mais qu'en
serait-il sans toutes ces précautions ?
Jusqu'à présent, "l'état de l'art", pour ces systèmes c'est d'utiliser
une démarche d'ingénierie extrêmement rigoureuse et, pour les logiciels,
d'appliquer strictement la démarche objet et d'utiliser des langages
objets à fort typage statique parce que, pour l'instant, c'est ce qui se
montre le plus fiable (encore une fois ceci n'élimine pas totalement les
erreurs, il n'y a pas de "silver bullet" comme dit Bruno).
Dans ces systèmes, il y a énormément de contraintes (et on ne complique
pas inutilement, loin de là car on n'en fait jamais assez...) et il est
faut de dire que c'est pour un gain minime.
Je parlais des langages qui incluent la notion de contexte dans leur
systeme de type statique, pas de statique vs dynamique comme vous
semblez le penser.
OK. Je n'avais effectivement pas bien saisi.
Post by ld
Post by Wykaaa
Je crois juste que les uns et les autres nous ne pratiquons pas les
mêmes types d'applications logicielles et que toutes les applications
n'ont pas besoin de la même approche.
Certe, mais j'ai l'impression que vous avez evoluer dans un
environnement ou le modele de developement "waterfall" etait dominant.
Dans beaucoup de cas (dont le mien), les specs son claires et precises
au debut, mais representent moins de 10 a 20% du produit final des
annees plus tard. La problematique n'est donc pas d'ecrire des
applications fiables a l'intant t mais qu'elle le reste a t+1, t+2,...
Et dans le modele de developement "iteratif", la gestion de la
complexite dans l'evolution est predonderante, avec en plus la gestion
de ressource (humaine) tres variantes, non expertes et en sous
effectifs prononces.
J'ai évolué dans un environnement où ce qui prime pour le logiciel est
la fiabilité, la sûreté de fonctionnement (c'est différent) et
l'évolutivité (durée de vie des logiciels 30 à 40 ans minimum).
Il est donc clair que 30 ans après, le logiciel n'a plus rien à voir
avec sa version initial. Ceci n'empêche pas un développement "waterfall"
comme vous dites mais incrémental (inclus dans le processus de
développement).
Post by ld
Post by Wykaaa
D'ailleurs je pense que les logiciels qui doivent être conçus avec une
approche objet sont assez minoritaires. Ce sont principalement ceux qui
relèvent de l'ingénierie système et non de la seule ingénierie
logicielle (pour faire court)
Pas d'accord (pour faire court). Ce n'est pas parce qu'on utilise la
POO que l'on ne peut pas utiliser aussi l'approche fonctionnelle.
Scala (et d'autres dont COS) cherche a utiliser le meilleur des deux
mondes. C'est meme la tendance des langages recents car l'un favorise
l'encapsulation et l'autre la composition.
Je parlais d'une approche tout objet et je n'oppose pas le fonctionnel
et l'objet. On peut faire du fonctionnel avec tout langage qui supporte
les...fonctions !
Post by ld
Post by Wykaaa
Post by ld
Post by Wykaaa
Post by Bruno Desthuilliers
Post by Wykaaa
Mais on a besoin, dans l'approche objet d'une notion de "hiérarchie"
(au sens de relation d'ordre strict partielle entre objets). Il y en a
déjà une, issue des langages non objet, c'est l'agrégation (faible ou
forte, peut importe pour ce qui nous occupe). Dans l'approche objet
"classique", il y a une autre notion de hiérarchie, c'est l'héritage
qui permet le polymorphisme d'héritage
En quoi ce polymorphisme apporte-t'il quoi que ce soit à celui plus
générique déjà offert par la séparation entre message et comportement ?
En quoi est-il nécessaire qu'un objet doive "hériter" d'un autre pour
comprendre un sous-ensemble commun de messages ?
Ce n'est pas pour "comprendre" un sous-ensemble commun de messages que
l'héritage existe mais pour identifier une classe d'abstraction ayant
des caractéristiques communes.
Et ces caracterisques devraient se resumer a l'ensemble des
comportements commun. Tout autre approche posera des problemes de
different ordres (couplage, subtitution, extensibilite) devrait etre
reserve au un code "local"
si ca nage, vole et caquette comme un canard, c'est un canard.
ce qui est completement faux. Il faut s'en tenir a ce que l'on sait
si ca nage, vole et caquette comme un canard, et bien ca _nage_,
_vole_ et _caquette_ comme un canard (identification comportementale),
RIEN DE PLUS, et peu importe ce que c'est en realite si on sait que ce
qu'on peut en faire convient aux objectifs.
Je rappelle que ce ne sont pas les informaticiens qui doivent décider
des abstractions mais le client (éventuellement avec l'aide des
informaticiens).
Si vous avez des clients qui vous specifient les besoins en terme de
message _et_ de type, ce ne sont plus des clients mais des
collaborateurs, ce qui est souvent le cas dans le modele waterfall
(tout specifier forever). Le client ne descend que tres tres rarement
a ce niveau de specification. Notament parce que les specs sont plutot
declarative qu'imperative, ca n'est donc pas une demarche naturelle.
Les clients me "citent" des abstractions et précisent un minimum leurs
fonctionnalités et leurs contraintes. Ce n'est pas moi qui connaît les
caractéristiques d'un radar ou les messages qui s'échangent sur un
"théâtre d'opérations" chez les militaires mais bien le client. Je ne
fais que formaliser ce que me disent les clients pour établir les
spécifications fonctionnelles. Ensuite, c'est mon boulot d'informaticien
de faire l'architecture et la conception globale (OO ou non) du logiciel
(ou les modifications de conception dans le cas d'une version n).
Post by ld
Post by Wykaaa
Ceci relève de l'ingénierie des besoins et des exigences.
Donc si le client me dit ça nage, ça vole et caquette et c'est un
canard, je ne vois pas pourquoi je le contredirais sauf si je relève des
incohérences ou des contradictions.
Ce qui me choque ici, c'est le _et_. Dans ce que j'ai mentionne, il ne
s'agit pas de conjonction mais de deduction (pour l'approche erronee)
et d'induction (pour l'approche correcte).
Peu importe. Soit le client sait distinguer entre les capacités d'un
canard et, mettons, d'une cigogne sinon, je devrais lui faire préciser
des choses pour mieux définir les abstractions.
Post by ld
Post by Wykaaa
Post by ld
Post by Wykaaa
Post by Bruno Desthuilliers
Post by Wykaaa
(qui se distingue du polymorphisme "ad'hoc" de type surcharge ou du
polymorphisme universel à la ML). Alors, en remplacement de
l'héritage, certains, dont Bruno, parlent de délégation (c'est plutôt
le vocabulaire des langages d'acteurs que des langages p"purement objet")
La notion de composition/délégation est assez fréquemment évoquée dans
la littérature, et notamment citée comme préférable à l'héritage
d'implémentation dans le GoF.
Je ne parle pas de l'héritage d'implémentation mais de l'héritage au
sens conceptuel du terme. Il est étroitement lié au concept d'abstraction.
Moi aussi. L'heritage devrait surtout permettre de structurer des
groupes de comportements (classes abstraites en C++, interface en
Java). Essaye de tout classer par taxinomie est simplement utopique,
prend enormement de temps et reste difficilement extensible.
Justement, tout "l'art" de l'objet consiste à faire des systèmes ouverts
(interopérables, facilement extensibles, etc.). J'ai constaté que très
peu de gens étaient capables de le faire et souvent ils se découragent
face à l'approche objet...
Je n'ai pas dis le contraire, mais pour obtenir ce resultat, il ne
faut surtout pas suivre une approche taxinomique.
Je ne dis pas qu'il faut la suivre rigoureusement mais ça peut servir de
guide pour ceux qui sont perdus...
Post by ld
Post by Wykaaa
Je crois que les gens sont toujours partisans du moindre effort et de la
facilité. Il est certain qu'il est plus facile de coder en Visual Basic
qu'en ADA, Java, C++, etc. mais surtout, il est bien plus facile (a
priori parce que a posteriori c'est autre chose...) de réaliser un
logiciel sans tout spécifier et tout concevoir (la bonne vieille méthode
d'essai/erreur a encore de beaux jours devant elle...).
Ca porte un nom ce modele de developement (iteratif), et il est
pretencieux de penser que ceux qui le mettent en place sont des
imbeciles.
Dans de nombreux milieux, je me suis aperçu (en réalisant des audits)
que l'adoption de la démarche itérative n'était qu'un prétexte pour
continuer à faire "comme avant" (démarche essai/erreur). Ou alors, les
développeurs ne savaient pas appliquer la démarche itérative...
Post by ld
Il correspond a des besoins, des contraites et des
objectifs, comme le reste. Pour ce qui est de Visual Basic, quand je
parles de developpeurs, j'exclus de fait 95% des apprentits
developpeurs (estimation personnelle qui n'engage que moi) qu'on
rencontre dans le developpement software au sens large.
Vous êtes encore plus sévère que moi. Je pensais que c'était 90%.
Moi, je ne les appelle pas "apprentis développeurs" mais "pousseurs de
caractères" :-)
Post by ld
Post by Wykaaa
Post by ld
Post by Wykaaa
Post by Bruno Desthuilliers
Post by Wykaaa
mais cette délégation doit tout de même respecter la notion de
hiérarchie sur les objets
Ah bon ? Et pourquoi donc ?
Post by Wykaaa
(on ne délègue pas à n'importe quel objet, n'importe comment).
Du moment que l'objet auquel on délègue comprend les messages qu'on lui
envoie, je ne vois pas où est le problème.
Je comprends pourquoi tu n'est pas "pour" l'encapsulation. La délégation
pure peut conduire aux pires dérivent concernant la sûreté de
fonctionnement.
Ah Bon? C'est pourtant l'outil le plus flexible permettant de
"parametriser" un systeme "fermé" tout en respectant l'encapsulation
(on ne peut pas en dire autant de la parametrisation en C++). L'objet
Locker dans COS est l'exemple le plus avance (mais simple) que je
connaisse qui utilise la delegation pour eliminer les deadlocks de
facon non intrusive.
Je ne connais pas COS (dont vous êtes l'auteur, non ?)
oui.
Post by Wykaaa
mais j'ai cru
comprendre que c'est "une couche" objet au-dessus de C;
oui.
Post by Wykaaa
Ayant fait un
compilateur C, si vous voulez, je peux vous dire tout le mal que je
pense de ce langage qui rassemble à peu près tout ce qu'il faut pour
être sûr de faire des logiciels non fiables et contraires à toutes les
règles de l'ingénierie logicielle.
Interessant. Neanmois, la majorite du binaire present sur votre
machine vient probablement d'un code C a plus de 50% et vous arrivez
quand meme a lire en envoyer des emails, surfer sur internet, ecouter
de la musique, etc...
Je ne pense pas, non.

J'ai beaucoup utilisé Multics et c'était du PL/1.
Chez IBM c'était du PLM (un dérivé de PL/1).
De même pour VAX VMS.
Sous MAC OS X, il y a beaucoup d'Objective-C (je n'utilise pas de PC et
Windows est l'OS que je connais le moins bien).
Post by ld
J'ai passer depuis longtemps le cap de dire que la fiabilite releve du
langage de programmation, en particulier quand celui-ci est de bas
niveau et donc offre un controle confortable des abstractions. Je le
concois d'avantage ce type de probleme avec des langages dit de haut-
niveau ou le controle est bien moindre et sur des sujets parfois tres
inattendus comme le changement de la complexite d'un algorithme de O
(n) a O(n^2) a cause du GC.
Vous avez une vision assez passéiste des langages de haut niveau, il me
semble. Incriminer le GC est un argument courant mais ceci est exagéré
car le GC ne se déclenche pas à tout bout de champ et on sait faire du
GC incrémental (quand la machine est "idle"). On n'est plus à l'époque
des machines Symbolics...
Ceci dit, c'est un fait avéré qu'il y a une plus forte probabilité de
défauts dans du code assembleur que dans du code écrit dans un langage
de haut niveau.
Post by ld
Post by Wykaaa
Post by ld
Post by Wykaaa
Post by Bruno Desthuilliers
Post by Wykaaa
La délégation ne peut se faire correctement qu'en respectant cette
notion d'ordre strict entre les objets, objets de la délégation.
On a déjà eu l'occasion de comparer nos points de vues et approches du
génie logiciel - et les raisons (notamment contextuelle) pour lesquelles
ces points de vues et approches diffèrent sensiblement. En ce qui me
concerne - et même si je peux comprendre son intérêt de ton point de vue
- cette "notion d'ordre strict" n'est (AMHA etc...) pas absolument
(voire absolument pas) nécessaire, et parfois (voire souvent) tout
simplement nuisible.
Elle est nuisible uniquement quand on souhaite que les objets puissent
changer de nature dynamiquement mais ceci conduit souvent à ce que les
objets ne soient plus intègrent ce qui peut nuire à la fiabilité du
logiciel et complique le style de programmation dit "sure" (safe
programming)
Pas plus que de croire aveuglement dans un systeme de typage statique.
Les bugs en seront d'autant plus subtiles et detectes tardivement
(peut-etre trop tard).
J'ai pratiqué plus de 30 langages de programmation de tout type.
On peux pratiquer 30 langages, mais mon experience est qu'on est
"expert" que dans une seule famille pour ce qui est du design. Cela
n'empeche pas d'utiliser de parfaitement comprendre les autres
languages, mais le design ne sera pas aussi bon car il est souvent
etroitement lie au modele(s) du langage.
Non, c'est une erreur de considérer que la conception globale doit être
étroitement liée au modèle du langage et c'est une des raisons qui fait
qu'il y a tant de problèmes en informatique.
L'architecture et la conception globale d'un logiciel doivent être le
plus indépendants possible de la future implémentation.
Ceci dit, on peut parfaitement faire du tout objet en assembleur,
simplement il n'y a pas les commodités prévues par des langages de plus
haut niveau.
Post by ld
Post by Wykaaa
Ceux
qui conduisent aux logiciels les plus fiables, les moins "buggés" et les
plus sûrs en fonctionnement sur la durée sont effectivement les langages
à typage statique. Ce n'est qu'une constatation par l'expérience, et pas
une croyance aveugle ni un axiome ou un théorème.
Ceci, encore une fois, n'évite pas les bugs mais améliore les choses de
façon, quelques fois, spectaculaire.
Je ne suis sans doute pas une reference, mais il m'arrive tres souvent
d'ecrire entre 2000 et 10000 lignes de code de C (COS) sans les tester
et me contenter de ca compile. La phase de debuuging me prend ensuite
rarement plus de quelques heures dans les cas les plus delicats. La
raison est que le design a plus d'importance pour moi que
l'implementation.
NOus somme à 100% d'accord : le design est le plus important.
Post by ld
Post by Wykaaa
Enfin, à mon sens, on ne devrait pas mélanger l'héritage et la
délégation dans une discussion sur l'approche objet car ce n'est pas de
même nature.
Ce n'est effectivement pas la meme chose.
Post by Wykaaa
James O. Coplien a montré comment faire de la délégation en
C++ mais on peut trouver des mécanismes directs de délégation dans des
langages qui ne sont pas objets et la délégation n'est pas un concept
clé, ni même mineur, dans l'approche objet.
C'est un point de vue. Avec la delegation, 1/3 des design patterns du
GoF deviennent inutiles. Mais peut-etre que le GoF n'est pas OO.
Je suis mitigé sur le GoF mais ça me paraît normal que la délégation
supprime 1/3 des patterns car si on regarde de près, c'est souvent au
détriment de la sûreté de fonctionnement.
Post by ld
Post by Wykaaa
Nombre de langages qui se disent objet ne le sont en fait pas car il
n'en possèdent pas toutes les caractéristiques.
Comme?
javascript, Python, par exemple.
Bruno Desthuilliers
2009-11-13 18:03:15 UTC
Permalink
(snip)
Post by Wykaaa
Post by ld
Post by Wykaaa
L'héritage est lié au principe de classification (la taxonomie ou
taxinomie). Il permet de regrouper dans une même hiérarchie des
abstractions ayant des caractéristiques communes mais aussi des
particularismes. Classer les éléments de l'univers du discours (en
l'occurrence, en informatique, les objets de l'application) est
essentiel pour savoir de quoi l'on parle. Il permet d'éviter les
problèmes d'imprédictabilité au sens de Poincaré.
C'est justement ce genre de discours qui sont a l'origne d'articles du
type "Why OO Failed". L'heritage n'est pas un outils pour decrire une
taxonomie car celle-ci va dependre des particularites mise en avant
par ses utilisateurs. Autrement dit il faudrait un heritage dependant
du contexte d'utilisation. Et si meme certains langage "academique"
s'y essaye, cela reste inutilement complique/contraignant par rapport
au gain.
Je connais parfaitement les arguments de ceux qui disent que l'orienté
objet a échoué. Ce sont de faux arguments.
L'OO est loin d'avoir tenu un certain nombre des promesses de ses
zélateurs - notamment concernant la réutilisabilité.
Post by Wykaaa
Ils avouent eux-mêmes qu'ils
ont de la peine à "penser objet". J'ai fait suffisamment de projets, de
conseil et de cours pour voir combien ceci était vrai. Car pour "penser
objet" il faut pratiquer une réelle démarche d'ingénierie, ce que,
finalement, peu d'informaticiens sont capables de faire.
L'ingénierie (civile, informatique, militaire, etc.) est un monde rempli
de contraintes pour "la bonne cause", celle de la fiabilité, de la
sûreté de fonctionnement. Quel informaticien logiciel a entendu parlé
des arbres de défaillances (utilisés dans l'ingénierie de systèmes
complexes).
Tous les systèmes ont-ils de tels besoins ? (question de pure
réthorique, la réponse est évidente).
Post by Wykaaa
J'ai été spécialiste (je suis retraité) de l'ingénierie de
systèmes complexes à logiciel prépondérant et là, on voit les VRAIS
problèmes
Ah ? Parce que les miens ne sont pas "vrais" ? Un peu méprisant, non,
comme affirmation...
Post by Wykaaa
car il ne s'agit pas de coder un serveur machin-chose plus ou
moins bien spécifié ou "ficelé"
Dans certains domaines, les specs sont au mieux floues et changeantes,
et l'important n'est pas que ce soit bien spécifié, bien ficelé, ni même
spécialement fiable, c'est que ce soit en prod hier.
Post by Wykaaa
Jusqu'à présent, "l'état de l'art", pour ces systèmes c'est d'utiliser
une démarche d'ingénierie extrêmement rigoureuse et, pour les logiciels,
d'appliquer strictement la démarche objet
Dieu merci, on a su faire des logiciels fiables bien avant l'OO. Je
pense honnêtement que le plus important ici est 1/ la rigueur de la
démarche et 2/ le fait d'avoir le *temps* de travailler proprement.
Qu'après ça, *une certaine vision* de la démarche OO, bien appliquée,
apporte un plus, c'est tout à fait possible. Mais je ne crois
sincèrement pas que ce soit l'élément déterminant.
Post by Wykaaa
et d'utiliser des langages
objets à fort typage statique parce que, pour l'instant, c'est ce qui se
montre le plus fiable (encore une fois ceci n'élimine pas totalement les
erreurs,
Amis d'Ada et des fusées qui crashent, bonjour !-)
Post by Wykaaa
il n'y a pas de "silver bullet" comme dit Bruno).
Bin non.
Post by Wykaaa
Je crois juste que les uns et les autres nous ne pratiquons pas les
mêmes types d'applications logicielles et que toutes les applications
n'ont pas besoin de la même approche.
Heureux de te l'entendre dire. Il est juste dommage que, la plupart du
temps, tu tendes à asséner *tes* vérités sans vraiment en préciser le
contexte.

Bon, ok, tu peux en dire autant pour moi !-)
Post by Wykaaa
D'ailleurs je pense que les logiciels qui doivent être conçus avec une
approche objet sont assez minoritaires. Ce sont principalement ceux qui
relèvent de l'ingénierie système et non de la seule ingénierie
logicielle (pour faire court)
Et - pour changer - je suis en total désaccord. Par expérience, l'OO
s'avère particulièrement adaptée au développement de GUI traditionnels
(domaine qui n'est d'ailleurs pas pour rien dans la percée de l'OO) et
de frameworks de développement web.

(snip)
Post by Wykaaa
Je rappelle que ce ne sont pas les informaticiens qui doivent décider
des abstractions mais le client (éventuellement avec l'aide des
informaticiens).
On ne doit pas avoir les mêmes clients...
Post by Wykaaa
Ceci relève de l'ingénierie des besoins et des exigences.
Donc si le client me dit ça nage, ça vole et caquette et c'est un
canard, je ne vois pas pourquoi je le contredirais sauf si je relève des
incohérences ou des contradictions.
Je confirme : nous n'avons pas les mêmes clients.
Post by Wykaaa
Post by ld
Post by Wykaaa
Post by Bruno Desthuilliers
Post by Wykaaa
(qui se distingue du polymorphisme "ad'hoc" de type surcharge ou du
polymorphisme universel à la ML). Alors, en remplacement de
l'héritage, certains, dont Bruno, parlent de délégation (c'est plutôt
le vocabulaire des langages d'acteurs que des langages p"purement objet")
La notion de composition/délégation est assez fréquemment évoquée dans
la littérature, et notamment citée comme préférable à l'héritage
d'implémentation dans le GoF.
Je ne parle pas de l'héritage d'implémentation mais de l'héritage au
sens conceptuel du terme. Il est étroitement lié au concept d'abstraction.
Moi aussi. L'heritage devrait surtout permettre de structurer des
groupes de comportements (classes abstraites en C++, interface en
Java). Essaye de tout classer par taxinomie est simplement utopique,
prend enormement de temps et reste difficilement extensible.
Justement, tout "l'art" de l'objet consiste à faire des systèmes ouverts
(interopérables, facilement extensibles, etc.).
Pour ce qui est de l'interopérabilité, l'OO n'entre pas spécialement en
jeu. Dans la pratique, le protocole HTTP s'avère pour le moment plus
efficace que la plupart des délires d'architectes astronautes façon
Corba !-)

Pour ce qui est de l'extensibilité, une des grandes spécialités des
mêmes astronautes est de compliquer inutilement leur design en vue d'une
éventuelle extensibilité / réutilisablité / etc, en se plantant assez
systématiquement sur ce qui aura effectivement besoin d'être
extensible... Accessoirement, sur ce point, les langages dynamiques sont
une bénédiction en comparaison des langages statiques déclaratifs.
Post by Wykaaa
J'ai constaté que très
peu de gens étaient capables de le faire et souvent ils se découragent
face à l'approche objet...
Disont que quand on voit par quoi il faut passer en Java pour lire un
fichier texte, y a de quoi baisser les bras !-)
Post by Wykaaa
Je crois que les gens sont toujours partisans du moindre effort et de la
facilité.
Nan, jure ? Parce que toi tu préfères te rendre les choses plus
difficiles et faire d'avantage d'efforts ? Je veux dire, comme ça, juste
pour le principe ?
Post by Wykaaa
Il est certain qu'il est plus facile de coder en Visual Basic
qu'en ADA, Java, C++,
Heu... A tout prendre, je préfère encore Java, personnellement. C'est
aussi stupide, lourdingue et bas-niveau que VB, mais au moins c'est à
peu près cohérent.
Post by Wykaaa
etc. mais surtout, il est bien plus facile (a
priori parce que a posteriori c'est autre chose...) de réaliser un
logiciel sans tout spécifier et tout concevoir (la bonne vieille méthode
d'essai/erreur a encore de beaux jours devant elle...).
Tiens, c'est marrant, moi je trouve que c'est plus facile de réaliser un
logiciel quand il y a eu au moins un minimum d'effort de fait sur les
specs, l'analyse et la conception. J'ai parfois du mal a faire
comprendre à mon patron que si je ne sais pas ce que le programme doit
faire, il y a peu de chances que le résultat soit d'une quelconque
utilité, et qu'on perdrait moins de temps à prendre le temps de
déterminer ce qu'on doit écrire qu'à faire n'importe quoi, puis à mettre
des bouts de ficelles dans tous les sens.

Par contre, espérer "tout" spécifier et "tout" concevoir, dans mon
domaine, c'est le plus sûr moyen de ne jamais rien livrer au final.

(snip)
Post by Wykaaa
Je ne connais pas COS (dont vous êtes l'auteur, non ?) mais j'ai cru
comprendre que c'est "une couche" objet au-dessus de C; Ayant fait un
compilateur C, si vous voulez, je peux vous dire tout le mal que je
pense de ce langage qui rassemble à peu près tout ce qu'il faut pour
être sûr de faire des logiciels non fiables et contraires à toutes les
règles de l'ingénierie logicielle.
et qui est pourtant la brique de base d'une écrasante majorité des
systèmes existant actuellement. Faut croire qu'il y a comme un hiatus
entre les "règles de l'ingénierie logicielle" et la réalité ?
Post by Wykaaa
J'ai pratiqué plus de 30 langages de programmation de tout type. Ceux
qui conduisent aux logiciels les plus fiables, les moins "buggés" et les
plus sûrs en fonctionnement sur la durée sont effectivement les langages
à typage statique. Ce n'est qu'une constatation par l'expérience, et pas
une croyance aveugle ni un axiome ou un théorème.
C'est bien. Pour ma part (sur certes un peu moins de langages, mais
quand même une bonne dizaine), j'ai fais le constat inverse. Après avoir
longtemps eu une fois aveugle en ceux qui clamaient qu'hors du typage
statique point de salut. Comme quoi, hein...
Post by Wykaaa
Enfin, à mon sens, on ne devrait pas mélanger l'héritage et la
délégation dans une discussion sur l'approche objet car ce n'est pas de
même nature.
L'héritage *tel qu'il est mis en oeuvre dans les langages objet* est une
forme particulière de délégation.
Post by Wykaaa
James O. Coplien a montré comment faire de la délégation en
C++
Je ne pense pas qu'il ait été le premier à trouver le joint, si tu veux...
Post by Wykaaa
mais on peut trouver des mécanismes directs de délégation dans des
langages qui ne sont pas objets
A ce jeu là, il y a un certain nombre de choses qu'on peut trouver aussi
bien dans des langages objets que dans des langages non-objets.
Post by Wykaaa
et la délégation n'est pas un concept
clé, ni même mineur, dans l'approche objet.
Ai-je jamais prétendu qu'il en était ainsi ? Certes non, puisque mon
propos était de démontrer que l'*héritage* n'est pas un concept
indispensable, fondamental (au sens littéral : "qui fonde") de l'OO.

Si j'étais de mauvaise fois, je pourrais ajouter que je suis donc ravi
que tu confirmes ce point, puisque l'héritage n'est qu'une forme
particulière de délégation, et que, tu le dis toi-même, la délégation
"n'est pas un concept clé, ni même mineur, dans l'approche objet." !-)
Post by Wykaaa
Nombre de langages qui se disent objet ne le sont en fait pas car il
n'en possèdent pas toutes les caractéristiques.
Personne n'a jamais pu se mettre d'accord sur ce que sont effectivement
"toutes les caractéristiques" d'un langage objet. David Flanagan - par
ailleurs auteur du seul bouquin à peu près potable sur javascript -
affirme que javascript n'est pas un "vrai" langage objet car il n'a ni
classes ni restrictions d'accès, contrairement à Java et C++ (qui sont
donc selon lui de "vrais" langages objets). Pour ma part, Java et C++
ayant des types non objets, il ne peuvent prétendre être des vrais
langages objets - contrairement à Python qui ne manipule que des objets.
Oui mais, diront certains, Python n'a pas de restriction d'accès, et
permet même, hérésie suprême, d'écire du code en dehors d'une classe, et
ne peut donc être un "vrai" langage objet... A ce jeu là, on peut
continuer longtemps.

J'en reviens donc au point de départ: pour le moment, les deux seules
définitions universellement acceptées sont celles que je citais au
départ de cette aimable discussion. Mais puisque tu à l'immense honneur
de détenir la vérité révélée sur ce qui définit un "vrai langage objet",
par pitié, ne te fais pas d'avantage prier et illumine nous, pauvres
pêcheurs que nous sommes.

!-)
Wykaaa
2009-11-14 10:49:39 UTC
Permalink
Post by Bruno Desthuilliers
(snip)
Post by Wykaaa
Post by ld
Post by Wykaaa
L'héritage est lié au principe de classification (la taxonomie ou
taxinomie). Il permet de regrouper dans une même hiérarchie des
abstractions ayant des caractéristiques communes mais aussi des
particularismes. Classer les éléments de l'univers du discours (en
l'occurrence, en informatique, les objets de l'application) est
essentiel pour savoir de quoi l'on parle. Il permet d'éviter les
problèmes d'imprédictabilité au sens de Poincaré.
C'est justement ce genre de discours qui sont a l'origne d'articles du
type "Why OO Failed". L'heritage n'est pas un outils pour decrire une
taxonomie car celle-ci va dependre des particularites mise en avant
par ses utilisateurs. Autrement dit il faudrait un heritage dependant
du contexte d'utilisation. Et si meme certains langage "academique"
s'y essaye, cela reste inutilement complique/contraignant par rapport
au gain.
Je connais parfaitement les arguments de ceux qui disent que l'orienté
objet a échoué. Ce sont de faux arguments.
L'OO est loin d'avoir tenu un certain nombre des promesses de ses
zélateurs - notamment concernant la réutilisabilité.
Le problème de la réutilisabilité n'est pas lié aux aspects techniques
qui sont à plus de 90% résolus. La réutilisabilité est un problème
d'organisation et d'outils autour de l'ingénierie logicielle. Il faut
déjà savoir que "ça existe" avant de penser à la réutilisation. Et si on
sait que "ça existe" encore faut-il savoir "comment" l'utiliser et c'est
là qu'il y a un manque d'outils car il ne suffit pas de faire des tonnes
de doc sur les composants réutilisables (comme en Java), il faut des
outils qui accompagnent la démarche.
Post by Bruno Desthuilliers
Post by Wykaaa
Ils avouent eux-mêmes qu'ils
ont de la peine à "penser objet". J'ai fait suffisamment de projets, de
conseil et de cours pour voir combien ceci était vrai. Car pour "penser
objet" il faut pratiquer une réelle démarche d'ingénierie, ce que,
finalement, peu d'informaticiens sont capables de faire.
L'ingénierie (civile, informatique, militaire, etc.) est un monde rempli
de contraintes pour "la bonne cause", celle de la fiabilité, de la
sûreté de fonctionnement. Quel informaticien logiciel a entendu parlé
des arbres de défaillances (utilisés dans l'ingénierie de systèmes
complexes).
Tous les systèmes ont-ils de tels besoins ? (question de pure
réthorique, la réponse est évidente).
La réponse est non, mais ceux qui en ont besoin ne vont certainement pas
être codés en javascript...
Post by Bruno Desthuilliers
Post by Wykaaa
J'ai été spécialiste (je suis retraité) de l'ingénierie de
systèmes complexes à logiciel prépondérant et là, on voit les VRAIS
problèmes
Ah ? Parce que les miens ne sont pas "vrais" ? Un peu méprisant, non,
comme affirmation...
Je le reconnais mais c'est le risque quand on répond "on-line" ;-)
Post by Bruno Desthuilliers
Post by Wykaaa
car il ne s'agit pas de coder un serveur machin-chose plus ou
moins bien spécifié ou "ficelé"
Dans certains domaines, les specs sont au mieux floues et changeantes,
et l'important n'est pas que ce soit bien spécifié, bien ficelé, ni même
spécialement fiable, c'est que ce soit en prod hier.
C'est le symptôme d'une mauvaise gestion de projet. Vos patrons
devraient lire le PMBOK (Project Management Body of Knowledge) et se
faire certifier en gestion de projet :
(http://www.pmi.org/Pages/default.aspx)
Post by Bruno Desthuilliers
Post by Wykaaa
Jusqu'à présent, "l'état de l'art", pour ces systèmes c'est d'utiliser
une démarche d'ingénierie extrêmement rigoureuse et, pour les logiciels,
d'appliquer strictement la démarche objet
Dieu merci, on a su faire des logiciels fiables bien avant l'OO. Je
pense honnêtement que le plus important ici est 1/ la rigueur de la
démarche et 2/ le fait d'avoir le *temps* de travailler proprement.
Qu'après ça, *une certaine vision* de la démarche OO, bien appliquée,
apporte un plus, c'est tout à fait possible. Mais je ne crois
sincèrement pas que ce soit l'élément déterminant.
Mais moi non plus. Je relate juste ce que je vois dans la "vraie vie"
des systèmes que je côtoie.
Post by Bruno Desthuilliers
Post by Wykaaa
et d'utiliser des langages
objets à fort typage statique parce que, pour l'instant, c'est ce qui se
montre le plus fiable (encore une fois ceci n'élimine pas totalement les
erreurs,
Amis d'Ada et des fusées qui crashent, bonjour !-)
On en a déjà parlé mais le bug d'Ariane 5 n'est pas un bug de
programmation mais d'intégration et de non validation de l'intégration
des composants (reprise de certains composants d'Ariane 4 sans
re-validation).
Post by Bruno Desthuilliers
Post by Wykaaa
il n'y a pas de "silver bullet" comme dit Bruno).
Bin non.
Post by Wykaaa
Je crois juste que les uns et les autres nous ne pratiquons pas les
mêmes types d'applications logicielles et que toutes les applications
n'ont pas besoin de la même approche.
Heureux de te l'entendre dire. Il est juste dommage que, la plupart du
temps, tu tendes à asséner *tes* vérités sans vraiment en préciser le
contexte.
Ne sois pas de mauvaise foi car "mon" contexte, tu le connais assez bien
au vu de nos discussions passées...
Post by Bruno Desthuilliers
Bon, ok, tu peux en dire autant pour moi !-)
. Elles sont caractéristiques d'un "certain milieu" (celui des
développements web).
Post by Bruno Desthuilliers
Post by Wykaaa
D'ailleurs je pense que les logiciels qui doivent être conçus avec une
approche objet sont assez minoritaires. Ce sont principalement ceux qui
relèvent de l'ingénierie système et non de la seule ingénierie
logicielle (pour faire court)
Et - pour changer - je suis en total désaccord. Par expérience, l'OO
s'avère particulièrement adaptée au développement de GUI traditionnels
(domaine qui n'est d'ailleurs pas pour rien dans la percée de l'OO) et
de frameworks de développement web.
Ah ben tiens, qu'est-ce que je disais juste au-dessus.
Ce que tu dis est vrai à tel point que j'ai rencontré plusieurs fois des
informaticiens qui pensaient que GUI = développement OO et que
l'approche OO ne servait qu'à cela !
Post by Bruno Desthuilliers
(snip)
Post by Wykaaa
Je rappelle que ce ne sont pas les informaticiens qui doivent décider
des abstractions mais le client (éventuellement avec l'aide des
informaticiens).
On ne doit pas avoir les mêmes clients...
Compte tenu de nos environnements respectifs, c'est certain !
Post by Bruno Desthuilliers
Post by Wykaaa
Ceci relève de l'ingénierie des besoins et des exigences.
Donc si le client me dit ça nage, ça vole et caquette et c'est un
canard, je ne vois pas pourquoi je le contredirais sauf si je relève des
incohérences ou des contradictions.
Je confirme : nous n'avons pas les mêmes clients.
Moi c'est pluôt les militaires ou les industriels de la défense (ainsi
que l'OTAN)
Post by Bruno Desthuilliers
Post by Wykaaa
Post by ld
Post by Wykaaa
Post by Bruno Desthuilliers
Post by Wykaaa
(qui se distingue du polymorphisme "ad'hoc" de type surcharge ou du
polymorphisme universel à la ML). Alors, en remplacement de
l'héritage, certains, dont Bruno, parlent de délégation (c'est plutôt
le vocabulaire des langages d'acteurs que des langages p"purement objet")
La notion de composition/délégation est assez fréquemment évoquée dans
la littérature, et notamment citée comme préférable à l'héritage
d'implémentation dans le GoF.
Je ne parle pas de l'héritage d'implémentation mais de l'héritage au
sens conceptuel du terme. Il est étroitement lié au concept d'abstraction.
Moi aussi. L'heritage devrait surtout permettre de structurer des
groupes de comportements (classes abstraites en C++, interface en
Java). Essaye de tout classer par taxinomie est simplement utopique,
prend enormement de temps et reste difficilement extensible.
Justement, tout "l'art" de l'objet consiste à faire des systèmes ouverts
(interopérables, facilement extensibles, etc.).
Pour ce qui est de l'interopérabilité, l'OO n'entre pas spécialement en
jeu. Dans la pratique, le protocole HTTP s'avère pour le moment plus
efficace que la plupart des délires d'architectes astronautes façon
Corba !-)
Ah bon ?
Connais-tu la SOA ? (je connais ta réponse)
Il n'y a pas que Corba pour les applications distribuées...
Si l'on veut faire des applications collaboratives sur le Web, HTTP est
loin d'être satisfaisant...
Post by Bruno Desthuilliers
Pour ce qui est de l'extensibilité, une des grandes spécialités des
mêmes astronautes est de compliquer inutilement leur design en vue d'une
éventuelle extensibilité / réutilisablité / etc, en se plantant assez
systématiquement sur ce qui aura effectivement besoin d'être
extensible... Accessoirement, sur ce point, les langages dynamiques sont
une bénédiction en comparaison des langages statiques déclaratifs.
Quand je disais que tes réactions étaient caractéristiques d'un certain
milieu...
Mais les miennes aussi :-))
Post by Bruno Desthuilliers
Post by Wykaaa
J'ai constaté que très
peu de gens étaient capables de le faire et souvent ils se découragent
face à l'approche objet...
Disont que quand on voit par quoi il faut passer en Java pour lire un
fichier texte, y a de quoi baisser les bras !-)
Pas faux...
Post by Bruno Desthuilliers
Post by Wykaaa
Je crois que les gens sont toujours partisans du moindre effort et de la
facilité.
Nan, jure ? Parce que toi tu préfères te rendre les choses plus
difficiles et faire d'avantage d'efforts ? Je veux dire, comme ça, juste
pour le principe ?
Non, pas juste pour le principe mais parce que, dans mon environnement,
ce qui prime n'est pas la facilité mais la sûreté de fonctionnement,
l'ouverture (au sens de système ouvert), la fiabilité et concilier ces 3
objectifs qui sont contradictoires n'est pas une tâche aisée.
Post by Bruno Desthuilliers
Post by Wykaaa
Il est certain qu'il est plus facile de coder en Visual Basic
qu'en ADA, Java, C++,
Heu... A tout prendre, je préfère encore Java, personnellement. C'est
aussi stupide, lourdingue et bas-niveau que VB, mais au moins c'est à
peu près cohérent.
Ah, quand même, tu reconnais la cohérence.
Post by Bruno Desthuilliers
Post by Wykaaa
etc. mais surtout, il est bien plus facile (a
priori parce que a posteriori c'est autre chose...) de réaliser un
logiciel sans tout spécifier et tout concevoir (la bonne vieille méthode
d'essai/erreur a encore de beaux jours devant elle...).
Tiens, c'est marrant, moi je trouve que c'est plus facile de réaliser un
logiciel quand il y a eu au moins un minimum d'effort de fait sur les
specs, l'analyse et la conception.
10% à 20 % de specs, est-ce suffisant ?
Post by Bruno Desthuilliers
J'ai parfois du mal a faire
comprendre à mon patron que si je ne sais pas ce que le programme doit
faire, il y a peu de chances que le résultat soit d'une quelconque
utilité, et qu'on perdrait moins de temps à prendre le temps de
déterminer ce qu'on doit écrire qu'à faire n'importe quoi, puis à mettre
des bouts de ficelles dans tous les sens.
C'est bien ce que je disais plus haut. Ton patron doit absolument lire
le PMBOK.
Post by Bruno Desthuilliers
Par contre, espérer "tout" spécifier et "tout" concevoir, dans mon
domaine, c'est le plus sûr moyen de ne jamais rien livrer au final.
Je n'en doute pas un instant, mais dans ce cas, les procédures
d'évolution (depuis l'expression des besoins jusqu'à la maintenance)
doivent être prévues dans le processus même de développement.
Post by Bruno Desthuilliers
(snip)
Post by Wykaaa
Je ne connais pas COS (dont vous êtes l'auteur, non ?) mais j'ai cru
comprendre que c'est "une couche" objet au-dessus de C; Ayant fait un
compilateur C, si vous voulez, je peux vous dire tout le mal que je
pense de ce langage qui rassemble à peu près tout ce qu'il faut pour
être sûr de faire des logiciels non fiables et contraires à toutes les
règles de l'ingénierie logicielle.
et qui est pourtant la brique de base d'une écrasante majorité des
systèmes existant actuellement. Faut croire qu'il y a comme un hiatus
entre les "règles de l'ingénierie logicielle" et la réalité ?
Ca c'est une vision des choses par rapport aux évolutions "récentes" de
l'informatique mais ce n'est pas vrai "dans l'absolu".
Post by Bruno Desthuilliers
Post by Wykaaa
J'ai pratiqué plus de 30 langages de programmation de tout type. Ceux
qui conduisent aux logiciels les plus fiables, les moins "buggés" et les
plus sûrs en fonctionnement sur la durée sont effectivement les langages
à typage statique. Ce n'est qu'une constatation par l'expérience, et pas
une croyance aveugle ni un axiome ou un théorème.
C'est bien. Pour ma part (sur certes un peu moins de langages, mais
quand même une bonne dizaine), j'ai fais le constat inverse. Après avoir
longtemps eu une fois aveugle en ceux qui clamaient qu'hors du typage
statique point de salut. Comme quoi, hein...
C'est bien ce que je disais : ça dépend de l'environnement et des types
de logiciel
Post by Bruno Desthuilliers
Post by Wykaaa
Enfin, à mon sens, on ne devrait pas mélanger l'héritage et la
délégation dans une discussion sur l'approche objet car ce n'est pas de
même nature.
L'héritage *tel qu'il est mis en oeuvre dans les langages objet* est une
forme particulière de délégation.
Je ne suis pas d'accord.
Post by Bruno Desthuilliers
Post by Wykaaa
James O. Coplien a montré comment faire de la délégation en
C++
Je ne pense pas qu'il ait été le premier à trouver le joint, si tu veux...
ben c'est quasiment le "père" du design pattern (en logiciel)
Post by Bruno Desthuilliers
Post by Wykaaa
mais on peut trouver des mécanismes directs de délégation dans des
langages qui ne sont pas objets
A ce jeu là, il y a un certain nombre de choses qu'on peut trouver aussi
bien dans des langages objets que dans des langages non-objets.
Oui. On peut faire du tout objet en assembleur. Tous les traits des
langages de haut niveau ne sont sue des commodités syntaxiques ;-)
Post by Bruno Desthuilliers
Post by Wykaaa
et la délégation n'est pas un concept
clé, ni même mineur, dans l'approche objet.
Ai-je jamais prétendu qu'il en était ainsi ? Certes non, puisque mon
propos était de démontrer que l'*héritage* n'est pas un concept
indispensable, fondamental (au sens littéral : "qui fonde") de l'OO.
Si j'étais de mauvaise fois, je pourrais ajouter que je suis donc ravi
que tu confirmes ce point, puisque l'héritage n'est qu'une forme
particulière de délégation, et que, tu le dis toi-même, la délégation
"n'est pas un concept clé, ni même mineur, dans l'approche objet." !-)
Mais l'héritage n'est pas une forme particulière de délégation... ou
alors, elle l'a dénature profondément.
Post by Bruno Desthuilliers
Post by Wykaaa
Nombre de langages qui se disent objet ne le sont en fait pas car il
n'en possèdent pas toutes les caractéristiques.
Personne n'a jamais pu se mettre d'accord sur ce que sont effectivement
"toutes les caractéristiques" d'un langage objet. David Flanagan - par
ailleurs auteur du seul bouquin à peu près potable sur javascript -
affirme que javascript n'est pas un "vrai" langage objet car il n'a ni
classes ni restrictions d'accès, contrairement à Java et C++ (qui sont
donc selon lui de "vrais" langages objets). Pour ma part, Java et C++
ayant des types non objets, il ne peuvent prétendre être des vrais
langages objets - contrairement à Python qui ne manipule que des objets.
Oui mais, diront certains, Python n'a pas de restriction d'accès, et
permet même, hérésie suprême, d'écire du code en dehors d'une classe, et
ne peut donc être un "vrai" langage objet... A ce jeu là, on peut
continuer longtemps.
Je suis globalement d'accord avec David Flanagan.
J'ai donné des cours de javascript et il ne m'est jamais venu à l'idée
de dire que c'était un langage objet (pas plus que Python mais là je
sens que tu vas m'accuser de troller...)
Post by Bruno Desthuilliers
J'en reviens donc au point de départ: pour le moment, les deux seules
définitions universellement acceptées sont celles que je citais au
départ de cette aimable discussion. Mais puisque tu à l'immense honneur
de détenir la vérité révélée sur ce qui définit un "vrai langage objet",
par pitié, ne te fais pas d'avantage prier et illumine nous, pauvres
pêcheurs que nous sommes.
Alors allons-y mais c'est sans surprise car je reprends, transposés aux
langages, les concepts objet décrits par Grady Booch qui,restent tout de
même les fondations de l'approche objet.

Donc un vrai langage objet doit posséder les traits suivants :
- Traits majeurs
Post by Bruno Desthuilliers
Mécanismes d'abstraction (en général la "classe")
Mécanismes d'encapsulation (public, private, voire protected)
Il faut pouvoir "masquer" l'implémentation des abstractions :
attributs et algorithmes
Basés sur les principes de forte cohésion d'une abstraction et de
faible couplage entre abstractions
agrégation forte (composition), agrégation faible (ou simplement
agrégation) et héritage

- Traits mineurs (ils sont facultatifs mais c'est mieux si le langage
Post by Bruno Desthuilliers
Mécanismes de typage
Mécanismes pour la concurrence
Mécanismes pour la persistence
Dans ce sens, Java, C++, Smalltalk, ADA 95, Eiffel sont des langages
objets mais pas javascript, Python, par exemple.
Bruno Desthuilliers
2009-11-14 23:26:12 UTC
Permalink
Wykaaa a écrit :
(snip)
Post by Wykaaa
Post by Bruno Desthuilliers
Post by Wykaaa
L'ingénierie (civile, informatique, militaire, etc.) est un monde rempli
de contraintes pour "la bonne cause", celle de la fiabilité, de la
sûreté de fonctionnement. Quel informaticien logiciel a entendu parlé
des arbres de défaillances (utilisés dans l'ingénierie de systèmes
complexes).
Tous les systèmes ont-ils de tels besoins ? (question de pure
réthorique, la réponse est évidente).
La réponse est non, mais ceux qui en ont besoin ne vont certainement pas
être codés en javascript...
Nan, jure ? Mais... Ai-je dit qu'il fallait les coder en js ?-)

Par contre, pour scripter un navigateur, c'est autre chose. Et
crois-moi, vu les différences d'implémentation tant de js que du DOM
selon les différents navigateurs, ça n'a rien de trivial (même si le but
de la manoeuvre, lui, l'est plus ou moins).
Post by Wykaaa
Post by Bruno Desthuilliers
Post by Wykaaa
car il ne s'agit pas de coder un serveur machin-chose plus ou
moins bien spécifié ou "ficelé"
Dans certains domaines, les specs sont au mieux floues et changeantes,
et l'important n'est pas que ce soit bien spécifié, bien ficelé, ni même
spécialement fiable, c'est que ce soit en prod hier.
C'est le symptôme d'une mauvaise gestion de projet.
C'est pas vrai ??? Alors là, tu m'apprend quelque chose.

Non, sérieusement, tu crois vraiment que je t'ai attendu pour m'en
rendre compte ?
Post by Wykaaa
Vos patrons
devraient lire le
Mes patrons devraient commencer par apprendre à lire, point.
Post by Wykaaa
Post by Bruno Desthuilliers
Post by Wykaaa
Jusqu'à présent, "l'état de l'art", pour ces systèmes c'est d'utiliser
une démarche d'ingénierie extrêmement rigoureuse et, pour les logiciels,
d'appliquer strictement la démarche objet
Dieu merci, on a su faire des logiciels fiables bien avant l'OO. Je
pense honnêtement que le plus important ici est 1/ la rigueur de la
démarche et 2/ le fait d'avoir le *temps* de travailler proprement.
Qu'après ça, *une certaine vision* de la démarche OO, bien appliquée,
apporte un plus, c'est tout à fait possible. Mais je ne crois
sincèrement pas que ce soit l'élément déterminant.
Mais moi non plus. Je relate juste ce que je vois dans la "vraie vie"
des systèmes que je côtoie.
Et moi de même. On ne côtoie pas les mêmes systèmes.
Post by Wykaaa
Post by Bruno Desthuilliers
Post by Wykaaa
et d'utiliser des langages
objets à fort typage statique parce que, pour l'instant, c'est ce qui se
montre le plus fiable (encore une fois ceci n'élimine pas totalement les
erreurs,
Amis d'Ada et des fusées qui crashent, bonjour !-)
On en a déjà parlé mais le bug d'Ariane 5
(etc)

Oui, je sais, merci. Et tu sais que je le sais (ou en tous cas tu
devrais le savoir). Et tu sais (etc...) que la conclusion que j'en tire
est que tu pourra prendre le langage le plus strictement psycho-rigide
qui soit, tu ne sera pas à l'abri d'une erreur *humaine* à un point ou
un autre de la chaine.
Post by Wykaaa
Post by Bruno Desthuilliers
Post by Wykaaa
il n'y a pas de "silver bullet" comme dit Bruno).
Bin non.
Post by Wykaaa
Je crois juste que les uns et les autres nous ne pratiquons pas les
mêmes types d'applications logicielles et que toutes les applications
n'ont pas besoin de la même approche.
Heureux de te l'entendre dire. Il est juste dommage que, la plupart du
temps, tu tendes à asséner *tes* vérités sans vraiment en préciser le
contexte.
Ne sois pas de mauvaise foi
Ah, désolé mais là tu m'en demande trop !-)
Post by Wykaaa
Post by Bruno Desthuilliers
Bon, ok, tu peux en dire autant pour moi !-)
donc tu vois, de mauvaise foi mais pas malhonnête !-)
Post by Wykaaa
Post by Bruno Desthuilliers
Post by Wykaaa
D'ailleurs je pense que les logiciels qui doivent être conçus avec une
approche objet sont assez minoritaires. Ce sont principalement ceux qui
relèvent de l'ingénierie système et non de la seule ingénierie
logicielle (pour faire court)
Et - pour changer - je suis en total désaccord. Par expérience, l'OO
s'avère particulièrement adaptée au développement de GUI traditionnels
(domaine qui n'est d'ailleurs pas pour rien dans la percée de l'OO) et
de frameworks de développement web.
Ah ben tiens, qu'est-ce que je disais juste au-dessus.
Ce que tu dis est vrai à tel point que j'ai rencontré plusieurs fois des
informaticiens qui pensaient que GUI = développement OO et que
l'approche OO ne servait qu'à cela !
Ai-je dis que ça ne servait qu'à ça ? C'est qui qui est de mauvaise foi,
là ?
Post by Wykaaa
Post by Bruno Desthuilliers
(snip)
Post by Wykaaa
Je rappelle que ce ne sont pas les informaticiens qui doivent décider
des abstractions mais le client (éventuellement avec l'aide des
informaticiens).
On ne doit pas avoir les mêmes clients...
Compte tenu de nos environnements respectifs, c'est certain !
Post by Bruno Desthuilliers
Post by Wykaaa
Ceci relève de l'ingénierie des besoins et des exigences.
Donc si le client me dit ça nage, ça vole et caquette et c'est un
canard, je ne vois pas pourquoi je le contredirais sauf si je relève des
incohérences ou des contradictions.
Je confirme : nous n'avons pas les mêmes clients.
Moi c'est pluôt les militaires ou les industriels de la défense (ainsi
que l'OTAN)
<demi-troll>
Moi, bosser pour cette clientèle là, ça me poserait des problèmes de
conscience.
</demi-troll>

Bon, d'un autre côté je bosse en bonne partie pour ce qu'on appelle
pudiquement la "communication", et vu ce que je pense de ce type de
"communication", je devrais fermer ma gueule :(
Post by Wykaaa
Post by Bruno Desthuilliers
Pour ce qui est de l'interopérabilité, l'OO n'entre pas spécialement en
jeu. Dans la pratique, le protocole HTTP s'avère pour le moment plus
efficace que la plupart des délires d'architectes astronautes façon
Corba !-)
Ah bon ?
Connais-tu la SOA ? (je connais ta réponse)
Il n'y a pas que Corba pour les applications distribuées...
Si l'on veut faire des applications collaboratives sur le Web, HTTP est
loin d'être satisfaisant...
Ah bon ? Tu t'y connais en applications web collaboratives ?-)
Post by Wykaaa
Post by Bruno Desthuilliers
Pour ce qui est de l'extensibilité, une des grandes spécialités des
mêmes astronautes est de compliquer inutilement leur design en vue d'une
éventuelle extensibilité / réutilisablité / etc, en se plantant assez
systématiquement sur ce qui aura effectivement besoin d'être
extensible... Accessoirement, sur ce point, les langages dynamiques sont
une bénédiction en comparaison des langages statiques déclaratifs.
Quand je disais que tes réactions étaient caractéristiques d'un certain
milieu...
Je ne suis pas sûr d'être tout à fait caractéristique de ce milieu. Ce
qui est caractéristique du milieu du développement web, c'est surtout de
ne jamais lire la doc, de ne pas avoir la moindre ébauche de notion de
base de génie logiciel, et de faire n'importe quoi du moment que ça
_semble_ fonctionner. De ce point de vue là, avec mon passé de dév
applicatif traditionnel, mes MCD etc, je fais un peu figure d'alien.
Post by Wykaaa
Mais les miennes aussi :-))
Bin oui.
Post by Wykaaa
Post by Bruno Desthuilliers
Post by Wykaaa
J'ai constaté que très
peu de gens étaient capables de le faire et souvent ils se découragent
face à l'approche objet...
Disont que quand on voit par quoi il faut passer en Java pour lire un
fichier texte, y a de quoi baisser les bras !-)
Pas faux...
Et toc !-)
Post by Wykaaa
Post by Bruno Desthuilliers
Post by Wykaaa
Je crois que les gens sont toujours partisans du moindre effort et de la
facilité.
Nan, jure ? Parce que toi tu préfères te rendre les choses plus
difficiles et faire d'avantage d'efforts ? Je veux dire, comme ça, juste
pour le principe ?
Non, pas juste pour le principe mais parce que, dans mon environnement,
ce qui prime n'est pas la facilité mais la sûreté de fonctionnement,
Dans le mien, c'est que ce soit livré hier, même si on n'aura les specs
(c'est à dire un bout de nappe griffoné par un inculte) la semaine
prochaine.
Post by Wykaaa
l'ouverture (au sens de système ouvert), la fiabilité et concilier ces 3
objectifs qui sont contradictoires n'est pas une tâche aisée.
Essaie un peu de livrer une appli dont tu ne sais même pas précisément
ce qu'elle doit faire. En matière de trucs pas aisés, ça se pose là !-)

Sans compter que, dans mon domaine, les décideurs (patrons et clients)
sont totalement ignares, et persistent à croire qu'il faut plus de temps
pour faire une charte graphique que pour développer une appli de réseau
social ("hein ??? comment ça deux mois ? Deux jours, ça suffira bien").
Post by Wykaaa
Post by Bruno Desthuilliers
Post by Wykaaa
Il est certain qu'il est plus facile de coder en Visual Basic
qu'en ADA, Java, C++,
Heu... A tout prendre, je préfère encore Java, personnellement. C'est
aussi stupide, lourdingue et bas-niveau que VB, mais au moins c'est à
peu près cohérent.
Ah, quand même, tu reconnais la cohérence.
T'es méchant, là.
Post by Wykaaa
Post by Bruno Desthuilliers
Post by Wykaaa
etc. mais surtout, il est bien plus facile (a
priori parce que a posteriori c'est autre chose...) de réaliser un
logiciel sans tout spécifier et tout concevoir (la bonne vieille méthode
d'essai/erreur a encore de beaux jours devant elle...).
Tiens, c'est marrant, moi je trouve que c'est plus facile de réaliser un
logiciel quand il y a eu au moins un minimum d'effort de fait sur les
specs, l'analyse et la conception.
10% à 20 % de specs, est-ce suffisant ?
Non. Mais c'est déjà un début !-)
Post by Wykaaa
Post by Bruno Desthuilliers
J'ai parfois du mal a faire
comprendre à mon patron que si je ne sais pas ce que le programme doit
faire, il y a peu de chances que le résultat soit d'une quelconque
utilité, et qu'on perdrait moins de temps à prendre le temps de
déterminer ce qu'on doit écrire qu'à faire n'importe quoi, puis à mettre
des bouts de ficelles dans tous les sens.
C'est bien ce que je disais plus haut. Ton patron doit absolument lire
le PMBOK.
Oublie. Le temps qu'il apprenne à lire, je serai à la retraite.
Post by Wykaaa
Post by Bruno Desthuilliers
Post by Wykaaa
Je ne connais pas COS (dont vous êtes l'auteur, non ?) mais j'ai cru
comprendre que c'est "une couche" objet au-dessus de C; Ayant fait un
compilateur C, si vous voulez, je peux vous dire tout le mal que je
pense de ce langage qui rassemble à peu près tout ce qu'il faut pour
être sûr de faire des logiciels non fiables et contraires à toutes les
règles de l'ingénierie logicielle.
et qui est pourtant la brique de base d'une écrasante majorité des
systèmes existant actuellement. Faut croire qu'il y a comme un hiatus
entre les "règles de l'ingénierie logicielle" et la réalité ?
Ca c'est une vision des choses par rapport aux évolutions "récentes" de
l'informatique
C'est pourtant pas si récent que ça, le C - au regard de l'histoire de
l'informatique, j'entend. Je me souviens encore des Apples programmés en
Pascal.
Post by Wykaaa
mais ce n'est pas vrai "dans l'absolu".
Post by Bruno Desthuilliers
Post by Wykaaa
J'ai pratiqué plus de 30 langages de programmation de tout type. Ceux
qui conduisent aux logiciels les plus fiables, les moins "buggés" et les
plus sûrs en fonctionnement sur la durée sont effectivement les langages
à typage statique. Ce n'est qu'une constatation par l'expérience, et pas
une croyance aveugle ni un axiome ou un théorème.
C'est bien. Pour ma part (sur certes un peu moins de langages, mais
quand même une bonne dizaine), j'ai fais le constat inverse. Après avoir
longtemps eu une fois aveugle en ceux qui clamaient qu'hors du typage
statique point de salut. Comme quoi, hein...
C'est bien ce que je disais : ça dépend de l'environnement et des types
de logiciel
Dommage que tu ne le dise pas plus clairement et dès le début d'une
discussion.
Post by Wykaaa
Post by Bruno Desthuilliers
Post by Wykaaa
Enfin, à mon sens, on ne devrait pas mélanger l'héritage et la
délégation dans une discussion sur l'approche objet car ce n'est pas de
même nature.
L'héritage *tel qu'il est mis en oeuvre dans les langages objet* est une
forme particulière de délégation.
Je ne suis pas d'accord.
Ca nous change !-)
Post by Wykaaa
Post by Bruno Desthuilliers
Post by Wykaaa
James O. Coplien a montré comment faire de la délégation en
C++
Je ne pense pas qu'il ait été le premier à trouver le joint, si tu veux...
ben c'est quasiment le "père" du design pattern (en logiciel)
Il ne prétend en aucun cas avoir inventé ces patterns. Relis le GoF.
Post by Wykaaa
Post by Bruno Desthuilliers
Post by Wykaaa
et la délégation n'est pas un concept
clé, ni même mineur, dans l'approche objet.
Ai-je jamais prétendu qu'il en était ainsi ? Certes non, puisque mon
propos était de démontrer que l'*héritage* n'est pas un concept
indispensable, fondamental (au sens littéral : "qui fonde") de l'OO.
Si j'étais de mauvaise fois, je pourrais ajouter que je suis donc ravi
que tu confirmes ce point, puisque l'héritage n'est qu'une forme
particulière de délégation, et que, tu le dis toi-même, la délégation
"n'est pas un concept clé, ni même mineur, dans l'approche objet." !-)
Mais l'héritage n'est pas une forme particulière de délégation...
Si. Tu délègue à la classe parent - ou plus exactement à une instance
"virtuelle" (au sens premier, hein, pas au sens Java/C++) de la classe
parent.

Mais je t'avais prévenu que c'était de mauvaise fois, puisque tu parles
de sous-typage au sens conceptuel et moi d'héritage d'implémentation.
Post by Wykaaa
Post by Bruno Desthuilliers
Post by Wykaaa
Nombre de langages qui se disent objet ne le sont en fait pas car il
n'en possèdent pas toutes les caractéristiques.
Personne n'a jamais pu se mettre d'accord sur ce que sont effectivement
"toutes les caractéristiques" d'un langage objet. David Flanagan - par
ailleurs auteur du seul bouquin à peu près potable sur javascript -
affirme que javascript n'est pas un "vrai" langage objet car il n'a ni
classes ni restrictions d'accès, contrairement à Java et C++ (qui sont
donc selon lui de "vrais" langages objets). Pour ma part, Java et C++
ayant des types non objets, il ne peuvent prétendre être des vrais
langages objets - contrairement à Python qui ne manipule que des objets.
Oui mais, diront certains, Python n'a pas de restriction d'accès, et
permet même, hérésie suprême, d'écire du code en dehors d'une classe, et
ne peut donc être un "vrai" langage objet... A ce jeu là, on peut
continuer longtemps.
Je suis globalement d'accord avec David Flanagan.
Pas moi.
Post by Wykaaa
J'ai donné des cours de javascript et il ne m'est jamais venu à l'idée
de dire que c'était un langage objet (pas plus que Python mais là je
sens que tu vas m'accuser de troller...)
Pas la peine, c'est tellement gros que n'importe quel lecteur s'en
rendra compte par lui-même.
Post by Wykaaa
Post by Bruno Desthuilliers
J'en reviens donc au point de départ: pour le moment, les deux seules
définitions universellement acceptées sont celles que je citais au
départ de cette aimable discussion. Mais puisque tu à l'immense honneur
de détenir la vérité révélée sur ce qui définit un "vrai langage objet",
par pitié, ne te fais pas d'avantage prier et illumine nous, pauvres
pêcheurs que nous sommes.
Alors allons-y mais c'est sans surprise car je reprends, transposés aux
langages, les concepts objet décrits par Grady Booch qui,restent tout de
même les fondations de l'approche objet.
- Traits majeurs
Post by Bruno Desthuilliers
Mécanismes d'abstraction (en général la "classe")
l'objet.
Post by Wykaaa
Post by Bruno Desthuilliers
Mécanismes d'encapsulation (public, private, voire protected)
Tu en est encore à confondre encapsulation et restriction d'accès ??? Ah
bin non de d'la, on n'est pas sorti, là.
Post by Wykaaa
Il faut pouvoir "masquer" l'implémentation
des abstractions : attributs et algorithmes
Il faut pouvoir découpler l'interface de l'implémentation. Le reste,
c'est de la paranoïa.
Post by Wykaaa
Basés sur les principes de forte cohésion d'une
abstraction et de faible couplage entre abstractions
On a déjà ça dans la programmation modulaires SANS objets.
Post by Wykaaa
- Traits mineurs (ils sont facultatifs mais c'est mieux si le langage
Hem...
Post by Wykaaa
Post by Bruno Desthuilliers
Mécanismes de typage
Mécanismes pour la concurrence
Mécanismes pour la persistence
Des trois, le seul que je trouve important, c'est la concurrence.
Post by Wykaaa
Dans ce sens, Java, C++, Smalltalk, ADA 95, Eiffel sont des langages
objets mais pas javascript, Python, par exemple.
Tu exclus js parce que c'est un langage à prototype. Donc tu exclus
également Self des "vrais" (mouarf) langages OO ?

Tu exclus Python parce que les restrictions d'accès ne sont pas
"imposées" dans le langage. Dans ce cas, où classerais-tu Ruby ?-)

Accessoirement, il est possible (même si plus difficile) de contourner
les restrictions d'accès en C++ et en Java. Donc exit ces deux là aussi ?-)
Wykaaa
2009-11-15 22:03:07 UTC
Permalink
[snip]
Post by Bruno Desthuilliers
Post by Wykaaa
Post by Bruno Desthuilliers
Tous les systèmes ont-ils de tels besoins ? (question de pure
réthorique, la réponse est évidente).
La réponse est non, mais ceux qui en ont besoin ne vont certainement pas
être codés en javascript...
Nan, jure ? Mais... Ai-je dit qu'il fallait les coder en js ?-)
Non, effectivement.
Post by Bruno Desthuilliers
Par contre, pour scripter un navigateur, c'est autre chose. Et
crois-moi, vu les différences d'implémentation tant de js que du DOM
selon les différents navigateurs, ça n'a rien de trivial (même si le but
de la manoeuvre, lui, l'est plus ou moins).
Si les développeurs ne se conforment pas aux standards (ou certaines
entreprises pour des raisons inavouables, suis mon regard...) voilà ce
qui arrive...

[snip]
Post by Bruno Desthuilliers
Post by Wykaaa
Vos patrons
devraient lire le
Mes patrons devraient commencer par apprendre à lire, point.
Ah, oui. C'est encore plus grave que je ne le croyais ;-)
Post by Bruno Desthuilliers
Post by Wykaaa
Post by Bruno Desthuilliers
Post by Wykaaa
Jusqu'à présent, "l'état de l'art", pour ces systèmes c'est d'utiliser
une démarche d'ingénierie extrêmement rigoureuse et, pour les logiciels,
d'appliquer strictement la démarche objet
Dieu merci, on a su faire des logiciels fiables bien avant l'OO. Je
pense honnêtement que le plus important ici est 1/ la rigueur de la
démarche et 2/ le fait d'avoir le *temps* de travailler proprement.
Qu'après ça, *une certaine vision* de la démarche OO, bien appliquée,
apporte un plus, c'est tout à fait possible. Mais je ne crois
sincèrement pas que ce soit l'élément déterminant.
Mais moi non plus. Je relate juste ce que je vois dans la "vraie vie"
des systèmes que je côtoie.
Et moi de même. On ne côtoie pas les mêmes systèmes.
Ca semble évident.
Je te donne des références (rassure-toi, il n'y a pas beaucoup à lire) :
J'ai travaillé sur (des parties de) l'architecture de la plupart des
systèmes mentionnés dans cette page et sur leur interopérabilité :
http://www.spyworld-actu.com/spip.php?article9365
J'ai travaillé sur les spécification de ce projet (14 architectes
logiciels pendant 18 mois) :
http://www.eads.net/1024/fr/pressdb/archiv/2005/2005/fr_20050112_sic.html
Et aussi sur une étude prospective d'architecture à l'horizon 2020 sur
ce sujet :
http://www.european-security.com/index.php?id=5160

[snip]
Post by Bruno Desthuilliers
Post by Wykaaa
Il n'y a pas que Corba pour les applications distribuées...
Si l'on veut faire des applications collaboratives sur le Web, HTTP est
loin d'être satisfaisant...
Ah bon ? Tu t'y connais en applications web collaboratives ?-)
Oui, forcément, il y a des intranets (très sécurisés) sur les théâtres
d'opérations et dans les systèmes mentionnés. Pour le NCW tout est basé
sur SOA + Web Services + Grid Computing + Virtualisation
Post by Bruno Desthuilliers
Post by Wykaaa
Post by Bruno Desthuilliers
Pour ce qui est de l'extensibilité, une des grandes spécialités des
mêmes astronautes est de compliquer inutilement leur design en vue d'une
éventuelle extensibilité / réutilisablité / etc, en se plantant assez
systématiquement sur ce qui aura effectivement besoin d'être
extensible... Accessoirement, sur ce point, les langages dynamiques sont
une bénédiction en comparaison des langages statiques déclaratifs.
Quand je disais que tes réactions étaient caractéristiques d'un certain
milieu...
Je ne suis pas sûr d'être tout à fait caractéristique de ce milieu. Ce
qui est caractéristique du milieu du développement web, c'est surtout de
ne jamais lire la doc, de ne pas avoir la moindre ébauche de notion de
base de génie logiciel, et de faire n'importe quoi du moment que ça
_semble_ fonctionner. De ce point de vue là, avec mon passé de dév
applicatif traditionnel, mes MCD etc, je fais un peu figure d'alien.
On est tous l'alien de qulqu'un :-)

[snip]
Post by Bruno Desthuilliers
C'est pourtant pas si récent que ça, le C - au regard de l'histoire de
l'informatique, j'entend. Je me souviens encore des Apples programmés en
Pascal.
Oui du Pascal UCSD puis, pour les premiers Macintosh, du Clascal
(ancêtre de Object Pascal et Turbo Pascal (avec les objets).

Mais le C n'est pas tout récent non plus (1974).

[snip]
Post by Bruno Desthuilliers
Post by Wykaaa
C'est bien ce que je disais : ça dépend de l'environnement et des types
de logiciel
Dommage que tu ne le dise pas plus clairement et dès le début d'une
discussion.
Avec les liens que j'ai donnés ça devrait être plus clair.

[snip]
Post by Bruno Desthuilliers
Post by Wykaaa
Mais l'héritage n'est pas une forme particulière de délégation...
Si. Tu délègue à la classe parent - ou plus exactement à une instance
"virtuelle" (au sens premier, hein, pas au sens Java/C++) de la classe
parent.
Mais je t'avais prévenu que c'était de mauvaise fois, puisque tu parles
de sous-typage au sens conceptuel et moi d'héritage d'implémentation.
Ben voilà...
Post by Bruno Desthuilliers
Post by Wykaaa
Post by Bruno Desthuilliers
Post by Wykaaa
Nombre de langages qui se disent objet ne le sont en fait pas car il
n'en possèdent pas toutes les caractéristiques.
Personne n'a jamais pu se mettre d'accord sur ce que sont effectivement
"toutes les caractéristiques" d'un langage objet. David Flanagan - par
ailleurs auteur du seul bouquin à peu près potable sur javascript -
affirme que javascript n'est pas un "vrai" langage objet car il n'a ni
classes ni restrictions d'accès, contrairement à Java et C++ (qui sont
donc selon lui de "vrais" langages objets). Pour ma part, Java et C++
ayant des types non objets, il ne peuvent prétendre être des vrais
langages objets - contrairement à Python qui ne manipule que des objets.
Oui mais, diront certains, Python n'a pas de restriction d'accès, et
permet même, hérésie suprême, d'écire du code en dehors d'une classe, et
ne peut donc être un "vrai" langage objet... A ce jeu là, on peut
continuer longtemps.
Je suis globalement d'accord avec David Flanagan.
Pas moi.
Comme disent les mathématiciens : the diagram commute !

[snip]
Post by Bruno Desthuilliers
Post by Wykaaa
Post by Bruno Desthuilliers
par pitié, ne te fais pas d'avantage prier et illumine nous, pauvres
pêcheurs que nous sommes.
Alors allons-y mais c'est sans surprise car je reprends, transposés aux
langages, les concepts objet décrits par Grady Booch qui,restent tout de
même les fondations de l'approche objet.
- Traits majeurs
Post by Bruno Desthuilliers
Mécanismes d'abstraction (en général la "classe")
l'objet.
Voir Bertrand Meyer et Grady Booch, déjà cités
Post by Bruno Desthuilliers
Post by Wykaaa
Post by Bruno Desthuilliers
Mécanismes d'encapsulation (public, private, voire protected)
Tu en est encore à confondre encapsulation et restriction d'accès ??? Ah
bin non de d'la, on n'est pas sorti, là.
Il y a d'autres mécanismes, je te le concède.
Post by Bruno Desthuilliers
Post by Wykaaa
Il faut pouvoir "masquer" l'implémentation
des abstractions : attributs et algorithmes
Il faut pouvoir découpler l'interface de l'implémentation. Le reste,
c'est de la paranoïa.
Non, ce n'est pas de la paranoïa pour la réutilisabilité, la
remplaçabilité (substituer un composant logiciel par un autre ayant les
mêmes fonctionnalités pour x raisons : faillite du fournisseur, licence
moins chère ailleurs,etc.)
Post by Bruno Desthuilliers
Post by Wykaaa
Basés sur les principes de forte cohésion d'une
abstraction et de faible couplage entre abstractions
On a déjà ça dans la programmation modulaires SANS objets.
Oui mais ici, abstraction est utilisé au sens de Grady Booch.
Post by Bruno Desthuilliers
Post by Wykaaa
- Traits mineurs (ils sont facultatifs mais c'est mieux si le langage
Hem...
Post by Wykaaa
Post by Bruno Desthuilliers
Mécanismes de typage
Mécanismes pour la concurrence
Mécanismes pour la persistence
Des trois, le seul que je trouve important, c'est la concurrence.
ben la persistence, ce sont quand même les bases de données. Tu connais
beaucoup de systèmes qui n'en ont pas ?
Post by Bruno Desthuilliers
Post by Wykaaa
Dans ce sens, Java, C++, Smalltalk, ADA 95, Eiffel sont des langages
objets mais pas javascript, Python, par exemple.
Tu exclus js parce que c'est un langage à prototype. Donc tu exclus
également Self des "vrais" (mouarf) langages OO ?
Tu exclus Python parce que les restrictions d'accès ne sont pas
"imposées" dans le langage. Dans ce cas, où classerais-tu Ruby ?-)
Dans ces types de langages, Ruby montre la bonne voie (bien mieux que
Python, pour moi).
Post by Bruno Desthuilliers
Accessoirement, il est possible (même si plus difficile) de contourner
les restrictions d'accès en C++ et en Java. Donc exit ces deux là aussi ?-)
Mais on peut toujours contourner tout ce qu'on veut. Dans une entreprise
sérieuse, les langages de programmation utilisés doivent être
accompagnés d'un manuel de règles de programmation (pour éviter le
n'importe quoi, justement).
Bruno Desthuilliers
2009-11-16 08:46:15 UTC
Permalink
Post by Wykaaa
[snip]
Post by Bruno Desthuilliers
Post by Wykaaa
Post by Bruno Desthuilliers
Tous les systèmes ont-ils de tels besoins ? (question de pure
réthorique, la réponse est évidente).
La réponse est non, mais ceux qui en ont besoin ne vont certainement pas
être codés en javascript...
Nan, jure ? Mais... Ai-je dit qu'il fallait les coder en js ?-)
Non, effectivement.
Post by Bruno Desthuilliers
Par contre, pour scripter un navigateur, c'est autre chose. Et
crois-moi, vu les différences d'implémentation tant de js que du DOM
selon les différents navigateurs, ça n'a rien de trivial (même si le but
de la manoeuvre, lui, l'est plus ou moins).
Si les développeurs ne se conforment pas aux standards (ou certaines
entreprises pour des raisons inavouables, suis mon regard...) voilà ce
qui arrive...
Bin oui, mais c'est là, c'est comme ça, et moi je dois faire avec.
Post by Wykaaa
[snip]
Post by Bruno Desthuilliers
Post by Wykaaa
Vos patrons
devraient lire le
Mes patrons devraient commencer par apprendre à lire, point.
Ah, oui. C'est encore plus grave que je ne le croyais ;-)
:-/
Post by Wykaaa
Post by Bruno Desthuilliers
Post by Wykaaa
Il n'y a pas que Corba pour les applications distribuées...
Si l'on veut faire des applications collaboratives sur le Web, HTTP est
loin d'être satisfaisant...
Ah bon ? Tu t'y connais en applications web collaboratives ?-)
Oui, forcément, il y a des intranets (très sécurisés) sur les théâtres
d'opérations et dans les systèmes mentionnés.
Ah oui, évidemment, je n'avais pas envisagé ce point.
Post by Wykaaa
Post by Bruno Desthuilliers
Post by Wykaaa
Post by Bruno Desthuilliers
Pour ce qui est de l'extensibilité, une des grandes spécialités des
mêmes astronautes est de compliquer inutilement leur design en vue d'une
éventuelle extensibilité / réutilisablité / etc, en se plantant assez
systématiquement sur ce qui aura effectivement besoin d'être
extensible... Accessoirement, sur ce point, les langages dynamiques sont
une bénédiction en comparaison des langages statiques déclaratifs.
Quand je disais que tes réactions étaient caractéristiques d'un certain
milieu...
Je ne suis pas sûr d'être tout à fait caractéristique de ce milieu. Ce
qui est caractéristique du milieu du développement web, c'est surtout de
ne jamais lire la doc, de ne pas avoir la moindre ébauche de notion de
base de génie logiciel, et de faire n'importe quoi du moment que ça
_semble_ fonctionner. De ce point de vue là, avec mon passé de dév
applicatif traditionnel, mes MCD etc, je fais un peu figure d'alien.
On est tous l'alien de qulqu'un :-)
Ouais enfin bon :(

D'un côté, je défend ma chapelle - enfin, je veux dire, les technos et
approches qui par expérience fonctionne à peu près dans le contexte
professionnel qui est le mien -, mais d'un autre, quand je vois le
niveau moyen et "l'état de l'art" (mouarf) dans ledit contexte, je
désespère un peu. Et bon, c'était guère mieux quand je bossais sur de
l'applicatif de gestion traditionnel... J'aimerais bien savoir un jour
ce que ça fait de bosser "normalement" - je veux dire, avec des specs
fonctionnelles sérieuses et le temps nécessaire pour faire le boulot
comme il faut.
Post by Wykaaa
Post by Bruno Desthuilliers
Post by Wykaaa
C'est bien ce que je disais : ça dépend de l'environnement et des types
de logiciel
Dommage que tu ne le dise pas plus clairement et dès le début d'une
discussion.
Avec les liens que j'ai donnés ça devrait être plus clair.
Je ne parles pas pour moi - je sais déjà à peu près d'où tu viens.
Post by Wykaaa
[snip]
Post by Bruno Desthuilliers
Post by Wykaaa
Mais l'héritage n'est pas une forme particulière de délégation...
Si. Tu délègue à la classe parent - ou plus exactement à une instance
"virtuelle" (au sens premier, hein, pas au sens Java/C++) de la classe
parent.
Mais je t'avais prévenu que c'était de mauvaise fois, puisque tu parles
de sous-typage au sens conceptuel et moi d'héritage d'implémentation.
Ben voilà...
Bin si t'a vu que c'était de la mauvaise foi, pourquoi tu répond ?-)

<hs>
je devrais peut-être me lancer dans une carrière de troll...
</hs>
Post by Wykaaa
Post by Bruno Desthuilliers
Post by Wykaaa
Post by Bruno Desthuilliers
par pitié, ne te fais pas d'avantage prier et illumine nous, pauvres
pêcheurs que nous sommes.
Alors allons-y mais c'est sans surprise car je reprends, transposés aux
langages, les concepts objet décrits par Grady Booch qui,restent tout de
même les fondations de l'approche objet.
- Traits majeurs
Post by Bruno Desthuilliers
Mécanismes d'abstraction (en général la "classe")
l'objet.
Voir Bertrand Meyer et Grady Booch, déjà cités
Je ne suis pas d'accord avec eux, au cas om tu ne l'aurais pas encore
compris.
Post by Wykaaa
Post by Bruno Desthuilliers
Post by Wykaaa
Post by Bruno Desthuilliers
Mécanismes d'encapsulation (public, private, voire protected)
Tu en est encore à confondre encapsulation et restriction d'accès ??? Ah
bin non de d'la, on n'est pas sorti, là.
Il y a d'autres mécanismes, je te le concède.
Post by Bruno Desthuilliers
Post by Wykaaa
Il faut pouvoir "masquer" l'implémentation
des abstractions : attributs et algorithmes
Il faut pouvoir découpler l'interface de l'implémentation. Le reste,
c'est de la paranoïa.
Non, ce n'est pas de la paranoïa pour la réutilisabilité, la
remplaçabilité (substituer un composant logiciel par un autre ayant les
mêmes fonctionnalités pour x raisons : faillite du fournisseur, licence
moins chère ailleurs,etc.)
C'est de la paranoïa quand même. Tant que l'interface est découplée de
l'implémentation, il est clair que le client est codé pour l'interface
et non pour l'implémentation. Il n'est pas _nécessaire_ de mettre en
place dans le langages des mécanismes visant à empêcher l'accès à
l'implémentation - sauf bien sûr si tes développeurs sont bêtes à manger
du foin, mais dans ce cas là, tu es de toutes façons dans la m..., et
aucun mécanisme ne les empêchera de saloper le travail.
Post by Wykaaa
Post by Bruno Desthuilliers
Post by Wykaaa
Basés sur les principes de forte cohésion
d'une abstraction et de faible couplage entre
abstractions
On a déjà ça dans la programmation modulaires SANS objets.
Oui mais ici, abstraction est utilisé au sens de Grady Booch.
Ca change quoi au juste ? le duo forte cohésion / faible couplage est le
B.A.BA de la modularité, que tu fasse du procédural, du fonctionnel ou
de l'objet.
Post by Wykaaa
Post by Bruno Desthuilliers
Post by Wykaaa
- Traits mineurs (ils sont facultatifs mais c'est mieux si le langage
Hem...
Post by Wykaaa
Post by Bruno Desthuilliers
Mécanismes de typage
Mécanismes pour la concurrence
Mécanismes pour la persistence
Des trois, le seul que je trouve important, c'est la concurrence.
ben la persistence, ce sont quand même les bases de données. Tu connais
beaucoup de systèmes qui n'en ont pas ?
Je n'entrerai pas pour le moment dans le débat sur le fait de
restreindre les bases de données à un entrepôt à octets. Pour le reste,
concernant les accès aux bases de données, ça n'a nul besoin d'être
défini dans le _langage_ lui-même. Ce type de mécanisme relève de
bibliothèques externes (ou éventuellement de la bibliothèque standard
pour définir une API unifiée).
Post by Wykaaa
Post by Bruno Desthuilliers
Post by Wykaaa
Dans ce sens, Java, C++, Smalltalk, ADA 95, Eiffel sont des langages
objets mais pas javascript, Python, par exemple.
Tu exclus js parce que c'est un langage à prototype. Donc tu exclus
également Self des "vrais" (mouarf) langages OO ?
Tu exclus Python parce que les restrictions d'accès ne sont pas
"imposées" dans le langage. Dans ce cas, où classerais-tu Ruby ?-)
Dans ces types de langages, Ruby montre la bonne voie (bien mieux que
Python, pour moi).
Ruby permets d'ajouter (voir de remplacer) à volonté des méthodes à
l'exécution. Une méthode peut sans problème accéder à toute
l'implémentation, ajouter d'autres attributs etc. Est-ce que tu n'a pas
un peu l'impression que fondamentalement, ça revient strictement au même
qu'en Python du point de vue des restrictions d'accès ?-)
Post by Wykaaa
Post by Bruno Desthuilliers
Accessoirement, il est possible (même si plus difficile) de contourner
les restrictions d'accès en C++ et en Java. Donc exit ces deux là aussi ?-)
Mais on peut toujours contourner tout ce qu'on veut. Dans une entreprise
sérieuse, les langages de programmation utilisés doivent être
accompagnés d'un manuel de règles de programmation (pour éviter le
n'importe quoi, justement).
Alors à quoi servent ces restrictions ?
NB : question réthorique, la réponse est évidente...
Wykaaa
2009-11-16 11:02:14 UTC
Permalink
Post by Bruno Desthuilliers
Post by Wykaaa
[snip]
[snip]
Post by Bruno Desthuilliers
D'un côté, je défend ma chapelle - enfin, je veux dire, les technos et
approches qui par expérience fonctionne à peu près dans le contexte
professionnel qui est le mien -, mais d'un autre, quand je vois le
niveau moyen et "l'état de l'art" (mouarf) dans ledit contexte, je
désespère un peu. Et bon, c'était guère mieux quand je bossais sur de
l'applicatif de gestion traditionnel... J'aimerais bien savoir un jour
ce que ça fait de bosser "normalement" - je veux dire, avec des specs
fonctionnelles sérieuses et le temps nécessaire pour faire le boulot
comme il faut.
Il faut avouer que c'est quand même agréable et en 35 ans de vie
professionnelle dans l'informatique je n'ai (presuqe) jamais travaillé
dans l'urgence et toujours avec un maximum de méthodologie (même dans
les années 70, dans une grande banque et un environnement Cobol...).
Pour prendre des activités plus récentes, c'est très agréable de
travailler avec les militaires car le cahier des charges est bien
défini(le projet a, en général, fait l'objet de pré-études, appelées
études amont, d'étude de faisabilité, de maquettage et/ou prototypage,
des simulations,etc.).
En plus, ce qui n'est pas négligeable, les militaires sont à l'heure aux
RDV et aux réunions, ce qui est loin d'être le cas dans le privé...

[snip]
Post by Bruno Desthuilliers
Post by Wykaaa
Post by Bruno Desthuilliers
Il faut pouvoir découpler l'interface de l'implémentation. Le reste,
c'est de la paranoïa.
Non, ce n'est pas de la paranoïa pour la réutilisabilité, la
remplaçabilité (substituer un composant logiciel par un autre ayant
les mêmes fonctionnalités pour x raisons : faillite du fournisseur,
licence moins chère ailleurs,etc.)
C'est de la paranoïa quand même. Tant que l'interface est découplée de
l'implémentation, il est clair que le client est codé pour l'interface
et non pour l'implémentation. Il n'est pas _nécessaire_ de mettre en
place dans le langages des mécanismes visant à empêcher l'accès à
l'implémentation - sauf bien sûr si tes développeurs sont bêtes à manger
du foin, mais dans ce cas là, tu es de toutes façons dans la m..., et
aucun mécanisme ne les empêchera de saloper le travail.
Dans l'un des derniers projets que j'ai audité, la phase de codage (450
000 lignes de Java) a été réalisée en 9 mois par 40 développeurs (ça
fait donc 30 hommes.an). Même si tu n'as que des développeurs
intelligents, tu as intérêt à "blinder" de partout pour la fiabilité, la
maintenabilité et l'évolutivité sachant que le logiciel va avoir une
durée de vie comprise entre 30 et 40 ans au moins...

[snip]
Post by Bruno Desthuilliers
Post by Wykaaa
ben la persistence, ce sont quand même les bases de données. Tu
connais beaucoup de systèmes qui n'en ont pas ?
Je n'entrerai pas pour le moment dans le débat sur le fait de
restreindre les bases de données à un entrepôt à octets. Pour le reste,
concernant les accès aux bases de données, ça n'a nul besoin d'être
défini dans le _langage_ lui-même. Ce type de mécanisme relève de
bibliothèques externes (ou éventuellement de la bibliothèque standard
pour définir une API unifiée).
Pour le coup c'est toi qui a des oeillères :-) car avoir un mécanisme de
sérialisation, dans le langage lui-même, pour écrire un objet en une
seule écriture dans une base de données (objet ou non objet, peu importe
car on utilisera le pattern DAO, n'est-ce pas, pour encapsuler les accès
à la base), ça me paraît assez pratique.

[snip parce que une discussion pointue sur les traits des langages n'a
pas sa place dans ce fil, mais on peut en ouvrir un autre ;-)]
Bruno Desthuilliers
2009-11-16 15:19:54 UTC
Permalink
Post by Wykaaa
Post by Bruno Desthuilliers
Post by Wykaaa
[snip]
[snip]
Post by Bruno Desthuilliers
D'un côté, je défend ma chapelle - enfin, je veux dire, les technos et
approches qui par expérience fonctionne à peu près dans le contexte
professionnel qui est le mien -, mais d'un autre, quand je vois le
niveau moyen et "l'état de l'art" (mouarf) dans ledit contexte, je
désespère un peu. Et bon, c'était guère mieux quand je bossais sur de
l'applicatif de gestion traditionnel... J'aimerais bien savoir un jour
ce que ça fait de bosser "normalement" - je veux dire, avec des specs
fonctionnelles sérieuses et le temps nécessaire pour faire le boulot
comme il faut.
Il faut avouer que c'est quand même agréable et en 35 ans de vie
professionnelle dans l'informatique je n'ai (presuqe) jamais travaillé
dans l'urgence et toujours avec un maximum de méthodologie (même dans
les années 70, dans une grande banque et un environnement Cobol...).
Pour prendre des activités plus récentes, c'est très agréable de
travailler avec les militaires car le cahier des charges est bien
défini(le projet a, en général, fait l'objet de pré-études, appelées
études amont, d'étude de faisabilité, de maquettage et/ou prototypage,
des simulations,etc.).
En plus, ce qui n'est pas négligeable, les militaires sont à l'heure aux
RDV et aux réunions, ce qui est loin d'être le cas dans le privé...
[snip]
Post by Bruno Desthuilliers
Post by Wykaaa
Post by Bruno Desthuilliers
Il faut pouvoir découpler l'interface de l'implémentation. Le reste,
c'est de la paranoïa.
Non, ce n'est pas de la paranoïa pour la réutilisabilité, la
remplaçabilité (substituer un composant logiciel par un autre ayant
les mêmes fonctionnalités pour x raisons : faillite du fournisseur,
licence moins chère ailleurs,etc.)
C'est de la paranoïa quand même. Tant que l'interface est découplée de
l'implémentation, il est clair que le client est codé pour l'interface
et non pour l'implémentation. Il n'est pas _nécessaire_ de mettre en
place dans le langages des mécanismes visant à empêcher l'accès à
l'implémentation - sauf bien sûr si tes développeurs sont bêtes à
manger du foin, mais dans ce cas là, tu es de toutes façons dans la
m..., et aucun mécanisme ne les empêchera de saloper le travail.
Dans l'un des derniers projets que j'ai audité, la phase de codage (450
000 lignes de Java)
Ca aurait probablement demandé très nettement moins de lignes dans un
langage de plus haut niveau (sans préjuger de l'adaptation ou non d'un
langage de plus haut niveau sur d'autres aspects comme les performances
et la gestion des ressources).
Post by Wykaaa
a été réalisée en 9 mois par 40 développeurs (ça
fait donc 30 hommes.an). Même si tu n'as que des développeurs
intelligents, tu as intérêt à "blinder" de partout pour la fiabilité, la
maintenabilité et l'évolutivité sachant que le logiciel va avoir une
durée de vie comprise entre 30 et 40 ans au moins...
De deux choses l'une: ou les développeurs sont effectivement au moins
normalement intelligents, et ils respecterons les specs, les règles
établies et bonnes pratiques (si bien sûr on leur en laisse le temps,
mais à t'entendre c'est effectivement le cas dans ton domaine), ou ils
ne le sont pas et AUCUNE technologie ne te protégera des imbécilités
qu'ils commettront.

Dans le premier cas, tu n'a pas _besoin_ de restriction d'accès au
niveau du langage - une bonne convention de nommage est largement
suffisante.

Dans le second cas... bin, bonne chance, hein.
Post by Wykaaa
[snip]
Post by Bruno Desthuilliers
Post by Wykaaa
ben la persistence, ce sont quand même les bases de données. Tu
connais beaucoup de systèmes qui n'en ont pas ?
Je n'entrerai pas pour le moment dans le débat sur le fait de
restreindre les bases de données à un entrepôt à octets. Pour le
reste, concernant les accès aux bases de données, ça n'a nul besoin
d'être défini dans le _langage_ lui-même. Ce type de mécanisme relève
de bibliothèques externes (ou éventuellement de la bibliothèque
standard pour définir une API unifiée).
Pour le coup c'est toi qui a des oeillères :-) car avoir un mécanisme de
sérialisation, dans le langage lui-même, pour écrire un objet en une
seule écriture dans une base de données (objet ou non objet, peu importe
car on utilisera le pattern DAO, n'est-ce pas, pour encapsuler les accès
à la base), ça me paraît assez pratique.
Je ne pense pas que ce soit "assez pratique", non. Si tu bosse avec une
base relationnelle, tu ferais une crétinerie absolue en la considérent
juste comme un entrepôt à objets. Quand aux bases objets que j'ai testé,
aucune n'est de toutes façons totalement transparente - crois moi, tu
_sais_ que la base est là. Les mécanismes à mettre en oeuvre divergent
de toutes façon trop entre ces deux options pour qu'un système de
sérialisation "universelle" permette des performances acceptables. Bref,
pour moi, ta justification est de la foutaise absolue digne d'un PHB ou
d'un architecte astronaute.
Wykaaa
2009-11-16 17:02:21 UTC
Permalink
Post by Bruno Desthuilliers
Post by Wykaaa
Post by Bruno Desthuilliers
Post by Wykaaa
[snip]
[snip]
Post by Bruno Desthuilliers
D'un côté, je défend ma chapelle - enfin, je veux dire, les technos
et approches qui par expérience fonctionne à peu près dans le
contexte professionnel qui est le mien -, mais d'un autre, quand je
vois le niveau moyen et "l'état de l'art" (mouarf) dans ledit
contexte, je désespère un peu. Et bon, c'était guère mieux quand je
bossais sur de l'applicatif de gestion traditionnel... J'aimerais
bien savoir un jour ce que ça fait de bosser "normalement" - je veux
dire, avec des specs fonctionnelles sérieuses et le temps nécessaire
pour faire le boulot comme il faut.
Il faut avouer que c'est quand même agréable et en 35 ans de vie
professionnelle dans l'informatique je n'ai (presuqe) jamais travaillé
dans l'urgence et toujours avec un maximum de méthodologie (même dans
les années 70, dans une grande banque et un environnement Cobol...).
Pour prendre des activités plus récentes, c'est très agréable de
travailler avec les militaires car le cahier des charges est bien
défini(le projet a, en général, fait l'objet de pré-études, appelées
études amont, d'étude de faisabilité, de maquettage et/ou prototypage,
des simulations,etc.).
En plus, ce qui n'est pas négligeable, les militaires sont à l'heure
aux RDV et aux réunions, ce qui est loin d'être le cas dans le privé...
[snip]
Post by Bruno Desthuilliers
Post by Wykaaa
Post by Bruno Desthuilliers
Il faut pouvoir découpler l'interface de l'implémentation. Le reste,
c'est de la paranoïa.
Non, ce n'est pas de la paranoïa pour la réutilisabilité, la
remplaçabilité (substituer un composant logiciel par un autre ayant
les mêmes fonctionnalités pour x raisons : faillite du fournisseur,
licence moins chère ailleurs,etc.)
C'est de la paranoïa quand même. Tant que l'interface est découplée
de l'implémentation, il est clair que le client est codé pour
l'interface et non pour l'implémentation. Il n'est pas _nécessaire_
de mettre en place dans le langages des mécanismes visant à empêcher
l'accès à l'implémentation - sauf bien sûr si tes développeurs sont
bêtes à manger du foin, mais dans ce cas là, tu es de toutes façons
dans la m..., et aucun mécanisme ne les empêchera de saloper le travail.
Dans l'un des derniers projets que j'ai audité, la phase de codage
(450 000 lignes de Java)
Ca aurait probablement demandé très nettement moins de lignes dans un
langage de plus haut niveau (sans préjuger de l'adaptation ou non d'un
langage de plus haut niveau sur d'autres aspects comme les performances
et la gestion des ressources).
Quand on "voit" ce que ça fait, ça m'étonnerait...
Post by Bruno Desthuilliers
Post by Wykaaa
a été réalisée en 9 mois par 40 développeurs (ça fait donc 30
hommes.an). Même si tu n'as que des développeurs intelligents, tu as
intérêt à "blinder" de partout pour la fiabilité, la
maintenabilité et l'évolutivité sachant que le logiciel va avoir une
durée de vie comprise entre 30 et 40 ans au moins...
De deux choses l'une: ou les développeurs sont effectivement au moins
normalement intelligents, et ils respecterons les specs, les règles
établies et bonnes pratiques (si bien sûr on leur en laisse le temps,
mais à t'entendre c'est effectivement le cas dans ton domaine), ou ils
ne le sont pas et AUCUNE technologie ne te protégera des imbécilités
qu'ils commettront.
Dans le premier cas, tu n'a pas _besoin_ de restriction d'accès au
niveau du langage - une bonne convention de nommage est largement
suffisante.
Non.
Je ne te parle pas des écritures ou lectures physiques avec une base
particulière mais de l'interface "base de données générale" que voit
l'application. En passant par le pattern DAO, tu peux avoir une
interface unique que ta base de données derrière soit relationnelle,
objet ou même XML. J'ai vu le cas et ça marchait très bien.
Post by Bruno Desthuilliers
Dans le second cas... bin, bonne chance, hein.
On ne considère pas ce cas-là ;-)
Post by Bruno Desthuilliers
Post by Wykaaa
[snip]
Post by Bruno Desthuilliers
Post by Wykaaa
ben la persistence, ce sont quand même les bases de données. Tu
connais beaucoup de systèmes qui n'en ont pas ?
Je n'entrerai pas pour le moment dans le débat sur le fait de
restreindre les bases de données à un entrepôt à octets. Pour le
reste, concernant les accès aux bases de données, ça n'a nul besoin
d'être défini dans le _langage_ lui-même. Ce type de mécanisme relève
de bibliothèques externes (ou éventuellement de la bibliothèque
standard pour définir une API unifiée).
Pour le coup c'est toi qui a des oeillères :-) car avoir un mécanisme
de sérialisation, dans le langage lui-même, pour écrire un objet en
une seule écriture dans une base de données (objet ou non objet, peu
importe
car on utilisera le pattern DAO, n'est-ce pas, pour encapsuler les
accès à la base), ça me paraît assez pratique.
Je ne pense pas que ce soit "assez pratique", non. Si tu bosse avec une
base relationnelle, tu ferais une crétinerie absolue en la considérent
juste comme un entrepôt à objets. Quand aux bases objets que j'ai testé,
aucune n'est de toutes façons totalement transparente - crois moi, tu
_sais_ que la base est là. Les mécanismes à mettre en oeuvre divergent
de toutes façon trop entre ces deux options pour qu'un système de
sérialisation "universelle" permette des performances acceptables. Bref,
pour moi, ta justification est de la foutaise absolue digne d'un PHB ou
d'un architecte astronaute.
Il y a forcément un moment où cela va diverger, évidemment car les
primitives d'appel à la base ne portent pas les mêmes noms, les mêmes
paramètres, etc.
Je te parlais de l'interface qui encapsule ces différentes
implémentations, celle qu'on va définir dans une architecture MVC.
Bruno Desthuilliers
2009-11-17 09:26:11 UTC
Permalink
Post by Wykaaa
Post by Bruno Desthuilliers
Post by Wykaaa
Dans l'un des derniers projets que j'ai audité, la phase de codage
(450 000 lignes de Java)
Ca aurait probablement demandé très nettement moins de lignes dans un
langage de plus haut niveau (sans préjuger de l'adaptation ou non d'un
langage de plus haut niveau sur d'autres aspects comme les
performances et la gestion des ressources).
Quand on "voit" ce que ça fait, ça m'étonnerait...
Es-tu sûr de connaitre assez Python pour pouvoir l'affirmer ?
Post by Wykaaa
Post by Bruno Desthuilliers
Post by Wykaaa
a été réalisée en 9 mois par 40 développeurs (ça fait donc 30
hommes.an). Même si tu n'as que des développeurs intelligents, tu as
intérêt à "blinder" de partout pour la fiabilité, la
maintenabilité et l'évolutivité sachant que le logiciel va avoir une
durée de vie comprise entre 30 et 40 ans au moins...
De deux choses l'une: ou les développeurs sont effectivement au moins
normalement intelligents, et ils respecterons les specs, les règles
établies et bonnes pratiques (si bien sûr on leur en laisse le temps,
mais à t'entendre c'est effectivement le cas dans ton domaine), ou ils
ne le sont pas et AUCUNE technologie ne te protégera des imbécilités
qu'ils commettront.
Dans le premier cas, tu n'a pas _besoin_ de restriction d'accès au
niveau du langage - une bonne convention de nommage est largement
suffisante.
Non.
Je ne te parle pas des écritures ou lectures physiques avec une base
particulière mais de l'interface "base de données générale" que voit
l'application.
Excuse moi mais je ne vois pas le rapport avec ce à quoi tu réponds, là ???
Post by Wykaaa
En passant par le pattern DAO, tu peux avoir une
interface unique que ta base de données derrière soit relationnelle,
objet ou même XML.
Sauf que cette "interface unique" ne permet pas de tirer parti
efficacement d'une base de données relationnelle. Désolé, mais une base
relationnelle (enfin, je devrais dire 'SQL', mais bon ça reste ce qui
s'approche le plus d'une implémentation du modèle relationnel) n'est
*pas* un bête entrepôt à données, et l'utiliser ainsi est de la débilité
à l'état brut.
Post by Wykaaa
J'ai vu le cas et ça marchait très bien.
Non. Ca ne marchait certainement pas "très bien", comparé à ce que
permet réellement une utilisation normalement intelligente d'une base
relationnelle.

Accessoirement, je ne comprend tout simplement pas l'intérêt de vouloir
faire abstraction d'une base relationnelle. Le modèle relationnel est
*déjà* en lui-même une couche d'abstraction (et accessoirement un
excellent support pour l'interopérabilité, à condition de ne pas
mépriser la base relationnelle au point d'en faire un stupide entrepôt à
octets).

Quant aux "bases XML", là je me marre carrément.

Tout ça est un cas typique et exemplaire d'architecture pondue par un
astronaute. Faut redescendre sur terre, les gars.
Post by Wykaaa
Post by Bruno Desthuilliers
Dans le second cas... bin, bonne chance, hein.
On ne considère pas ce cas-là ;-)
Pourtant, vu l'emploi que tu semble faire des "programmeurs" (en gros:
pisser du code là où les "experts" leur ont dit de faire), tu devrais
sérieusement le considérer, parce que tu n'es pas près d'attirer (et
encore moins de conserver) des développeurs normalement intelligents sur
de tels postes. C'est du travail de singe que tu leur propose, pas du
travail de développeur.
Post by Wykaaa
Post by Bruno Desthuilliers
Post by Wykaaa
[snip]
Post by Bruno Desthuilliers
Post by Wykaaa
ben la persistence, ce sont quand même les bases de données. Tu
connais beaucoup de systèmes qui n'en ont pas ?
Je n'entrerai pas pour le moment dans le débat sur le fait de
restreindre les bases de données à un entrepôt à octets. Pour le
reste, concernant les accès aux bases de données, ça n'a nul besoin
d'être défini dans le _langage_ lui-même. Ce type de mécanisme
relève de bibliothèques externes (ou éventuellement de la
bibliothèque standard pour définir une API unifiée).
Pour le coup c'est toi qui a des oeillères :-) car avoir un mécanisme
de sérialisation, dans le langage lui-même, pour écrire un objet en
une seule écriture dans une base de données (objet ou non objet, peu
importe
car on utilisera le pattern DAO, n'est-ce pas, pour encapsuler les
accès à la base), ça me paraît assez pratique.
Je ne pense pas que ce soit "assez pratique", non. Si tu bosse avec
une base relationnelle, tu ferais une crétinerie absolue en la
considérent juste comme un entrepôt à objets. Quand aux bases objets
que j'ai testé, aucune n'est de toutes façons totalement transparente
- crois moi, tu _sais_ que la base est là. Les mécanismes à mettre en
oeuvre divergent de toutes façon trop entre ces deux options pour
qu'un système de sérialisation "universelle" permette des performances
acceptables. Bref, pour moi, ta justification est de la foutaise
absolue digne d'un PHB ou d'un architecte astronaute.
Il y a forcément un moment où cela va diverger, évidemment car les
primitives d'appel à la base ne portent pas les mêmes noms, les mêmes
paramètres, etc.
Je te parlais de l'interface qui encapsule ces différentes
implémentations,
On ne peut pas "encapsuler dans une même interface" les "différences
d'implémentation" entre un SGBDR et une base hierarchique ou réseau (ce
que sont, de facto, les bases "objets") sans perdre l'essentiel de ce
qui fait l'intérêt du modèle relationnel.

Pour ce que ça vaut, je préfèrerais voir une réelle intégration
(native...) du modèle relationnel dans les langages que cet espèce de
délire schizophrène consistant à nier purement et simplement l'apport du
modèle relationnel et à retourner allègrement des années en arrière.
Wykaaa
2009-11-17 11:19:56 UTC
Permalink
Post by Bruno Desthuilliers
Post by Wykaaa
Post by Bruno Desthuilliers
Post by Wykaaa
Dans l'un des derniers projets que j'ai audité, la phase de codage
(450 000 lignes de Java)
Ca aurait probablement demandé très nettement moins de lignes dans un
langage de plus haut niveau (sans préjuger de l'adaptation ou non
d'un langage de plus haut niveau sur d'autres aspects comme les
performances et la gestion des ressources).
Quand on "voit" ce que ça fait, ça m'étonnerait...
Es-tu sûr de connaitre assez Python pour pouvoir l'affirmer ?
Il ne viendrait à l'idée de personne de coder un SIC (Système
d'information et de commandement) en Python. C'est une idée surréaliste !
Post by Bruno Desthuilliers
Post by Wykaaa
Post by Bruno Desthuilliers
Post by Wykaaa
a été réalisée en 9 mois par 40 développeurs (ça fait donc 30
hommes.an). Même si tu n'as que des développeurs intelligents, tu as
intérêt à "blinder" de partout pour la fiabilité, la
maintenabilité et l'évolutivité sachant que le logiciel va avoir une
durée de vie comprise entre 30 et 40 ans au moins...
De deux choses l'une: ou les développeurs sont effectivement au moins
normalement intelligents, et ils respecterons les specs, les règles
établies et bonnes pratiques (si bien sûr on leur en laisse le temps,
mais à t'entendre c'est effectivement le cas dans ton domaine), ou
ils ne le sont pas et AUCUNE technologie ne te protégera des
imbécilités qu'ils commettront.
Dans le premier cas, tu n'a pas _besoin_ de restriction d'accès au
niveau du langage - une bonne convention de nommage est largement
suffisante.
Non.
Je ne te parle pas des écritures ou lectures physiques avec une base
particulière mais de l'interface "base de données générale" que voit
l'application.
Excuse moi mais je ne vois pas le rapport avec ce à quoi tu réponds, là ???
Ben oui car tu raisonnes implémentation...
Post by Bruno Desthuilliers
Post by Wykaaa
En passant par le pattern DAO, tu peux avoir une interface unique que
ta base de données derrière soit relationnelle, objet ou même XML.
Sauf que cette "interface unique" ne permet pas de tirer parti
efficacement d'une base de données relationnelle. Désolé, mais une base
relationnelle (enfin, je devrais dire 'SQL', mais bon ça reste ce qui
s'approche le plus d'une implémentation du modèle relationnel) n'est
*pas* un bête entrepôt à données, et l'utiliser ainsi est de la débilité
à l'état brut.
Bien sûr, bien sûr. Mais là, tu devrais te mettre au courant sur les
patterns actuels concernant ce domaine...
Post by Bruno Desthuilliers
Post by Wykaaa
J'ai vu le cas et ça marchait très bien.
Non. Ca ne marchait certainement pas "très bien", comparé à ce que
permet réellement une utilisation normalement intelligente d'une base
relationnelle.
Accessoirement, je ne comprend tout simplement pas l'intérêt de vouloir
faire abstraction d'une base relationnelle. Le modèle relationnel est
*déjà* en lui-même une couche d'abstraction (et accessoirement un
excellent support pour l'interopérabilité, à condition de ne pas
mépriser la base relationnelle au point d'en faire un stupide entrepôt à
octets).
Qui te dit qu'avec ce pattern on considère qu'une base relationnelle est
un entrepôt à octets ?
Bien sûr que le modèle relationnel est déjà une couche d'abstraction, et
alors ?
Il peut être lui-même encapsulé dans une couche d'abstraction plus
générale (le modèle CRUD pour Create, Read, Update, Delete, qui, lui,
est commun à l'ensemble des types de bases de données).
Post by Bruno Desthuilliers
Quant aux "bases XML", là je me marre carrément.
Ah oui, pourquoi ?
Le système SICF (Système d'Information et de Commandement des Forces)
qui représente plusieurs millions de lignes de code utilise des bases de
données XML)
A terme, dans le cadre de l'interopérabilité des systèmes d'information
et de commandement (15 systèmes rien que pour l'armée de terre), tous
les messages entre les systèmes seront en XML. De même avec les alliés,
l'OTAN, etc.
Les bases de données XML sont essentielles dans cet environnement.
Tu auras une idée de l'utilisation d'XML chez les militaires en
parcourant le site : http://www.mip-site.org et plus particulièrement :
http://www.mip-site.org/043_Public_Documents_XML_02.htm#MA-XML-02-Down-WS-OO
Post by Bruno Desthuilliers
Tout ça est un cas typique et exemplaire d'architecture pondue par un
astronaute. Faut redescendre sur terre, les gars.
Ben pas du tout. Ca existe et ça marche. Je pense tout simplement que
dans ton environnement, la réflexion n'est pas assez avancée. Pourtant
les bases XML devraient être largement utilisées...
Post by Bruno Desthuilliers
Post by Wykaaa
Post by Bruno Desthuilliers
Dans le second cas... bin, bonne chance, hein.
On ne considère pas ce cas-là ;-)
pisser du code là où les "experts" leur ont dit de faire), tu devrais
sérieusement le considérer, parce que tu n'es pas près d'attirer (et
encore moins de conserver) des développeurs normalement intelligents sur
de tels postes. C'est du travail de singe que tu leur propose, pas du
travail de développeur.
Non, ils font aussi la conception détaillée et ils doivent connaître
parfaitement les environnement utilisés, en particulier J2EE, CORBA,
Apache, Jonas, les standards du Net genre DOM, les Web
Services,l'approche SOA, etc. et les APIs qui vont avec tout ça...
Sans compter les logiciels de cartographie et les standards d'échanges
de messages dans le milieux militaire comme aDat-P3
(http://fr.wikipedia.org/wiki/Automatic_Data_Processing_Publication_num%C3%A9ro_3),
Post by Bruno Desthuilliers
Post by Wykaaa
Post by Bruno Desthuilliers
Post by Wykaaa
[snip]
Post by Bruno Desthuilliers
Post by Wykaaa
ben la persistence, ce sont quand même les bases de données. Tu
connais beaucoup de systèmes qui n'en ont pas ?
Je n'entrerai pas pour le moment dans le débat sur le fait de
restreindre les bases de données à un entrepôt à octets. Pour le
reste, concernant les accès aux bases de données, ça n'a nul besoin
d'être défini dans le _langage_ lui-même. Ce type de mécanisme
relève de bibliothèques externes (ou éventuellement de la
bibliothèque standard pour définir une API unifiée).
Pour le coup c'est toi qui a des oeillères :-) car avoir un
mécanisme de sérialisation, dans le langage lui-même, pour écrire un
objet en une seule écriture dans une base de données (objet ou non
objet, peu importe
car on utilisera le pattern DAO, n'est-ce pas, pour encapsuler les
accès à la base), ça me paraît assez pratique.
Je ne pense pas que ce soit "assez pratique", non. Si tu bosse avec
une base relationnelle, tu ferais une crétinerie absolue en la
considérent juste comme un entrepôt à objets. Quand aux bases objets
que j'ai testé, aucune n'est de toutes façons totalement
transparente - crois moi, tu _sais_ que la base est là. Les
mécanismes à mettre en oeuvre divergent de toutes façon trop entre
ces deux options pour qu'un système de sérialisation "universelle"
permette des performances acceptables. Bref, pour moi, ta
justification est de la foutaise absolue digne d'un PHB ou d'un
architecte astronaute.
Il y a forcément un moment où cela va diverger, évidemment car les
primitives d'appel à la base ne portent pas les mêmes noms, les mêmes
paramètres, etc.
Je te parlais de l'interface qui encapsule ces différentes
implémentations,
On ne peut pas "encapsuler dans une même interface" les "différences
d'implémentation" entre un SGBDR et une base hierarchique ou réseau (ce
que sont, de facto, les bases "objets") sans perdre l'essentiel de ce
qui fait l'intérêt du modèle relationnel.
Tu raisonnes toujours implémentation...
Post by Bruno Desthuilliers
Pour ce que ça vaut, je préfèrerais voir une réelle intégration
(native...) du modèle relationnel dans les langages que cet espèce de
délire schizophrène consistant à nier purement et simplement l'apport du
modèle relationnel et à retourner allègrement des années en arrière.
Dans le SIR (Système d'Information Régimentaire), c'est une base de
données objet qui est utilisée (Versant) et des ordres sont échangés
avec un autre système qui a des bases XML.
Il y a finalement très peu de BD relationnelle dans ces systèmes (mais
il y en a).
Bruno Desthuilliers
2009-11-17 11:56:29 UTC
Permalink
Post by Wykaaa
Post by Bruno Desthuilliers
Post by Wykaaa
Post by Bruno Desthuilliers
Post by Wykaaa
Dans l'un des derniers projets que j'ai audité, la phase de codage
(450 000 lignes de Java)
Ca aurait probablement demandé très nettement moins de lignes dans
un langage de plus haut niveau (sans préjuger de l'adaptation ou non
d'un langage de plus haut niveau sur d'autres aspects comme les
performances et la gestion des ressources).
Quand on "voit" ce que ça fait, ça m'étonnerait...
Es-tu sûr de connaitre assez Python pour pouvoir l'affirmer ?
Il ne viendrait à l'idée de personne de coder un SIC (Système
d'information et de commandement) en Python. C'est une idée surréaliste !
Bon, excuse moi, j'avais cru que tu avais LU attentivement le texte
auquel tu répondais. Je reprend donc :

"""
sans préjuger de l'adaptation ou non d'un langage de plus haut niveau
sur d'autres aspects comme les performances et la gestion des ressources
"""
Post by Wykaaa
Post by Bruno Desthuilliers
Post by Wykaaa
Post by Bruno Desthuilliers
Post by Wykaaa
a été réalisée en 9 mois par 40 développeurs (ça fait donc 30
hommes.an). Même si tu n'as que des développeurs intelligents, tu
as intérêt à "blinder" de partout pour la fiabilité, la
maintenabilité et l'évolutivité sachant que le logiciel va avoir
une durée de vie comprise entre 30 et 40 ans au moins...
De deux choses l'une: ou les développeurs sont effectivement au
moins normalement intelligents, et ils respecterons les specs, les
règles établies et bonnes pratiques (si bien sûr on leur en laisse
le temps, mais à t'entendre c'est effectivement le cas dans ton
domaine), ou ils ne le sont pas et AUCUNE technologie ne te
protégera des imbécilités qu'ils commettront.
Dans le premier cas, tu n'a pas _besoin_ de restriction d'accès au
niveau du langage - une bonne convention de nommage est largement
suffisante.
Non.
Je ne te parle pas des écritures ou lectures physiques avec une base
particulière mais de l'interface "base de données générale" que voit
l'application.
Excuse moi mais je ne vois pas le rapport avec ce à quoi tu réponds, là ???
Ben oui car tu raisonnes implémentation...
Je ne vois toujours pas le rapport. Je te parles de restrictions d'accès
(data hiding en d'autres termes), tu réponds "écritures et lectures
physique" et "base de données".
Post by Wykaaa
Post by Bruno Desthuilliers
Post by Wykaaa
En passant par le pattern DAO, tu peux avoir une interface unique que
ta base de données derrière soit relationnelle, objet ou même XML.
Sauf que cette "interface unique" ne permet pas de tirer parti
efficacement d'une base de données relationnelle. Désolé, mais une
base relationnelle (enfin, je devrais dire 'SQL', mais bon ça reste ce
qui s'approche le plus d'une implémentation du modèle relationnel)
n'est *pas* un bête entrepôt à données, et l'utiliser ainsi est de la
débilité à l'état brut.
Bien sûr, bien sûr. Mais là, tu devrais te mettre au courant sur les
patterns actuels concernant ce domaine...
C'est curieux, il se trouve que ça fait plusieurs années que je suis ce
domaine d'assez prêt.
Post by Wykaaa
Post by Bruno Desthuilliers
Post by Wykaaa
J'ai vu le cas et ça marchait très bien.
Non. Ca ne marchait certainement pas "très bien", comparé à ce que
permet réellement une utilisation normalement intelligente d'une base
relationnelle.
Accessoirement, je ne comprend tout simplement pas l'intérêt de
vouloir faire abstraction d'une base relationnelle. Le modèle
relationnel est *déjà* en lui-même une couche d'abstraction (et
accessoirement un excellent support pour l'interopérabilité, à
condition de ne pas mépriser la base relationnelle au point d'en faire
un stupide entrepôt à octets).
Qui te dit qu'avec ce pattern on considère qu'une base relationnelle est
un entrepôt à octets ?
Bien sûr que le modèle relationnel est déjà une couche d'abstraction, et
alors ?
Il peut être lui-même encapsulé dans une couche d'abstraction plus
générale (le modèle CRUD pour Create, Read, Update, Delete, qui, lui,
est commun à l'ensemble des types de bases de données).
Si je te dis "opérations ensemblistes" et "algèbre relationnel", ça te
parles ?
Post by Wykaaa
Post by Bruno Desthuilliers
Quant aux "bases XML", là je me marre carrément.
Ah oui, pourquoi ?
Le système SICF (Système d'Information et de Commandement des Forces)
qui représente plusieurs millions de lignes de code utilise des bases de
données XML)
Super. Ah, oui, remarque, c'est en Java. C'est vrai que faire du Java
sans tout truffer de XML, ça ferait un peu désordre.
Post by Wykaaa
A terme, dans le cadre de l'interopérabilité des systèmes d'information
et de commandement (15 systèmes rien que pour l'armée de terre), tous
les messages entre les systèmes seront en XML.
Il y a comme qui dirait une légère différence entre les deux cas
d'utilisation, non ? Tu ne vois pas laquelle ?
Post by Wykaaa
De même avec les alliés,
l'OTAN, etc.
Les bases de données XML sont essentielles dans cet environnement.
Tu auras une idée de l'utilisation d'XML chez les militaires
Non, merci.
Post by Wykaaa
Post by Bruno Desthuilliers
Tout ça est un cas typique et exemplaire d'architecture pondue par un
astronaute. Faut redescendre sur terre, les gars.
Ben pas du tout. Ca existe et ça marche. Je pense tout simplement que
dans ton environnement, la réflexion n'est pas assez avancée.
Si. On a bien réfléchi à ce sujet, et le consensus général est "foutaise".
Post by Wykaaa
Pourtant
les bases XML devraient être largement utilisées...
Dieu merci non.
Post by Wykaaa
Post by Bruno Desthuilliers
Post by Wykaaa
Post by Bruno Desthuilliers
Dans le second cas... bin, bonne chance, hein.
On ne considère pas ce cas-là ;-)
pisser du code là où les "experts" leur ont dit de faire), tu devrais
sérieusement le considérer, parce que tu n'es pas près d'attirer (et
encore moins de conserver) des développeurs normalement intelligents
sur de tels postes. C'est du travail de singe que tu leur propose, pas
du travail de développeur.
Non, ils font aussi la conception détaillée
Tiens, je croyais qu'ils n'avaient même pas le droit d'inventer un objet
non prévu par messieurs les Grands Experts ?-)
Post by Wykaaa
et ils doivent connaître
parfaitement les environnement utilisés, en particulier J2EE, CORBA,
Apache, Jonas, les standards du Net genre DOM, les Web
Services,l'approche SOA, etc. et les APIs qui vont avec tout ça...
Sans compter les logiciels de cartographie et les standards d'échanges
de messages dans le milieux militaire comme aDat-P3
Tout ça (ce paragraphe là, j'entend) reste de l'application pure et
simple - du travail de singe. Connaitre une API ? bon, bin tu lis la doc
et t'applique, quoi.
Post by Wykaaa
Post by Bruno Desthuilliers
Post by Wykaaa
Post by Bruno Desthuilliers
Post by Wykaaa
[snip]
Post by Bruno Desthuilliers
Post by Wykaaa
ben la persistence, ce sont quand même les bases de données. Tu
connais beaucoup de systèmes qui n'en ont pas ?
Je n'entrerai pas pour le moment dans le débat sur le fait de
restreindre les bases de données à un entrepôt à octets. Pour le
reste, concernant les accès aux bases de données, ça n'a nul
besoin d'être défini dans le _langage_ lui-même. Ce type de
mécanisme relève de bibliothèques externes (ou éventuellement de
la bibliothèque standard pour définir une API unifiée).
Pour le coup c'est toi qui a des oeillères :-) car avoir un
mécanisme de sérialisation, dans le langage lui-même, pour écrire
un objet en une seule écriture dans une base de données (objet ou
non objet, peu importe
car on utilisera le pattern DAO, n'est-ce pas, pour encapsuler les
accès à la base), ça me paraît assez pratique.
Je ne pense pas que ce soit "assez pratique", non. Si tu bosse avec
une base relationnelle, tu ferais une crétinerie absolue en la
considérent juste comme un entrepôt à objets. Quand aux bases objets
que j'ai testé, aucune n'est de toutes façons totalement
transparente - crois moi, tu _sais_ que la base est là. Les
mécanismes à mettre en oeuvre divergent de toutes façon trop entre
ces deux options pour qu'un système de sérialisation "universelle"
permette des performances acceptables. Bref, pour moi, ta
justification est de la foutaise absolue digne d'un PHB ou d'un
architecte astronaute.
Il y a forcément un moment où cela va diverger, évidemment car les
primitives d'appel à la base ne portent pas les mêmes noms, les mêmes
paramètres, etc.
Je te parlais de l'interface qui encapsule ces différentes
implémentations,
On ne peut pas "encapsuler dans une même interface" les "différences
d'implémentation" entre un SGBDR et une base hierarchique ou réseau
(ce que sont, de facto, les bases "objets") sans perdre l'essentiel de
ce qui fait l'intérêt du modèle relationnel.
Tu raisonnes toujours implémentation...
Puis-je te rappeler, Monsieur l'Astronaute, que sans implémentation,
tout ton beau travail d'expert est du gâchis de fric pur et simple. Le
but de la maneuvre est quand même bien d'avoir, au final, une putain
d'implémentation, et si possible raisonnablement fonctionnelle - pas des
tonnes de paperasses soigneusement formatées.
Post by Wykaaa
Post by Bruno Desthuilliers
Pour ce que ça vaut, je préfèrerais voir une réelle intégration
(native...) du modèle relationnel dans les langages que cet espèce de
délire schizophrène consistant à nier purement et simplement l'apport
du modèle relationnel et à retourner allègrement des années en arrière.
Dans le SIR (Système d'Information Régimentaire), c'est une base de
données objet qui est utilisée (Versant) et des ordres sont échangés
avec un autre système qui a des bases XML.
Il y a finalement très peu de BD relationnelle dans ces systèmes (mais
il y en a).
Wykaaa
2009-11-17 12:43:09 UTC
Permalink
Post by Bruno Desthuilliers
Post by Wykaaa
Post by Bruno Desthuilliers
Post by Wykaaa
Post by Bruno Desthuilliers
Post by Wykaaa
Dans l'un des derniers projets que j'ai audité, la phase de codage
(450 000 lignes de Java)
Ca aurait probablement demandé très nettement moins de lignes dans
un langage de plus haut niveau (sans préjuger de l'adaptation ou
non d'un langage de plus haut niveau sur d'autres aspects comme les
performances et la gestion des ressources).
Quand on "voit" ce que ça fait, ça m'étonnerait...
Es-tu sûr de connaitre assez Python pour pouvoir l'affirmer ?
Il ne viendrait à l'idée de personne de coder un SIC (Système
d'information et de commandement) en Python. C'est une idée surréaliste !
Bon, excuse moi, j'avais cru que tu avais LU attentivement le texte
"""
sans préjuger de l'adaptation ou non d'un langage de plus haut niveau
sur d'autres aspects comme les performances et la gestion des ressources
"""
Bon, ok.
Post by Bruno Desthuilliers
Post by Wykaaa
Post by Bruno Desthuilliers
Post by Wykaaa
Post by Bruno Desthuilliers
Post by Wykaaa
a été réalisée en 9 mois par 40 développeurs (ça fait donc 30
hommes.an). Même si tu n'as que des développeurs intelligents, tu
as intérêt à "blinder" de partout pour la fiabilité, la
maintenabilité et l'évolutivité sachant que le logiciel va avoir
une durée de vie comprise entre 30 et 40 ans au moins...
De deux choses l'une: ou les développeurs sont effectivement au
moins normalement intelligents, et ils respecterons les specs, les
règles établies et bonnes pratiques (si bien sûr on leur en laisse
le temps, mais à t'entendre c'est effectivement le cas dans ton
domaine), ou ils ne le sont pas et AUCUNE technologie ne te
protégera des imbécilités qu'ils commettront.
Dans le premier cas, tu n'a pas _besoin_ de restriction d'accès au
niveau du langage - une bonne convention de nommage est largement
suffisante.
Non.
Je ne te parle pas des écritures ou lectures physiques avec une base
particulière mais de l'interface "base de données générale" que voit
l'application.
Excuse moi mais je ne vois pas le rapport avec ce à quoi tu réponds, là ???
Ben oui car tu raisonnes implémentation...
Je ne vois toujours pas le rapport. Je te parles de restrictions d'accès
(data hiding en d'autres termes), tu réponds "écritures et lectures
physique" et "base de données".
Non justement. ma phrase était : Je ne te parle pas des écritures ou
lectures physiques
Post by Bruno Desthuilliers
Post by Wykaaa
Post by Bruno Desthuilliers
Post by Wykaaa
En passant par le pattern DAO, tu peux avoir une interface unique
que ta base de données derrière soit relationnelle, objet ou même XML.
Sauf que cette "interface unique" ne permet pas de tirer parti
efficacement d'une base de données relationnelle. Désolé, mais une
base relationnelle (enfin, je devrais dire 'SQL', mais bon ça reste
ce qui s'approche le plus d'une implémentation du modèle relationnel)
n'est *pas* un bête entrepôt à données, et l'utiliser ainsi est de la
débilité à l'état brut.
Bien sûr, bien sûr. Mais là, tu devrais te mettre au courant sur les
patterns actuels concernant ce domaine...
C'est curieux, il se trouve que ça fait plusieurs années que je suis ce
domaine d'assez prêt.
Ca n'empêche pas qu'il y ait des choses qui nous échappent, comme moi
avec le modèle objet pour les langages à prototypes, par exemple :-)
D'ailleurs où est-il ce modèle ?
Post by Bruno Desthuilliers
Post by Wykaaa
Post by Bruno Desthuilliers
Post by Wykaaa
J'ai vu le cas et ça marchait très bien.
Non. Ca ne marchait certainement pas "très bien", comparé à ce que
permet réellement une utilisation normalement intelligente d'une base
relationnelle.
Accessoirement, je ne comprend tout simplement pas l'intérêt de
vouloir faire abstraction d'une base relationnelle. Le modèle
relationnel est *déjà* en lui-même une couche d'abstraction (et
accessoirement un excellent support pour l'interopérabilité, à
condition de ne pas mépriser la base relationnelle au point d'en
faire un stupide entrepôt à octets).
Qui te dit qu'avec ce pattern on considère qu'une base relationnelle
est un entrepôt à octets ?
Bien sûr que le modèle relationnel est déjà une couche d'abstraction,
et alors ?
Il peut être lui-même encapsulé dans une couche d'abstraction plus
générale (le modèle CRUD pour Create, Read, Update, Delete, qui, lui,
est commun à l'ensemble des types de bases de données).
Si je te dis "opérations ensemblistes" et "algèbre relationnel", ça te
parles ?
Oui, pas de problème. Et les formes normales et tout le toutim...
Post by Bruno Desthuilliers
Post by Wykaaa
Post by Bruno Desthuilliers
Quant aux "bases XML", là je me marre carrément.
Ah oui, pourquoi ?
Le système SICF (Système d'Information et de Commandement des Forces)
qui représente plusieurs millions de lignes de code utilise des bases
de données XML)
Super. Ah, oui, remarque, c'est en Java. C'est vrai que faire du Java
sans tout truffer de XML, ça ferait un peu désordre.
Quel mépris !
Post by Bruno Desthuilliers
Post by Wykaaa
A terme, dans le cadre de l'interopérabilité des systèmes
d'information et de commandement (15 systèmes rien que pour l'armée de
terre), tous les messages entre les systèmes seront en XML.
Il y a comme qui dirait une légère différence entre les deux cas
d'utilisation, non ? Tu ne vois pas laquelle ?
Oui mais si tout les messages sont en XML, c'est tout de même mieux
qu'ils soient stockés directement dans des bases idoines. Dans ces
systèmes, le relationnel n'est pas d'une grande utilité car le
relationnel, ce ne sont, pour eux que des lignes et des colonnes...
Post by Bruno Desthuilliers
Post by Wykaaa
De même avec les alliés, l'OTAN, etc.
Les bases de données XML sont essentielles dans cet environnement.
Tu auras une idée de l'utilisation d'XML chez les militaires
Non, merci.
Ah ben maintenant tu ne veux pas apprendre ?
Même pas un semblant de curiosité ?
Post by Bruno Desthuilliers
Post by Wykaaa
Post by Bruno Desthuilliers
Tout ça est un cas typique et exemplaire d'architecture pondue par un
astronaute. Faut redescendre sur terre, les gars.
Ben pas du tout. Ca existe et ça marche. Je pense tout simplement que
dans ton environnement, la réflexion n'est pas assez avancée.
Si. On a bien réfléchi à ce sujet, et le consensus général est "foutaise".
C'est pour ça qu'il y a tant de bug sur le Web. Je me demandais d'où ça
pouvait provenir, maintenant je comprends :
- inculture généralisée,
- aucune méthodologie
- pas ou peu de spécifications
- aucune vision à long terme
Bravo :-)
Post by Bruno Desthuilliers
Post by Wykaaa
Pourtant les bases XML devraient être largement utilisées...
Dieu merci non.
Arguments ?
Post by Bruno Desthuilliers
Post by Wykaaa
Post by Bruno Desthuilliers
Post by Wykaaa
Post by Bruno Desthuilliers
Dans le second cas... bin, bonne chance, hein.
On ne considère pas ce cas-là ;-)
Pourtant, vu l'emploi que tu semble faire des "programmeurs" (en
gros: pisser du code là où les "experts" leur ont dit de faire), tu
devrais sérieusement le considérer, parce que tu n'es pas près
d'attirer (et encore moins de conserver) des développeurs normalement
intelligents sur de tels postes. C'est du travail de singe que tu
leur propose, pas du travail de développeur.
Non, ils font aussi la conception détaillée
Tiens, je croyais qu'ils n'avaient même pas le droit d'inventer un objet
non prévu par messieurs les Grands Experts ?-)
En phase de CODAGE. Heureusement que ce sont eux qui s'occupent des
objets "d'implémentation" avec la conception détaillée car, comme tu le
dis fort justement, on n'irait pas loin avec mes experts métiers non
informaticien...

Mais même à ce stade, ttoutes les interfaces sont vérifiées et validées
lors de revues ("reviews").
Post by Bruno Desthuilliers
Post by Wykaaa
et ils doivent connaître parfaitement les environnement utilisés, en
particulier J2EE, CORBA, Apache, Jonas, les standards du Net genre
DOM, les Web Services,l'approche SOA, etc. et les APIs qui vont avec
tout ça...
Sans compter les logiciels de cartographie et les standards d'échanges
de messages dans le milieux militaire comme aDat-P3
Tout ça (ce paragraphe là, j'entend) reste de l'application pure et
simple - du travail de singe. Connaitre une API ? bon, bin tu lis la doc
et t'applique, quoi.
Faut appliquer intelligemment quand même !
Surtout en respectant les nombreuses contraintes de fiabilité, de sûreté
de fonctionnement et d'évolutivité.
Post by Bruno Desthuilliers
Post by Wykaaa
Post by Bruno Desthuilliers
Post by Wykaaa
Post by Bruno Desthuilliers
Post by Wykaaa
[snip]
[snip]
Post by Bruno Desthuilliers
Post by Wykaaa
Tu raisonnes toujours implémentation...
Puis-je te rappeler, Monsieur l'Astronaute, que sans implémentation,
tout ton beau travail d'expert est du gâchis de fric pur et simple. Le
but de la maneuvre est quand même bien d'avoir, au final, une putain
d'implémentation, et si possible raisonnablement fonctionnelle - pas des
tonnes de paperasses soigneusement formatées.
Bin oui, les systèmes dont je te parle sont opérationnels. Ils sont
effectivement accompagnés de tonnes de "paperasse" comme tu dis (la doc
des 15 systèmes de commandement de l'armée de terre représente 20 mètres
de linéaires).

[snip]
Bruno Desthuilliers
2009-11-17 16:16:04 UTC
Permalink
Post by Wykaaa
Post by Bruno Desthuilliers
Post by Wykaaa
Qui te dit qu'avec ce pattern on considère qu'une base relationnelle
est un entrepôt à octets ?
Bien sûr que le modèle relationnel est déjà une couche d'abstraction,
et alors ?
Il peut être lui-même encapsulé dans une couche d'abstraction plus
générale (le modèle CRUD pour Create, Read, Update, Delete, qui, lui,
est commun à l'ensemble des types de bases de données).
Si je te dis "opérations ensemblistes" et "algèbre relationnel", ça te
parles ?
Oui, pas de problème. Et les formes normales et tout le toutim...
Et tu ne vois pas où est le problème avec l'interface que tu proposes
ci-dessus ?
Post by Wykaaa
Post by Bruno Desthuilliers
Post by Wykaaa
Post by Bruno Desthuilliers
Quant aux "bases XML", là je me marre carrément.
Ah oui, pourquoi ?
Le système SICF (Système d'Information et de Commandement des Forces)
qui représente plusieurs millions de lignes de code utilise des bases
de données XML)
Super. Ah, oui, remarque, c'est en Java. C'est vrai que faire du Java
sans tout truffer de XML, ça ferait un peu désordre.
Quel mépris !
Non, un constat. Chaque fois que je vois une appli java, c'est truffé de
XML à toutes les sauces.
Post by Wykaaa
Post by Bruno Desthuilliers
Post by Wykaaa
De même avec les alliés, l'OTAN, etc.
Les bases de données XML sont essentielles dans cet environnement.
Tu auras une idée de l'utilisation d'XML chez les militaires
Non, merci.
Ah ben maintenant tu ne veux pas apprendre ?
Même pas un semblant de curiosité ?
Disons que j'ai d'autres trucs plus urgents sur mon agenda. Comme il n'y
a de toutes façons pas assez d'une vie entière pour faire le tour du
sujet (l'informatique en général), j'ai tendance à filtrer un minimum.
Post by Wykaaa
Post by Bruno Desthuilliers
Post by Wykaaa
Post by Bruno Desthuilliers
Tout ça est un cas typique et exemplaire d'architecture pondue par
un astronaute. Faut redescendre sur terre, les gars.
Ben pas du tout. Ca existe et ça marche. Je pense tout simplement que
dans ton environnement, la réflexion n'est pas assez avancée.
Si. On a bien réfléchi à ce sujet, et le consensus général est "foutaise".
C'est pour ça qu'il y a tant de bug sur le Web. Je me demandais d'où ça
- inculture généralisée,
- aucune méthodologie
- pas ou peu de spécifications
- aucune vision à long terme
Bravo :-)
Oh le joli troll. Là, bravo, en effet. Le raccourci est saisissant. Et
fait un bel amalgame entre pas mal de choses sans grand rapport, dont au
moins une part de tout à fait véridique au moins dans la grande majorité
des cas. Avec comme conclusion "logique" (évdemment fallacieuse) que le
rejet de test joujous préférés ne peut que s'expliquer ainsi.

Non, vraiment, très beau, très fort. Chapeau. Je prend des leçons.

Le pire c'est que le niveau moyen - en tous cas en France - n'est pas
loin de ce que tu cites.
Post by Wykaaa
Post by Bruno Desthuilliers
Post by Wykaaa
Post by Bruno Desthuilliers
Post by Wykaaa
Post by Bruno Desthuilliers
Dans le second cas... bin, bonne chance, hein.
On ne considère pas ce cas-là ;-)
Pourtant, vu l'emploi que tu semble faire des "programmeurs" (en
gros: pisser du code là où les "experts" leur ont dit de faire), tu
devrais sérieusement le considérer, parce que tu n'es pas près
d'attirer (et encore moins de conserver) des développeurs
normalement intelligents sur de tels postes. C'est du travail de
singe que tu leur propose, pas du travail de développeur.
Non, ils font aussi la conception détaillée
Tiens, je croyais qu'ils n'avaient même pas le droit d'inventer un
objet non prévu par messieurs les Grands Experts ?-)
En phase de CODAGE. Heureusement que ce sont eux qui s'occupent des
objets "d'implémentation" avec la conception détaillée car, comme tu le
dis fort justement, on n'irait pas loin avec mes experts métiers non
informaticien...
Ah... Donc l'implémentation est quand même considérée comme ayant une
quelconque importance, alors ? Excuse moi, mais vu la façon dont tu
présentait la chose, ça n'a rien d'évident...
Post by Wykaaa
[snip]
Post by Bruno Desthuilliers
Post by Wykaaa
Tu raisonnes toujours implémentation...
Puis-je te rappeler, Monsieur l'Astronaute, que sans implémentation,
tout ton beau travail d'expert est du gâchis de fric pur et simple. Le
but de la maneuvre est quand même bien d'avoir, au final, une putain
d'implémentation, et si possible raisonnablement fonctionnelle - pas
des tonnes de paperasses soigneusement formatées.
Bin oui, les systèmes dont je te parle sont opérationnels.
Alors pourquoi me reproches-tu de penser AUSSI en termes d'implémentation ?

Les dernières fois que j'ai vu des belles specs bien définies par des
"experts" de l'OO, c'était une monstrueuse usine à gaz, d'une
complexification totalement inutile - particulièrement compte tenu du
contexte - et dont l'implémentation a été aussi longue et fastidieuse
que totalement inefficiente - et s'avère bien sûr inmaintenable. Ah, et
bugguée aussi. Je te rassure tout de suite, y avait à peu près tout le
catalogue des design patterns, des accesseurs inutiles dans tous les
sens, et une base objet, enfin bref, la totale. Il faut deux serveurs
dédiées pour faire tourner le truc, et même comme ça, ça rame grave et
ça ne tient pas la montée en charge.

A part ça, on peut, je suppose, dire que le système est "opérationnel" -
dans la mesure où il est effectivement en production, au grand dam des
utilisateurs qui pestent à qui mieux mieux (et à mon grand regret car
j'ai hérité de la maintenance de cette monstruosité qu'on aurait dû
noyer à la naissance).

J'ai fait (analyse, conception, implémentation) des applis tout à fait
comparables (en termes de complexité, de volume de données etc) en
nettement moins de temps et pour nettement moins cher, fonctionnant
nettement mieux avec nettement moins de ressources, et qui s'avèrent
simple à maintenir, à faire évoluer, et à interfacer avec d'autres
systèmes. Il me semble que le fait que je pense _aussi_ "implémentation"
au lieu de partir sur la lune n'y est pas pour rien. Et ça ne veut
certainement pas dire que je fasse de l'optimisation prématurée... Bon,
j'ai pas dû tomber sur les bon "experts", faut croire. Mais quelque
chose me dit qu'avec tes méthodes, le temps que l'appli soit ne
serait-ce que spécifiée, la concurrence aurait déjà eu le temps de
manger le marché !-)
Wykaaa
2009-11-17 22:45:11 UTC
Permalink
Post by Bruno Desthuilliers
Post by Wykaaa
Post by Bruno Desthuilliers
Post by Wykaaa
Qui te dit qu'avec ce pattern on considère qu'une base relationnelle
est un entrepôt à octets ?
Bien sûr que le modèle relationnel est déjà une couche
d'abstraction, et alors ?
Il peut être lui-même encapsulé dans une couche d'abstraction plus
générale (le modèle CRUD pour Create, Read, Update, Delete, qui,
lui, est commun à l'ensemble des types de bases de données).
Si je te dis "opérations ensemblistes" et "algèbre relationnel", ça
te parles ?
Oui, pas de problème. Et les formes normales et tout le toutim...
Et tu ne vois pas où est le problème avec l'interface que tu proposes
ci-dessus ?
Enfin, c'était pour simplifier, hein. Parce que, dans la vraie vie,
l'interface dont je parle est quand même moins simple, mais pas tant que
cela.
Post by Bruno Desthuilliers
Post by Wykaaa
Post by Bruno Desthuilliers
Post by Wykaaa
Post by Bruno Desthuilliers
Quant aux "bases XML", là je me marre carrément.
Ah oui, pourquoi ?
Le système SICF (Système d'Information et de Commandement des
Forces) qui représente plusieurs millions de lignes de code utilise
des bases de données XML)
Super. Ah, oui, remarque, c'est en Java. C'est vrai que faire du Java
sans tout truffer de XML, ça ferait un peu désordre.
Quel mépris !
Non, un constat. Chaque fois que je vois une appli java, c'est truffé de
XML à toutes les sauces.
Bin aujourd'hui, avec les Web Services et la SOA, c'est un peu normal non ?
Post by Bruno Desthuilliers
Post by Wykaaa
Post by Bruno Desthuilliers
Post by Wykaaa
De même avec les alliés, l'OTAN, etc.
Les bases de données XML sont essentielles dans cet environnement.
Tu auras une idée de l'utilisation d'XML chez les militaires
Non, merci.
Ah ben maintenant tu ne veux pas apprendre ?
Même pas un semblant de curiosité ?
Disons que j'ai d'autres trucs plus urgents sur mon agenda. Comme il n'y
a de toutes façons pas assez d'une vie entière pour faire le tour du
sujet (l'informatique en général), j'ai tendance à filtrer un minimum.
Je comprends, c'est normal. Moi, je n'ai que cela à faire puisque je
suis jeune retraité. Ah, non, je fais aussi de la musique.
Post by Bruno Desthuilliers
Post by Wykaaa
Post by Bruno Desthuilliers
Post by Wykaaa
Post by Bruno Desthuilliers
Tout ça est un cas typique et exemplaire d'architecture pondue par
un astronaute. Faut redescendre sur terre, les gars.
Ben pas du tout. Ca existe et ça marche. Je pense tout simplement
que dans ton environnement, la réflexion n'est pas assez avancée.
Si. On a bien réfléchi à ce sujet, et le consensus général est "foutaise".
C'est pour ça qu'il y a tant de bug sur le Web. Je me demandais d'où
- inculture généralisée,
- aucune méthodologie
- pas ou peu de spécifications
- aucune vision à long terme
Bravo :-)
Oh le joli troll. Là, bravo, en effet. Le raccourci est saisissant. Et
fait un bel amalgame entre pas mal de choses sans grand rapport, dont au
moins une part de tout à fait véridique au moins dans la grande majorité
des cas. Avec comme conclusion "logique" (évdemment fallacieuse) que le
rejet de test joujous préférés ne peut que s'expliquer ainsi.
Non, vraiment, très beau, très fort. Chapeau. Je prend des leçons.
J'ai quand même été directeur de projet :-)
Post by Bruno Desthuilliers
Le pire c'est que le niveau moyen - en tous cas en France - n'est pas
loin de ce que tu cites.
Hélas, mille fois hélas, mais ne le prend pas pour toi car tu sais que,
même si on ne se connaît pas, je t'estime.
Post by Bruno Desthuilliers
Post by Wykaaa
Post by Bruno Desthuilliers
Post by Wykaaa
Post by Bruno Desthuilliers
Post by Wykaaa
Post by Bruno Desthuilliers
Dans le second cas... bin, bonne chance, hein.
On ne considère pas ce cas-là ;-)
Pourtant, vu l'emploi que tu semble faire des "programmeurs" (en
gros: pisser du code là où les "experts" leur ont dit de faire), tu
devrais sérieusement le considérer, parce que tu n'es pas près
d'attirer (et encore moins de conserver) des développeurs
normalement intelligents sur de tels postes. C'est du travail de
singe que tu leur propose, pas du travail de développeur.
Non, ils font aussi la conception détaillée
Tiens, je croyais qu'ils n'avaient même pas le droit d'inventer un
objet non prévu par messieurs les Grands Experts ?-)
En phase de CODAGE. Heureusement que ce sont eux qui s'occupent des
objets "d'implémentation" avec la conception détaillée car, comme tu
le dis fort justement, on n'irait pas loin avec mes experts métiers
non informaticien...
Ah... Donc l'implémentation est quand même considérée comme ayant une
quelconque importance, alors ? Excuse moi, mais vu la façon dont tu
présentait la chose, ça n'a rien d'évident...
C'est vrai. Excuse-moi.
Dans nos milieux un développeur fait la conception détaillée , le codage
et les tests unitaires.
Post by Bruno Desthuilliers
Post by Wykaaa
[snip]
Post by Bruno Desthuilliers
Post by Wykaaa
Tu raisonnes toujours implémentation...
Puis-je te rappeler, Monsieur l'Astronaute, que sans implémentation,
tout ton beau travail d'expert est du gâchis de fric pur et simple.
Le but de la maneuvre est quand même bien d'avoir, au final, une
putain d'implémentation, et si possible raisonnablement fonctionnelle
- pas des tonnes de paperasses soigneusement formatées.
Bin oui, les systèmes dont je te parle sont opérationnels.
Alors pourquoi me reproches-tu de penser AUSSI en termes d'implémentation ?
Les dernières fois que j'ai vu des belles specs bien définies par des
"experts" de l'OO, c'était une monstrueuse usine à gaz, d'une
complexification totalement inutile - particulièrement compte tenu du
contexte - et dont l'implémentation a été aussi longue et fastidieuse
que totalement inefficiente - et s'avère bien sûr inmaintenable. Ah, et
bugguée aussi. Je te rassure tout de suite, y avait à peu près tout le
catalogue des design patterns, des accesseurs inutiles dans tous les
sens, et une base objet, enfin bref, la totale. Il faut deux serveurs
dédiées pour faire tourner le truc, et même comme ça, ça rame grave et
ça ne tient pas la montée en charge.
Il n'y avait aucune exigence de performance et de charge du système dans
les specs initiales ?
Si c'était le cas, le client ne peut pas venir se plaindre ;-)
Post by Bruno Desthuilliers
A part ça, on peut, je suppose, dire que le système est "opérationnel" -
dans la mesure où il est effectivement en production, au grand dam des
utilisateurs qui pestent à qui mieux mieux (et à mon grand regret car
j'ai hérité de la maintenance de cette monstruosité qu'on aurait dû
noyer à la naissance).
Ah, l'acharnement thérapeutique !
Post by Bruno Desthuilliers
J'ai fait (analyse, conception, implémentation) des applis tout à fait
comparables (en termes de complexité, de volume de données etc) en
nettement moins de temps et pour nettement moins cher, fonctionnant
nettement mieux avec nettement moins de ressources, et qui s'avèrent
simple à maintenir, à faire évoluer, et à interfacer avec d'autres
systèmes. Il me semble que le fait que je pense _aussi_ "implémentation"
au lieu de partir sur la lune n'y est pas pour rien. Et ça ne veut
certainement pas dire que je fasse de l'optimisation prématurée... Bon,
j'ai pas dû tomber sur les bon "experts", faut croire. Mais quelque
chose me dit qu'avec tes méthodes, le temps que l'appli soit ne
serait-ce que spécifiée, la concurrence aurait déjà eu le temps de
manger le marché !-)
Tu te trompes car il n'y a quasiment pas de concurrence . Ce sont
toujours les mêmes car "le ticket d'entrée" dans ce domaine est
tellement élevé que peu peuvent se le payer...

Ceci dit, heureusement que dans ces projets on se soucie de
l'implémentation, même si tu as l'impression qu'on part "sur la lune"
(d'ailleurs ça serait plutôt sur Jupiter : c'est plus loin et c'est plus
gros...). C'est la nature des problèmes adressés qui veut que tu ais
cette impression. Si l'on ne s'y prenait pas comme ça, les systèmes ne
sortiraient jamais !
Bruno Desthuilliers
2009-11-18 09:34:11 UTC
Permalink
(snip)
Post by Wykaaa
Post by Bruno Desthuilliers
Post by Wykaaa
Post by Bruno Desthuilliers
Super. Ah, oui, remarque, c'est en Java. C'est vrai que faire du
Java sans tout truffer de XML, ça ferait un peu désordre.
Quel mépris !
Non, un constat. Chaque fois que je vois une appli java, c'est truffé
de XML à toutes les sauces.
Bin aujourd'hui, avec les Web Services et la SOA, c'est un peu normal non ?
json, ça marche pas mal aussi pour les webservices, et c'est nettement
moins verbeux (donc moins de travail pour générer, transmettre et parser
les données).
Post by Wykaaa
Post by Bruno Desthuilliers
Post by Wykaaa
Ah ben maintenant tu ne veux pas apprendre ?
Même pas un semblant de curiosité ?
Disons que j'ai d'autres trucs plus urgents sur mon agenda. Comme il
n'y a de toutes façons pas assez d'une vie entière pour faire le tour
du sujet (l'informatique en général), j'ai tendance à filtrer un minimum.
Je comprends, c'est normal. Moi, je n'ai que cela à faire puisque je
suis jeune retraité. Ah, non, je fais aussi de la musique.
Moi aussi. Pour la musique, je veux, dire - pour la retraite, au train
où vont les choses, j'y compte même plus...
Post by Wykaaa
Post by Bruno Desthuilliers
Post by Wykaaa
C'est pour ça qu'il y a tant de bug sur le Web. Je me demandais d'où
- inculture généralisée,
- aucune méthodologie
- pas ou peu de spécifications
- aucune vision à long terme
Bravo :-)
Oh le joli troll. Là, bravo, en effet. Le raccourci est saisissant. Et
fait un bel amalgame entre pas mal de choses sans grand rapport, dont
au moins une part de tout à fait véridique au moins dans la grande
majorité des cas. Avec comme conclusion "logique" (évdemment
fallacieuse) que le rejet de test joujous préférés ne peut que
s'expliquer ainsi.
Non, vraiment, très beau, très fort. Chapeau. Je prend des leçons.
J'ai quand même été directeur de projet :-)
Ah oui, c'est vrai, j'avais oublié. C'est vrai que ça doit aider !-)
Post by Wykaaa
Post by Bruno Desthuilliers
Le pire c'est que le niveau moyen - en tous cas en France - n'est pas
loin de ce que tu cites.
Hélas, mille fois hélas, mais ne le prend pas pour toi car tu sais que,
même si on ne se connaît pas, je t'estime.
"""
Votre mission, si vous l'acceptez, sera de réussir à livrer dans les
délais une application raisonnablement fonctionnielle, malgré un
environnement se caractérisant par (cf ta description...)
"""
Post by Wykaaa
Post by Bruno Desthuilliers
Post by Wykaaa
Post by Bruno Desthuilliers
Tiens, je croyais qu'ils n'avaient même pas le droit d'inventer un
objet non prévu par messieurs les Grands Experts ?-)
En phase de CODAGE.
Heureusement que ce sont eux qui s'occupent des
objets "d'implémentation" avec la conception détaillée
Ca sent quand même grave le waterfall, ton truc.
Post by Wykaaa
Post by Bruno Desthuilliers
Post by Wykaaa
car, comme tu
le dis fort justement, on n'irait pas loin avec mes experts métiers
non informaticien...
Ah bin ça, pour sûr... C'est pas eux qui vont penser aux objets techniques.
Post by Wykaaa
Post by Bruno Desthuilliers
Post by Wykaaa
[snip]
Post by Bruno Desthuilliers
Post by Wykaaa
Tu raisonnes toujours implémentation...
Puis-je te rappeler, Monsieur l'Astronaute, que sans implémentation,
tout ton beau travail d'expert est du gâchis de fric pur et simple.
Le but de la maneuvre est quand même bien d'avoir, au final, une
putain d'implémentation, et si possible raisonnablement
fonctionnelle - pas des tonnes de paperasses soigneusement formatées.
Bin oui, les systèmes dont je te parle sont opérationnels.
Alors pourquoi me reproches-tu de penser AUSSI en termes
d'implémentation ?
Les dernières fois que j'ai vu des belles specs bien définies par des
"experts" de l'OO, c'était une monstrueuse usine à gaz, d'une
complexification totalement inutile - particulièrement compte tenu du
contexte - et dont l'implémentation a été aussi longue et fastidieuse
que totalement inefficiente - et s'avère bien sûr inmaintenable. Ah,
et bugguée aussi. Je te rassure tout de suite, y avait à peu près tout
le catalogue des design patterns, des accesseurs inutiles dans tous
les sens, et une base objet, enfin bref, la totale. Il faut deux
serveurs dédiées pour faire tourner le truc, et même comme ça, ça rame
grave et ça ne tient pas la montée en charge.
Il n'y avait aucune exigence de performance et de charge du système dans
les specs initiales ?
Peut-être pas assez clairement formulées.
Post by Wykaaa
Si c'était le cas, le client ne peut pas venir se plaindre ;-)
Il y a un peu comme du copinage entre ce client et mon patron, donc
c'est un peu spécial comme cas. Je pense que n'importe quel autre client
aurait fait un scandale.
Post by Wykaaa
Post by Bruno Desthuilliers
A part ça, on peut, je suppose, dire que le système est "opérationnel"
- dans la mesure où il est effectivement en production, au grand dam
des utilisateurs qui pestent à qui mieux mieux (et à mon grand regret
car j'ai hérité de la maintenance de cette monstruosité qu'on aurait
dû noyer à la naissance).
Ah, l'acharnement thérapeutique !
C'est d'autant plus débile qu'avec tout le temps que j'ai déjà perdu sur
cette appli - en maintenance applicative et administration système -,
j'aurai déjà pu en réécrire la moitié...
Post by Wykaaa
Post by Bruno Desthuilliers
Mais quelque chose me dit qu'avec tes méthodes, le temps que
l'appli soit ne serait-ce que spécifiée, la concurrence aurait déjà eu
le temps de manger le marché !-)
Tu te trompes car il n'y a quasiment pas de concurrence .
Je parlais de mon domaine, pas du tien.
Post by Wykaaa
Ceci dit, heureusement que dans ces projets on se soucie de
l'implémentation, même si tu as l'impression qu'on part "sur la lune"
(d'ailleurs ça serait plutôt sur Jupiter : c'est plus loin et c'est plus
gros...). C'est la nature des problèmes adressés qui veut que tu ais
cette impression. Si l'on ne s'y prenait pas comme ça, les systèmes ne
sortiraient jamais !
C'est possible - mais ça ne veut pas dire que cette approche soit la
bonne dans tous les cas et tous les domaines. Je n'essaierais
certainement pas d'appliquer _mes_ méthodes et technos à des logiciels
de surveillance de centrale nucléaire ou de guidage de missile
balistique. Et si tu essayais d'appliquer _tes_ méthodes ici (dans une
agence web, j'entends), tu prendrais le bouillon immédiatement - le
temps que tu ai fini l'étude préalable, le projet aurais été confié à
une autre équipe, réalisé et mis en prod depuis longtemps.

Là dessus, je te laisse, je dois étudier une demande d'un client - reçue
hier soir - pour un truc qui doit impérativement être en prod dans
quelques jours !-)
ld
2009-11-10 09:40:30 UTC
Permalink
Post by Bruno Desthuilliers
Ca, on peut pas dire que ce soit très vivant ic. Ca commence même à
sentir un peu...
  Voui. Les rares discussions objet intéressantes ont plutôt lieu
sur les forum des langages...
Ou ils restent tres partisant...

a+, ld.
Bruno Desthuilliers
2009-11-12 20:18:26 UTC
Permalink
Post by ld
Post by Marc Boyer
Post by Bruno Desthuilliers
Ca, on peut pas dire que ce soit très vivant ic. Ca commence même à
sentir un peu...
Voui. Les rares discussions objet intéressantes ont plutôt lieu
sur les forum des langages...
Ou ils restent tres partisant...
Pas comme ici, quoi ?-)
ld
2009-11-13 00:04:52 UTC
Permalink
On Nov 12, 9:18 pm, Bruno Desthuilliers
Post by Bruno Desthuilliers
Post by ld
Post by Bruno Desthuilliers
Ca, on peut pas dire que ce soit très vivant ic. Ca commence même à
sentir un peu...
  Voui. Les rares discussions objet intéressantes ont plutôt lieu
sur les forum des langages...
Ou ils restent tres partisant...
Pas comme ici, quoi ?-)
Disons qu'ici on peut esperer que les points de vue soient moins
rattaches a un langage mais plutot a un ensemble de langage (famille)
qu'on pourrait appeler une "ecole de pense". Ce thread est un bon
exemple ou par exemple ta question sur les types est percue de deux
facons differentes: le type induit les comportements (methodes,
statique, C++) ou les comportements (messages, dynamique, Objc)
induisent le (les) type(s) (ou le 's' denote typiquement un class-
cluster). Evidement, le point de vue change radicalement la definition
d'un type. Certains pense que connaitre le type d'un objet est plus
important (je dirais plus rassurant) que de savoir ce qu'on peut faire
avec: le type devient secondaire et plutot lie a la structure de
l'implementation. Aucun des deux ne permet de prouver qu'un programme
est correct. En revanche, l'approche statique oblige les developpeurs
a formaliser les relations (a tous les niveaux) ce qui peut rassurer
sur le design et aider a communiquer, mais aussi augmente les
contraintes et la complexite.

mes 2 centimes de contributions.

a+, ld.
Bruno Desthuilliers
2009-11-13 20:33:54 UTC
Permalink
On Nov 12, 9:18 pm, Bruno Desthuilliers
Post by Bruno Desthuilliers
Post by ld
Post by Marc Boyer
Post by Bruno Desthuilliers
Ca, on peut pas dire que ce soit très vivant ic. Ca commence même à
sentir un peu...
Voui. Les rares discussions objet intéressantes ont plutôt lieu
sur les forum des langages...
Ou ils restent tres partisant...
Pas comme ici, quoi ?-)
Disons qu'ici on peut esperer que les points de vue soient moins
rattaches a un langage mais plutot a un ensemble de langage (famille)
qu'on pourrait appeler une "ecole de pense".
Ca n'en reste pas moins très partisan !-)
Ce thread est un bon
exemple ou par exemple ta question sur les types est percue de deux
facons differentes: le type induit les comportements (methodes,
statique, C++) ou les comportements (messages, dynamique, Objc)
induisent le (les) type(s) (ou le 's' denote typiquement un class-
cluster). Evidement, le point de vue change radicalement la definition
d'un type.
Oui. Ca change même radicalement pas mal d'autres choses. Par exemple de
donner une place prépondérante à l'objet ou à la classe. Un des trucs
qui me frappent dans le point de vue de Wykaaa, c'est qu'il pense parler
de (et même définir) l'approche "objet" alors que "son" concept
fondamental est la classe.

Accessoirement, Alan Kay - à qui (selon la légende au moins) on doit le
terme même de "object-oriented programming" - a par la suite affirmer
qu'avec le recul il regrettait de ne pas plutôt avoir parler de "message
oriented programming".
Certains pense que connaitre le type d'un objet est plus
important (je dirais plus rassurant) que de savoir ce qu'on peut faire
Ce qui me semble aller à l'encontre du principe même de communication
par envoi de message, et donc du découplage entre interface et
implémentation. En se focalisant sur le "type" et en limitant
arbitrairement les destinataires potentiel d'un message selon ce critère
formel, on réintroduit - même si à un niveau moindre - un couplage entre
interface et implémentation.

De mon point de vue, cette approche dénote d'une incompréhension d'un -
pour ne pas dire *du* - concept fondamental de l'OO.
le type devient secondaire et plutot lie a la structure de
l'implementation. Aucun des deux ne permet de prouver qu'un programme
est correct. En revanche, l'approche statique oblige les developpeurs
a formaliser les relations (a tous les niveaux) ce qui peut rassurer
sur le design et aider a communiquer,
Je n'ai rien contre la formalisation des interfaces et relation, bien au
contraire - mais au point de vue conceptuel et documentaire. Quant à la
mais aussi augmente les
contraintes et la complexite.
Bin voilà. Ca crée de la complexité accidentelle - comme si on n'avait
déjà pas assez à faire avec la complexité intrinsèque - et du couplage -
comme si la gestion des dépendances n'était déjà pas assez compliquée -
sans apporter de garantie *effective* de correction.
mes 2 centimes de contributions.
Tu es trop modeste - tes contributions valent plus que ça !-)
ld
2009-11-14 01:35:58 UTC
Permalink
On Nov 13, 9:33 pm, Bruno Desthuilliers
Post by Bruno Desthuilliers
On Nov 12, 9:18 pm, Bruno Desthuilliers
Certains pense que connaitre le type d'un objet est plus
important (je dirais plus rassurant) que de savoir ce qu'on peut faire
Ce qui me semble aller à l'encontre du principe même de communication
par envoi de message, et donc du découplage entre interface et
implémentation. En se focalisant sur le "type" et en limitant
arbitrairement les destinataires potentiel d'un message selon ce critère
formel, on réintroduit - même si à un niveau moindre - un couplage entre
interface et implémentation.
Dans la mesure ou COS est base sur les multi-methodes (message
_associe_ a plusieurs types) et la delegation (message _dissocie_ d'un
type), il devient difficile, voir impossible de parler de message
associe a _un_ type. Les types structurent l'implementation, pour le
reste, il vaut mieux s'en tenir aux messages (interface). Mon cas
d'ecole: le Locker ;-) qui enleve les deadlocks d'un programme sans
_intrusion_ dans le code client (pas necessaire d'avoir les
sources ;-). Par exemple pour un objet partage on l'utilise comme
ceci:

useclass(Locker);
OBJ shared_object = gnewWith(Locker, object);

// code utilisant shared_object en concurrence a la place de object.

et desormais sont utilisation sera synchronisee sans provoquer de
deadlock, peut importe ce que 'object' est ou sera. Ce type de
composant ne pourra jamais etre definit dans un langage qui ne
supporte pas au minimum les multi-methodes et la delegation. Je laisse
les theoriciens formaliser tout cela dans un systeme de typage
statique. Pendant ce temps j'ai la synchronisation for free ;-)

a+, ld.
Wykaaa
2009-11-14 11:45:11 UTC
Permalink
Post by Bruno Desthuilliers
On Nov 12, 9:18 pm, Bruno Desthuilliers
Post by Bruno Desthuilliers
Post by ld
Post by Marc Boyer
Post by Bruno Desthuilliers
Ca, on peut pas dire que ce soit très vivant ic. Ca commence même à
sentir un peu...
Voui. Les rares discussions objet intéressantes ont plutôt lieu
sur les forum des langages...
Ou ils restent tres partisant...
Pas comme ici, quoi ?-)
Disons qu'ici on peut esperer que les points de vue soient moins
rattaches a un langage mais plutot a un ensemble de langage (famille)
qu'on pourrait appeler une "ecole de pense".
Ca n'en reste pas moins très partisan !-)
Ce thread est un bon
exemple ou par exemple ta question sur les types est percue de deux
facons differentes: le type induit les comportements (methodes,
statique, C++) ou les comportements (messages, dynamique, Objc)
induisent le (les) type(s) (ou le 's' denote typiquement un class-
cluster). Evidement, le point de vue change radicalement la definition
d'un type.
Oui. Ca change même radicalement pas mal d'autres choses. Par exemple de
donner une place prépondérante à l'objet ou à la classe. Un des trucs
qui me frappent dans le point de vue de Wykaaa, c'est qu'il pense parler
de (et même définir) l'approche "objet" alors que "son" concept
fondamental est la classe.
Le (et non "mon") concept fondamental est le concept d'abstraction qui,
c'est vrai, dans la plupart des langages objets (sinon tous), se traduit
pas le mot clé "classe". D'ailleurs faire de la conception objet c'est
identifier les abstractions et établir leurs dépendances (composition,
agrégation, héritage).
Post by Bruno Desthuilliers
Accessoirement, Alan Kay - à qui (selon la légende au moins) on doit le
terme même de "object-oriented programming" - a par la suite affirmer
qu'avec le recul il regrettait de ne pas plutôt avoir parler de "message
oriented programming".
Il me semble que c'est effectivement une légende.
Post by Bruno Desthuilliers
Certains pense que connaitre le type d'un objet est plus
important (je dirais plus rassurant) que de savoir ce qu'on peut faire
Ce qui me semble aller à l'encontre du principe même de communication
par envoi de message, et donc du découplage entre interface et
implémentation. En se focalisant sur le "type" et en limitant
arbitrairement les destinataires potentiel d'un message selon ce critère
formel, on réintroduit - même si à un niveau moindre - un couplage entre
interface et implémentation.
Ce qui découple l'interface de son implémentation c'est l'encapsulation,
après elle peut être implémentée selon différents mécanismes.
Post by Bruno Desthuilliers
De mon point de vue, cette approche dénote d'une incompréhension d'un -
pour ne pas dire *du* - concept fondamental de l'OO.
Le typage est un concept mineur dans l'approche objet. Ce qui est
fondamental c'est le concept d'abstraction autour duquel tout les autres
principes de l'approche objet s'organisent.
[snip]
Bruno Desthuilliers
2009-11-15 13:26:44 UTC
Permalink
(snip)
Post by Wykaaa
Post by Bruno Desthuilliers
Post by ld
Ce thread est un bon
exemple ou par exemple ta question sur les types est percue de deux
facons differentes: le type induit les comportements (methodes,
statique, C++) ou les comportements (messages, dynamique, Objc)
induisent le (les) type(s) (ou le 's' denote typiquement un class-
cluster). Evidement, le point de vue change radicalement la definition
d'un type.
Oui. Ca change même radicalement pas mal d'autres choses. Par exemple de
donner une place prépondérante à l'objet ou à la classe. Un des trucs
qui me frappent dans le point de vue de Wykaaa, c'est qu'il pense parler
de (et même définir) l'approche "objet" alors que "son" concept
fondamental est la classe.
Le (et non "mon") concept fondamental est le concept d'abstraction
Tout en informatique étant abstraction, avec une déclaration pareille,
on ne va pas bien loin...
Post by Wykaaa
qui,
c'est vrai, dans la plupart des langages objets (sinon tous), se traduit
pas le mot clé "classe".
Wikaaa, un "objet" (en POO) *est* une abstraction. Une "classe" en est
une autre qui décrit, peu ou ou prou, comment "fabriquer" (pour une
définition assez abstraite de "fabriquer") un nombre indéfini d'"objets"
ayant - au moins à un certain moment (pour une définition toujours assez
abstraite de "moment") - certaines "caractéristiques" (on ne peut plas
abstraites) en commun. Ces abstractions appelées "objets" vont ensuite
"communiquer" (pour une définition toujours assez abstraite de
"communiquer") en échangeant des abstractions de "messages".

On nage en pleine abstraction, là. Alors affirmer que (pour reformuler)
"(en OO) _le_ concept fondamental d'abstraction est la classe" me semble
au mieux relever de la myopie.

Du point de vue de l'implémentation, fondamentalement, une classe est
une fabrique à objet. De même qu'un prototype, d'ailleurs. Ce avec quoi
on travaille le plus, ça reste bien les objets. Ce que mon code
manipule, ce sont des objets (le fait est qu'en Python les classes
elles-mêmes sont des objets, et qu'il est relativement courant que mon
code manipule des objets "classes", mais à ce stade ça ne change pas
grand chose - ce sont bien _avant tout_ des objets que je suis en train
de manipuler).
Post by Wykaaa
D'ailleurs faire de la conception objet c'est
identifier les abstractions et établir leurs dépendances (composition,
agrégation, héritage).
Ca ne s'arrête pas à ça, loin s'en faut. Le diagramme de classes n'est
qu'un des diagrammes d'UML, et c'est le seul à être centré sur les
classes - la plupart des autres sont centrés sur les objets et les
messages. Avec un diagramme de classes - de même qu'avec un MCD -, tout
ce que tu capture est une vue statique du système, qui ne permet en rien
(ou si faiblement que c'en est dérisoire) d'exposer la _dynamique_ du
système - c'est à dire, comment fonctionne *effectivement* le système à
l'exécution.
Post by Wykaaa
Post by Bruno Desthuilliers
Accessoirement, Alan Kay - à qui (selon la légende au moins) on doit le
terme même de "object-oriented programming" - a par la suite affirmer
qu'avec le recul il regrettait de ne pas plutôt avoir parler de "message
oriented programming".
Il me semble que c'est effectivement une légende.
La plupart des légendes se fondent sur un élément de vérité.
Accessoirement, et à ma connaissance, personne d'autre n'a pour le
moment revendiquer la paternité de ce terme. Ou alors vraiment très très
discrètement...
Post by Wykaaa
Post by Bruno Desthuilliers
Post by ld
Certains pense que connaitre le type d'un objet est plus
important (je dirais plus rassurant) que de savoir ce qu'on peut faire
Ce qui me semble aller à l'encontre du principe même de communication
par envoi de message, et donc du découplage entre interface et
implémentation. En se focalisant sur le "type" et en limitant
arbitrairement les destinataires potentiel d'un message selon ce critère
formel, on réintroduit - même si à un niveau moindre - un couplage entre
interface et implémentation.
Ce qui découple l'interface de son implémentation c'est l'encapsulation,
Tu inverse encore une fois la cause et l'effet. L'encapsulation
*résulte* du fait de découpler l'interface de l'implémentation.
Post by Wykaaa
après elle peut être implémentée selon différents mécanismes.
Tu veux dire que le support pour ce découplage peut être fourni par
différents mécanismes, je suppose.
Post by Wykaaa
Post by Bruno Desthuilliers
De mon point de vue, cette approche dénote d'une incompréhension d'un -
pour ne pas dire *du* - concept fondamental de l'OO.
Le typage est un concept mineur dans l'approche objet. Ce qui est
fondamental c'est le concept d'abstraction
D'abstraction de quoi ?-)
Post by Wykaaa
autour duquel tout les autres
principes de l'approche objet s'organisent.
[snip]
Wykaaa
2009-11-15 22:11:21 UTC
Permalink
Post by Bruno Desthuilliers
(snip)
Post by Wykaaa
Post by Bruno Desthuilliers
Post by ld
Ce thread est un bon
exemple ou par exemple ta question sur les types est percue de deux
facons differentes: le type induit les comportements (methodes,
statique, C++) ou les comportements (messages, dynamique, Objc)
induisent le (les) type(s) (ou le 's' denote typiquement un class-
cluster). Evidement, le point de vue change radicalement la definition
d'un type.
Oui. Ca change même radicalement pas mal d'autres choses. Par exemple de
donner une place prépondérante à l'objet ou à la classe. Un des trucs
qui me frappent dans le point de vue de Wykaaa, c'est qu'il pense parler
de (et même définir) l'approche "objet" alors que "son" concept
fondamental est la classe.
Le (et non "mon") concept fondamental est le concept d'abstraction
Tout en informatique étant abstraction, avec une déclaration pareille,
on ne va pas bien loin...
Abstraction au sens de Grady Booch dont j'ai donné la définition dans un
autre message.
Post by Bruno Desthuilliers
Post by Wykaaa
qui,
c'est vrai, dans la plupart des langages objets (sinon tous), se traduit
pas le mot clé "classe".
[snip]
Post by Bruno Desthuilliers
On nage en pleine abstraction, là. Alors affirmer que (pour reformuler)
"(en OO) _le_ concept fondamental d'abstraction est la classe" me semble
au mieux relever de la myopie.
Alors Grady Booch, Bertrand Meyer and Co sont myopes !
Post by Bruno Desthuilliers
Du point de vue de l'implémentation, fondamentalement, une classe est
une fabrique à objet. De même qu'un prototype, d'ailleurs. Ce avec quoi
on travaille le plus, ça reste bien les objets. Ce que mon code
manipule, ce sont des objets (le fait est qu'en Python les classes
elles-mêmes sont des objets, et qu'il est relativement courant que mon
code manipule des objets "classes", mais à ce stade ça ne change pas
grand chose - ce sont bien _avant tout_ des objets que je suis en train
de manipuler).
Tu parles de code, je parle d'approche objet en général. En
programmation objet, on ne manipule que des objets, évidemment.
Post by Bruno Desthuilliers
Post by Wykaaa
D'ailleurs faire de la conception objet c'est
identifier les abstractions et établir leurs dépendances (composition,
agrégation, héritage).
Ca ne s'arrête pas à ça, loin s'en faut. Le diagramme de classes n'est
qu'un des diagrammes d'UML, et c'est le seul à être centré sur les
classes - la plupart des autres sont centrés sur les objets et les
messages. Avec un diagramme de classes - de même qu'avec un MCD -, tout
ce que tu capture est une vue statique du système, qui ne permet en rien
(ou si faiblement que c'en est dérisoire) d'exposer la _dynamique_ du
système - c'est à dire, comment fonctionne *effectivement* le système à
l'exécution.
Je suis d'accord, mais on était sur classe et objet. Evidemment qu'en
UML j'utilise aussi les diagrammes de séquence, d'activité, d'états,
depackage et que sais-je encore.


[snip]
Post by Bruno Desthuilliers
Post by Wykaaa
après elle peut être implémentée selon différents mécanismes.
Tu veux dire que le support pour ce découplage peut être fourni par
différents mécanismes, je suppose.
Oui, tout à fait.
Bruno Desthuilliers
2009-11-16 21:15:24 UTC
Permalink
Post by Wykaaa
Post by Bruno Desthuilliers
(snip)
Post by Wykaaa
Post by Bruno Desthuilliers
Post by ld
Ce thread est un bon
exemple ou par exemple ta question sur les types est percue de deux
facons differentes: le type induit les comportements (methodes,
statique, C++) ou les comportements (messages, dynamique, Objc)
induisent le (les) type(s) (ou le 's' denote typiquement un class-
cluster). Evidement, le point de vue change radicalement la definition
d'un type.
Oui. Ca change même radicalement pas mal d'autres choses. Par exemple de
donner une place prépondérante à l'objet ou à la classe. Un des trucs
qui me frappent dans le point de vue de Wykaaa, c'est qu'il pense parler
de (et même définir) l'approche "objet" alors que "son" concept
fondamental est la classe.
Le (et non "mon") concept fondamental est le concept d'abstraction
Tout en informatique étant abstraction, avec une déclaration pareille,
on ne va pas bien loin...
Abstraction au sens de Grady Booch dont j'ai donné la définition dans un
autre message.
Ce n'est pas parce que GradyBoochADitQue que la question est close et
qu'on doive fermer sa gueule et mettre son cerveau en standby.

Même une *vraie* théorie scientifique reste une théorie, qui n'est
valide que tant qu'on n'en a pas trouvée de meilleure (avec une
définition _très_ claire de "meilleure"). Et les écrits de tous ces bons
"ex-pairs" de l'OO n'ont *rien* de scientifique, malgré certaines
prétentions qui ferait se pisser dessus n'importe quel épistémologue.
Post by Wykaaa
Post by Bruno Desthuilliers
Post by Wykaaa
qui,
c'est vrai, dans la plupart des langages objets (sinon tous), se traduit
pas le mot clé "classe".
[snip]
Post by Bruno Desthuilliers
On nage en pleine abstraction, là. Alors affirmer que (pour reformuler)
"(en OO) _le_ concept fondamental d'abstraction est la classe" me semble
au mieux relever de la myopie.
Alors Grady Booch, Bertrand Meyer and Co sont myopes !
Ah bin tu vois, quand tu veux !-)


Plus sérieusement, est-ce que tu es capable de faire la différence entre
ces deux propositions:

1/ "Dans le cadre de la méthode de conception objet définie par Grady
Booch, le concept fondamental d'abstraction fondamentale est la classe"

et

2/ "En OO, _le_ concept fondamental d'abstraction fondamentale est la
classe"

Notes que tu a bien sûr le droit de trouver à la méthode de Grady Booch
toutes les qualités que tu veux, à commencer par celle de correspondre à
ta propre façon de mener ton activité. Simplement, ça n'en fait pas une
vérité universelle (au sens où les théories scientifiques admises par la
communauté ont valeur de vérités universelles), et ça ne te donne pas le
droit d'affirmer que d'autres méthodes ou d'autres façons de concevoir
l'OO ne sont pas tout aussi légitimes et valides.
Post by Wykaaa
Post by Bruno Desthuilliers
Du point de vue de l'implémentation, fondamentalement, une classe est
une fabrique à objet. De même qu'un prototype, d'ailleurs. Ce avec quoi
on travaille le plus, ça reste bien les objets. Ce que mon code
manipule, ce sont des objets (le fait est qu'en Python les classes
elles-mêmes sont des objets, et qu'il est relativement courant que mon
code manipule des objets "classes", mais à ce stade ça ne change pas
grand chose - ce sont bien _avant tout_ des objets que je suis en train
de manipuler).
Tu parles de code, je parle d'approche objet en général.
Le code décrivant la dynamique du programme, je vois mal comment on
pourrait faire l'impasse dessus. Le code participe tout autant de
l'approche objet que l'analyse et la conception. Le terme originel est
d'ailleurs bien "*programmation* orientée objet".

AMHA, ton environnement plein d'experts qui ne connaissent rien à
l'informatique mais dictent à des singes programmeurs ce qu'ils doivent
pisser commence à déformer sérieusement ta vision. Dans la majorité des
cas, il n'y a pas de cloisement étanche entre conception et
programmation - au contraire, il y a des aller-retours constant entre
ces deux activités, généralement menés par les mêmes personnes. J'irai
même jusqu'à dire que, à un certain niveau de détail dans la conception,
ce ne sont que deux facettes d'une même activité.
Post by Wykaaa
En
programmation objet, on ne manipule que des objets, évidemment.
Donc l'abstraction centrale de la programmation orientée objet est
l'objet, merci Monsieur de la Palisse.
Post by Wykaaa
Post by Bruno Desthuilliers
Post by Wykaaa
D'ailleurs faire de la conception objet c'est
identifier les abstractions et établir leurs dépendances (composition,
agrégation, héritage).
Ca ne s'arrête pas à ça, loin s'en faut. Le diagramme de classes n'est
qu'un des diagrammes d'UML, et c'est le seul à être centré sur les
classes - la plupart des autres sont centrés sur les objets et les
messages. Avec un diagramme de classes - de même qu'avec un MCD -, tout
ce que tu capture est une vue statique du système, qui ne permet en rien
(ou si faiblement que c'en est dérisoire) d'exposer la _dynamique_ du
système - c'est à dire, comment fonctionne *effectivement* le système à
l'exécution.
Je suis d'accord, mais on était sur classe et objet.
Oui, justement. A l'exécution, ce sont bien des objets qui vont
interagir, et le diagramme de classes ne dit que très peu de choses sur
ces interactions qui sont pourtant essentielles.
Post by Wykaaa
Evidemment qu'en
UML j'utilise aussi les diagrammes de séquence, d'activité, d'états,
Qui décrivent soit des interactions entre des objets, soit les
changements d'état d'un seul objet. Faut croire que même en conception,
les objet ont une importance, finalement...
Wykaaa
2009-11-17 10:31:42 UTC
Permalink
Post by Bruno Desthuilliers
Post by Wykaaa
Post by Bruno Desthuilliers
(snip)
Post by Wykaaa
Post by Bruno Desthuilliers
Post by ld
Ce thread est un bon
exemple ou par exemple ta question sur les types est percue de deux
facons differentes: le type induit les comportements (methodes,
statique, C++) ou les comportements (messages, dynamique, Objc)
induisent le (les) type(s) (ou le 's' denote typiquement un class-
cluster). Evidement, le point de vue change radicalement la definition
d'un type.
Oui. Ca change même radicalement pas mal d'autres choses. Par exemple de
donner une place prépondérante à l'objet ou à la classe. Un des trucs
qui me frappent dans le point de vue de Wykaaa, c'est qu'il pense parler
de (et même définir) l'approche "objet" alors que "son" concept
fondamental est la classe.
Le (et non "mon") concept fondamental est le concept d'abstraction
Tout en informatique étant abstraction, avec une déclaration pareille,
on ne va pas bien loin...
Abstraction au sens de Grady Booch dont j'ai donné la définition dans un
autre message.
Ce n'est pas parce que GradyBoochADitQue que la question est close et
qu'on doive fermer sa gueule et mettre son cerveau en standby.
Même une *vraie* théorie scientifique reste une théorie, qui n'est
valide que tant qu'on n'en a pas trouvée de meilleure (avec une
définition _très_ claire de "meilleure"). Et les écrits de tous ces bons
"ex-pairs" de l'OO n'ont *rien* de scientifique, malgré certaines
prétentions qui ferait se pisser dessus n'importe quel épistémologue.
Je n'ai jamais prétendu qu'il existait une théorie scientifique de l'OO,
j'ai simplement dit que l'approche objet telle que définie par ses
créateurs était assez précisément définie et j'en ai donné des preuves
par ailleurs. Celui qui résume (si on peut dire car son bouquin fait
1200 pages !) le mieux cette approche est Bertrand Meyer dans
"Conception et programmation objet (ISBN : 2-212-09111-7).
Post by Bruno Desthuilliers
Post by Wykaaa
Post by Bruno Desthuilliers
Post by Wykaaa
qui,
c'est vrai, dans la plupart des langages objets (sinon tous), se traduit
pas le mot clé "classe".
[snip]
Post by Bruno Desthuilliers
On nage en pleine abstraction, là. Alors affirmer que (pour reformuler)
"(en OO) _le_ concept fondamental d'abstraction est la classe" me semble
au mieux relever de la myopie.
Alors Grady Booch, Bertrand Meyer and Co sont myopes !
Ah bin tu vois, quand tu veux !-)
Bertrand Meyer dans le chapitre 2 p25 (critères d'orientation objet) :
la méthode et le langage devraient utiliser la notion de classe comme
concept central.
Post by Bruno Desthuilliers
Plus sérieusement, est-ce que tu es capable de faire la différence entre
1/ "Dans le cadre de la méthode de conception objet définie par Grady
Booch, le concept fondamental d'abstraction fondamentale est la classe"
et
2/ "En OO, _le_ concept fondamental d'abstraction fondamentale est la
classe"
Oui
Post by Bruno Desthuilliers
Notes que tu a bien sûr le droit de trouver à la méthode de Grady Booch
toutes les qualités que tu veux, à commencer par celle de correspondre à
ta propre façon de mener ton activité. Simplement, ça n'en fait pas une
vérité universelle (au sens où les théories scientifiques admises par la
communauté ont valeur de vérités universelles), et ça ne te donne pas le
droit d'affirmer que d'autres méthodes ou d'autres façons de concevoir
l'OO ne sont pas tout aussi légitimes et valides.
Alors soyons sérieux. J'ai montré que l'approche objet à base de classes
est précisément définie (UML, qui est le standard de l'approche objet et
un certain nombre de langages objets intégrant le concept de classe.

Admettons qu'il existe une autre approche objet à base de langages à
prototype. Donne-moi les références de la ou des méthodes qui permettent
d'exprimer l'analyse, la conception, la programmation dans cette approche.
Moi j'ai juste trouvé ceci : www.lirmm.fr/~dony/postscript/proto-lmo95.pdf,
mais ça date de 95.

Parce que, avant de trouver légitime d'autres méthodes ou d'autres façon
de concevoir l'OO, encore faudrait-il qu'elles soient décrites...
Post by Bruno Desthuilliers
Post by Wykaaa
Post by Bruno Desthuilliers
Du point de vue de l'implémentation, fondamentalement, une classe est
une fabrique à objet. De même qu'un prototype, d'ailleurs. Ce avec quoi
on travaille le plus, ça reste bien les objets. Ce que mon code
manipule, ce sont des objets (le fait est qu'en Python les classes
elles-mêmes sont des objets, et qu'il est relativement courant que mon
code manipule des objets "classes", mais à ce stade ça ne change pas
grand chose - ce sont bien _avant tout_ des objets que je suis en train
de manipuler).
Tu parles de code, je parle d'approche objet en général.
Le code décrivant la dynamique du programme, je vois mal comment on
pourrait faire l'impasse dessus. Le code participe tout autant de
l'approche objet que l'analyse et la conception. Le terme originel est
d'ailleurs bien "*programmation* orientée objet".
Oui avec les objets, en POO, qui sont des instances de classes
(lesquelles sont les objets en conception : ceux dont on recherche
l'identification et les propriétés) :-)
Post by Bruno Desthuilliers
AMHA, ton environnement plein d'experts qui ne connaissent rien à
l'informatique mais dictent à des singes programmeurs ce qu'ils doivent
pisser commence à déformer sérieusement ta vision. Dans la majorité des
cas, il n'y a pas de cloisement étanche entre conception et
programmation - au contraire, il y a des aller-retours constant entre
ces deux activités, généralement menés par les mêmes personnes. J'irai
même jusqu'à dire que, à un certain niveau de détail dans la conception,
ce ne sont que deux facettes d'une même activité.
C'est vrai dans ce que je n'ose même pas qualifier de méthode, à savoir
l'extrême programming (un habillage qui consiste à nous enfumer sur
l'absence de méthode à savoir "essais/erreurs").
Dans mon environnement, ceux qui codent ne sont pas les concepteurs (du
moins pour l'architecture et la conception globale). Bien sûr qu'ils
font la conception détaillée (donc ce ne sont pas tout à fait "des
singes"...).
Post by Bruno Desthuilliers
Post by Wykaaa
En
programmation objet, on ne manipule que des objets, évidemment.
Donc l'abstraction centrale de la programmation orientée objet est
l'objet, merci Monsieur de la Palisse.
Oui : des instances de classe :-)
Post by Bruno Desthuilliers
Post by Wykaaa
Post by Bruno Desthuilliers
Post by Wykaaa
D'ailleurs faire de la conception objet c'est
identifier les abstractions et établir leurs dépendances (composition,
agrégation, héritage).
Ca ne s'arrête pas à ça, loin s'en faut. Le diagramme de classes n'est
qu'un des diagrammes d'UML, et c'est le seul à être centré sur les
classes - la plupart des autres sont centrés sur les objets et les
messages. Avec un diagramme de classes - de même qu'avec un MCD -, tout
ce que tu capture est une vue statique du système, qui ne permet en rien
(ou si faiblement que c'en est dérisoire) d'exposer la _dynamique_ du
système - c'est à dire, comment fonctionne *effectivement* le système à
l'exécution.
Je suis d'accord, mais on était sur classe et objet.
Oui, justement. A l'exécution, ce sont bien des objets qui vont
interagir, et le diagramme de classes ne dit que très peu de choses sur
ces interactions qui sont pourtant essentielles.
A l'exécution, un objet (une instance de classe) à une représentation
physique en mémoire.
La classe est au moule ce que l'instance est à la tarte ;-)
Post by Bruno Desthuilliers
Post by Wykaaa
Evidemment qu'en
UML j'utilise aussi les diagrammes de séquence, d'activité, d'états,
Qui décrivent soit des interactions entre des objets, soit les
changements d'état d'un seul objet. Faut croire que même en conception,
les objet ont une importance, finalement...
Pas si vite. Les diagrammes de séquence je les utilise en conjonction
avec les cas d'utilisation (en colonne je mets des acteurs). Je les
utilise pour modéliser les processus métier.
Un diagramme d'états décrit les changements d'états d'une famille
d'objets (donc la classe) qui ont un comportement commun.
Les diagrammes de collaboration décrivent comment les objets (de
conception, donc les classes) collaborent entre eux.
Bruno Desthuilliers
2009-11-17 12:54:04 UTC
Permalink
Post by Wykaaa
Post by Bruno Desthuilliers
Ce n'est pas parce que GradyBoochADitQue que la question est close et
qu'on doive fermer sa gueule et mettre son cerveau en standby.
Même une *vraie* théorie scientifique reste une théorie, qui n'est
valide que tant qu'on n'en a pas trouvée de meilleure (avec une
définition _très_ claire de "meilleure"). Et les écrits de tous ces bons
"ex-pairs" de l'OO n'ont *rien* de scientifique, malgré certaines
prétentions qui ferait se pisser dessus n'importe quel épistémologue.
Je n'ai jamais prétendu qu'il existait une théorie scientifique de l'OO,
Ah, on avance ?
Post by Wykaaa
j'ai simplement dit que l'approche objet telle que définie par ses
créateurs
Simula date de 62 pour sa première version, mais n'a vraiment commencé à
intégrer ce qui a donné naissance à l'OO qu'à partir de 1966 environ, le
tout étant formalisé en 67.

Smalltalk date du début des années 70. La première release officielle
date du début des années 80.

Eiffel - première release en 86.

Self - le premier langage à prototypes - débute en 86, premiers écrits
recensés en 89, première release officielle en 90.

Si je consulte la DBLP, je trouve comme premiers écrits répertoriés pour
Booch un papier de 82 nommé "Naming subprograms with clarity", qui ne
doit pas avoir grand rapport avec l'OO. Ses premiers écrits sur l'OO
datent de 86.

Idem pour Jacobson : premiers écrits en 86, premier écrit portant
explicitement sur l'OO en 87.

Je pense donc que si on veut effectivement désigner les "créateurs" de
l'approche objet, on devrait plutôt citer Nygaard, Dahl, Hoare, Kay,
Meyer et Ungar.
Post by Wykaaa
était assez précisément définie et j'en ai donné des preuves
par ailleurs. Celui qui résume (si on peut dire car son bouquin fait
1200 pages !) le mieux cette approche est Bertrand Meyer dans
"Conception et programmation objet"
Ce que "résume" (mouarf) Meyer est *son* approche de l'OO.
Post by Wykaaa
Post by Bruno Desthuilliers
Post by Wykaaa
Post by Bruno Desthuilliers
On nage en pleine abstraction, là. Alors affirmer que (pour reformuler)
"(en OO) _le_ concept fondamental d'abstraction est la classe" me semble
au mieux relever de la myopie.
Alors Grady Booch, Bertrand Meyer and Co sont myopes !
Ah bin tu vois, quand tu veux !-)
la méthode et le langage devraient utiliser la notion de classe comme
concept central.
Post by Bruno Desthuilliers
Plus sérieusement, est-ce que tu es capable de faire la différence entre
1/ "Dans le cadre de la méthode de conception objet définie par Grady
Booch, le concept fondamental d'abstraction fondamentale est la classe"
et
2/ "En OO, _le_ concept fondamental d'abstraction fondamentale est la
classe"
Oui
Bon. Alors peux-tu me décrire, en termes simples, cette différence ?
Post by Wykaaa
Post by Bruno Desthuilliers
Notes que tu a bien sûr le droit de trouver à la méthode de Grady Booch
toutes les qualités que tu veux, à commencer par celle de correspondre à
ta propre façon de mener ton activité. Simplement, ça n'en fait pas une
vérité universelle (au sens où les théories scientifiques admises par la
communauté ont valeur de vérités universelles), et ça ne te donne pas le
droit d'affirmer que d'autres méthodes ou d'autres façons de concevoir
l'OO ne sont pas tout aussi légitimes et valides.
Alors soyons sérieux. J'ai montré que l'approche objet à base de classes
est précisément définie (UML, qui est le standard de l'approche objet et
un certain nombre de langages objets intégrant le concept de classe.
Non. Tu a montré qu'il existait un certain nombres de définitions de
l'approche objet à base de classes. Ce qui est très différent.
Post by Wykaaa
Admettons qu'il existe une autre approche objet à base de langages à
prototype. Donne-moi les références de la ou des méthodes qui permettent
d'exprimer l'analyse, la conception, la programmation dans cette approche.
Pour la programmation, on l'exprime généralement dans un langage de
programmation !-)

Pour le reste, l'essentiel des efforts de nos experts s'étant concentrés
sur l'approche "class-based", il n'y a effectivement pas grand chose
comme écrits. Ceci signifie t'il pour autant que les langages à
prototypes ne soient pas des langages objets ? Evidemment non.

Accessoirement, la frontière entre prototype et classe est parfois
floue. Les classes de Python sont par certains aspects plus proches des
prototypes que des classes de Java.
Post by Wykaaa
Parce que, avant de trouver légitime d'autres méthodes ou d'autres façon
de concevoir l'OO, encore faudrait-il qu'elles soient décrites...
Les langages Self, Javascript et Python sont relativement bien décrits,
ce me semble.

Et avant que tu ne revienne me dire que tu parles de conception et pas
d'implémentation, je me permets de te rapeller que l'histoire de l'OO a
bel et bien commencé par les langages objets - la conception objet n'est
venu que bien plus tard.
Post by Wykaaa
Post by Bruno Desthuilliers
Post by Wykaaa
Post by Bruno Desthuilliers
Du point de vue de l'implémentation, fondamentalement, une classe est
une fabrique à objet. De même qu'un prototype, d'ailleurs. Ce avec quoi
on travaille le plus, ça reste bien les objets. Ce que mon code
manipule, ce sont des objets (le fait est qu'en Python les classes
elles-mêmes sont des objets, et qu'il est relativement courant que mon
code manipule des objets "classes", mais à ce stade ça ne change pas
grand chose - ce sont bien _avant tout_ des objets que je suis en train
de manipuler).
Tu parles de code, je parle d'approche objet en général.
Le code décrivant la dynamique du programme, je vois mal comment on
pourrait faire l'impasse dessus. Le code participe tout autant de
l'approche objet que l'analyse et la conception. Le terme originel est
d'ailleurs bien "*programmation* orientée objet".
Oui avec les objets, en POO, qui sont des instances de classes
pas forcément - cf les langages à prototype.
Post by Wykaaa
(lesquelles sont les objets en conception : ceux dont on recherche
l'identification et les propriétés) :-)
Post by Bruno Desthuilliers
AMHA, ton environnement plein d'experts qui ne connaissent rien à
l'informatique mais dictent à des singes programmeurs ce qu'ils doivent
pisser commence à déformer sérieusement ta vision. Dans la majorité des
cas, il n'y a pas de cloisement étanche entre conception et
programmation - au contraire, il y a des aller-retours constant entre
ces deux activités, généralement menés par les mêmes personnes. J'irai
même jusqu'à dire que, à un certain niveau de détail dans la conception,
ce ne sont que deux facettes d'une même activité.
C'est vrai dans ce que je n'ose même pas qualifier de méthode, à savoir
l'extrême programming (un habillage qui consiste à nous enfumer sur
l'absence de méthode à savoir "essais/erreurs").
Mmmm.... Je pense que ta perception des méthodes agiles est légèrement
psychorigide et peut être pas dénuée de quelques a priori !-)

Ceci dit, je ne suis pas forcément un adepte inconditionnel de ces
méthodes, et il y a clairement pas mal d'huile de serpent dans
l'affaire. Mais globalement ni plus ni moins que dans le reste de la
hype marketing autour de l'OO - et je soupçonne certains marchands de
carpettes de s'inquiéter de voir un concurrent empiéter sur leurs plates
bandes.

Dans la pratiques, certaines des notions des méthodes agiles sont
pleines de bon sens *dans un certain contexte* (qui n'est of course pas
le tiens) - et la plupart des défenseurs de ces méthodes précisent très
clairement que leur approche n'a pas vocation à être universellement
applicable (contrairement à un certain Wikaaa qui pense que les
approches qui lui conviennent son les seuls dignes de ce nom...).
Post by Wykaaa
Dans mon environnement, ceux qui codent ne sont pas les concepteurs (du
moins pour l'architecture et la conception globale). Bien sûr qu'ils
font la conception détaillée (donc ce ne sont pas tout à fait "des
singes"...).
Ah, quand même ? Ils ont le droit d'écrire une méthode qui n'est pas
dans les specs ?
Post by Wykaaa
Post by Bruno Desthuilliers
Post by Wykaaa
En
programmation objet, on ne manipule que des objets, évidemment.
Donc l'abstraction centrale de la programmation orientée objet est
l'objet, merci Monsieur de la Palisse.
Oui : des instances de classe :-)
Pas nécessairement, cf les langages à prototype.
Post by Wykaaa
Post by Bruno Desthuilliers
Oui, justement. A l'exécution, ce sont bien des objets qui vont
interagir, et le diagramme de classes ne dit que très peu de choses sur
ces interactions qui sont pourtant essentielles.
A l'exécution, un objet (une instance de classe) à une représentation
physique en mémoire.
La classe est au moule ce que l'instance est à la tarte ;-)
T'en a pas marre de me prendre pour un newbie, là ? Tu veux que je te
fasse un cours sur les métaclasses, la résolution d'attributs et le
protocole descripteur en Python ?
Wykaaa
2009-11-17 14:08:43 UTC
Permalink
[snip]
Post by Bruno Desthuilliers
Post by Wykaaa
Je n'ai jamais prétendu qu'il existait une théorie scientifique de l'OO,
Ah, on avance ?
Post by Wykaaa
j'ai simplement dit que l'approche objet telle que définie par ses
créateurs
Simula date de 62 pour sa première version, mais n'a vraiment commencé à
intégrer ce qui a donné naissance à l'OO qu'à partir de 1966 environ, le
tout étant formalisé en 67.
Oui OK.
Pour l'approche objet, la démarche a été ascendante : langage,
conception, analyse, expression du besoin
Post by Bruno Desthuilliers
Smalltalk date du début des années 70. La première release officielle
date du début des années 80.
Oui mais il y a eu Smalltalk 72 et 76 avant la 80.
Post by Bruno Desthuilliers
Eiffel - première release en 86.
Self - le premier langage à prototypes - débute en 86, premiers écrits
recensés en 89, première release officielle en 90.
Si je consulte la DBLP, je trouve comme premiers écrits répertoriés pour
Booch un papier de 82 nommé "Naming subprograms with clarity", qui ne
doit pas avoir grand rapport avec l'OO. Ses premiers écrits sur l'OO
datent de 86.
Non.
Il n'y a pas tout, loin de là, dans la DBLP. Par exemple :
[Booch 81] Grady BOOCH, Describing Software Design in ADA SIGPLAN
Notices, Vol 16, No 2, 1981
[Booch, 1982a]. G. Booch, "Object-Oriented Design," Ada Letters, Vol. I,
No. 3, March/April 1982, pp. 64 - 76.
C'est à partir de ce dernier article que j'ai commencé à faire du
"design" objet.
Puis cette article a achevé de me convaincre :
[Abbott, 1983]. R. J. Abbott, "Program Design by Informal English
Descriptions," Communications of the ACM, Vol. 26, No. 11, November
1983, pp. 882 - 894.

Bref la DBLP est loin d'être la panacée quand on fait de la veille techno...
Post by Bruno Desthuilliers
Idem pour Jacobson : premiers écrits en 86, premier écrit portant
explicitement sur l'OO en 87.
Je pense donc que si on veut effectivement désigner les "créateurs" de
l'approche objet, on devrait plutôt citer Nygaard, Dahl, Hoare, Kay,
Meyer et Ungar.
Oui bin non. On peut situer le "départ" avec Nygaard et Dahl car ils ont
"inventé" une partie du vocabulaire. Mais on reste au niveau POO. Le
vrai démarrage de la COO, c'est l'article de 82 de Booch. Il y a eu
quand même des antécédents avec John Guttag en 1977 :
John V. Guttag: Abstract Data Type and the Development of Data
Structures. Commun. ACM 20(6): 396-404 (1977)
et même dès 74 avec Barbara Liskov :
Barbara Liskov, Stephen N. Zilles: Programming with Abstract Data Types.
SIGPLAN Notices 9(4): 50-59 (1974)
Post by Bruno Desthuilliers
Post by Wykaaa
était assez précisément définie et j'en ai donné des preuves par
ailleurs. Celui qui résume (si on peut dire car son bouquin fait 1200
pages !) le mieux cette approche est Bertrand Meyer dans "Conception
et programmation objet"
Ce que "résume" (mouarf) Meyer est *son* approche de l'OO.
Ouais. Dans mon milieu, il est considéré que Bertrand Meyer est parmi
ceux qui ont produit la meilleure "littérature" sur l'objet. Du moins,
la plus clair (avec Grady Booch). Par contre James Rumbaugh est
considéré comme un piètre pédagogue.
Post by Bruno Desthuilliers
Post by Wykaaa
Post by Bruno Desthuilliers
Post by Wykaaa
Post by Bruno Desthuilliers
On nage en pleine abstraction, là. Alors affirmer que (pour reformuler)
"(en OO) _le_ concept fondamental d'abstraction est la classe" me semble
au mieux relever de la myopie.
Alors Grady Booch, Bertrand Meyer and Co sont myopes !
Ah bin tu vois, quand tu veux !-)
la méthode et le langage devraient utiliser la notion de classe comme
concept central.
Post by Bruno Desthuilliers
Plus sérieusement, est-ce que tu es capable de faire la différence entre
1/ "Dans le cadre de la méthode de conception objet définie par Grady
Booch, le concept fondamental d'abstraction fondamentale est la classe"
et
2/ "En OO, _le_ concept fondamental d'abstraction fondamentale est la
classe"
Oui
Bon. Alors peux-tu me décrire, en termes simples, cette différence ?
Je ne vois pas ce que tu veux me faire dire :-)
Post by Bruno Desthuilliers
Post by Wykaaa
Post by Bruno Desthuilliers
Notes que tu a bien sûr le droit de trouver à la méthode de Grady Booch
toutes les qualités que tu veux, à commencer par celle de correspondre à
ta propre façon de mener ton activité. Simplement, ça n'en fait pas une
vérité universelle (au sens où les théories scientifiques admises par la
communauté ont valeur de vérités universelles), et ça ne te donne pas le
droit d'affirmer que d'autres méthodes ou d'autres façons de concevoir
l'OO ne sont pas tout aussi légitimes et valides.
Alors soyons sérieux. J'ai montré que l'approche objet à base de
classes est précisément définie (UML, qui est le standard de
l'approche objet et un certain nombre de langages objets intégrant le
concept de classe.
Non. Tu a montré qu'il existait un certain nombres de définitions de
l'approche objet à base de classes. Ce qui est très différent.
Alors cite moi d'autres définitions avec les références...
Post by Bruno Desthuilliers
Post by Wykaaa
Admettons qu'il existe une autre approche objet à base de langages à
prototype. Donne-moi les références de la ou des méthodes qui
permettent d'exprimer l'analyse, la conception, la programmation dans
cette approche.
Pour la programmation, on l'exprime généralement dans un langage de
programmation !-)
Non. Les langages ont des spécifications, souvent décrites de façon
formelles pour la sémantique. Exemples VDL pour PL/1, lambda-calcul non
typé pour les langages fonctionnels de type Lisp, le pi-calcul pour la
concurrence, etc.
Post by Bruno Desthuilliers
Pour le reste, l'essentiel des efforts de nos experts s'étant concentrés
sur l'approche "class-based", il n'y a effectivement pas grand chose
comme écrits. Ceci signifie t'il pour autant que les langages à
prototypes ne soient pas des langages objets ? Evidemment non.
Ca reste à "prouver"
Post by Bruno Desthuilliers
Accessoirement, la frontière entre prototype et classe est parfois
floue. Les classes de Python sont par certains aspects plus proches des
prototypes que des classes de Java.
J'en suis même personnellement convaincu.
Post by Bruno Desthuilliers
Post by Wykaaa
Parce que, avant de trouver légitime d'autres méthodes ou d'autres
façon de concevoir l'OO, encore faudrait-il qu'elles soient décrites...
Les langages Self, Javascript et Python sont relativement bien décrits,
ce me semble.
Oui mais où est leur "modèle" de programmation ?
Post by Bruno Desthuilliers
Et avant que tu ne revienne me dire que tu parles de conception et pas
d'implémentation, je me permets de te rapeller que l'histoire de l'OO a
bel et bien commencé par les langages objets - la conception objet n'est
venu que bien plus tard.
On est tout à fait d'accord sur ce fait mais, au moins, il y a eu un
effort de cohérence entre la POO à base de classes et la conception à la
Grady Booch puis UML.

Où est cet effort dans l'univers de l'objet à base de prototype ?
Pour l'instant c'est le désert donc ça n'existe pas (pas encore).

[snip]
Post by Bruno Desthuilliers
Post by Wykaaa
Post by Bruno Desthuilliers
AMHA, ton environnement plein d'experts qui ne connaissent rien à
l'informatique mais dictent à des singes programmeurs ce qu'ils doivent
pisser commence à déformer sérieusement ta vision. Dans la majorité des
cas, il n'y a pas de cloisement étanche entre conception et
programmation - au contraire, il y a des aller-retours constant entre
ces deux activités, généralement menés par les mêmes personnes. J'irai
même jusqu'à dire que, à un certain niveau de détail dans la conception,
ce ne sont que deux facettes d'une même activité.
C'est vrai dans ce que je n'ose même pas qualifier de méthode, à
savoir l'extrême programming (un habillage qui consiste à nous enfumer
sur l'absence de méthode à savoir "essais/erreurs").
Mmmm.... Je pense que ta perception des méthodes agiles est légèrement
psychorigide et peut être pas dénuée de quelques a priori !-)
Tu penses juste ;-)
Post by Bruno Desthuilliers
Ceci dit, je ne suis pas forcément un adepte inconditionnel de ces
méthodes, et il y a clairement pas mal d'huile de serpent dans
l'affaire. Mais globalement ni plus ni moins que dans le reste de la
hype marketing autour de l'OO - et je soupçonne certains marchands de
carpettes de s'inquiéter de voir un concurrent empiéter sur leurs plates
bandes.
Oh que non tellement c'est grotesque !
Post by Bruno Desthuilliers
Dans la pratiques, certaines des notions des méthodes agiles sont
pleines de bon sens *dans un certain contexte* (qui n'est of course pas
le tiens) - et la plupart des défenseurs de ces méthodes précisent très
clairement que leur approche n'a pas vocation à être universellement
applicable (contrairement à un certain Wikaaa qui pense que les
approches qui lui conviennent son les seuls dignes de ce nom...).
Wykaaa avec un "y", SVP.

Ca va pour des "petits" projets (< 50K lignes) et des "petites" équipes
(< 10 personnes). Et surtout, il faut des gens expérimentés, ce que
beaucoup "oublient".
Post by Bruno Desthuilliers
Post by Wykaaa
Dans mon environnement, ceux qui codent ne sont pas les concepteurs
(du moins pour l'architecture et la conception globale). Bien sûr
qu'ils font la conception détaillée (donc ce ne sont pas tout à fait
"des singes"...).
Ah, quand même ? Ils ont le droit d'écrire une méthode qui n'est pas
dans les specs ?
Oui mais pas si ça touche la conception globale...

[snip]
Post by Bruno Desthuilliers
Post by Wykaaa
Post by Bruno Desthuilliers
Oui, justement. A l'exécution, ce sont bien des objets qui vont
interagir, et le diagramme de classes ne dit que très peu de choses sur
ces interactions qui sont pourtant essentielles.
A l'exécution, un objet (une instance de classe) à une représentation
physique en mémoire.
La classe est au moule ce que l'instance est à la tarte ;-)
T'en a pas marre de me prendre pour un newbie, là ? Tu veux que je te
fasse un cours sur les métaclasses, la résolution d'attributs et le
protocole descripteur en Python ?
Tu n'as pas vu le clin d'oeil ?
Combien tes cours ?
Moi c'est 100 euros de l'heure minimum et là, je suis sérieux.
Bruno Desthuilliers
2009-11-20 10:07:27 UTC
Permalink
Post by Wykaaa
[snip]
Post by Bruno Desthuilliers
Post by Wykaaa
Je n'ai jamais prétendu qu'il existait une théorie scientifique de l'OO,
Ah, on avance ?
Post by Wykaaa
j'ai simplement dit que l'approche objet telle que définie par ses
créateurs
Simula date de 62 pour sa première version, mais n'a vraiment commencé
à intégrer ce qui a donné naissance à l'OO qu'à partir de 1966
environ, le tout étant formalisé en 67.
Oui OK.
Pour l'approche objet, la démarche a été ascendante : langage,
conception, analyse, expression du besoin
Bef, une démarche des plus empiriques.

(snip détails historiques - au temps pour moi pour les premiers écrits
de gradybooch sur l'OO)
Post by Wykaaa
Post by Bruno Desthuilliers
Je pense donc que si on veut effectivement désigner les "créateurs" de
l'approche objet, on devrait plutôt citer Nygaard, Dahl, Hoare, Kay,
Meyer et Ungar.
Oui bin non. On peut situer le "départ" avec Nygaard et Dahl car ils ont
"inventé" une partie du vocabulaire. Mais on reste au niveau POO.
Et alors ? C'est bien avec la POO qu'a commencé l'approche objet, et la
conception OO est difficilement dissociable de la programmation OO.
Post by Wykaaa
Le
vrai démarrage de la COO,
date d'après le début de la POO et n'aurait pas vu le jour sans.
Post by Wykaaa
c'est l'article de 82 de Booch. Il y a eu
John V. Guttag: Abstract Data Type and the Development of Data
Structures. Commun. ACM 20(6): 396-404 (1977)
Barbara Liskov, Stephen N. Zilles: Programming with Abstract Data Types.
SIGPLAN Notices 9(4): 50-59 (1974)
L'OO ne se résume pas aux ADT (même si elle en dérive).
Post by Wykaaa
Post by Bruno Desthuilliers
Post by Wykaaa
était assez précisément définie et j'en ai donné des preuves par
ailleurs. Celui qui résume (si on peut dire car son bouquin fait 1200
pages !) le mieux cette approche est Bertrand Meyer dans "Conception
et programmation objet"
Ce que "résume" (mouarf) Meyer est *son* approche de l'OO.
Ouais. Dans mon milieu, il est considéré que Bertrand Meyer est parmi
ceux qui ont produit la meilleure "littérature" sur l'objet. Du moins,
la plus clair (avec Grady Booch).
Ce qui ne contredit pas ma proposition.
Post by Wykaaa
Post by Bruno Desthuilliers
Post by Wykaaa
Post by Bruno Desthuilliers
Post by Wykaaa
Post by Bruno Desthuilliers
On nage en pleine abstraction, là. Alors affirmer que (pour reformuler)
"(en OO) _le_ concept fondamental d'abstraction est la classe" me semble
au mieux relever de la myopie.
Alors Grady Booch, Bertrand Meyer and Co sont myopes !
Ah bin tu vois, quand tu veux !-)
Bertrand Meyer dans le chapitre 2 p25 (critères d'orientation objet)
: la méthode et le langage devraient utiliser la notion de classe
comme concept central.
Post by Bruno Desthuilliers
Plus sérieusement, est-ce que tu es capable de faire la différence entre
1/ "Dans le cadre de la méthode de conception objet définie par Grady
Booch, le concept fondamental d'abstraction fondamentale est la classe"
et
2/ "En OO, _le_ concept fondamental d'abstraction fondamentale est la
classe"
Oui
Bon. Alors peux-tu me décrire, en termes simples, cette différence ?
Je ne vois pas ce que tu veux me faire dire :-)
Tu es un GrosMenteur(tm) !-)
Post by Wykaaa
Post by Bruno Desthuilliers
Post by Wykaaa
Admettons qu'il existe une autre approche objet à base de langages à
prototype. Donne-moi les références de la ou des méthodes qui
permettent d'exprimer l'analyse, la conception, la programmation dans
cette approche.
Pour la programmation, on l'exprime généralement dans un langage de
programmation !-)
Non. Les langages ont des spécifications, souvent décrites de façon
formelles pour la sémantique.
Aucun rapport. Tu parlais "d'exprimer la programmation dans cette
approche" (nb: prototypes), je te réponds une évidence digne de M. de la
Palisse: la programmation objet à base de langages à prototypes
s'exprime dans un langage objet à prototypes. UML ne décrit pas la
grammaire ni la syntaxe d'un langage de programmation, et ne permet pas
"d'exprimer la programmation".
Post by Wykaaa
Exemples VDL pour PL/1, lambda-calcul non
typé pour les langages fonctionnels de type Lisp, le pi-calcul pour la
concurrence, etc.
Ahhh.... C'est de ça que tu parlais. Dis, tu a vu *où* une quelconque
"théorie formelle" servant de support à l'OO - je veux dire, quelque
chose de l'ordre des théories de Church pour le lambda-calcul ou de
celles de Codd pour le modèle relationel ? Bon, cherche pas : *y en a
pas*. Au mieux, on a deux pauvres "axiomes" de base - et c'est justement
le point de départ de cette discussion.
Post by Wykaaa
Post by Bruno Desthuilliers
Pour le reste, l'essentiel des efforts de nos experts s'étant
concentrés sur l'approche "class-based", il n'y a effectivement pas
grand chose comme écrits. Ceci signifie t'il pour autant que les
langages à prototypes ne soient pas des langages objets ? Evidemment non.
Ca reste à "prouver"
Tu ne peux pas prouver le contraire, pour les raisons ci-dessus. Par
contre, et toujours pour ces mêmes raisons, j'affirme que les langages à
prototypes sont des langages objet, puisqu'ils offre le support pour des
objets définis par une identité, un état et un comportement communicant
par envoi de messages. CQFD.
Post by Wykaaa
Post by Bruno Desthuilliers
Accessoirement, la frontière entre prototype et classe est parfois
floue. Les classes de Python sont par certains aspects plus proches
des prototypes que des classes de Java.
J'en suis même personnellement convaincu.
Pourtant, Python est classé (c'est le cas de le dire) dans les langages
à classes.
Post by Wykaaa
Post by Bruno Desthuilliers
Post by Wykaaa
Parce que, avant de trouver légitime d'autres méthodes ou d'autres
façon de concevoir l'OO, encore faudrait-il qu'elles soient décrites...
Les langages Self, Javascript et Python sont relativement bien
décrits, ce me semble.
Oui mais où est leur "modèle" de programmation ?
Pour quelle définition de "modèle de programmation" ?
Post by Wykaaa
Post by Bruno Desthuilliers
Et avant que tu ne revienne me dire que tu parles de conception et pas
d'implémentation, je me permets de te rapeller que l'histoire de l'OO
a bel et bien commencé par les langages objets - la conception objet
n'est venu que bien plus tard.
On est tout à fait d'accord sur ce fait mais, au moins, il y a eu un
effort de cohérence entre la POO à base de classes et la conception à la
Grady Booch puis UML.
Cet "effort de cohérence" - outre qu'il a accouché d'une monstruosité
(UML) tout à fait représentative du symptome "designed by comitee" - est
loin de prendre en compte toute la biodiversité des langages objets
existants. Il décrit certes assez bien le modèle objet dominant, mais
même si c'est (était...) le plus visible, ce n'est qu'un sous-ensemble
de l'OO.
Post by Wykaaa
Où est cet effort dans l'univers de l'objet à base de prototype ?
Pour l'instant c'est le désert
Oui, un peu
Post by Wykaaa
donc ça n'existe pas
quoi ? Les langages à prototypes n'eisxtent pas parce qu'il n'y a pas eu
de Grand Comité de Grands Experts pour définir la ligne du parti ?

Le raccourci est fallacieux, et dénote d'une certaine tendance à
l'obscurantisme. Et pourtant, elle tourne...
Post by Wykaaa
[snip]
Post by Bruno Desthuilliers
Post by Wykaaa
C'est vrai dans ce que je n'ose même pas qualifier de méthode, à
savoir l'extrême programming (un habillage qui consiste à nous
enfumer sur l'absence de méthode à savoir "essais/erreurs").
Mmmm.... Je pense que ta perception des méthodes agiles est légèrement
psychorigide et peut être pas dénuée de quelques a priori !-)
Tu penses juste ;-)
Oui, je sais
Post by Wykaaa
Post by Bruno Desthuilliers
Ceci dit, je ne suis pas forcément un adepte inconditionnel de ces
méthodes, et il y a clairement pas mal d'huile de serpent dans
l'affaire. Mais globalement ni plus ni moins que dans le reste de la
hype marketing autour de l'OO - et je soupçonne certains marchands de
carpettes de s'inquiéter de voir un concurrent empiéter sur leurs
plates bandes.
Oh que non tellement c'est grotesque !
Ah bon ? C'est donc de la fumisterie quand ça contredit ta vision des
chose, mais suggérer qu'il puisse y avoir _aussi_ de la fumisterie chez
ceux qui partage ta vision des choses est "grotesque" ? J'admire ton
honnêteté intellectuelle.
Post by Wykaaa
Post by Bruno Desthuilliers
Dans la pratiques, certaines des notions des méthodes agiles sont
pleines de bon sens *dans un certain contexte* (qui n'est of course
pas le tiens) - et la plupart des défenseurs de ces méthodes précisent
très clairement que leur approche n'a pas vocation à être
universellement applicable (contrairement à un certain Wikaaa qui
pense que les approches qui lui conviennent son les seuls dignes de ce
nom...).
Wykaaa avec un "y", SVP.
oops, désolé.
Post by Wykaaa
Ca va pour des "petits" projets (< 50K lignes)
50K lignes de Python bien utilisé (metaclasses, descripteurs etc), ça
peut déjà faire un projet assez conséquent en termes de fonctionnalités,
tu sais.
Post by Wykaaa
et des "petites" équipes
(< 10 personnes). Et surtout, il faut des gens expérimentés, ce que
beaucoup "oublient".
Tiens, c'est curieux, parmi les tout premier trucs que j'ai vu sur l'xp
et les méthodes agiles en général, il y avait les mentions _très claires
et très explicites_ que ces approches

* ne convenaient pas à tous type de projet, et particulièrement pas à
des projets "mammouth"
* ne convenaient pas à des équipes de plus d'une dizaine de personnes
* nécessitaient qu'au moins la majorité de l'équipe soit constituée de
personnes expérimentées ET capable d'auto-discipline.

Accessoirement, le BigDesignUpFront nécessite _également_ des personnes
très expérimentées - sans quoi tu peux avoir l'absolu certitude que le
design sera purement et simplement impossible à implémenter tel que, et
que ses failles se révèleront trop tard pour être rattrapable dans les
délais.
Post by Wykaaa
Post by Bruno Desthuilliers
Post by Wykaaa
Dans mon environnement, ceux qui codent ne sont pas les concepteurs
(du moins pour l'architecture et la conception globale). Bien sûr
qu'ils font la conception détaillée (donc ce ne sont pas tout à fait
"des singes"...).
Ah, quand même ? Ils ont le droit d'écrire une méthode qui n'est pas
dans les specs ?
Oui mais pas si ça touche la conception globale...
cf ci-dessus - avec ton approche, si on doit "toucher à la conception
globale", c'est de toutes façon qu'il y a une faille dans celle-ci.
Post by Wykaaa
Post by Bruno Desthuilliers
Post by Wykaaa
Post by Bruno Desthuilliers
Oui, justement. A l'exécution, ce sont bien des objets qui vont
interagir, et le diagramme de classes ne dit que très peu de choses sur
ces interactions qui sont pourtant essentielles.
A l'exécution, un objet (une instance de classe) à une représentation
physique en mémoire.
La classe est au moule ce que l'instance est à la tarte ;-)
T'en a pas marre de me prendre pour un newbie, là ? Tu veux que je te
fasse un cours sur les métaclasses, la résolution d'attributs et le
protocole descripteur en Python ?
Tu n'as pas vu le clin d'oeil ?
Combien tes cours ?
Moi c'est 100 euros de l'heure minimum et là, je suis sérieux.
Alors je te fais un tarif d'ami : 250€ de l'heure. Pour les autres -
ceux qui lisent c.l.py - c'est gratuit !-)

NB : j'espère que tu a vu le clin d'oeil ?
Wykaaa
2009-11-20 20:46:36 UTC
Permalink
Post by Bruno Desthuilliers
Post by Wykaaa
[snip]
Post by Bruno Desthuilliers
Post by Wykaaa
Je n'ai jamais prétendu qu'il existait une théorie scientifique de l'OO,
Ah, on avance ?
Post by Wykaaa
j'ai simplement dit que l'approche objet telle que définie par ses
créateurs
Simula date de 62 pour sa première version, mais n'a vraiment commencé
à intégrer ce qui a donné naissance à l'OO qu'à partir de 1966
environ, le tout étant formalisé en 67.
Oui OK.
Pour l'approche objet, la démarche a été ascendante : langage,
conception, analyse, expression du besoin
Bef, une démarche des plus empiriques.
D'un autre côté on imagine mal que quelqu'un, un jour, ait eu l'idée de
dire : tiens je vais développer une approche objet et le fasse de façon
top-down...
Post by Bruno Desthuilliers
(snip détails historiques - au temps pour moi pour les premiers écrits
de gradybooch sur l'OO)
Bin tu as appris quelque chose :-)
Post by Bruno Desthuilliers
Post by Wykaaa
Post by Bruno Desthuilliers
Je pense donc que si on veut effectivement désigner les "créateurs" de
l'approche objet, on devrait plutôt citer Nygaard, Dahl, Hoare, Kay,
Meyer et Ungar.
Oui bin non. On peut situer le "départ" avec Nygaard et Dahl car ils ont
"inventé" une partie du vocabulaire. Mais on reste au niveau POO.
Et alors ? C'est bien avec la POO qu'a commencé l'approche objet, et la
conception OO est difficilement dissociable de la programmation OO.
Mais sur ce point nous sommes tout à fait d'accord.
Post by Bruno Desthuilliers
Post by Wykaaa
Le
vrai démarrage de la COO,
date d'après le début de la POO et n'aurait pas vu le jour sans.
Oui. C'est ce que je disais plus haut de façon ironique.
Post by Bruno Desthuilliers
Post by Wykaaa
c'est l'article de 82 de Booch. Il y a eu
John V. Guttag: Abstract Data Type and the Development of Data
Structures. Commun. ACM 20(6): 396-404 (1977)
Barbara Liskov, Stephen N. Zilles: Programming with Abstract Data Types.
SIGPLAN Notices 9(4): 50-59 (1974)
L'OO ne se résume pas aux ADT (même si elle en dérive).
Les ADT sont quand même les ancêtres de l'objet.
J'ai suivi un workshop de Barbara Liskov à Berlin en 85 dans le cadre
d'un séminaire d'une semaine sur le génie logiciel.
Cette femme est vraiment géniale (c'est ma grande "chouchoute" dans le
domaine).
Post by Bruno Desthuilliers
Post by Wykaaa
Post by Bruno Desthuilliers
Post by Wykaaa
était assez précisément définie et j'en ai donné des preuves par
ailleurs. Celui qui résume (si on peut dire car son bouquin fait 1200
pages !) le mieux cette approche est Bertrand Meyer dans "Conception
et programmation objet"
Ce que "résume" (mouarf) Meyer est *son* approche de l'OO.
Ouais. Dans mon milieu, il est considéré que Bertrand Meyer est parmi
ceux qui ont produit la meilleure "littérature" sur l'objet. Du moins,
la plus clair (avec Grady Booch).
Ce qui ne contredit pas ma proposition.
-:)
Post by Bruno Desthuilliers
Post by Wykaaa
Post by Bruno Desthuilliers
Post by Wykaaa
Post by Bruno Desthuilliers
Post by Wykaaa
Post by Bruno Desthuilliers
On nage en pleine abstraction, là. Alors affirmer que (pour reformuler)
"(en OO) _le_ concept fondamental d'abstraction est la classe" me semble
au mieux relever de la myopie.
Alors Grady Booch, Bertrand Meyer and Co sont myopes !
Ah bin tu vois, quand tu veux !-)
Bertrand Meyer dans le chapitre 2 p25 (critères d'orientation objet)
: la méthode et le langage devraient utiliser la notion de classe
comme concept central.
Post by Bruno Desthuilliers
Plus sérieusement, est-ce que tu es capable de faire la différence entre
1/ "Dans le cadre de la méthode de conception objet définie par Grady
Booch, le concept fondamental d'abstraction fondamentale est la classe"
et
2/ "En OO, _le_ concept fondamental d'abstraction fondamentale est la
classe"
Oui
Bon. Alors peux-tu me décrire, en termes simples, cette différence ?
Je ne vois pas ce que tu veux me faire dire :-)
Tu es un GrosMenteur(tm) !-)
Un peu "joueur" aussi ;-)
Post by Bruno Desthuilliers
Post by Wykaaa
Post by Bruno Desthuilliers
Post by Wykaaa
Admettons qu'il existe une autre approche objet à base de langages à
prototype. Donne-moi les références de la ou des méthodes qui
permettent d'exprimer l'analyse, la conception, la programmation dans
cette approche.
Pour la programmation, on l'exprime généralement dans un langage de
programmation !-)
Non. Les langages ont des spécifications, souvent décrites de façon
formelles pour la sémantique.
Aucun rapport. Tu parlais "d'exprimer la programmation dans cette
approche" (nb: prototypes), je te réponds une évidence digne de M. de la
Palisse: la programmation objet à base de langages à prototypes
s'exprime dans un langage objet à prototypes. UML ne décrit pas la
grammaire ni la syntaxe d'un langage de programmation, et ne permet pas
"d'exprimer la programmation".
Post by Wykaaa
Exemples VDL pour PL/1, lambda-calcul non
typé pour les langages fonctionnels de type Lisp, le pi-calcul pour la
concurrence, etc.
Ahhh.... C'est de ça que tu parlais. Dis, tu a vu *où* une quelconque
"théorie formelle" servant de support à l'OO - je veux dire, quelque
chose de l'ordre des théories de Church pour le lambda-calcul ou de
celles de Codd pour le modèle relationel ? Bon, cherche pas : *y en a
pas*. Au mieux, on a deux pauvres "axiomes" de base - et c'est justement
le point de départ de cette discussion.
Et il y a des choses comme ça :
- ftp://ftp.inria.fr/INRIA/publication/publi-pdf/RR/RR-4499.pdf
- Castagna (G.). - Integration of parametric and "ad hoc" second order
polymorphism in a calculus with subtyping. Formal Aspects of Computing,
vol. 8, 1996, pp. 247-293
- U. S. Reddy. Objects as closures: Abstract semantics of
object-oriented languages.In Proc. of the ACM Conf. on Lisp and
Functional Programming, pages 289–297,
1988.

Et tous les travaux de William Cook (F-Bound) dont voici un des articles
récents : http://en.scientificcommons.org/42306597

Il y a bien d'autres choses encore...
Post by Bruno Desthuilliers
Post by Wykaaa
Post by Bruno Desthuilliers
Pour le reste, l'essentiel des efforts de nos experts s'étant
concentrés sur l'approche "class-based", il n'y a effectivement pas
grand chose comme écrits. Ceci signifie t'il pour autant que les
langages à prototypes ne soient pas des langages objets ? Evidemment non.
Ca reste à "prouver"
Tu ne peux pas prouver le contraire, pour les raisons ci-dessus. Par
contre, et toujours pour ces mêmes raisons, j'affirme que les langages à
prototypes sont des langages objet, puisqu'ils offre le support pour des
objets définis par une identité, un état et un comportement communicant
par envoi de messages. CQFD.
Ce n'est pas suffisant.
Post by Bruno Desthuilliers
Post by Wykaaa
Post by Bruno Desthuilliers
Accessoirement, la frontière entre prototype et classe est parfois
floue. Les classes de Python sont par certains aspects plus proches
des prototypes que des classes de Java.
J'en suis même personnellement convaincu.
Pourtant, Python est classé (c'est le cas de le dire) dans les langages
à classes.
Oui, souvent. Mais on ne va pas refaire une n-ième guerre des langages,
d'autant plus que, dans l'industrie, le ou les langages utilisés sont
souvent imposés.
D'ailleurs, je le répète, un de mes langages favoris est Ocaml, mais je
vois mal des systèmes d'armes écrits dans ce langage...

[un grand snip]
Post by Bruno Desthuilliers
Post by Wykaaa
Combien tes cours ?
Moi c'est 100 euros de l'heure minimum et là, je suis sérieux.
Alors je te fais un tarif d'ami : 250€ de l'heure. Pour les autres -
ceux qui lisent c.l.py - c'est gratuit !-)
NB : j'espère que tu a vu le clin d'oeil ?
Finalement, pour toi, ça sera 300 euros/heure parce qu'il va y avoir du
boulot pour te mettre dans la VRAIE approche objet :-D
ld
2009-11-17 15:57:30 UTC
Permalink
Post by Wykaaa
Post by Bruno Desthuilliers
AMHA, ton environnement plein d'experts qui ne connaissent rien à
l'informatique mais dictent à des singes programmeurs ce qu'ils doivent
pisser commence à déformer sérieusement ta vision. Dans la majorité des
cas, il n'y a pas de cloisement étanche entre conception et
programmation - au contraire, il y a des aller-retours constant entre
ces deux activités, généralement menés par les mêmes personnes. J'irai
même jusqu'à dire que, à un certain niveau de détail dans la conception,
ce ne sont que deux facettes d'une même activité.
C'est vrai dans ce que je n'ose même pas qualifier de méthode, à savoir
l'extrême programming (un habillage qui consiste à nous enfumer sur
l'absence de méthode à savoir "essais/erreurs").
Je suppose que vous vouliez dire "erreurs/essais". Parce que c'est la
difference entre du "n'importe quoi" et une _convergence_ vers un
design "quasi-optimal" (pour l'application visee). Il semble que la
fumee vous ait fait passer a cote de l'essentiel.

Ce que l'on peut reprocher a cette methode (car s'en est une), c'est
qu'elle ne convient pas a la realisation de framework mais plutot
d'application.

a+, ld.
Wykaaa
2009-11-17 22:03:27 UTC
Permalink
Post by ld
Post by Wykaaa
Post by Bruno Desthuilliers
AMHA, ton environnement plein d'experts qui ne connaissent rien à
l'informatique mais dictent à des singes programmeurs ce qu'ils doivent
pisser commence à déformer sérieusement ta vision. Dans la majorité des
cas, il n'y a pas de cloisement étanche entre conception et
programmation - au contraire, il y a des aller-retours constant entre
ces deux activités, généralement menés par les mêmes personnes. J'irai
même jusqu'à dire que, à un certain niveau de détail dans la conception,
ce ne sont que deux facettes d'une même activité.
C'est vrai dans ce que je n'ose même pas qualifier de méthode, à savoir
l'extrême programming (un habillage qui consiste à nous enfumer sur
l'absence de méthode à savoir "essais/erreurs").
Je suppose que vous vouliez dire "erreurs/essais". Parce que c'est la
difference entre du "n'importe quoi" et une _convergence_ vers un
design "quasi-optimal" (pour l'application visee). Il semble que la
fumee vous ait fait passer a cote de l'essentiel.
Oui c'est plutôt "erreurs/essais" que je voulais dire. Je ne suis pas
certain qu'elle débouche toujours sur une conception "quasi-optimale"...
Post by ld
Ce que l'on peut reprocher a cette methode (car s'en est une), c'est
qu'elle ne convient pas a la realisation de framework mais plutot
d'application.
Là je suis tout à fait d'accord avec vous.
ld
2009-11-17 16:18:23 UTC
Permalink
Post by Wykaaa
Admettons qu'il existe une autre approche objet à base de langages à
prototype. Donne-moi les références de la ou des méthodes qui permettent
d'exprimer l'analyse, la conception, la programmation dans cette approche.
Moi j'ai juste trouvé ceci :www.lirmm.fr/~dony/postscript/proto-lmo95.pdf,
mais ça date de 95.
Google "language prototype delegation clone"

1ere reponse:

http://en.wikipedia.org/wiki/Prototype-based_programming#Further_reading

Les trois premieres references sont significatives...

Je ne connais pas les autres. La delegation etant le point clef des
langages a prototypes, vous comprendrez pourquoi ils ne sont pas
statiquement types meme s'il existe des tentatives de systeme a typage
statique.

Quitte a elargir vos horizons, regardez aussi du cote du predicate
dispatch. Vous y trouverez une theorie unifiee (la plus generale a ma
connaissance) de tout ce qui concerne les types, objets, classes,
messages (incluant OO et derivation). Attention, cela pourrait alterer
votre point de vu sur l'OO.

a+, ld.
Wykaaa
2009-11-17 22:27:29 UTC
Permalink
Post by ld
Post by Wykaaa
Admettons qu'il existe une autre approche objet à base de langages à
prototype. Donne-moi les références de la ou des méthodes qui permettent
d'exprimer l'analyse, la conception, la programmation dans cette approche.
Moi j'ai juste trouvé ceci :www.lirmm.fr/~dony/postscript/proto-lmo95.pdf,
mais ça date de 95.
Google "language prototype delegation clone"
http://en.wikipedia.org/wiki/Prototype-based_programming#Further_reading
Aïe, wikipedia, ça commence mal...
Post by ld
Les trois premieres references sont significatives...
Mais je connais les langages à prototype vous savez. J'ai même enseigné
javascript...
Post by ld
Je ne connais pas les autres. La delegation etant le point clef des
langages a prototypes, vous comprendrez pourquoi ils ne sont pas
statiquement types meme s'il existe des tentatives de systeme a typage
statique.
Oui, bien sûr.
Post by ld
Quitte a elargir vos horizons, regardez aussi du cote du predicate
dispatch. Vous y trouverez une theorie unifiee (la plus generale a ma
connaissance) de tout ce qui concerne les types, objets, classes,
messages (incluant OO et derivation). Attention, cela pourrait alterer
votre point de vu sur l'OO.
Oui, je connais un peu mais je ne l'ai pas pratiqué.

Vous voulez parler de ce livre
:http://www.springerlink.com/content/b737454110600hg3/ ?
ld
2009-11-18 08:41:44 UTC
Permalink
Post by Wykaaa
Post by ld
Post by Wykaaa
Admettons qu'il existe une autre approche objet à base de langages à
prototype. Donne-moi les références de la ou des méthodes qui permettent
d'exprimer l'analyse, la conception, la programmation dans cette approche.
Moi j'ai juste trouvé ceci :www.lirmm.fr/~dony/postscript/proto-lmo95.pdf,
mais ça date de 95.
Google "language prototype delegation clone"
http://en.wikipedia.org/wiki/Prototype-based_programming#Further_reading
Aïe, wikipedia, ça commence mal...
Pas forcement.
Post by Wykaaa
Post by ld
Les trois premieres references sont significatives...
Mais je connais les langages à prototype vous savez. J'ai même enseigné
javascript...
C'est vous qui demandiez des references. Je n'ai fait que repondre et
il se trouve que wikipedia contient deux des references auxquelles je
pensais.
Post by Wykaaa
Post by ld
Je ne connais pas les autres. La delegation etant le point clef des
langages a prototypes, vous comprendrez pourquoi ils ne sont pas
statiquement types meme s'il existe des tentatives de systeme a typage
statique.
Oui, bien sûr.
Post by ld
Quitte a elargir vos horizons, regardez aussi du cote du predicate
dispatch. Vous y trouverez une theorie unifiee (la plus generale a ma
connaissance) de tout ce qui concerne les types, objets, classes,
messages (incluant OO et derivation). Attention, cela pourrait alterer
votre point de vu sur l'OO.
Oui, je connais un peu mais je ne l'ai pas pratiqué.
Vous voulez parler de ce livre
:http://www.springerlink.com/content/b737454110600hg3/?
Ce "livre", c'est les proceedings de ECOOP98 dans lequel le papier se
trouve:

http://www.cs.washington.edu/homes/mernst/pubs/dispatching-ecoop98-abstract.html

a+, ld.
Continuer la lecture sur narkive:
Loading...