Discussion:
définition d'un objet
(trop ancien pour répondre)
s***@gmail.com
2006-09-18 14:49:20 UTC
Permalink
Bonjour,


J'aurai aimé savoir s'il était préférable qu'un objet soit quelque
chose, c'est à dire assimilable à un être concret, plutôt qu'il
s'occupe de quelque chose.
Merci.
Miguel Moquillon
2006-09-18 14:53:26 UTC
Permalink
Post by s***@gmail.com
Bonjour,
J'aurai aimé savoir s'il était préférable qu'un objet soit quelque
chose, c'est à dire assimilable à un être concret, plutôt qu'il
s'occupe de quelque chose.
Un objet, dans un programme, représente un concept du monde de l'entreprise
ou une idée ou une chose du monde concret. Ce n'est pas une fonction si
c'est à quoi tu penses.
Par contre, il peut être dédié à une tâche précise pour laquelle il offre
différents services ou opérations : un gestionnaire de connexions par
exemple. Mais là aussi, tu dois le penser comme une entité, comme un sujet,
et non comme un verbe.
Bruno Desthuilliers
2006-09-18 21:38:55 UTC
Permalink
Post by Miguel Moquillon
Post by s***@gmail.com
Bonjour,
J'aurai aimé savoir s'il était préférable qu'un objet soit quelque
chose, c'est à dire assimilable à un être concret, plutôt qu'il
s'occupe de quelque chose.
Un objet, dans un programme, représente un concept du monde de l'entreprise
ou une idée ou une chose du monde concret.
Ah bon ? Une boite de dialogue, une connection à une base de donnée ou
un handler de fichier sont des concepts du monde de l'entreprise ou des
idées ou choses du monde concret ? On ne doit pas vivre dans le même
monde !-)
Post by Miguel Moquillon
Ce n'est pas une fonction si
c'est à quoi tu penses.
Python 2.4.1 (#1, Jul 23 2005, 00:37:37)
[GCC 3.3.4 20040623 (Gentoo Linux 3.3.4-r1, ssp-3.3.2-2, pie-8.7.6)] on
linux2
Type "help", "copyright", "credits" or "license" for more information.
... print arg
...
Post by Miguel Moquillon
Post by s***@gmail.com
func
<function func at 0x40423374>
Post by Miguel Moquillon
Post by s***@gmail.com
func.__class__
<type 'function'>
Post by Miguel Moquillon
Post by s***@gmail.com
func.func_code
<code object func at 0x4041b1a0, file "<stdin>", line 1>
Post by Miguel Moquillon
Post by s***@gmail.com
isinstance(func, object)
True
Post by Miguel Moquillon
Post by s***@gmail.com
newfunc = func.__new__(func.__class__, func.func_code, func.__dict__)
newfunc
<function func at 0x404233ac>
Post by Miguel Moquillon
Post by s***@gmail.com
newfunc is func
False
Il semblerait pourtant bien que dans certains langages, un fonction soit
... def __call__(self, arg):
... print arg
...
Post by Miguel Moquillon
Post by s***@gmail.com
func2 = MyFunctionType() # create a new instance of type
func2(42)
42
Post by Miguel Moquillon
Par contre, il peut être dédié à une tâche précise pour laquelle il offre
différents services ou opérations : un gestionnaire de connexions par
exemple. Mais là aussi, tu dois le penser comme une entité, comme un sujet,
et non comme un verbe.
En analyse, oui. En conception, c'est déjà plus tangeant. En ce qui
concerne l'implémentation, c'est avant tout lié au langage.
Accessoirement, quand les fonctions sont des objets, on peut les
considérer aussi bien comme des sujets que comme des verbes... Cette
distinction entre "données" et "fonctions", héritée des langages
procéduraux, est en fait franchement arbitraire (et pas seulement du
point de vue conceptuel - pour l'ordinateur, il s'agit toujours d'une
suite de bits stockés à une adresse mémoire, et l'interprétation qu'il
va en faire dépend essentiellement de ce qu'on lui demande (c'est
d'ailleurs à l'origine de pas mal de faille de sécurité...)).

