Jump to content
Yozz

Introduction décente à l'orienté objet ?

Recommended Posts

Certains murmurent même qu'on pourrait en faire en PHP, mais ce ne sont que des rumeurs...

:D

On peut aussi en JavaScript, même si ça relève de la bidouille il y a multiples librairies pour le faire. Par objet j'implique le minimum de choses intéressantes comme héritage, polymorphisme etc. sinon le C est aussi un langage objet. D'ailleurs… https://en.wikipedia.org/wiki/GObject

Share this post


Link to post
Share on other sites

Je commence à avancer dans mon projet, notamment grâce à l'aide d'un de mes enseignants. Au fond, les méthodes ne sont pas des trucs si dramatiques (ça ressemble vaguement aux fonctions en Python, que je n'avais aucun mal à programmer l'an dernier). Néanmoins, alors que Perl, Python et Bash me semblent être des outils extraordinaires pour paresseux (on peut faire tout ce qu'on veut avec des données textuelles en un claquement de doigts), là on doit utiliser une usine à gaz (Eclipse) et passer un semestre entier pour faire un seul programme. Certes, c'est surtout une façon de programmer qu'on apprend avant tout, mais qu'est-ce que c'est laborieux... En plus, la syntaxe ressemble à du C/C++ (avec des int, des void et des double partout), langages que je n'ai jamais étudiés. :icon_neutral: Ah, si tous les langages étaient aussi lisibles que Python ou aussi concis que Perl...

Share this post


Link to post
Share on other sites

Je ne peux qu'être d'accord.

Autre avantage de Python, il ne me fait pas mal aux doigts (voire plus, pour utiliser Eclipse).

Share this post


Link to post
Share on other sites

Tiens, ici j'arriverai sûrement à me faire tuyauter.

 

Je cherche un bouquin pour perfectionner mon C++, surtout dans le domaine de l'OOP et de la bonne utilisation des design patterns. En anglais obligatoirement et, de préférence, de niveau avancé.

 

Soit, un peu dans la continuité du topic : une fois que l'on s'est déjà tapé une introduction plus que décente à l'OOP et que l'on veut commencer à se perfectionner, qu'est-ce qu'on lit ?

Share this post


Link to post
Share on other sites

Un bon gros pavé, en anglais : http://www.amazon.com/dp/0596007124/

Je l'ai seulement parcouru mais ça m'avait l'air bien (et puis c'est O'Reilly).

Soit, un peu dans la continuité du topic : une fois que l'on s'est déjà tapé une introduction plus que décente à l'OOP et que l'on veut commencer à se perfectionner, qu'est-ce qu'on lit ?

Du code.

Et on en écrit, par exemple en contribuant à un projet libre exigeant (pour le C++ j'ai pas grand-chose en tête).

Share this post


Link to post
Share on other sites

c'est surtout une façon de programmer qu'on apprend avant tout, mais qu'est-ce que c'est laborieux... En plus, la syntaxe ressemble à du C/C++ (avec des int, des void et des double partout), langages que je n'ai jamais étudiés. :icon_neutral: Ah, si tous les langages étaient aussi lisibles que Python ou aussi concis que Perl...

 

Disons que c'est historique aussi, à la création de Java les langages les plus populaires étaient le C et le C++.

Sinon j'ai toujours préféré les langages typés. Python c'est super chouette parce que la syntaxe est succincte et les performances plutôt bonne (comparée à Ruby pour des scripts), mais bon c'est vraiment personnel.

Share this post


Link to post
Share on other sites

Un bon gros pavé, en anglais : http://www.amazon.com/dp/0596007124/

Je l'ai seulement parcouru mais ça m'avait l'air bien (et puis c'est O'Reilly).

Du code.

Et on en écrit, par exemple en contribuant à un projet libre exigeant (pour le C++ j'ai pas grand-chose en tête).

 

C'est ce que j'avais envie de répondre et ce que m'ont toujours conseillé mes profs (on ne devient bon programmeur qu'en lisant une tonne de lignes de code et en mettant les mains dans le cambouis), et ça m'a l'air plutôt vrai.

Share this post


Link to post
Share on other sites

Tiens, ici j'arriverai sûrement à me faire tuyauter.

 

Je cherche un bouquin pour perfectionner mon C++, surtout dans le domaine de l'OOP et de la bonne utilisation des design patterns. En anglais obligatoirement et, de préférence, de niveau avancé.

 

Soit, un peu dans la continuité du topic : une fois que l'on s'est déjà tapé une introduction plus que décente à l'OOP et que l'on veut commencer à se perfectionner, qu'est-ce qu'on lit ?

 

Très bon bouquin proposé par pankkake sinon il existe aussi celui qu'on appelle le Gang of 4. http://en.wikipedia.org/wiki/Design_Patterns

Faut par contre trouver une édition récente, ce qui me semble pas si simple.

 

Sinon si c'est pour te former au niveau pro, ce qui est utile c'est d'apprendre un framework d'injection de dépendance.

L'idée derrière c'est de découpler les définitions des composants d'un programme de leur collaboration. Le plus connu dans le monde Java c'est spring.

Share this post


Link to post
Share on other sites

Merci pour les références. J'avais déjà entendu parler de celui du GoF (forcément), mais pas du O'Reilly. D'ailleurs, ça tombe à merveille : un de mes amis suédois vient de revenir d'un long séjour en mer, et il avait ces deux bouquins sous la main. Du coup, je me les suis fait prêter.

 

Par contre, dans le Head First, ils me mettent direct à l'index, du style : If you're new to Java, you should get the fuck away from this book (but you might be ok with "just" a C++ background). Mais je n'ai jamais pris le temps de me pencher sur Java, que je voulais me garder sous le coude pour plus tard (C > C++ > Java) et j'espère que la gymnastique mentale entre les deux langages ne va pas me perdre en cours de route.

 

 

Du code.

Et on en écrit, par exemple en contribuant à un projet libre exigeant (pour le C++ j'ai pas grand-chose en tête).

 

Le truc, c'est que j'apprends le C++ sur un mode "casual", avec seulement deux sessions de travail de trois heures par semaine (et en soirée). Du coup, j'aurai bien aimé pouvoir prendre quelques raccourcis pour accélérer mon apprentissage.

En ce moment, question code, j'essaie de développer un solver pour faire du skinning sur des physics-enabled ragdolls gérés par la lib Bullet. C'est passionnant, mais il faudrait que j'y passe des semaines entières pour faire avancer le projet correctement :online2long:.

 

Sinon si c'est pour te former au niveau pro, ce qui est utile c'est d'apprendre un framework d'injection de dépendance.

L'idée derrière c'est de découpler les définitions des composants d'un programme de leur collaboration. Le plus connu dans le monde Java c'est spring.

Tiens, c'est une bonne piste, ça, merci. Tout ce qui touche à la programmation orienté aspect m'est encore relativement inconnu et c'est typiquement le genre de domaine sur lequel je dois bosser pour perfectionner mes compétences en dev.

Share this post


Link to post
Share on other sites

En ce moment, question code, j'essaie de développer un solver pour faire du skinning sur des physics-enabled ragdolls gérés par la lib Bullet.

 

En français, ça veut dire quoi ?

Share this post


Link to post
Share on other sites

Pondre une fonction qui calcule toute seule les coordonnées de texture à appliquer à des modèles 3D déformés librement par la simulation physique (=dont les articulations prennent des valeurs d'angle que tu dois considérer comme arbitraires).

Enfin je crois.

Share this post


Link to post
Share on other sites

Pondre une fonction qui calcule toute seule les coordonnées de texture à appliquer à des modèles 3D déformés librement par la simulation physique (=dont les articulations prennent des valeurs d'angle que tu dois considérer comme arbitraires).

 

 

Heureusement, pour l'instant, je n'ai pas à modifier les textures coordinates de façon programmatique, car je me cantonne à tout ce qui est hard body dynamics : les objets que j'anime ne sont pas flexibles, ni déformables. Par contre, lorsque j'attaquerai les soft bodies (ie. vêtements, cheveux, seins), je vais probablement y être confronté.

 

 

En fait, je travaille sur une fonction capable de d'appliquer des animations 3D "classique" (skeletal animation), telle que définie dans un logiciel d'animation, à un modèle dont le mouvement est contraint par les forces physiques calculée par une bibliothèque dédiée.

 

Car typiquement, à partir du moment où on anime un objet, celui-ci ne subit plus les contraintes physiques de l'environnement. Lorsque l'on anime un modèle, on applique en fait une matrice de transformation à chacun des points formant les sommets des triangles composant le modèle (vertex skinning) : les positions sont donc "dictées" par ces transformations, et non plus par le moteur physique.

Par contre, lorsque l'on laisse un modèle être uniquement animés par les contraintes physiques, celui-ci est totalement "inerte" : c'est le cas des ragdolls, qui ne sont en fait que des pantins soumis au lois de la gravité, collisions, et autres contraintes liées aux jointures. Ca ressemble pour beaucoup aux "dummies" utilisés lors des crash tests.

 

Une des solutions les plus utilisées est de définir le personnage comme un kinematic body, un objet animé, puis de le transformer ponctuellement en ragdoll lorsque l'on a besoin de le soumettre au loi de la physique. Par exemple : votre bonhomme court, chacun de ses polygones est animé par skinning, il se prends une balle dans la tête, et hop, on le bascule en mode ragdoll, et il s'effondre alors dans une position complètement invraisemblable comme une poupée de chiffon. On alterne entre les deux modes.

 

Ce que je veux faire, c'est combiner les deux modes, de façon à pouvoir avoir un personnage animé sensible aux lois de la physique (an animated physics-enabled ragdoll). Par exemple : votre personnage court, on lui jette un pavé, et celui-ci, tout en continuant de courir, est déséquilibré par la force que l'on vient de lui appliquer par jet de pavé interposé.

Ce qui demande en fait de garder un "fantôme" du personnage animé, invisible à l'affichage et servant uniquement aux calculs de force, qui, a chaque boucle, est soumis aux collisions et autres lois physiques. On peut alors le basculer en mode "pantin" dès qu'une force lui est appliqué, calculer les transformations qu'il subit, les transformer en matrices, puis combiner celles-ci à celle de l'animation principale du personnage. En parallèle, il faut d'ailleurs mettre en place un solver capable de générer des équations de cinématique inverse, qui seront appliquées au fantôme en mode ragdoll, et dont l'objectif est de le faire revenir à la position initiale (celle de l'animation principale).

 

Bref, le genre de truc purement expérimental et complètement prise de tête qui sert juste à se déchirer le cerveau le vendredi soir pour se prouver que celui-ci fonctionne encore parfaitement. Ou pas.

Share this post


Link to post
Share on other sites

:D

On peut aussi en JavaScript, même si ça relève de la bidouille il y a multiples librairies pour le faire. Par objet j'implique le minimum de choses intéressantes comme héritage, polymorphisme etc. sinon le C est aussi un langage objet. D'ailleurs… https://en.wikipedia.org/wiki/GObject

 

Ouais. ca relève effectivement pas mal bidouille, m'enfin c'est toujours mieux que rien. Sinon il y a TypeScript qui a l'air intéressant: c'est une extension objet pour Javascript, et le compilateur est écrit lui-même en Javascript (j'aime bien ce point).

 

Un bon gros pavé, en anglais : http://www.amazon.com/dp/0596007124/

Je l'ai seulement parcouru mais ça m'avait l'air bien (et puis c'est O'Reilly).

Du code.

Et on en écrit, par exemple en contribuant à un projet libre exigeant (pour le C++ j'ai pas grand-chose en tête).

 

Des projets libres en C++, j'en connais au moins 1 assez conséquent: KDE, et toute la suite logicielle de KDE. Il y aussi MongoDB qui est ecrit en C++, avec Boost.

 

Très bon bouquin proposé par pankkake sinon il existe aussi celui qu'on appelle le Gang of 4. http://en.wikipedia.org/wiki/Design_Patterns

Faut par contre trouver une édition récente, ce qui me semble pas si simple.

 

Sinon si c'est pour te former au niveau pro, ce qui est utile c'est d'apprendre un framework d'injection de dépendance.

L'idée derrière c'est de découpler les définitions des composants d'un programme de leur collaboration. Le plus connu dans le monde Java c'est spring.

 

Mouais, Spring est "populaire", mais je trouve Guice et CDI (Weld, OpenWebBeans, CanDI) bien mieux foutus. Spring c'est un peu devenu le standard d'un seul vendeur (qui fourni aussi le serveur, la VM, etc), et surtout c'est bourre d'antipatterns et certaines extensions sont de qualité douteuse.

 

Mais pour du C++, je ne crois pas qu'il y ait un équivalent de Spring: une rapide recherche me donne quelques pistes, mais ca n'a pas l'air très avancé.

https://code.google.com/p/wallaroo/

 

Enfin je dirais que ce qui me parait indispensable de creuser quand on veut faire du C++ professionnel c'est Boost et la stdlib:

http://www.boost.org/

Share this post


Link to post
Share on other sites

Filthy John, tu peux te plonger dans les délices de la mécanique et des torseurs, modéliser chaque articulation comme articulation mécanique (typiquement, rotules ou rotules à doigt) dotée de moteurs ou d'élasticité, et d'autres trucs du genre... Bref, fais de la vraie simulation mécanique, pas juste des modèles "qui marchent à peu près". ;)

Share this post


Link to post
Share on other sites

Filthy John, tu peux te plonger dans les délices de la mécanique et des torseurs, modéliser chaque articulation comme articulation mécanique (typiquement, rotules ou rotules à doigt) dotée de moteurs ou d'élasticité, et d'autres trucs du genre... Bref, fais de la vraie simulation mécanique, pas juste des modèles "qui marchent à peu près". ;)

 

C'est couteux, en puissance de calcul ?

Share this post


Link to post
Share on other sites

C'est couteux, en puissance de calcul ?

Horriblement. Pourquoi on utilise des modèles "à peu près bons dans les cas les plus généraux et avec un tas d'hypothèses supplémentaires" ? Parce que la complexité mathématique et numérique de la simulation réelle est juste monstrueuse. Un peu comme pour le raytracing, d'ailleurs : le résultat est incomparable, mais au prix de quelle débauche de moyens ! A moins de trouver comment un peu simplifier le bouzin, évidemment.

Share this post


Link to post
Share on other sites

Enfin je dirais que ce qui me parait indispensable de creuser quand on veut faire du C++ professionnel c'est Boost et la stdlib:

En C++, les sources de Boost sont fort instructives pour la métaprogrammation (j'adoorre).

 

J'ai les sources la lib Boost sur mon disque dur depuis des semaines, vu que c'est un prérequis pour pouvoir compiler Ogre 3D. Mais je n'ai pas encore mis le nez très profondément dedans  :icon_redface: .

 

 

Filthy John, tu peux te plonger dans les délices de la mécanique et des torseurs, modéliser chaque articulation comme articulation mécanique (typiquement, rotules ou rotules à doigt) dotée de moteurs ou d'élasticité, et d'autres trucs du genre... Bref, fais de la vraie simulation mécanique, pas juste des modèles "qui marchent à peu près". ;)

 

Effectivement, je pourrai définir mon modèle comme une chaine de corps rigides reliés entre eux par des articulations possédant n degrés de liberté, puis appliquer des moteurs au niveau de chacune de ces contraintes pour animer le modèle en question. Je sais.

 

Mais s'il y a autre chose que je sais, c'est que cela revient à se préparer un joli noeud coulant avec lequel aller se pendre de désespoir face à la difficulté du projet dans lequel on vient de se lancer.

 

Parce que tout à coup, on ne raisonne plus en termes de translations et de rotations appliquées à un élément de la structure, ce qui se fait sans mal avec les outils proposés par les différentes libs : on doit tout convertir en vecteurs de forces.

 

Et là, même l'animation la plus basique en forward kinetics devient —littéralement— une épreuve de force. Et pour arriver à "doser" ces forces, on commence à taper dans les modèles déterministes avec des équations différentielles de partout, et c'est juste beaucoup trop balaise pour mon niveau actuel... J'ai bien ressorti mes cours de maths pour la physique, mais pour l'instant, je nage complètement.

 

Et puis... Comme j'anime des personnages, un autre challenge se pose alors obligatoirement avec cette méthode : arriver à les faire tenir debout. Du coup, l'usage d'inverse kinematics devient omniprésent et tu es obligé de calculer à chaque instant les forces nécessaires pour que ton gugusse ne se casse pas la gueule.

Là, on arrive à un level "Je suis étudiant au MIT et je prépare ma thèse pour passer mon PhD" et je n'ose même pas imaginer à quoi doivent ressembler les solvers nécessaires pour faire courir un bonhomme sans qu'il ne termine couché au sol à s'agiter comme un lapin épileptique dopé au MDMA.

 

 

C'est couteux, en puissance de calcul ?

 

C'est non seulement coûteux en puissance de calcul, mais c'est aussi excessivement coûteux en puissance neuronale pour le développeur.

 

Vu que je cherche à réaliser une solution qui soit suffisamment légère pour être exploitée en real time et que j'espère pouvoir la développer sans qu'à terme, je ne me sois transformé en clone de Stephen Hawking à force de me flinguer l'encéphale sur des modèles atrocement complexes, je préfère en rester à des implémentation plus basiques.

Share this post


Link to post
Share on other sites

Quelqu'un connaît une manière simple, en Java, de classer des mots dans l'ordre décroissant de leur fréquence dans un texte donné ? J'ai réussi à faire une table de hachage (HashMap) qui donne un résultat comme ça :

 

{religieux=5, realphilosophie=1, rallié=1, scientifique=16, efface=1, correspondait=1, nouveaux=5, (...) }

 

Mais on ne peut pas trier un HashMap, donc je bloque et je ne crois pas que ce soit la bonne structure de données.

Share this post


Link to post
Share on other sites

Quelqu'un connaît une manière simple, en Java, de classer des mots dans l'ordre décroissant de leur fréquence dans un texte donné ? J'ai réussi à faire une table de hachage (HashMap) qui donne un résultat comme ça :

 

{religieux=5, realphilosophie=1, rallié=1, scientifique=16, efface=1, correspondait=1, nouveaux=5, (...) }

 

Mais on ne peut pas trier un HashMap, donc je bloque et je ne crois pas que ce soit la bonne structure de données.

 

Bon tu as plusieurs façon :

Si tu n'as pas le choix que de stocker tes mots dans une HashMap, tu dois pouvoir en tirer une Collection. http://docs.oracle.com/javase/6/docs/api/java/util/HashMap.html#values()

La collection tu devrais pouvoir la trier après en avoir obtenu un tableau, mais c'est un peu crade. À mon avis tu ferais mieux de te faire une classe MyTuple, qui aura le mot et la fréquence comme attribut, cette classe sera comparable qui utilisera la fréquence comme critère dans la fonction compareTo.

Ensuite tu pourras tous les mettre dans un tableau que tu trieras avec http://docs.oracle.com/javase/6/docs/api/java/util/Arrays.html#sort(java.lang.Object[])

Share this post


Link to post
Share on other sites

Bon tu as plusieurs façon :

Si tu n'as pas le choix que de stocker tes mots dans une HashMap, tu dois pouvoir en tirer une Collection. http://docs.oracle.com/javase/6/docs/api/java/util/HashMap.html#values()

La collection tu devrais pouvoir la trier après en avoir obtenu un tableau, mais c'est un peu crade. À mon avis tu ferais mieux de te faire une classe MyTuple, qui aura le mot et la fréquence comme attribut, cette classe sera comparable qui utilisera la fréquence comme critère dans la fonction compareTo.

Ensuite tu pourras tous les mettre dans un tableau que tu trieras avec http://docs.oracle.com/javase/6/docs/api/java/util/Arrays.html#sort(java.lang.Object[])

 

Plus propre la TreeMap non? http://docs.oracle.com/javase/6/docs/api/java/util/TreeMap.html

 

Enfin java, ca fait longtemps, donc je garanti pas.

(Pis c# c'est mieux :icon_wink:  )

Share this post


Link to post
Share on other sites

Bon tu as plusieurs façon :

Si tu n'as pas le choix que de stocker tes mots dans une HashMap, tu dois pouvoir en tirer une Collection. http://docs.oracle.com/javase/6/docs/api/java/util/HashMap.html#values()

La collection tu devrais pouvoir la trier après en avoir obtenu un tableau, mais c'est un peu crade. À mon avis tu ferais mieux de te faire une classe MyTuple, qui aura le mot et la fréquence comme attribut, cette classe sera comparable qui utilisera la fréquence comme critère dans la fonction compareTo.

Ensuite tu pourras tous les mettre dans un tableau que tu trieras avec http://docs.oracle.com/javase/6/docs/api/java/util/Arrays.html#sort(java.lang.Object[])

 

Selon la consigne, je dois tout faire dans une seule classe, je n'ai pas la possibilité d'en créer une autre... Et non, je ne suis pas obligé d'utiliser une HashMap.

 

Intéressant, TreeMap, je vais voir ça.

Share this post


Link to post
Share on other sites

Selon la consigne, je dois tout faire dans une seule classe, je n'ai pas la possibilité d'en créer une autre...

 

Même en utilisant des nested classes ? :)

Share this post


Link to post
Share on other sites

Bon tu as plusieurs façon :

Si tu n'as pas le choix que de stocker tes mots dans une HashMap, tu dois pouvoir en tirer une Collection. http://docs.oracle.com/javase/6/docs/api/java/util/HashMap.html#values()

La collection tu devrais pouvoir la trier après en avoir obtenu un tableau, mais c'est un peu crade. À mon avis tu ferais mieux de te faire une classe MyTuple, qui aura le mot et la fréquence comme attribut, cette classe sera comparable qui utilisera la fréquence comme critère dans la fonction compareTo.

Ensuite tu pourras tous les mettre dans un tableau que tu trieras avec http://docs.oracle.com/javase/6/docs/api/java/util/Arrays.html#sort(java.lang.Object[])

J'ai arrêté de lire à "Oracle". Ca ne vaut pas la peine de se faire chier avec un truc mal codé si tu n'es pas payé pour.

Share this post


Link to post
Share on other sites

Même en utilisant des nested classes ? :)

 

Je crois pas qu'on ait appris ça pour l'instant.

 

 

SortedMap ?

 

 

Ca permet de classer en fonction des valeurs ?

Share this post


Link to post
Share on other sites

Je crois pas qu'on ait appris ça pour l'instant.

 

Ce serait un peu "tricher" avec la régle d'une seule classe. Mais après, t'aurais juste à override CompareTo et c'est bon. Après mon Java est un peu rouillé, donc il y a peut-être une structure faisant déjà un truc similaire.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...