La POO pour un nul ?

Discussions concernant tout ce qui n'entre pas dans le cadre des autres catégories.
[participation réservée aux utilisateurs inscrits]
Règles du forum
Merci de soigner la rédaction de vos messages et de consulter ce sujet avant de poster. Pensez également à utiliser la fonction recherche du forum.
François D.
Utilisateur chevronné
Utilisateur chevronné
Messages : 1367
Inscription : dimanche 30 juillet 2006, 10:04
Localisation : Alsace

La POO pour un nul ?

Message non lu par François D. »

Dans le fil de discussion dédié au sujet Bac S Métropole 2012, je disais que j'allais peut-être lancer un gentil troll que nous aurons le temps d'alimenter gentiment, profitant des vacances d'été :mrgreen: .
Partons de ce code Python :

Code : Tout sélectionner

from random import randint

max=int(raw_input("Quel est le maximum ? "))
n=int(raw_input("Combien de tirages ?"))
tab=range(1,max+1)
print(tab)
tirage=[]

for i in range(n):
    carte=randint(1,max)
    tirage.append(tab[carte-1])
    tab[carte-1]=tab[max-1]
    max=max-1

print("Le tirage est ",tirage)
La ligne qui sera le point de départ de la discussion est

Code : Tout sélectionner

tirage.append(tab[carte-1])
qui, autant que je peux en juger, est typique de la structure d'objet conférée à la liste appelée tirage.

Tout d'abord, malgré mes sollicitations répétées auprès de plusieurs personnes censées être particulièrement compétentes, j'ai eu énormément de mal à obtenir une définition à mes yeux valable de ce qu'est un objet au sens informatique du mot. J'ai même eu des réponses du genre : « inutile de savoir ce que c'est vraiment, ça s'utilise, c'est tout » :evil: .
Si j'ai bien suivi, un objet serait un « truc / machin / bidule » où cohabitent sous une même appellation des données et des procédures/fonctions permettant de les traiter.
Sur le code Python ci-dessus, à tirage, en tant que représentant (il paraît que, dans un délicieux anglicisme, on dit « instance ») de l'objet liste, est associé tirage.append(..) qui permet d'accrocher un élément supplémentaire à la liste tirage.

Bon, alors je le dis de manière abrupte : je ne vois pas ce que ça apporte :? .
Dans mon cerveau de dinosaure de la programmation élevé au TurboPascal, mettre les données et les outils de traitement dans les mêmes boîtes relève de la confusion des genres. Je trouve plus clair d'avoir des variables contenant les données, et des outils universels pour les traiter.

Pour en revenir à mon tirage, je trouverais plus clair qu'il y ait une fonction/procédure « absolue » appelée append à laquelle on passerait la variable tirage en paramètre, selon une syntaxe qui pourrait ressembler à

Code : Tout sélectionner

append(tirage,tab[carte-1])
ou

Code : Tout sélectionner

tirage=append(tirage,tab[carte-1])
à défaut du

Code : Tout sélectionner

tirage=tirage + tab[carte-1]
qui serait la forme la plus intuitive.

Bref : la POO, j'ai beau réfléchir au concept, ça coince. Les trolls sont lâchés :rifle: .
Tonn83
Utilisateur éprouvé
Utilisateur éprouvé
Messages : 886
Inscription : mercredi 05 novembre 2008, 01:19
Localisation : Paris, France

Re: La POO pour un nul ?

Message non lu par Tonn83 »

Définition du Wiktionnaire :
Objet --- (Programmation informatique) (Objet) Instance de classe. Un objet stocke des valeurs de données (attributs), sur lesquels travaillent les méthodes de la classe.
Classe --- (Programmation informatique) Un des concepts de base de la programmation orientée objet : ensemble d’objets partageant certaines propriétés (les méthodes).
Méthode --- (Programmation informatique) Équivalent d’une fonction ou d’une procédure associée à une classe et ou un objet, dans le développement orienté objet.
Procédure --- (Programmation informatique) Fonction ne renvoyant pas de valeur.
Fonction --- (Programmation informatique) Transformation d’un objet en un autre objet.
Je :arrow:
Tonn83
rebouxo
Modérateur honoraire
Modérateur honoraire
Messages : 6962
Inscription : mercredi 15 février 2006, 13:18
Localisation : le havre
Contact :