Mes deux centimes...
Miguel Moquillon
2006-09-19 09:56:14 UTC
Permalink
Post by Bruno Desthuilliers
Post by Miguel Moquillon
Un objet, dans un programme, représente un concept du monde de
l'entreprise ou une idée ou une chose du monde concret.
Ah bon ? Une boite de dialogue, une connection à une base de donnée ou
un handler de fichier sont des concepts du monde de l'entreprise ou des
idées ou choses du monde concret ? On ne doit pas vivre dans le même
monde !-)
Si si on vit bien dans le même monde. La preuve on peut communiquer
ensemble. Évidemment, je ne saurais être exhaustif et donc on peut rajouter
aussi des concepts informatiques.
Post by Bruno Desthuilliers
Post by Miguel Moquillon
Ce n'est pas une fonction si
c'est à quoi tu penses.
Python 2.4.1 (#1, Jul 23 2005, 00:37:37)
[GCC 3.3.4 20040623 (Gentoo Linux 3.3.4-r1, ssp-3.3.2-2, pie-8.7.6)] on
linux2
Type "help", "copyright", "credits" or "license" for more information.
... print arg
...
Post by Miguel Moquillon
func
<function func at 0x40423374>
Post by Miguel Moquillon
func.__class__
<type 'function'>
Post by Miguel Moquillon
func.func_code
<code object func at 0x4041b1a0, file "<stdin>", line 1>
Post by Miguel Moquillon
isinstance(func, object)
True
Post by Miguel Moquillon
newfunc = func.__new__(func.__class__, func.func_code, func.__dict__)
newfunc
<function func at 0x404233ac>
Post by Miguel Moquillon
newfunc is func
False
Il semblerait pourtant bien que dans certains langages, un fonction soit
... print arg
...
Post by Miguel Moquillon
func2 = MyFunctionType() # create a new instance of type
func2(42)
42
Que les fonctions puissent être implémentées sous forme d'objet dans un
langage est une chose, qu'un objet soit une fonction en est une autre.
De même, les fonctors (objets qui agissent comme une fonction) sont une
chose, les fonctions par elles-même une autre.

Il faut arrêter de percevoir la PO qu'au travers de la petite lorgnette de
tel ou tel langage de programmation. Avec C++ ça a abouti suffisamment à
des travers pour que l'on commence à arrêter les conneries.
Post by Bruno Desthuilliers
Post by Miguel Moquillon
Par contre, il peut être dédié à une tâche précise pour laquelle il offre
différents services ou opérations : un gestionnaire de connexions par
exemple. Mais là aussi, tu dois le penser comme une entité, comme un
sujet, et non comme un verbe.
En analyse, oui. En conception, c'est déjà plus tangeant. [...]
Non, non et non. Arrêtons de tout voir par et uniquement par les langages
qui ne sont que des outils limités de l'approche objet.
Tout ça pour s'excuser de faire du mixte de procédurale et de l'objet parce
qu'on a du mal à faire de la programmation par objets correcte. Et après,
on va entendre des soit disant experts (qui ne sont experts que par leur
prétention de l'être) que l'objet c'est limité, c'est machin, c'est truc.

Note : désolé ... j'ai piqué une colère.
Post by Bruno Desthuilliers
(et pas seulement du
point de vue conceptuel - pour l'ordinateur, il s'agit toujours d'une
suite de bits stockés à une adresse mémoire, et l'interprétation qu'il
va en faire dépend essentiellement de ce qu'on lui demande (c'est
d'ailleurs à l'origine de pas mal de faille de sécurité...)).
L'approche objet est une abstraction bien au-dessus de considérations de
bits (pas de vilain jeux de mots stp :) )
Bruno Desthuilliers
2006-09-19 11:46:57 UTC
Permalink
Post by Miguel Moquillon
Post by Bruno Desthuilliers
Post by Miguel Moquillon
Un objet, dans un programme, représente un concept du monde de
l'entreprise ou une idée ou une chose du monde concret.
Ah bon ? Une boite de dialogue, une connection à une base de donnée ou
un handler de fichier sont des concepts du monde de l'entreprise ou des
idées ou choses du monde concret ? On ne doit pas vivre dans le même
monde !-)
Si si on vit bien dans le même monde. La preuve on peut communiquer
ensemble.
!-)
Post by Miguel Moquillon
Évidemment, je ne saurais être exhaustif et donc on peut rajouter
aussi des concepts informatiques.
Bref, un objet représente un élément du programme, que cet élément
provienne du problème ou de la solution...

