Partage
  • Partager sur Facebook
  • Partager sur Twitter

La programmation Orienté Objet

Sujet résolu
7 août 2017 à 19:22:37

Bonjour :)

Après m'être renseigner sur le sujet (donc la POO), je me suis demandé : Comment rendre un langage Orienté Objet. Cela pourrait vous paraître un peu bête comme question, mais est-ce que déjà c'est possible de faire du... heu du C Orienté Objet (vous me direz C++ j'imagine) par exemple, mais est-ce créer un nouveau langage sur base d'un autre, ou alors on ajoute des choses (librairies, classes, api, dll,...) au langage ?

Si vous sauriez éclairer ma lanterne :D

  • Partager sur Facebook
  • Partager sur Twitter
Le doute est le commencement de la sagesse
7 août 2017 à 19:42:24

Lu'!

Un peu de lecture (il faut juste trier les trolls) : https://openclassrooms.com/forum/sujet/novice-en-poo-par-quoi-commencer . Si on suit l'avis des pères de l'OO, actuellement il n'y a approximativement aucun langage de programmation qui soit effectivement OO.

Par exemple :

Geralt de Riv a écrit:

Mais est-ce que déjà c'est possible de faire du... heu du C Orienté Objet (vous me direz C++ j'imagine)

Non C++ n'est pas OO :

  • d'abord parce qu'il est multi-paradigme et n'est pas cantonné à l'OO,
  • et Coplien qui est assez connu du côté de C++ dit lui même qu'il est très compliqué de faire de l'OO en C++, ... et que c'est carrément impossible en Java ou en C#.

En OO basiquement, on ne devrait jamais raisonner autrement qu'en terme d'opérations proposées par les objets du programme et chaque objet peut choisir sa propre manière d'implémenter ces opérations (y compris en changer au cours de l'exécution) ou encore changer les opérations qu'il est capable d'effectuer en cours d'exécution.

Bref, de ce côté, il faut s'intéresser assez profondément à la théorie qui gravite autour de la notion d'OO pour comprendre vraiment à quoi ça devrait ressembler.

-
Edité par Ksass`Peuk 7 août 2017 à 19:42:35

  • Partager sur Facebook
  • Partager sur Twitter

Posez vos questions ou discutez informatique, sur le Discord NaN | Tuto : Preuve de programmes C

7 août 2017 à 22:47:23

Merci pour le lien, j'ai remarqué le troll xD

Ksass`Peuk a écrit:

"Non C++ n'est pas OO"

Ha bon, il me semblait que C++ était orienté objet, enfin, selon cette page Wikipédia.

Ksass`Peuk a écrit:

"et Coplien qui est assez connu du côté de C++ dit lui même qu'il est très compliqué de faire de l'OO en C++, ... et que c'est carrément impossible en Java ou en C#."

Je ne suis pas sûr de comprendre, Java et C# sont orienté objet ?!

Ksass`Peuk a écrit:

"Bref, de ce côté, il faut s'intéresser assez profondément à la théorie qui gravite autour de la notion d'OO pour comprendre vraiment à quoi ça devrait ressembler."

Merci, je vais donc aller (re)voir ça de plus près, car j'ai la réelle intention de comprendre avec quoi je programme, en fait, je voudrais savoir comment créer un langage Orienté Objet, je n'ais pas l'intention d'en créer un, mais je voudrais comprendre comment c'est créer.

-
Edité par Geralt de Riv 7 août 2017 à 22:47:45

  • Partager sur Facebook
  • Partager sur Twitter
Le doute est le commencement de la sagesse
8 août 2017 à 2:55:16

> Ha bon, il me semblait que C++ était orienté objet, enfin, selon cette page Wikipédia.

Le multi-paradigme de C++ contient entre autres l'OO.

Après, un des problèmes de l'OO est la définition qu'on veut lui donner. Chacun y va un peu à sa sauce et j'ai l'impression qu'au fils des ans la définition à beaucoup dérivée.

Je pense que @Ksass à une définition très précise de ce qu'est l'OO et plus proche de l’originale. Si je ne dis pas de bêtises un langage OO ne devrait pas avoir de structure figée et tout devrait être modifiable, y comprit les fonctions/classes. Ce qui fait qu'un langage orienté prototype serait plus proche de l'OO qu'un langage orienté objet :'). Tu confirmes ou je suis à côté ?