Re: La POO pour un nul ?

Message non lu par rebouxo »

Chouette. La chasse est ouverte.

Bon, pour ce que j'en comprend, objet = données+méthodes pour agir sur ces données. On n'a accès aux données de l'objet qu'au travers de méthodes qui sont des fonctions. La POO n'est intéressante que dans le cas ou tu travailles sur des projets à plusieurs, car comme tu n'a accès aux données d'un objet qu'au travers des méthodes, tu peux changer l'implémentation de ces méthodes, pourvu que tu ne changes pas le nom de la méthode qui accède aux données. Cela permet une meilleure maintenance du code. Le fait de ne pas avoir accès au données directement est un élément de sécurité important. Premier aspect important de la POO.

C'est pourquoi ton exemple est à mon avis mal choisi, car il est trop simple pour voir l'intérêt de la programmation objet. Prenons une liste. En python une liste peut contenir n'importe quoi. On est d'accord ?
Considérons une liste tab
Or tu peux faire tab+tab[j] sans te soucier du type de données contenu dans la liste tab. Voici, un autre avantage de la POO : la surcharge des opérateurs ! le même opérateur peut opérer sur des entiers, des flottants, des caractères, des vecteurs, des matrices, des complexes, .... Enfin, si ton langage te le permet, parce que en Java, c'est pas possible, mais cela l'est en C++ et en python. Ici, les opérateurs sont des fonctions (si, si) à deux arguments et l'on pourrait noter +(a,b), ou a b + ou ce que tu veux. Il y a donc un opérateur . qui prend un objet en premier argument et une méthode pour agir sur l'objet. Deuxième point important de la POO : le polymorphisme. Note bien que c'est bien le même + pour l'addition d'entier, et de flottant en Pascal, mais l'un ne dérive pas de l'autre, je pense que c'est le compilateur qui gère cela (mais je n'en sais absolument rien), alors qu'en POO, tu peux le programmer. Il me semble qu'il est impossible de surcharger un opérateur en Pascal. Bref, en POO +(int, int) ce n'est pas la même chose que +(double, double) ou +(vec, vec), mais dans ton programme, tu n'as qu'un seul opérateur (sauf en JAVA).

Troisième aspect : l'héritage. Je fais un TP d'info. Je définis des classes vecteur et matrice, puis sur ces classes, je définis les opérations classiques : +, x, produit scalaire, produit d'une matrice et d'un vecteur, norme d'un vecteur. Bon, maintenant, je ne m'intéresse qu'au matrice triangulaire, et bien je fais dériver mes matrices triangulaires de mes matrices (et tant qu'à faire, je fais les matrices triangulaires sup et inf, les diagonales). Hop, je n'ai pas besoin de refaire les opérations sur ces nouveaux objets, ils héritent de tout en bloc.

Bon, il me semble avoir fait le tour. Projetmbc, Arnaud et d'autres compléterons. Enfin dernier argument, si cela n'avait pas un quelconque avantage, on ne l'utiliserait pas autant.

Du côté des inconvénients : c'est très verbeux à programmer (enfin JAVA, C++, JAVAScript le sont, je n'utilise que très peux le côté POO de python).

Olivier
A line is a point that went for a walk. Paul Klee.
Par solidarité, pas de MP.
François D.
Utilisateur chevronné
Utilisateur chevronné
Messages : 1367
Inscription : dimanche 30 juillet 2006, 10:04
Localisation : Alsace

Re: La POO pour un nul ?

Message non lu par François D. »