Bon, on est bien avancé avec ça !-)
Post by Miguel Moquillon
Post by Bruno Desthuilliers
Post by Miguel Moquillon
Ce n'est pas une fonction si
c'est à quoi tu penses.
Python 2.4.1 (#1, Jul 23 2005, 00:37:37)
[GCC 3.3.4 20040623 (Gentoo Linux 3.3.4-r1, ssp-3.3.2-2, pie-8.7.6)] on
linux2
Type "help", "copyright", "credits" or "license" for more information.
... print arg
...
Post by Miguel Moquillon
func
<function func at 0x40423374>
Post by Miguel Moquillon
func.__class__
<type 'function'>
Post by Miguel Moquillon
func.func_code
<code object func at 0x4041b1a0, file "<stdin>", line 1>
Post by Miguel Moquillon
isinstance(func, object)
True
Post by Miguel Moquillon
newfunc = func.__new__(func.__class__, func.func_code, func.__dict__)
newfunc
<function func at 0x404233ac>
Post by Miguel Moquillon
newfunc is func
False
Il semblerait pourtant bien que dans certains langages, un fonction soit
... print arg
...
Post by Miguel Moquillon
func2 = MyFunctionType() # create a new instance of type
func2(42)
42
Que les fonctions puissent être implémentées sous forme d'objet dans un
langage est une chose, qu'un objet soit une fonction en est une autre.
Je n'ai pas dit qu'un objet *était* une fonction, juste qu'un objet
*pouvait être* une function (et réciproquement). Et crois moi, c'est
*très* loin d'être un gadget.
Post by Miguel Moquillon
De même, les fonctors (objets qui agissent comme une fonction) sont une
chose, les fonctions par elles-même une autre.
J'avoue avoir du mal à saisir la différence conceptuelle profonde. Le
pattern functor - comme une grande majorité des design patterns du GOF -
n'est jamais qu'une solution de contournement née des limitations de
certains langages plus ou moins OO.
Post by Miguel Moquillon
Il faut arrêter de percevoir la PO qu'au travers de la petite lorgnette de
tel ou tel langage de programmation.
Tout à fait d'accord. C'est bien pour ça que je cite l'exemple
(relativement marginal - hélas AMHA) d'un langage où les fonctions sont
des objets...

Le problème, c'est l'OO "officiel" est exactement ce que tu dénonces :
une réduction du concept aux fonctionnalités supportés par quelques
langages soit-disant OO mais pour la plupart bien plus proche du
procédural que du modèle d'origine proposé par Smalltalk.
Post by Miguel Moquillon
Avec C++ ça a abouti suffisamment à
des travers pour que l'on commence à arrêter les conneries.
Post by Bruno Desthuilliers
Post by Miguel Moquillon
Par contre, il peut être dédié à une tâche précise pour laquelle il offre
différents services ou opérations : un gestionnaire de connexions par
exemple. Mais là aussi, tu dois le penser comme une entité, comme un
sujet, et non comme un verbe.
En analyse, oui. En conception, c'est déjà plus tangeant. [...]
Non, non et non. Arrêtons de tout voir par et uniquement par les langages
qui ne sont que des outils limités de l'approche objet.
Jusqu'à preuve du contraire, il s'agit bien au final d'implémenter une
solution, ce qui nécessite un langage de programmation. La conception
n'est *pas* indépendante des technos choisies (malgré ce que certains
marchands de vent voudraient faire croire). Se limiter, lors de la
conception, au sous-ensemble commun aux technos "main stream", c'est
AMHA s'amputer le cerveau.
Post by Miguel Moquillon
Tout ça pour s'excuser de faire du mixte de procédurale et de l'objet parce
qu'on a du mal à faire de la programmation par objets correcte.
Je ne vois pas où est le problème à utiliser des fonctions là où c'est
la solution appropriée. En faire des méthodes statique d'une classe
bidon qui n'existe que parce les concepteurs du langage ont décidé que
tout devait être mis dans une classe ne change rien au problème.