Ma définition de l'OO est très réductrice: substantialité. Toute dérivée d'une interface/classe devrait pouvoir être utilisée comme interface/classe de base. Ceci permet d'adapter l'implémentation d'une interface sans modifier le code qui l'utilise. Il y a quelques règles à respecter qu'on peut trouver dans les principes SOLID.

  • Partager sur Facebook
  • Partager sur Twitter
8 août 2017 à 3:12:17

Merci pour le complément ;)

Maintenant, cela dépend je penses de quel langage on parle, ici on est partit du C++, mais les langages où "tout" y est objet, je pense a Ruby par exemple, leurs OO aurait encore une définitions différentes.

  • Partager sur Facebook
  • Partager sur Twitter
Le doute est le commencement de la sagesse
8 août 2017 à 8:46:14

Geralt de Riv a écrit:

Je ne suis pas sûr de comprendre, Java et C# sont orienté objet ?!

Normalement oui, d'après leurs créateurs. D'après Coplien, non. Et il y a des points sur lesquels on ne peut pas lui donner tord. Notamment l'impossibilité pour un objet de décider d'implémenter de nouvelles fonctionnalités ou de changer son implémentation d'une opération en cours d'exécution. Ou encore la possibilité (le plus couramment utilisée) de dépendre d'une classe plutôt que d'une interface.

jo_link_noir a écrit:

Si je ne dis pas de bêtises un langage OO ne devrait pas avoir de structure figée et tout devrait être modifiable, y comprit les fonctions/classes. Ce qui fait qu'un langage orienté prototype serait plus proche de l'OO qu'un langage orienté objet :'). Tu confirmes ou je suis à côté ?