rebouxo a écrit :Bon, pour ce que j'en comprend, objet = données+méthodes pour agir sur ces données. On n'a accès aux données de l'objet qu'au travers de méthodes qui sont des fonctions. La POO n'est intéressante que dans le cas ou tu travailles sur des projets à plusieurs, car comme tu n'a accès aux données d'un objet qu'au travers des méthodes, tu peux changer l'implémentation de ces méthodes, pourvu que tu ne changes pas le nom de la méthode qui accède aux données. Cela permet une meilleure maintenance du code. Le fait de ne pas avoir accès au données directement est un élément de sécurité important. Premier aspect important de la POO.
Bon, admettons, même si je pense qu'un projet en POO mal documenté restera moins facile à maintenir qu'un projet non POO bien documenté.
rebouxo a écrit :C'est pourquoi ton exemple est à mon avis mal choisi, car il est trop simple pour voir l'intérêt de la programmation objet. Prenons une liste. En python une liste peut contenir n'importe quoi. On est d'accord ?
Je ne connais pas assez les détails de Python pour oser dire le contraire.
rebouxo a écrit :Considérons une liste tab
Or tu peux faire tab+tab[j] sans te soucier du type de données contenu dans la liste tab. Voici, un autre avantage de la POO : la surcharge des opérateurs ! le même opérateur peut opérer sur des entiers, des flottants, des caractères, des vecteurs, des matrices, des complexes, .... Enfin, si ton langage te le permet, parce que en Java, c'est pas possible, mais cela l'est en C++ et en python. Ici, les opérateurs sont des fonctions (si, si) à deux arguments et l'on pourrait noter +(a,b), ou a b + ou ce que tu veux. Il y a donc un opérateur . qui prend un objet en premier argument et une méthode pour agir sur l'objet. Deuxième point important de la POO : le polymorphisme. Note bien que c'est bien le même + pour l'addition d'entier, et de flottant en Pascal, mais l'un ne dérive pas de l'autre, je pense que c'est le compilateur qui gère cela (mais je n'en sais absolument rien), alors qu'en POO, tu peux le programmer. Il me semble qu'il est impossible de surcharger un opérateur en Pascal. Bref, en POO +(int, int) ce n'est pas la même chose que +(double, double) ou +(vec, vec), mais dans ton programme, tu n'as qu'un seul opérateur (sauf en JAVA).
Et comme disent les anglophones : you lost me there.
Ou plutôt, si je comprends bien : on a une fonction de même apparence (+) capable d'opérer sur des données de types différents, dans la mesure où en fait ce sont des fonctions différentes avec la même « étiquette » ; alors, quel est le gain global par rapport à ce que j'appelle une fonction absolue + qui aurait été programmée de manière à pourvoir gérer tous les types de données qu'elle est susceptible de manipuler ? Tôt ou tard, il faut « se taper » toutes les possibilités.
rebouxo a écrit : Troisième aspect : l'héritage. Je fais un TP d'info. Je définis des classes vecteur et matrice, puis sur ces classes, je définis les opérations classiques : +, x, produit scalaire, produit d'une matrice et d'un vecteur, norme d'un vecteur. Bon, maintenant, je ne m'intéresse qu'au matrice triangulaire, et bien je fais dériver mes matrices triangulaires de mes matrices (et tant qu'à faire, je fais les matrices triangulaires sup et inf, les diagonales). Hop, je n'ai pas besoin de refaire les opérations sur ces nouveaux objets, ils héritent de tout en bloc.
Tu aurais les fonctions +, x, norme, etc., qui ont pour argument des matrices, qu'elle soient triangulaires ou non : que je sache, les matrices triangulaires forment un sous-ensemble des matrices ...
rebouxo a écrit : Bon, il me semble avoir fait le tour. Projetmbc, Arnaud et d'autres compléterons. Enfin dernier argument, si cela n'avait pas un quelconque avantage, on ne l'utiliserait pas autant.
Oh, il peut aussi y avoir eu au début un effet de mode pour un concept « furieusement tendance » :mrgreen: . Plus sérieusement on a pu être plus ou moins contraint de suivre un mouvement initié par quelques leaders du secteur, pour rester à la page ; après, une fois le pli pris ...
rebouxo a écrit : Du côté des inconvénients : c'est très verbeux à programmer (enfin JAVA, C++, JAVAScript le sont, je n'utilise que très peux le côté POO de python).
J'imagine :) .

Merci pour cette intervention. On verra si d'autres arguments viennent compléter ton propos ; cela dit, je sens que je risque de ne jamais franchir le pas, il y a quelque chose qui ne me convient pas là-dedans :? .
rebouxo
Modérateur honoraire
Modérateur honoraire
Messages : 6962
Inscription : mercredi 15 février 2006, 13:18
Localisation : le havre
Contact :

Re: La POO pour un nul ?

Message non lu par rebouxo »