Par ailleurs, je me permets d'attirer ton attention sur le fait que
fonction n'implique pas procédural. Le fait d'avoir des fonctions
représentées par des objets permet une approche fonctionelle qui est
parfois la plus appropriée (et que d'autres langages émulent par
l'emploi de 'functors'). Pour ce que ça vaut, Smalltalk (qui reste,
qu'on le veuille ou non, *la* référence en matière d'OO) utilise
lui-même une approche inspirée de la programmation fonctionnelle (les
"blocks" de Smalltalk ne sont pas grand chose d'autre que des fermetures).
Post by Miguel Moquillon
Et après,
on va entendre des soit disant experts (qui ne sont experts que par leur
prétention de l'être) que l'objet c'est limité, c'est machin, c'est truc.
Mais *c'est* limité !-) En tous cas dans la version "officielle" (UML,
Java et autres couenneries déficientes du bulbe). Ce n'est certainement
pas un hasard si de plus en plus de langages essentiellement objets
tournent le dos à cette approche réductrice et intègrent de plus en plus
d'éléments provenant des langages fonctionnels.
Post by Miguel Moquillon
Note : désolé ... j'ai piqué une colère.
Pas de mal, ça m'arrive aussi - comme tu a pu le constater en lisant
cette diatribe.
Post by Miguel Moquillon
Post by Bruno Desthuilliers
(et pas seulement du
point de vue conceptuel - pour l'ordinateur, il s'agit toujours d'une
suite de bits stockés à une adresse mémoire, et l'interprétation qu'il
va en faire dépend essentiellement de ce qu'on lui demande (c'est
d'ailleurs à l'origine de pas mal de faille de sécurité...)).
L'approche objet est une abstraction bien au-dessus de considérations de
bits (pas de vilain jeux de mots stp :) )
Je parlais de la distinction artifielle entre données et traitements.
--
bruno desthuilliers
python -c "print '@'.join(['.'.join([w[::-1] for w in p.split('.')]) for
p in '***@xiludom.gro'.split('@')])"
Miguel Moquillon
2006-09-19 12:09:52 UTC
Permalink
Post by Bruno Desthuilliers
une réduction du concept aux fonctionnalités supportés par quelques
langages soit-disant OO mais pour la plupart bien plus proche du
procédural que du modèle d'origine proposé par Smalltalk.
C'est là où je ne suis pas d'accord, ou alors nous n'avons pas la même
vision de l'approche objet officielle.
Le problème est l'expérience langage-centrique des développeurs quant à la
PO. Cette expérience conduit à ce que j'appellerai alors l'approche
officieuse. L'approche officiel est bien au delà de ça. Exemple : les
langages s'évertuent à se limiter au typage de premier ordre auquel ils ont
rajouté l'attachement dynamique (ce qui conduit potentiellement à des
erreurs de typages), à définir que syntaxiquement un type, etc. Dans le
paradigme objet, seul le typage du second ordre permet d'exprimer les types
des objets en introduisant implicitement le polymorphisme et la
redéfinition par exemple. De plus, un type est correctement exprimé
lorsqu'il est défini à la fois syntaxiquement et sémantiquement => ce qui
permet une meilleur réutilisation. Etc.
Sinon, par rapport à Smalltalk, je suis complètement d'accord.
Post by Bruno Desthuilliers
Post by Miguel Moquillon
Tout ça pour s'excuser de faire du mixte de procédurale et de l'objet
parce qu'on a du mal à faire de la programmation par objets correcte.
Je ne vois pas où est le problème à utiliser des fonctions là où c'est
la solution appropriée. En faire des méthodes statique d'une classe
bidon qui n'existe que parce les concepteurs du langage ont décidé que
tout devait être mis dans une classe ne change rien au problème.
J'ai appris une chose par l'expérience : ou ta solution est objet ou elle ne
l'est pas. Autrement dit les solutions intermédiaires n'existent pas. Dès
que tu commences à polluer ta solution de, par exemple, considérations
procédurales, tu brises alors ton modèle objet (ce qui n'est plus un modèle
objet) et finalement tu aboutis à un résultat dans lequel tu as surtout les
désavantages des deux approches, sans avoir nécessairement leurs plus gros
avantages. Pour moi, mettre des fonctions dans une classe (que l'on appelle
souvent classe utilitaire d'ailleurs) c'est faire du procédurale cachée,
mais c'est du procédurale quand même.
Par contre, je conviens qu'avec certains langages, il est plus difficile de
développer correctement en objet et qu'il faut faire preuve de rigueur qui
finalement n'aboutit qu'à fatiguer les développeurs.
Post by Bruno Desthuilliers
Par ailleurs, je me permets d'attirer ton attention sur le fait que
fonction n'implique pas procédural. Le fait d'avoir des fonctions
représentées par des objets permet une approche fonctionelle qui est
parfois la plus appropriée (et que d'autres langages émulent par
l'emploi de 'functors'). Pour ce que ça vaut, Smalltalk (qui reste,
qu'on le veuille ou non, *la* référence en matière d'OO) utilise
lui-même une approche inspirée de la programmation fonctionnelle (les
"blocks" de Smalltalk ne sont pas grand chose d'autre que des fermetures).
Bon, je crois alors que l'on ne s'est pas finalement pas compris. J'ai mal
interprété tes propos et sur le fond finalement on semble être d'accord.
Sinon, je rajouterais ceci par rapport à Smalltalk : outre les fermetures
lexicales, c'est sa syntaxe orienté sujet et son principe même de méthodes
(une méthode qui ne retourne rien, renvoie par défaut l'objet lui-même une
fois le message répondu) qui donne à Smalltalk son aspect "fonctionnel".
En fait, c'est parce que l'on peut faire du typage du second ordre avec que
finalement Smalltalk parait encore si avancé comparé aux autres langages
objets.
Pascal Bourguignon
2006-09-19 12:33:43 UTC
Permalink
Post by Bruno Desthuilliers
Bref, un objet représente un élément du programme, que cet élément
provienne du problème ou de la solution...
Bon, on est bien avancé avec ça !-)
En effet. En Smalltalk tout est un objet. Même les structures de
controle du programme, comme les selecteurs comme #ifTrue: et
#whileTrue:.
Post by Bruno Desthuilliers
Post by Miguel Moquillon
Tout ça pour s'excuser de faire du mixte de procédurale et de l'objet parce
qu'on a du mal à faire de la programmation par objets correcte.
Je ne vois pas où est le problème à utiliser des fonctions là où c'est
la solution appropriée. En faire des méthodes statique d'une classe
bidon qui n'existe que parce les concepteurs du langage ont décidé que
tout devait être mis dans une classe ne change rien au problème.
Par ailleurs, je me permets d'attirer ton attention sur le fait que
fonction n'implique pas procédural. Le fait d'avoir des fonctions
représentées par des objets permet une approche fonctionelle qui est
parfois la plus appropriée (et que d'autres langages émulent par
l'emploi de 'functors'). Pour ce que ça vaut, Smalltalk (qui reste,
qu'on le veuille ou non, *la* référence en matière d'OO) utilise
lui-même une approche inspirée de la programmation fonctionnelle (les
"blocks" de Smalltalk ne sont pas grand chose d'autre que des fermetures).
Post by Miguel Moquillon
Et après,
on va entendre des soit disant experts (qui ne sont experts que par leur
prétention de l'être) que l'objet c'est limité, c'est machin, c'est truc.
Mais *c'est* limité !-) En tous cas dans la version "officielle" (UML,
Java et autres couenneries déficientes du bulbe). Ce n'est certainement
pas un hasard si de plus en plus de langages essentiellement objets
tournent le dos à cette approche réductrice et intègrent de plus en plus
d'éléments provenant des langages fonctionnels.
Il y a un antagonisme fondamental entre la programmation par objet et
la programmation fonctionnelle.

Dans la programmation fonctionnelle, quand on n'a que des fonctions
pures, il n'y a pas d'état.

Alors que la programmation par objet n'est concernée justement que par
l'état des objets. Quand il n'y a pas d'état on est bien embêté en
POO, c'est là qu'on fait intervenir des classes et méthodes de classes
artificielles.

Ça n'empêche pas de concevoir un language de programmation avec lequel
on puisse utiliser les deux approches (par exemple, en Lisp). Mais il
faut savoir ce qu'on fait.




Donc, qu'est ce un objet?

Un objet c'est une entité qui a une identité et un état, qu'on
modélise en encapsulant des attributs et des méthodes, c'est à dire
des données et des procédures travaillant sur ces données.
--
__Pascal Bourguignon__ http://www.informatimago.com/

"Debugging? Klingons do not debug! Our software does not coddle the
weak."
Miguel Moquillon
2006-09-19 13:11:34 UTC
Permalink
Post by Pascal Bourguignon
Il y a un antagonisme fondamental entre la programmation par objet et
la programmation fonctionnelle.
Dans la programmation fonctionnelle, quand on n'a que des fonctions
pures, il n'y a pas d'état.
C'est un peu réducteur, voir faux. En fait, en programmation fonctionnelle,
les entités logiciels manipulées sont des fonctions qui s'appuient
toutefois sur les types de base. Un langage fonctionnel est dit pur
lorsqu'il n'y a pas d'effet de bords dans la manipulation des données,
c'est tout. Un donnée, exprimée sous forme de fonction ou de types de base,
a au moins 1 état, seulement le passage d'un état à l'autre conduit à une
autre donnée ou fonction. Pour vraiment apprécier ce qu'est un langage
fonctionnel pur, voir Haskell qui plus est est libre.
Post by Pascal Bourguignon
Alors que la programmation par objet n'est concernée justement que par
l'état des objets. Quand il n'y a pas d'état on est bien embêté en
POO, c'est là qu'on fait intervenir des classes et méthodes de classes
artificielles.
D'abord, je ne suis pas tout à fait d'accord sur cette assertion : dans un
premier temps, on se concentre sur le type de l'objet, donc sur la syntaxe
et la sémantique des messages, indépendamment de la structure interne de
l'objet qui décrit finalement son état ou plus exactement sa machine à
état. Dans un deuxième temps, on se concentre effectivement sur l'état de
l'objet. Du moins, c'est l'approche que je préconise dans le développement
objet.

Ensuite, dans la réalité, j'ai plus l'impression que l'on fait intervenir
des classes artificielles pour écrire ce qui a été mal (voir pas de tout)
exprimé ou modélisé. Car d'après mon expérience, lorsqu'il ne semble pas
avoir d'état, c'est qu'il y a déjà quelque part un problème ; en effet, une
entité a toujours au moins un état, que ce dernier soit ou non explicité
par son codeur.
Post by Pascal Bourguignon
Ça n'empêche pas de concevoir un language de programmation avec lequel
on puisse utiliser les deux approches (par exemple, en Lisp). Mais il
faut savoir ce qu'on fait.
Hum ... CLOS par exemple. L'approche objet est une abstraction
supplémentaire dans la conception d'un programme, raison pour laquelle des
langages objet peuvent aussi bien revêtir une forme fonctionnelle
qu'impérative.
Pascal Bourguignon
2006-09-19 16:06:25 UTC
Permalink
Post by Miguel Moquillon
Post by Pascal Bourguignon
Il y a un antagonisme fondamental entre la programmation par objet et
la programmation fonctionnelle.
Dans la programmation fonctionnelle, quand on n'a que des fonctions
pures, il n'y a pas d'état.
C'est un peu réducteur, voir faux. En fait, en programmation fonctionnelle,
les entités logiciels manipulées sont des fonctions qui s'appuient
toutefois sur les types de base. Un langage fonctionnel est dit pur
lorsqu'il n'y a pas d'effet de bords dans la manipulation des données,
c'est tout. Un donnée, exprimée sous forme de fonction ou de types de base,
a au moins 1 état, seulement le passage d'un état à l'autre conduit à une
autre donnée ou fonction. Pour vraiment apprécier ce qu'est un langage
fonctionnel pur, voir Haskell qui plus est est libre.
Oui, je sais que ma définition est un peu dure. Elle exclue les choses
comme les nombres des objets. Comme on ne peut pas modifier un
nombre, c'est qu'il n'a pas d'état, seulement une identité. Si on
accepte cette définition, Smalltalk y va un peu trop fort.


J'admet qu'en pratique, en programmation objet, on peut considérer des
objets sans état, où seul l'identité de l'objet est utile. Mais
souvent ce sont ces cas limitites (par exemple, les singletons), qui
sont critiqué à partir des langages moins fondamentalistement OO.
Post by Miguel Moquillon
Post by Pascal Bourguignon
Alors que la programmation par objet n'est concernée justement que par
l'état des objets. Quand il n'y a pas d'état on est bien embêté en
POO, c'est là qu'on fait intervenir des classes et méthodes de classes
artificielles.
D'abord, je ne suis pas tout à fait d'accord sur cette assertion : dans un
premier temps, on se concentre sur le type de l'objet, donc sur la syntaxe
et la sémantique des messages, indépendamment de la structure interne de
l'objet qui décrit finalement son état ou plus exactement sa machine à
état. Dans un deuxième temps, on se concentre effectivement sur l'état de
l'objet. Du moins, c'est l'approche que je préconise dans le développement
objet.
Ensuite, dans la réalité, j'ai plus l'impression que l'on fait intervenir
des classes artificielles pour écrire ce qui a été mal (voir pas de tout)
exprimé ou modélisé. Car d'après mon expérience, lorsqu'il ne semble pas
avoir d'état, c'est qu'il y a déjà quelque part un problème ; en effet, une
entité a toujours au moins un état, que ce dernier soit ou non explicité
par son codeur.
Oui, ensuite en pratique, il faut voir selon les circonstances quelle
méthodologie d'analyse on emploie; ça dépend de l'environnement et du
type de développement. Les questions techniques de programmation sont
subalterne, et c'est simplement plus agréable quand le langage de
programmation impose le moins de contraintes possible.
--
__Pascal Bourguignon__ http://www.informatimago.com/

NEW GRAND UNIFIED THEORY DISCLAIMER: The manufacturer may
technically be entitled to claim that this product is
ten-dimensional. However, the consumer is reminded that this
confers no legal rights above and beyond those applicable to
three-dimensional objects, since the seven new dimensions are
"rolled up" into such a small "area" that they cannot be
detected.
Bruno Desthuilliers
2006-09-20 09:04:15 UTC
Permalink
Pascal Bourguignon wrote:
(snip)
Post by Pascal Bourguignon
Oui, je sais que ma définition est un peu dure. Elle exclue les choses
comme les nombres des objets. Comme on ne peut pas modifier un
nombre, c'est qu'il n'a pas d'état, seulement une identité.
On peut aussi prendre une autre approche: les nombres ont un état (leur
valeur), mais cet état n'est pas modifiable.
Post by Pascal Bourguignon
Si on
accepte cette définition, Smalltalk y va un peu trop fort.
D'un autre côté, avoir une seule et même "abstraction de base" pour tout
un système n'est pas une mauvaise chose. En ce qui concerne Smalltalk,
dans la mesure où les structures de contrôles sont construites sur
l'envoi de messages, il était difficile de faire autrement...
Post by Pascal Bourguignon
J'admet qu'en pratique, en programmation objet, on peut considérer des
objets sans état, où seul l'identité de l'objet est utile.
Dans le cas des fonctions, le code de la fonction peut être vu comme
faisant partie de son état, puisqu'il détermine le comportement de
l'objet en réaction au message 'call'.
Post by Pascal Bourguignon
Mais
souvent ce sont ces cas limitites (par exemple, les singletons),
Dans la majorité des cas, l'utilité d'un singleton ne se limite pas à
son identité...

(snip)
--
bruno desthuilliers
python -c "print '@'.join(['.'.join([w[::-1] for w in p.split('.')]) for
p in '***@xiludom.gro'.split('@')])"
Bruno Desthuilliers
2006-09-18 21:24:32 UTC
Permalink
Post by s***@gmail.com
Bonjour,
J'aurai aimé savoir s'il était préférable qu'un objet soit quelque
chose, c'est à dire assimilable à un être concret, plutôt qu'il
s'occupe de quelque chose.
Il est impossible de répondre à cette question dans l'absolu. Du point
de vue informatique, un objet est essentiellement une instance de
l'association d'une structure de données et d'un ensemble de traitements
agissant sur cette structure de données (bref, un ADT). Qu'il soit
utilisé pour modéliser un élément du domaine ou un élément de la
solution est de ce point de vue tout à fait accessoire - à vrai dire, on
a généralement les deux cas. Dans un langage "pur objet", de toutes
façons, *tout* est un objet. En Python par exemple, non seulement tous
les types "primitifs" (numériques, chaines etc) ou complexes (listes,
tuples, dictionnaires etc) sont des objets, mais même les fonctions, les
modules ou les classes sont eux-mêmes des objets. Tu comprends que dans
ce cadre, ta question n'a guère de sens...