Wala, notamment la notion de classe ne serait pas nécessaire à l'objet. On pourrait émuler de l'objet en C++, mais c'est un peu tendu. Disons que si on veut s'en rapprocher sans trop compliquer les choses (et c'est déjà un euphémisme), il faudrait respecter à la lettre le DIP et l'ISP, et toujours dépendre d'une classe de base complètement abstraite.

jo_link_noir a écrit:

Toute dérivée d'une interface/classe devrait pouvoir être utilisée comme interface/classe de base. Ceci permet d'adapter l'implémentation d'une interface sans modifier le code qui l'utilise. Il y a quelques règles à respecter qu'on peut trouver dans les principes SOLID.

J'avais tendance à penser ça, et d'ailleurs quand je conçois, c'est plutôt comme ça que je raisonne mais typiquement si on regarde SOLID :

  • SRP : clairement plus général que l'objet,
  • OCP : c'est aussi ce que permet la programmation sous forme de modules qu'on trouve dans le fonctionnel,
  • LSP : c'est aussi une propriété respecter par les types algébriques, qu'on sait rendre extensibles,
  • ISP : là on commence à s'approche de l'objet, mais les traits et les mixins permettent sensiblement la même chose,
  • DIP : dépendre des interfaces on le fait aussi hors de l'objet.

Donc à ce niveau, je ne cherche plus vraiment à justifier d'une quelconque orientation objet, plutôt du fait que si on n'essaie pas de respecter ça, on a de bonnes chances d'avoir une conception moins flexible.

Geralt de Riv a écrit:

Maintenant, cela dépend je penses de quel langage on parle, ici on est partit du C++, mais les langages où "tout" y est objet, je pense a Ruby par exemple, leurs OO aurait encore une définitions différentes.

Ruby a l'air d'être assez OO effectivement.

Geralt de Riv a écrit:

Merci, je vais donc aller (re)voir ça de plus près, car j'ai la réelle intention de comprendre avec quoi je programme, en fait, je voudrais savoir comment créer un langage Orienté Objet, je n'ais pas l'intention d'en créer un, mais je voudrais comprendre comment c'est créer.

Oui enfin, n'oublie pas que l'OO n'a que la valeur qu'on souhaite y accorder. La plupart des arguments de ceux qui t'annoncent que l'objet est mieux que les autres sont juste les mêmes arguments fournis par les amateurs des autres paradigmes dans lesquels on a remplacé "autre paradigme" par "objet", et ces arguments là sont plutôt de l'ordre de ce qui fait la programmation et la conception de manière générale, comme un consensus qui s'est formé au cours du temps sur ce qui rend un programme flexible et évolutif. Les points vraiment différenciant sont surtout des éléments de détail qui vont parfois avoir de l'importance, et parfois non.

Les paradigmes c'est juste des manières de voir les choses et de programmer. Autant être un peu flexible et savoir en changer au besoin.

  • Partager sur Facebook
  • Partager sur Twitter

Posez vos questions ou discutez informatique, sur le Discord NaN | Tuto : Preuve de programmes C

8 août 2017 à 9:58:42

Salut,

Le C# est de base, plus OO que le C++...Enfin, je m'explique:

Dans le cadre du moteur Unity, il est très facile de faire de l'OO, mais de l'OO sale; il est très fréquent de pouvoir accéder à des variables membres d'une classe, lorsqu'on est dans un autre objet, notamment grâce aux variables publique statique. C'est même limite recommandé ! (un comble)

Et puis, toujours avec Unity, ce sont les gameObject que l'on attache à des scripts (qui eux-mêmes sont des classes => obligatoire dans ce cas là); les gameObject étant des éléments d'une scène (sprite, musique, préfab, etc...).

Mes connaissances en C++ moderne sont maigre, mais avec ce langage si on veut faire de l'OO, faut limite réinventer la roue; enfin moins que si on devait re-créer le langage C++ en partant du C (création de structures contenant des variables mais aussi des prototypes de fonctions; je simplifie un max).

Pour en revenir au C#, je n'ai pas trop utilisé le framework Dot Net, mais déjà on s'aperçoit que tout est mis en œuvre pour nous pousser dans la bonne voie de l'OO; si on veut faire du procédural en C#, faut vraiment le faire exprès...ou alors être très étourdit...

  • Partager sur Facebook
  • Partager sur Twitter
8 août 2017 à 10:14:50

Gaetano-GX a écrit:

Mes connaissances en C++ moderne sont maigre, mais avec ce langage si on veut faire de l'OO, faut limite réinventer la roue; enfin moins que si on devait re-créer le langage C++ en partant du C

Ah ? Et quelle notion objet présente en C# n'existe pas en C++ exactement ? Parce que concrètement le modèle objet de C++ n'a pas bougé depuis sa création ou presque et je ne vois pas ce que C# apporte de ce côté.

Si je partage des liens plus haut qui explorent tout ça de fond en comble ce n'est pas pour rien :( . L'OO implique de toujours avoir substituabilité mais aussi de pouvoir, à l'exécution, changer les opérations qui peuvent être effectuée par un objet ainsi que la manière d'effectuer une opération : je ne crois pas que C# autorise ça.

  • Partager sur Facebook
  • Partager sur Twitter

Posez vos questions ou discutez informatique, sur le Discord NaN | Tuto : Preuve de programmes C

8 août 2017 à 10:53:55

Ksass`Peuk a écrit:

Gaetano-GX a écrit:

Mes connaissances en C++ moderne sont maigre, mais avec ce langage si on veut faire de l'OO, faut limite réinventer la roue; enfin moins que si on devait re-créer le langage C++ en partant du C

Ah ? Et quelle notion objet présente en C# n'existe pas en C++ exactement ?


Disons que (sans te contredire), dès que l'on crée un nouveau projet vierge en C# (avec visual, en console par exemple), on s’aperçoit que la fonction main est déjà une classe. Une classe qui sert à l'instanciation d'autres objets créees à partir d'autres classes qui sont presque toutes faites pour ça (être instanciées).

On ne retrouve pas cela en C++ lorsque l'on crée un projet vide (certainement pas avec Code::Blocks en tout cas).

  • Partager sur Facebook
  • Partager sur Twitter
8 août 2017 à 10:59:51

Ok, sauf que :

  • la notion de classe n'est pas nécessaire pour faire de l'objet.
  • la notion de classe n'implique pas que l'on va faire de l'objet.

J'ai résumé ça dans les posts du lien que j'ai mis plus haut.

On peut ajouter : https://www.youtube.com/watch?v=lQQ_CahFVzw .

-
Edité par Ksass`Peuk 8 août 2017 à 11:07:32

  • Partager sur Facebook
  • Partager sur Twitter

Posez vos questions ou discutez informatique, sur le Discord NaN | Tuto : Preuve de programmes C

8 août 2017 à 11:07:01

"la notion de classe n'est pas nécessaire pour faire de l'objet."

=> je l'ignorais, autant pour moi.

"la notion de classe n'implique pas que l'on va faire de l'objet."

=> je suis d'accord, on peut tout à fait créer des classes et coder en procédural.

Merci pour le lien, je l'ai pas encore lu en entier...

Bien cordialement.

EDIT: oui, pour le premier point, je sais qu'on peut faire du "C with Class"

-
Edité par Gaetano-GX 8 août 2017 à 11:09:39

  • Partager sur Facebook
  • Partager sur Twitter
8 août 2017 à 11:41:13

Puis le fait d'embarquer main dans une classe n'a rien de « plus objet », c'est même plutôt contre-intuitif. Qu'est-ce que ça vient faire là ? En quoi c'est mieux que ce soit une méthode statique d'une classe créée pour l'occasion, plutôt qu'une fonction du scope global ? Quel intérêt a cette classe ? À quel moment interagit-on avec ses instances ?

  • Partager sur Facebook
  • Partager sur Twitter
8 août 2017 à 11:44:58

A la limite, ce qui pourrait avoir une logique, c'est d'avoir le langage qui définit la signature de main, et que le main d'un programme soit un objet répondant à cette signature. Auquel cas, le main devient bien un comportement particulier de l'ensemble des programmes réalisables avec le langage.

  • Partager sur Facebook
  • Partager sur Twitter

Posez vos questions ou discutez informatique, sur le Discord NaN | Tuto : Preuve de programmes C

8 août 2017 à 11:51:16

Sur ces points, je suis completement d'accord.

D'ailleurs, au niveau de Java, c'est sûr que son approche n'est pas conforme à ce que voulaient les pères de l'OO.

C'est pour cela que Kotlin y ajoute pas mal de possibilitées, dont le fait de modifier l'implémentation d'une classe sans l'hérité, ainsi que de modifier le comportement de methodes à l'exécution.

Kotlin tourne sur la JVM, de ce fait, il est tout à fait possible qu'un jours Java arrive au même résultat (mais bon avec Oracle ...)

  • Partager sur Facebook
  • Partager sur Twitter

Architecte logiciel - Software craftsmanship convaincu.

8 août 2017 à 13:29:40

Donc, si vous dites que Java, et C# (pour reprendre ceux cités) ne sont pas orienté objet, ils sont quoi alors ? Il ne ferait qu'imiter le paradigmes OO ?

-
Edité par Geralt de Riv 8 août 2017 à 13:30:13

  • Partager sur Facebook
  • Partager sur Twitter
Le doute est le commencement de la sagesse
8 août 2017 à 13:32:51

Ils sont leurs façon de voir l'objet ;)
  • Partager sur Facebook
  • Partager sur Twitter

Architecte logiciel - Software craftsmanship convaincu.

8 août 2017 à 13:35:39

Un mot qui revient souvent depuis quelque temps c'est "class-oriented". Et accessoirement, c'est pas moi qui dit ça à la base, c'est des gens comme William Cook, Alan Kay ou Jim Coplien. En tout cas, ils ne sont clairement pas orientés objet au sens qui lui a été donné à la base.

  • Partager sur Facebook
  • Partager sur Twitter

Posez vos questions ou discutez informatique, sur le Discord NaN | Tuto : Preuve de programmes C

8 août 2017 à 14:29:48

Ok, très bien :)