François D a écrit :Bon, admettons, même si je pense qu'un projet en POO mal documenté restera moins facile à maintenir qu'un projet non POO bien documenté.
Oui et non, car la POO oblige à structurer davantage que la programmation fonctionnelle et comme elle aussi bien plus verbeuse, ben rapidement tu commentes. Enfin c'est mon expérience (limitée à une année de POO cela ne fait pas de moi un spécialiste).
François D a écrit :Et comme disent les anglophones : you lost me there.
Ou plutôt, si je comprends bien : on a une fonction de même apparence (+) capable d'opérer sur des données de types différents, dans la mesure où en fait ce sont des fonctions différentes avec la même « étiquette » ; alors, quel est le gain global par rapport à ce que j'appelle une fonction absolue + qui aurait été programmée de manière à pourvoir gérer tous les types de données qu'elle est susceptible de manipuler ? Tôt ou tard, il faut « se taper » toutes les possibilités.
Parce que ce n'est pas possible (?) en programmation fonctionnelle classique. Une fois que tu as fixé ton alphabet et ta grammaire tu ne peux plus les modifier, sauf à faire un nouveau langage. Les grammaires des langages sont des grosses grammaires, y inclure toutes les possibilités n'est pas possibles. La POO offre ici une souplesse que n'offrira jamais la prog. fonc.

J'ai oublié de préciser lorsque tu créés ton objet, tu vas vérifier que l'on donne bien les bonnes données. Je trouve que la POO se prête bien à ce type de vérification (le vecteur a-t-il bien le bon nombre de données ?). Cela évite des plantages dans l'utilisation et une meilleure sécurité de ton programme.
François D a écrit : Tu aurais les fonctions +, x, norme, etc., qui ont pour argument des matrices, qu'elle soient triangulaires ou non : que je sache, les matrices triangulaires forment un sous-ensemble des matrices ...
Ben, oui c'est fait exprès. Le but du TP est de résoudre des système linéaire, donc avoir des classes trianginf, triangsup et diagonale, ce n'est pas inutile. Reste à passer de la matrice $M$ générique à une matrice susceptible d'être inversée.
François D a écrit :Oh, il peut aussi y avoir eu au début un effet de mode pour un concept « furieusement tendance » :mrgreen: . Plus sérieusement on a pu être plus ou moins contraint de suivre un mouvement initié par quelques leaders du secteur, pour rester à la page ; après, une fois le pli pris ...
Bien sur, mais pas seulement. La gestion des fenêtres est vraiment bien plus simple en POO. Tu décris tes fenêtres, et le programme se débrouille pour la mise en page. Je trouve qu'il y a un parallèle entre la POO (pour la gestion des fenêtres) et le couple .tex/.sty (ou le fichier html et le css). Ce qui permet de couvrir davantage de cas (àmtha) : le changement de style de tes fenêtres en est un bon exemple. Tu changes ton .sty ou ta css et hop les fenêtres changent de style sans recompilation. Là je pense qu'en programmation fonctionnelle ce n'est tout simplement : tout est codé en dur dans le programme. Je pense que la POO est surtout très présente dans les interfaces graphiques, et vu que tout le monde en veux, ben cela explique le succès de la POO. Les casses-briques sont aussi un endroit ou tu fais plein de POO. Tu définis une surface qui rebondis avec des dimensions, des couleurs, etc. Puis tu dérives les briques qui sont des surface de dimensions particulières, et qui se détruisent plus ou moins vite. Hop c'est terminé. :D

Cela dit, j'ai beaucoup résisté avant d'arriver à me mettre à la POO. Et la POO n'a d'intérêt que si tu l'utilises. On ne fait pas tout en POO.

Olivier
A line is a point that went for a walk. Paul Klee.
Par solidarité, pas de MP.
François D.
Utilisateur chevronné
Utilisateur chevronné
Messages : 1367
Inscription : dimanche 30 juillet 2006, 10:04
Localisation : Alsace

Re: La POO pour un nul ?

Message non lu par François D. »

Ah.

Si la POO revient au niveau de $\LaTeX$ à utiliser des fichiers .sty, alors en effet mieux vaut que j'évite de me triturer le ciboulot : je n'en suis pas là, et il est probable que je n'atteigne pas ce niveau.