Du point de vue de l'analyse et de la conception, le problème est
légèrement différent. L'analyse consiste essentiellement (du moins pour
la partie qui nous intéresse ici) à modéliser le domaine (le problème à
résoudre). A ce stade, on a essentiellement - dans un premier temps du
moins - des représentations pratiquement 1 pour 1 d'éléments "concrets"
(ie client, produit, commande, facture etc). Attention, j'ai bien parlé
de *représentations* - il ne s'agit pas de modéliser fidèlement
l'élément réel (une personne par exemple), mais de se concentrer sur ce
qui fait sens dans le cadre du problème à résoudre (bref, de modéliser
l'élément *tel qu'il est vu par le système*, et non tel qu'il est
réellement - ce qui serait de toutes façons impossible).

En général, l'analyse détaillée tend à introduire un premier niveau
d'abstraction, en refactorisant les définitions obtenues lors de la
phase préalable afin d'obtenir un ensemble aussi cohérent que possible.
Cette phase commence à faire apparaître des objets qui relèvent plus de
la solution (système informatique) que du problème (système
d'information), comme par exemple des classes de base etc... Arrivé à la
conception (formulation de la solution), on voit apparaître une
multitude d'objets sans aucun rapport avec le domaine (objets
techniques, par opposition aux objets "métier" issus de l'analyse) - et
parfois même on voit les objets métier disparaître purement et
simplement (dans beaucoup d'applications de gestion, la multiplicité et
la complexité des relations entre les entités métier et des différentes
"vues" nécessaires entraine l'utilisation du modèle relationel, et
l'application ne voit plus que des des requêtes et des relations). Ce
qui n'empêche pas l'utilisation du modèle objet : une table, une requête
SQL etc peuvent eux-même être représentés comme des objets.

En tout état de cause, l'essentiel est de bien capturer les
responsabilités des différents objets et les relations qui les unissent.
L'implémentation en découle. Et de ne pas se tromper de granularité
selon les différentes phases.

HTH
f***@gmail.com
2006-09-19 09:43:53 UTC
Permalink
Bonjour,
Post by s***@gmail.com
J'aurai aimé savoir s'il était préférable qu'un objet soit quelque
chose, c'est à dire assimilable à un être concret, plutôt qu'il
s'occupe de quelque chose.
le "plutôt" me gêne car un objet regroupe les deux à la fois.

Un objet est une instance d'une classe qui définie des attributs
(taille, couleur ...) et des méthodes (sonner, clignoter, changer de
chaîne ...).

Il peut "s'occuper" d'autres objets dans divers types de relation avec
ceux-ci : utilisation / délégation, aggrégation, composition ...

Bref, rien d'exclusif, tout dépend du contexte.

À question floue ... réponse vague ;)
--
François
Moi ? Normand ?
fco not dead !
s***@gmail.com
2006-09-19 22:38:47 UTC
Permalink
Post by f***@gmail.com
Post by s***@gmail.com
J'aurai aimé savoir s'il était préférable qu'un objet soit quelque
chose, c'est à dire assimilable à un être concret, plutôt qu'il
s'occupe de quelque chose.
le "plutôt" me gêne car un objet regroupe les deux à la fois.
Un objet est une instance d'une classe qui définie des attributs
(taille, couleur ...) et des méthodes (sonner, clignoter, changer de
chaîne ...).
Il peut "s'occuper" d'autres objets dans divers types de relation avec
ceux-ci : utilisation / délégation, aggrégation, composition ...
Bref, rien d'exclusif, tout dépend du contexte.
À question floue ... réponse vague ;)
Je n'ai peut être pas été très clair dans l'énoncé de ma
question. En fait en disant s'occupe de quelque chose, je voulais dire
ne s'occupe que de quelque chose et donc qu'un objet puisse directement
être assimilable à une fonction. Pour simplifier, est-ce qu'un objet
peut être dénué de cette "consistance" qui pourrait caractériser un
objet et remplir exactement le même rôle qu'une fonction, "être" une
fonction ?