Merci beaucoup de m'avoir éclairé, maintenant je suis presque ébloui xD

Je passe le sujet [Résolut]

J'aurais juste une toute dernière question, je voudrais "(ré-)apprendre" le C++, j'ai vu qu'il y avait les formations de gbdivers, qui a 1er vue semble pas mal du tout, mais auriez-vous d'autres conseils ?

Merci beaucoup en tout cas ;)

-
Edité par Geralt de Riv 8 août 2017 à 14:34:08

  • Partager sur Facebook
  • Partager sur Twitter
Le doute est le commencement de la sagesse
8 août 2017 à 16:10:43

C++ Primer 5th Edition de S.Lippmann.

  • Partager sur Facebook
  • Partager sur Twitter

Posez vos questions ou discutez informatique, sur le Discord NaN | Tuto : Preuve de programmes C

8 août 2017 à 16:33:01

Il y a aussi "Principes et pratiques avec C++" de Stroustrup qui est très bon. Je le cite car il existe en français (je l'ai mais pas la dernière édition), dès fois que l'auteur soit allergique à l'anglais.
  • Partager sur Facebook
  • Partager sur Twitter
8 août 2017 à 16:37:37

Merci beaucoup :)

Bien à vous

  • Partager sur Facebook
  • Partager sur Twitter
Le doute est le commencement de la sagesse