Peut-être serai-je un jour amené à faire de la POO, et si ça se trouve j'arriverai à m'en dépatouiller ; en attendant, et sous réserve d'arguments que d'autres intervenants pourraient ajouter, je dirais que la programmation fonctionnelle classique me semble à moi plus intuitivement cohérente.
Arnaud
Modérateur honoraire
Modérateur honoraire
Messages : 7097
Inscription : lundi 28 août 2006, 13:18
Localisation : Allemagne
Contact :

Re: La POO pour un nul ?

Message non lu par Arnaud »

Comme cela a été énoncé précédemment, la POO ne sert pas à grand chose pour de petits projets ( enfin sauf si tu programmes en java ... ).
Pour rester dans le vieux turbopascal, définir un objet revient à définir un nouveau type de variable, dont tu définis les paramètres et les fonctions qui s'y appliquent.
Si tu fais un jeu avec pleins de monstres qui bougent dans tous les sens, en créant un objet "monstre", tu permets à chacun d'eux d'évoluer de façon indépendante.

Pour en revenir à l'héritage, oui, les matrices triangulaires supérieures forment un sous-ensemble des matrices, donc soit tu décides que cet objet hérite de l'addition des matrices, soit tu redéfinis cette addition de façon à optimiser le calcul.
Par contre, il me semble inutile de redéfinir la trace...c'est bien le genre de méthodes que les matrices triangulaires supérieures peuvent hériter des matrices.

Personnellement, je vois l'utilisation de la POO comme quelque chose d'assez proche de la vie de tous les jours : à chaque tâche est associé un objet ( une lampe pour éclairer, une montre pour l'heure, etc ... ), et on utilise cet objet et ses spécificités à chaque fois qu'on en a besoin.
Pour rester dans l'exemple des jeux, un compteur de points peut être simplement une variable entière, ou plus finement une liste de variables ( avec date de début, différence max, etc... ) ou alors créer un objet spécifique compteur ( dans ce cas l'accès à chaque paramètre sera plus simple ).
Arnaud
Un peu d'info - Pyromaths - Pas d'aide en MP (non plus)
francois
Utilisateur éprouvé
Utilisateur éprouvé
Messages : 856
Inscription : jeudi 21 septembre 2006, 00:14
Localisation : Antony
Contact :

Re: La POO pour un nul ?

Message non lu par francois »

Bonjour,

Je me permets de remonter ce fil un peu ancien afin de donner le lien ci-dessous qui, je trouve, peut donner une idée de ce qu'est la POO (et de son intérêt) même si ici c'est expliqué à travers le langage Java (et non pas Python) :
http://rainet.enic.fr/unit/A43/index.htm

Sinon, pour répondre vite fait à François D. (même si cela a déjà été fait), il n'existe pas de définition précise de ce qu'est un objet ou de ce qu'est la POO. Ce sont des notions qui ne sont pas précisément et universellement définies au sens d'une définition mathématique par exemple (quand on est matheux, en programmation il faut parfois faire le deuil de la précision mathématique et ce n'est pas toujours facile). Ce qu'on peut dire en premier lieu, il me semble, c'est que d'un point de vue matérialiste un objet est un programme que l'on instancie (c'est-à-dire « que l'on charge ») via un autre programme (en général le programme principal) et qui encapsule des attributs (c'est-à-dire « des données ») et des méthodes (c'est-à-dire « des fonctions ») permettant d'agir sur les attributs et/ou de les consulter. Dans beaucoup de langages, l'appel d'une méthode se fait via une syntaxe du type objet.methode() et le code décrivant un objet s'appelle une classe. Hélas, au niveau de la terminologie (méthodes, attributs etc.), ça peut varier d'un langage à un autre.

Enfin dans l'acronyme POO, le deuxième O signifie « orienté » et ça sous-entend que la notion de POO n'est pas binaire. Un programme peut être plus ou moins orienté objet. La base étant l'encapsulation (sans l'encapsulation, c'est difficile de qualifier un programme de « orienté objet »). Ensuite, tu peux faire usage (si le langage le permet) de notions objets supplémentaires comme l'héritage et le polymorphisme par exemple ce qui peut rendre ton programme encore plus orienté objet. Quant aux intérêts de la POO, je pense que le lien que j'ai donné ci-dessus arrive à en montrer quelques-uns (à travers des exemples bien sûr, car sans exemple ça me semble impossible).

Mes deux centimes. :wink:
François Lafont
Répondre