En fait ma question se réfère à un cas bien concret. Il s'agit d'un
programme faisant évoluer, graphiquement, des robots dans un même
espace. Ces robots possèdent un certain nombre de roues et ont bien
sûr la possibilité de se déplacer, avec différents types de
déplacements (tourner à gauche, avancer etc.) Evidement un robot
ayant 2 roues n'avancera pas de la même manière qu'un robot en ayant
4 car le nombre de moteurs requis sera différent.
La problématique vient lors de la création des robots. Il faut en
effet les initialiser en leur spécifiant les déplacements qu'ils
seront amenés à effectuer. Je cherchais à savoir si l'idée de
créer des classes implémentant les déplacements (comme reculer,
demi-tour etc.) de ces robots était une bonne idée. Bien sûr il
faudra créer une classe différente pour chaque déplacement
correspondant à un nombre de roues (avancer_2_roues, avancer_4_roues
reculer_2_roues etc..). Lors de l'initialisation des robots, il
faudrait alors donner des instances de ces classes au constructeur (le
langage est le java) de la classe robot.
J'aimerai savoir si une telle solution est adaptée.
Merci.
Bruno Desthuilliers
2006-09-20 08:30:26 UTC
Permalink
Post by s***@gmail.com
Post by f***@gmail.com
Post by s***@gmail.com
J'aurai aimé savoir s'il était préférable qu'un objet soit quelque
chose, c'est à dire assimilable à un être concret, plutôt qu'il
s'occupe de quelque chose.
le "plutôt" me gêne car un objet regroupe les deux à la fois.
Un objet est une instance d'une classe qui définie des attributs
(taille, couleur ...) et des méthodes (sonner, clignoter, changer de
chaîne ...).
Il peut "s'occuper" d'autres objets dans divers types de relation avec
ceux-ci : utilisation / délégation, aggrégation, composition ...
Bref, rien d'exclusif, tout dépend du contexte.
À question floue ... réponse vague ;)
Je n'ai peut être pas été très clair dans l'énoncé de ma
question. En fait en disant s'occupe de quelque chose, je voulais dire
ne s'occupe que de quelque chose et donc qu'un objet puisse directement
être assimilable à une fonction. Pour simplifier, est-ce qu'un objet
peut être dénué de cette "consistance" qui pourrait caractériser un
objet et remplir exactement le même rôle qu'une fonction, "être" une
fonction ?
Dans certains langages, les fonctions sont des objets, et il est
possible de créer soit même des objets se comportant comme des
fonctions. Dans les langages ne le permettant pas, on a créé le pattern
functor pour contourner cette limitation - ainsi que d'autres patterns
similaires (command, strategy...). Cela indique clairement, AMHA, qu'il
y a de réels cas d'utilisation pour des objets-fonctions...
Post by s***@gmail.com
En fait ma question se réfère à un cas bien concret. Il s'agit d'un
programme faisant évoluer, graphiquement, des robots dans un même
espace. Ces robots possèdent un certain nombre de roues et ont bien
sûr la possibilité de se déplacer, avec différents types de
déplacements (tourner à gauche, avancer etc.) Evidement un robot
ayant 2 roues n'avancera pas de la même manière qu'un robot en ayant
4 car le nombre de moteurs requis sera différent.
La problématique vient lors de la création des robots. Il faut en
effet les initialiser en leur spécifiant les déplacements qu'ils
seront amenés à effectuer. Je cherchais à savoir si l'idée de
créer des classes implémentant les déplacements (comme reculer,
demi-tour etc.) de ces robots était une bonne idée.
Bravo, tu viens de réinventer le pattern strategy !-)
Post by s***@gmail.com
Bien sûr il
faudra créer une classe différente pour chaque déplacement
correspondant à un nombre de roues (avancer_2_roues, avancer_4_roues
reculer_2_roues etc..). Lors de l'initialisation des robots, il
faudrait alors donner des instances de ces classes au constructeur (le
langage est le java) de la classe robot.
J'aimerai savoir si une telle solution est adaptée.
Dans l'idée générale, tout à fait.

Dans le détail, il peut éventuellement (difficile à dire sans connaitre
le détail du projet) être préférable de regrouper les différents actions
de déplacements dans une même classe, ie:

interface DeplacementRobot {
public void avancer();
public void reculer();
// etc
}

class Deplacement4Roues implements DeplacementRobot {
// ...
}

class Deplacement2Roues implements DeplacementRobot {
// ...
}

etc...
--
bruno desthuilliers
python -c "print '@'.join(['.'.join([w[::-1] for w in p.split('.')]) for
p in '***@xiludom.gro'.split('@')])"
Laurent Bossavit
2006-09-20 17:26:41 UTC
Permalink
Post by Bruno Desthuilliers
interface DeplacementRobot {
public void avancer();
public void reculer();
// etc
C'est le design pattern "Stratégie".

Pour le contributeur à l'origine de ce thread ("surcroma") je recommande
la lecture du livre "Design Patterns Tête La Première". Il est éclairant
sur ces tactiques indispensables en conception objet.
Post by Bruno Desthuilliers
class Deplacement4Roues implements DeplacementRobot {
// ...
Je me demande si on peut faire mieux pour le nommage des classes
dérivées de "DeplacementRobot". (Je ne dis pas que c'est mauvais,
simplement une intuition qu'il pourrait y avoir mieux.)

La question d'origine de "surcroma" ressemble à une question de philo,
mais en fait il faut la comprendre comme une (bonne) question sur le
*nommage* des classes.

Le nommage est important parce que bien nommer les choses, c'est un
prérequis à être capable de bien en parler, c'est à dire d'en parler
avec précision, simplicité et brièveté. D'ailleurs il n'y a pas que les
classes qui sont concernées, mais toutes les "parties du discours" -
méthodes, constantes, etc.

Par exemple, le nom d'une classe est (sauf cas exceptionnels) un
substantif singulier. Jamais (autant que je me souvienne) un verbe; ce
sont les méthodes qui sont les verbes. Une interface peut être nommée
d'un substantif singulier ou d'un adjectif, le plus souvent en "able",
par exemple "Observable".

La question à poser quand on voit le nom d'une classe est: ce nom
renseigne-t-il de façon efficace sur ce que sont les *responsabilités*
de l'objet en question ?

C'est avec cette question qu'on peut écarter comme "mauvais" une classe
qui s'appellerait "GestionnaireDeRobots". Que doit "gérer", exactement
ce gestionnaire ? Ca peut être tout et n'importe quoi.

Avec quoi est-ce qu'un robot avance ? Avec un bloc moteur. D'ailleurs un
robot qui n'est pas doté d'un bloc moteur n'avancera pas. Une classe
abstraite nommée BlocMoteur (avec des variétés comme
BlocMoteurTroisRoues ou BlocMoteursQuatreRoues ou même BlocMoteurHelice)
renseigne mieux sur les responsabilités qu'elle encapsule.

Laurent

Continuer la lecture sur narkive:
Loading...