« 1 2 (3) 4 »


Re: Python - l'instruction return
OverdOzed
Inscrit:
19/07/2011 21:39
De Corsica !
Post(s): 1027
Citation :

Redstar a écrit:
Si je comprends bien, ça veux dire que je pourrai très bien appeler une fonction de cette classe, tout en étant a l'extérieur (de la classe) ? (ex: ma_classe.ajouter_un_texte(arg1, arg2, arg3))


Oui c'est le principe de la programmation orientée objet... Bon je pense que ça sert à rien de t'expliquer plus DaWaaaaghBabal à tout dit. Faut vraiment que tu prenne le temps de te renseigner la dessus, t'es un peu à coté de la plaque la et c'est pas en t'expliquant des trucs et toi en disant "comprend pas" qu'on va avancer.

Citation :

Dans la doc python de blender ? C'est impossible. Ou as-tu trouvé cette phrase qui parle d'une telle hérésie ? Comment peux-tu, dans un environnement interactif, exécuter le script une seule fois ?

A donc puisque tu dis que c'est impossible alors ça doit être vrai
Tout ce qui est valable dans un tuto juste Python est valable dans Blender avec Python donc tu devrais commencer par la. Regarder des tutos python puis l'appliquer sur blender.

Citation :

Pourquoi suis-je obligé de séparer ça ? Point de vue éthique, on est d'accord, mais pourquoi créer juste une classe pour ça ? Pour le lecteur, peut-être ?

Parce que tu ranges tes chaussettes avec tes pâtes ?
C'est pas logique t'a un script qui gère deux trucs complètement différent, pas pour le lecteur, surtout pour t'y retrouver toi.

Donc voila franchement prend le temps de te renseigner plus en détails, t'a des tutoriels Python pour faire de la POO et une fois que t'aura bien mis en application tout ça tu y verra plus clair, parce que la ...


edit: Ah oui et pour les scripts, bah ça coule de source ... diviser pour mieux régner tu connais ?
Citation :
Il me semblait que c'était dangereux d'avoir beaucoup de scripts...

Dangereux pour la santé oui

Contribution le : 25/03/2018 14:37
Créer un fichier PDF de la contribution Imprimer


Re: Python - l'instruction return
OverdOzed
Inscrit:
29/04/2007 20:11
De Nîmes...300 jours de soleil par an, inondations le reste du temps
Post(s): 3774
Citation :
Donc, tu veux dire que "init" n'est pas obligatoire quand on créer un classe ? Car moi, c'est ce que j'avais compris.

Ce n'est pas vraiment ce que je voulais dire dans ce cas précis, mais non, en effet, __init__ n'est pas obligatoire.
Comme son nom l'indique, c'est un initialiseur. C'est une méthode qui s'assure que l'état de l'objet est correctement initialisé, et a priori elle n'est rien censée faire de plus.
Par exemple, si j'écris :
class Foo:
    def add(self, element):
	    data.append(element)
foo = Foo()
foo.add("foo")

Je vais me retrouver avec une erreur de type variable non déclarée (ou pointeur nul, dans les langages plus stricts).
Pour que mon objet Foo puisse ajouter des éléments à sa collection, il faut que la collection existe ; et dans le cas du Python, par défaut le champ n'existe même pas. Le rôle d'__init__, c'est de s'assurer que tout ce dont l'objet a besoin pour fonctionner est bien en place.

Citation :
Si je comprends bien, ça veux dire que je pourrai très bien appeler une fonction de cette classe, tout en étant a l'extérieur (de la classe) ? (ex: ma_classe.ajouter_un_texte(arg1, arg2, arg3))

Je serais tenté de répondre oui, mais avec le flou qui semble régner entre "classe" et "objet"...
Une classe déclare des méthodes, qui décrivent le comportement de ses instances. Quand tu as un objet d'une classe donnée, tu peux lui envoyer un message pour que la méthode correspondante s'exécute. Un exemple :
class Bar():
	def __init__(self, data):
		self.data = data
	def output():
	    print(data)
# Ailleurs dans le code, on n'est à présent plus dans la déclaration de la classe.
bar1 = Bar("Hello,")
bar2 = Bar("World !")

bar1.output()
bar2.output()

La console affichera "Hello, World !". Avec peut-être un retour à la ligne au milieu, je ne sais pas comment print() se comporte de ce côté-là.

Citation :
Tu as dis que le "post_draw" est un aimant à bug (ou est-ce l'ensemble ... = [write] ?), c'est bien juste ?

Non !
J'ai dit que le fait de remplacer la collection de méthodes à appeler après le rendu était un aimant à bugs. Cette variable est accessible partout, donc potentiellement utilisée partout ; tu ne sais pas qui s'est inscrit précédemment, tu ne sais pas qui a besoin qu'un truc en particulier se fasse après le rendu, et tu viens tout désinscrire.

Comme dans mon code d'exemple, remplace ça par ....post_draw.append(write) et tout ira bien.

Citation :
Dans la doc python de blender ? C'est impossible. Ou as-tu trouvé cette phrase qui parle d'une telle hérésie ? Comment peux-tu, dans un environnement interactif, exécuter le script une seule fois ?

À ce stade, la seule chose que je trouve à répondre, c'est "réfléchis". Tu noteras que dans l'Histoire, le mot "hérésie" a rarement été employé par ceux qui avaient raison...
Explique-moi le rapport entre l'interactivité et le fait d'exécuter un script en boucle.
Genre l'initialisation du monde. Tu recrées tout ton monde à chaque frame ?
Le spawn des ennemis. Tu respawn tes ennemis à chaque frame ?
L'interactivité t'oblige à avoir des boucles qui vérifient les entrées utilisateur. Le temps réel t'oblige à avoir des boucles pour le comportement des divers personnages.

Mais mettre en place le système d'affichage... Une fois qu'il y est, il ne bouge plus, non ? Pourquoi le refaire en boucle ?

Maintenant, si la question était réellement "comment", un sensor Always en décochant les deux boutons avec trois pointillés en bas à gauche du cadre. Premier résultat Google, soit dit en passant.

Citation :
Comment peux-tu en une seule fois, virer un texte en vert si l'on place le pointeur dessus et le virer en rouge quand le pointeur est ailleurs (donc on suppose qu'il est rouge de base) ?

Quand le pointeur arrive sur l'élément, on appelle un script qui modifie le texte à afficher. Quand il repart, on en appelle un autre. Le détail des senseurs et tout ça m'échappe, mais en fait, ça n'a rien à voir avec la question.

Si tu reprends le code que je t'ai proposé (ce serait sympa de l'étudier avant de poser des questions auxquelles j'ai déjà répondu), tu verras que le TextStorage est présent dans le dictionnaire. Donc, la liste des textes à afficher est bien accessible là où tu en as besoin, genre dans ton MouseOver. Par contre, TextStorage et TextWriter n'ont besoin d'être créés qu'une seule fois.

Citation :
Je pense que l'on à pas bien interpréter ce que j'ai dit, je laisse passer.

J'espère bien.

Citation :
Pourquoi suis-je obligé de séparer ça ? Point de vue éthique, on est d'accord, mais pourquoi créer juste une classe pour ça ? Pour le lecteur, peut-être ?


"Créer une classe juste pour ça"... Cette formulation laisse entendre que créer une classe est un effort surhumain, un coût à payer, qu'on cherche à économiser un maximum. C'est entièrement faux. En fait, cette phrase remporte le prix de l'hérésie de toute cette conversation
Une classe, c'est la brique de base de ton code, c'est ton principal outil de simplification du problème. La créer ne demande aucun effort, juste le fait d'écrire "class:" et éventuellement d'ouvrir un nouveau fichier.
Tu gagnes en lisibilité, en modularité, en tout.

Citation :
"super" se réfère à "SceneElement" ? Mais enfin, comment est-ce possible ? Si je place "class audioplayer" en premier, c'est lui "super" alors ?

Ça c'est les bases de la POO.
Super renvoie à l'objet courant (self donc) considéré comme une instance de sa superclasse. La superclasse étant ici SceneElement...

Citation :
Seul game doit faire apparaitre des créatures.

Euh ben c'est le cas ici, puisque les méthodes concernées sont déclarées par la classe Game...

Citation :
Donc, je pompe l'objet current_game (ou game, plutôt ?) du dico, pour pouvoir faire ça ?

L'objet current_game est une instance de la classe Game.
Quant à la gestion de l'inventaire... Le simple fait d'avoir une classe "game" qui fait quelque chose est un gros signal d'alarme. Un nom pareil, ça laisse entendre que ça va faire plein de trucs. Or on n'a pas le droit de faire plein de trucs. En fait, j'aurais dû la renommer Spawner plutôt que Game.
Donc non, la gestion d'inventaire, tu ne la mets pas dans Spawner.

Citation :
Il me semblait que c'était dangereux d'avoir beaucoup de scripts... Outre la facilité de lire ceux-ci, pourquoi faire ça ?

Pourquoi dangereux ?
Et la facilité de lecture ne te paraît pas un argument suffisant ? Te balader dans un fichier de 4 000 lignes, tu trouves ça fun ?

Citation :
- Pas de init sauf si variable il y a.

Ou si l'objet a besoin pour fonctionner de faire "quelque chose". L'idée d'__init__, c'est qu'une fois qu'elle est exécutée, tu puisses dire "ça y est, j'ai un [truc]". Il ne fait encore rien puisqu'on ne lui a rien demandé, mais il est là, il est complet. Tout ce qui n'est pas nécessaire à l'objet pour être complet, pour (i]exister[/i], n'a pas sa place dans __init__.

Citation :
- classe est un objet, variable = objet, donc variable est un "label", un surnom donné à la classe.

Quoi ? Non !
Je n'aurais pas dû mentionner qu'une classe est un objet, ça t'a emmêlé les pinceaux. Une classe est avant tout un plan, un modèle, qui décrit des objets. Elle décrit les données qu'ils contiennent, et le travail qu'il sont capables de faire.

Prenons la classe Personne. Cette classe déclare un champ nom, un champ âge, et un champ organes qui est une collection. Ça revient à dire "une Personne a un nom, un âge et des organes" ; c'est l'état. La classe déclare aussi les méthodes parler(), manger() et marcher(). Ce qui revient à dire "une Personne peut parler, manger et marcher" ; c'est le comportement.
Je suis une Personne. Je suis un objet, une instance de la classe Personne. Comme toute Personne, j'ai un nom, "DaWaaaaghBabal", un âge, 28 ans, et tout un tas d'organes en parfait état. Je sais parler, manger et marcher, comme toute Personne.
La dernière caractéristique d'un objet, c'est son identité : si tu croisais un autre DaWaaaaghBabal de 28 ans me ressemblant comme deux gouttes d'eau, ce ne serait quand même pas moi, seulement mon clone.
Tu es une Personne. Tu es un objet, une instance de la classe Personne. Étant une Personne, tu as un nom, "Redstar", un âge inconnu, et tout un tas d'organes que j'espère en bon état. Tu sais aussi parler, manger et marcher.
Étant deux Personnes, on nous décrit de la même façon. On sait qu'on peut nous demander la même chose : parler, manger, marcher, et qu'on le fera de la même façon.
Nous sommes deux objets. "La dernière Personne à avoir posté un message" est une variable. Ça va être tantôt toi, tantôt moi, mais dans un cas comme dans l'autre ça ne change rien à notre identité ou à notre état. Cette variable référence un de nous deux.

Et j'oubliais : à la naissance, on appelle __init__(nom). __init__ fait trois choses : elle met l'âge à 0, elle assigne au champ nom la valeur choisie par les parents, et elle crée tout un tas d'organes qu'elle stocke dans la collection organes. Ouais, j'avais de mauvaises notes en biologie.

Honnêtement, si tu as déjà écrit plusieurs milliers de lignes de code en comprenant aussi mal les concepts les plus fondamentaux, tu peux te préparer psychologiquement à réécrire ton programme de zéro. Ce sera plus rapide qu'essayer de corriger ce que tu as déjà.
En tout cas, la prochaine étape pour avancer dans ton projet, ça va être de le mettre en pause (du moins l'aspect prog) pour écrire des programmes beaucoup plus simples mais en te concentrant sur les concepts fondamentaux.

Contribution le : 25/03/2018 15:26
_________________
|C'est en forgeant qu'on devient forgeron, c'est en mouchant qu'on devient moucheron et c'est en sciant que Léonard devint scie.
Créer un fichier PDF de la contribution Imprimer


Re: Python - l'instruction return
OverdOzed
Inscrit:
19/03/2016 16:30
De Belgique
Post(s): 1436
Vous avez des tutos sur la POO à recommander ?

Je fondes mes réflexions sur ce que j'ai observé depuis ma découverte du BGE. S'il manque des détails, il suffit de le dire. Je l'ai déjà dit, je peux pas tout savoir.

De ton point de vue, c'est pas logique. Pour moi, ça l'est. C'est comme ça et pas autrement, j'interprète comme ça. Mais si ça doit être autrement, d'accord, on trouve un compromis.

Citation :

Explique-moi le rapport entre l'interactivité et le fait d'exécuter un script en boucle.


Je suis d'accord pour ce que tu viens de dire, le principe de l'action-réaction, je veux dire.

Concrètement, mon code actuel, il est écris pour être lancé en boucle et parce que je pensais bien faire mes classes. Voilà l'explication.

Mais voilà, je n'utilise pas les classes correctement, donc je devrai modifier tout ça. Si je fais comme cela devrait être fait, je devrai pouvoir me contenter d'un "mouseover", qui sera mon action pour obtenir ma réaction et sera ensuite désactivé dés que l'impulsion ne sera plus.

En résumé, il y a un rapport si l'on regarde ce que j'ai fais, parce que je l'ai fais ainsi. Il n'y en a pas si l'on regarde la façon "universelle" de faire (quand je dit universelle, je devrai dire tout les programmeurs python (voire programmeur tout court ?)).

Citation :
"Créer une classe juste pour ça"...


En fait, ma question était dans le sens du "c'est comme ça et pas autrement ?". Le nombre de lignes à écrire ne me dérange pas à priori (vive le copier/coller).

Citation :

Ça c'est les bases de la POO.


Cette base ne se trouve pas dans le format pdf du tutoriel d'OpenClassRoom (pas présent dans la version mise à jour non plus). Et je me suis contenté de ça, pensant que c'était complet.

Citation :

Et la facilité de lecture ne te paraît pas un argument suffisant ? Te balader dans un fichier de 4 000 lignes, tu trouves ça fun ?


En incluent l'outil de recherche, pour être honnête, oui, c'est ma façon à moi de procéder. J'aime bien avoir tout sous la main d'un coup. Même si l'on peut avoir autant de fenêtres Blender que l'on veut.

C'est comme ça, je peut pas décrire mieux.

Contribution le : 25/03/2018 20:15
_________________
Mon projet jeu vidéo
Mes tutos
Créer un fichier PDF de la contribution Imprimer


Re: Python - l'instruction return
OverdOzed
Inscrit:
29/04/2007 20:11
De Nîmes...300 jours de soleil par an, inondations le reste du temps
Post(s): 3774
Citation :
Vous avez des tutos sur la POO à recommander ?

... Bonne question. Je n'ai pas appris en ligne, donc je n'en ai pas sous la main. Une recherche rapide m'a permis de trouver celui-ci et celui-ci, un peu plus détaillé. Les deux s'appliquent au Java, ce qui m'arrange en fait : ce qui compte, c'est les concepts, pas la syntaxe.

Mais ce ne sont pas vraiment des tutoriels, plus des présentations des concepts. Après, il y a celui-ci qui est un peu plus tourné vers la pratique. Il se finit par ce bonus, que tu devrais lire avant tout le reste en fait.

Mais un tutoriel pour apprendre à programmer, ça revient un peu à demander un tutoriel pour apprendre à réfléchir. Or il y a un seul moyen d'apprendre à réfléchir : réfléchir. Donc, ce dont tu as besoin, ce n'est pas de tutoriels, c'est 1/ de bien comprendre ce que représentent les concepts de base du langage, dans l'abstrait, pas dans un cas concret dans un langage (Python) et un environnement (le BGE) spécifiques ; et 2/ de faire des katas. Et pour l'instant, code en-dehors du BGE.

Citation :
De ton point de vue, c'est pas logique. Pour moi, ça l'est. C'est comme ça et pas autrement, j'interprète comme ça.

Je ne t'accuse pas d'incohérence ou d'illogisme , seulement de fonder ton raisonnement sur des bases imparfaites.

Citation :
En fait, ma question était dans le sens du "c'est comme ça et pas autrement ?".

Ah, je vois. Disons qu'il y a des tas de façons de faire, là je suis resté proche de ce que tu avais au départ, en essayant de respecter ce que je devinais de ta logique. En résumé, c'est la meilleure façon de faire ce que tu cherchais apparemment à faire. J'avais détaillé pourquoi, mais ce message commence à être très long donc si tu veux le raisonnement pas-à-pas, demande.

Citation :
En incluent l'outil de recherche, pour être honnête, oui, c'est ma façon à moi de procéder. J'aime bien avoir tout sous la main d'un coup. Même si l'on peut avoir autant de fenêtres Blender que l'on veut.

Ah, il y a aussi une question d'outils. Un bon éditeur de code présente une arborescence des fichiers du projet, donc en découpant tout la navigation devient plus simple puisqu'au lieu de chercher dans 4 000 lignes, tu cherches le bon fichier parmi les 5 qui sont dans le bon sous-dossier. Et tu peux garder plusieurs fichiers dans plusieurs onglets.
Mais si tu tiens à utiliser Blender comme éditeur de code... Je ne veux pas dire du mal de notre logiciel préféré, mais ça fait partie, avec le café, des choses qu'il ne fait clairement pas bien. Après, je ne connais pas d'IDE Python, peut-être que Google t'en dira plus.

Juste une remarque : "je garde tout sous la main d'un coup"... Et ça te sert souvent ? Tu lis souvent tout d'une traite ? Tu travailles souvent sur tout le code à la fois ?

Note : j'avais aussi écrit un gros bloc concernant la séparation des responsabilités appliquée à l'ensemble du projet, mais peut-être qu'avant de se poser la question de l'architecture d'ensemble d'un gros système, il faudrait avoir une compréhension en profondeur des briques de base. On verra ça plus tard.

Contribution le : 25/03/2018 23:53
_________________
|C'est en forgeant qu'on devient forgeron, c'est en mouchant qu'on devient moucheron et c'est en sciant que Léonard devint scie.
Créer un fichier PDF de la contribution Imprimer


Re: Python - l'instruction return
OverdOzed
Inscrit:
19/03/2016 16:30
De Belgique
Post(s): 1436
En fait, ce que je déteste pas dessus tout, c'est que je soit obligé de rédiger d'une façon arbitraire sans pouvoir comprendre.

C'est la raison pour laquelle je dis "pourquoi ?", "pourquoi faire ça ?" et "quel intérêt ?".

Je ne peux pas me contenter de dire "ok, tu as raison, je vais faire comme cela". Il faut que je puisse comprendre le programmeur pour bien programmer à mon tour.

Citation :

...avec le café, des choses qu'il ne fait clairement pas bien.


C'est à dire ? Pas assez de headers de couleurs ? Sinon, pour l'IDE, il y a la console interne dans Blender (très pratique pour faire des essais rapides) mais il y a également Python (de cher Python.org).

Citation :
Et ça te sert souvent ? Tu lis souvent tout d'une traite ? Tu travailles souvent sur tout le code à la fois ?


Ça dépends: il m'arrive de faire des erreurs de frappe et je perds du temps des fois à chercher après l'erreur. Donc j'ai besoin de tester progressivement ce que je fais pour m'assurer du fonctionnement recherché.

Fragmenter le code "à l’excès", soit avoir 40 scripts, par exemple, me semble contre-productifs: Si je dois commencer à voyager d'un script à l'autre, pour vérifier que l'erreur n'est pas là et bien ailleurs, en sachant qu'après 5 essais je commence à faire tourner mon moulin à jurons...

Ça deviendrai invivable.

En faisant des essais, je me rendrai mieux compte de ce que je dit là et changerai mon avis selon ce qu'il en ressortira.

Je vais d'abord commencer à méditer sur le principe, le temps de laisser reposer, puis je commences.

Pour BGL, je devais poser une question sur la résolution et le positionnement du texte mais je suppose que ça attendra ?

Citation :
...mais peut-être qu'avant de se poser la question de l'architecture d'ensemble d'un gros système, il faudrait avoir une compréhension en profondeur des briques de base. On verra ça plus tard.


Dois-je en déduire que je dois te donner un compte-rendu sous forme d'une partie de mon code reconditionné ?

Après mes essais dans mon coins, je peux commencer éventuellement par le script des IA des mes animaux, il est assez petit. Et te partager mes modifications.

Contribution le : 26/03/2018 12:41
_________________
Mon projet jeu vidéo
Mes tutos
Créer un fichier PDF de la contribution Imprimer


Re: Python - l'instruction return
OverdOzed
Inscrit:
29/04/2007 20:11
De Nîmes...300 jours de soleil par an, inondations le reste du temps
Post(s): 3774
Citation :
En fait, ce que je déteste pas dessus tout, c'est que je soit obligé de rédiger d'une façon arbitraire sans pouvoir comprendre.

C'est la raison pour laquelle je dis "pourquoi ?", "pourquoi faire ça ?" et "quel intérêt ?".

Je ne peux pas me contenter de dire "ok, tu as raison, je vais faire comme cela". Il faut que je puisse comprendre le programmeur pour bien programmer à mon tour.

Dans ce cas, je peux détailler sur ce morceau en particulier. Note préliminaire : j'ai tâché de respecter la logique de ce que tu avais fait, en partant du principe qu'il y avait des raisons. Ce n'est probablement pas ce que j'aurais fait en partant de zéro.
1/ Tu as décidé de factoriser l'accès aux "variables d'environnement" du script. Note : ce n'est pas une bonne idée, du moins pas de cette façon, mais je détaillerai pourquoi ailleurs. J'ai donc écrit une classe SceneElement qui fait ça.
2/ Tu as décidé de factoriser la lecture de sons. J'ai donc écrit une classe AudioPlayer qui fait ça.
3/ Tu as décidé que ces deux responsabilités, son et variables d'environnement, étaient liés. Personnellement je ne suis pas d'accord (ça n'a juste rien à voir), mais comme le but était d'apporter une petite correction et pas de tout refaire, j'ai gardé ce lien.
4/ Pour faire le lien entre les deux classes A et B, il y a en gros deux façons : A "possède une instance de" B, ou A "est un type particulier de" B. On a donc quatre choix :
- AudioPlayer possède une instance de SceneElement. C'est le plus propre, mais ça nuit un peu au but recherché qui était de simplifier l'écriture.
- SceneElement possède une instance d'AudioPlayer. Non. La plupart des SceneElement n'ont pas besoin de son.
- SceneElement est un type particulier d'AudioPlayer. Encore moins, pour le coup, ça n'a aucun sens.
- AudioPlayer est un type particulier de SceneElement. Admettons. Moins bon que le premier choix, mais plus proche de ce que tu avais écrit.

Donc AudioPlayer hérite de SceneElement.

Citation :
C'est à dire ? Pas assez de headers de couleurs ?

Les couleurs on s'en fout. Le minimum syndical pour coder confortablement, c'est 1/ un explorateur de fichiers, 2/ pouvoir ouvrir plusieurs fichiers dans des onglets, 3/ pouvoir ouvrir une définition à partir d'une référence (si un code mentionne une classe / fonction / constante, je peux ouvrir le fichier où elle est déclarée). Ensuite, idéalement, on veut bien de l'autocomplétion, de la correction syntaxique, des outils de refactoring...
Et Blender n'a rien de tout ça.

Citation :
Ça dépends: il m'arrive de faire des erreurs de frappe et je perds du temps des fois à chercher après l'erreur. Donc j'ai besoin de tester progressivement ce que je fais pour m'assurer du fonctionnement recherché.

Ma question était en fait rhétorique. Tu travailles sur une ligne de code à la fois, pas dans tout le code. Tu travailles sur une fonctionnalité à la fois, pas sur tout le système.
Et afficher tout le code à la fois est un handicap quand tu cherches une faute de frappe récente. Quand tu as fragmenté ton script en 40 fichiers, tu sais que ta faute de frappe n'est pas dans un des 39 qui sont actuellement fermés. Ce qui réduit le volume de fichier à relire de 97,5%...

Citation :
Fragmenter le code "à l’excès", soit avoir 40 scripts, par exemple, me semble contre-productifs: Si je dois commencer à voyager d'un script à l'autre, pour vérifier que l'erreur n'est pas là et bien ailleurs, en sachant qu'après 5 essais je commence à faire tourner mon moulin à jurons... Ça deviendrai invivable.

Euh, rien de tout ça n'a de sens.
Quand tout est bien divisé, tu sais où est l'erreur. C'est une des raisons pour lesquelles on divise...

Note bien un truc : en Java, on considère qu'il y a un problème de design quand une classe dépasse 100 lignes. C'est une limite un peu arbitraire et ça dépend des équipes et des entreprises, certaines vont te dire 50, d'autres tolèreront jusqu'à 200, mais dans l'ensemble, tout le monde considère que 100 lignes est une bonne taille. Et en Java, on ne peut déclarer qu'une classe par fichier. Donc, plus ou moins tout le monde s'entend pour dire que 100 lignes par fichier est la taille à ne pas dépasser. Et en 100 lignes de Java, on fait moins qu'en 100 lignes de Python.

La division en plein de fichiers permet de simplifier la navigation en limitant la quantité de code à fouiller et en exploitant l'arborescence de fichiers pour trier les informations. Elle permet de limiter les bugs, puisque ce qui est dans un fichier ne peut pas affecter ce qui est dans un autre sauf si c'est explicitement mentionné ("import"). Elle permet de les identifier facilement : si l'affichage des textes se passe mal, tu vas dans le(s) fichier(s) qui gèrent l'affichage des textes, il y a peu de chances que le bug viennent de la gestion des sons. Sauf si la gestion des sons contient la ligne "...post_draw = [play]"

Citation :
Pour BGL, je devais poser une question sur la résolution et le positionnement du texte mais je suppose que ça attendra ?

Ben en fait, c'est surtout que je n'aurai pas de réponse. Autant la programmation en général c'est mon métier, autant le BGE en particulier je n'y connais rien. Note : ne prends pas ça comme une excuse pour m'ignorer, les principes dont je parle sont à peu près universels

Citation :
Dois-je en déduire que je dois te donner un compte-rendu sous forme d'une partie de mon code reconditionné ?

Je ne vais pas te donner des devoirs, hein. Si je disais ça, c'est parce que je m'étais laissé emporter et que j'avais encore une page d'explications qui n'étaient pas en rapport avec le problème immédiat.

Citation :
Après mes essais dans mon coins, je peux commencer éventuellement par le script des IA des mes animaux, il est assez petit. Et te partager mes modifications.

Oh, partage tes essais dans ton coin aussi
Et on trouve sur Google des exercices de POO, ça peut être un meilleur début que de modifier tes scripts (un exercice conçu comme tel est généralement plus clair qu'un cas concret).

Contribution le : 26/03/2018 17:03
_________________
|C'est en forgeant qu'on devient forgeron, c'est en mouchant qu'on devient moucheron et c'est en sciant que Léonard devint scie.
Créer un fichier PDF de la contribution Imprimer


Re: Python - l'instruction return
OverdOzed
Inscrit:
08/10/2003 10:20
De Annecy
Post(s): 2781
Eh ben ça code ardument par ici!
Pour en revenir au sujet de base, je n'ai pas compris non plus pourquoi il y avait ce "return", il ne renvoit rien... tentative d'obscurification peut être
Sinon si vous voulez mon opinion sur le design du code, je rejoins l'avis de Ton Rosendaal:
https://www.youtube.com/watch?v=qJEWOTZnFeg&t=1631s

Il vaut mieux avoir queleque chose de mal codé mais qui marche, que quelque chose de très élégant mais inutile. Bon je dis ça mais je ne suis pas codeur professionel, on est bien d'accord, si certains arrivent à faire les deux à la fois, c'est tant mieux

Contribution le : 26/03/2018 17:59
_________________
lucky
www.lucky3d.fr
Auto-Rig Pro Addon: Blender Market - GumRoad
Créer un fichier PDF de la contribution Imprimer


Re: Python - l'instruction return
OverdOzed
Inscrit:
29/04/2007 20:11
De Nîmes...300 jours de soleil par an, inondations le reste du temps
Post(s): 3774
Citation :
Il vaut mieux avoir queleque chose de mal codé mais qui marche, que quelque chose de très élégant mais inutile.


En réalité, cette opposition est stupide. Mais il est très commode de passer sous le tapis que dans 80% des cas, le code "à l'arrache mais qui marche" est pourri de bugs et qu'en vrai, demain, il ne marchera plus parce que quelqu'un aura modifié la mauvaise ligne de code. Ou qu'il vient de rallonger de 3 mois les délais de livraison parce que telle autre fonctionnalité est à présent beaucoup plus compliquée à mettre en place qu'elle ne devrait.

L'élégance comme souci esthétique, OK, on s'en passe. La clarté, la simplicité et la structure, non. Quand on prend le temps de bien concevoir les choses, on obtient plus rapidement un code fonctionnel que quand on le fait à l'arrache, mais en plus on a un résultat sans bugs qu'on peut étendre par la suite ou modifier sans effort.

Contribution le : 26/03/2018 18:15
_________________
|C'est en forgeant qu'on devient forgeron, c'est en mouchant qu'on devient moucheron et c'est en sciant que Léonard devint scie.
Créer un fichier PDF de la contribution Imprimer


Re: Python - l'instruction return
OverdOzed
Inscrit:
08/10/2003 10:20
De Annecy
Post(s): 2781
Bon donc Ton dit des choses stupides Je pense que cela dépend aussi du type d'application, et parfois la pratique démontre le contraire. En ce qui me concerne, mon expérience se limite principalement aux scripts pythons sous Blender, C# sur Unity et un peu de C++ sur Qt. Un bon nombre de fois je me suis senti idiot d'avoir passé du temps à bien organiser mon code, pour finalement devoir tout casser un peu plus tard parce que le projet nécéssite de nouveaux besoins, qui rendent l'ancien code inutile, peu importe la qualité de la structure du code. Donc je rejoins Ton pour cette raison, coder rapidement sans trop se soucier de la structure dans un premier temps, puis, si les fonctions sont validés sur le long terme, polisser et optimser tout ça.

Contribution le : 26/03/2018 18:36
_________________
lucky
www.lucky3d.fr
Auto-Rig Pro Addon: Blender Market - GumRoad
Créer un fichier PDF de la contribution Imprimer


Re: Python - l'instruction return
OverdOzed
Inscrit:
19/03/2016 16:30
De Belgique
Post(s): 1436
Citation :

...coder rapidement sans trop se soucier de la structure dans un premier temps, puis, si les fonctions sont validés sur le long terme, polisser et optimser tout ça.


Je suis d'accord du moment que l'on est au statut de programmeur amateur: ça permet de se rôder un peut, histoire de comprendre le plus de choses possibles (concepts, règles à suivre, ...).

Ça permet aussi de savoir si l'on a la patience suffisante pour programmer, m'est avis.

Mais du moment que l'on est confirmé comme DaWaaaaghBabal, c'est une perte de temps, ou plutôt contre-productif, car on est confirmé, donc on a le savoir-faire. On ne doit plus se permettre de perdre du temps, par conséquent.

J'en profite à présent pour remercie Hook et DaWaaaaghBabal (surtout) pour leur patiences.

Citation :
Pour BGL, je devais poser une question sur la résolution et le positionnement


Je me suis trompé, c'est pour BLF.

Pendant que j'étais en train de rédiger ladite question (que je ne poserai pas, finalement), je pense avoir trouvé la solution: je dois mettre directement la résolution (ex:1280 x 1024) plutôt que passer par getWindowWidth() et getWindowHeight().

Il faudra que je teste ça pour en être sûr, en sachant qu'il n'y a pas que cette résolution là qui existe.

Contribution le : 27/03/2018 10:09
_________________
Mon projet jeu vidéo
Mes tutos
Créer un fichier PDF de la contribution Imprimer



 Haut   Précédent   Suivant
« 1 2 (3) 4 »




Enregistrer votre réponse
Compte*
Nom   Mot de passe   Authentification
Message:*



[Recherche avancée]



Sujets récemment répondus
Forums Sujets Réponses Lus Dernières contributions
Questions & Réponses [non résolu] Blend4web et Blender version 2.80 ? 0 5 Aujourd'hui 16:52:14
blendinfos 
Questions & Réponses [non résolu] Comportement 2.8    [1][2][3] 20 2081 Aujourd'hui 16:48:45
blendinfos 
Questions & Réponses A l'aide nous sommes perdus aidez nous !!!!    [1][2] 15 185 Aujourd'hui 15:59:40
marionnulenblender 
The Blender Clan 'tchat Le topic des trucs à voir    [1][2][3]...[303] 3027 725657 Aujourd'hui 13:15:27
Bibi09 
Questions & Réponses Mieux texturer 2 81 Aujourd'hui 11:20:42
thierry_st_malo 
Moteur de jeu GameBlender et alternatives Oculus 0 37 Aujourd'hui 01:20:21
kouz 
Questions & Réponses Environnment Texture, Image texture 3 118 Hier 18:59:47
HarDrive 
Questions & Réponses armature position 3 86 Hier 11:05:20
Rimpotche 
Questions & Réponses Eevee et son affichage 'différent' 1 100 Hier 10:42:52
ebrain 
Questions & Réponses [résolu] Rigging mécanique 3 163 13/12 21:47:30
mapleberry 
Questions & Réponses [résolu] Textures de Maya vers Blender 1 71 13/12 18:00:04
Melodicpinpon 
Questions & Réponses Camera Blender et Blend4Web 0 62 13/12 17:14:14
Seb_K 
Questions & Réponses [résolu] Edges lumineuses ? 2 91 13/12 16:48:08
Cdric 
[WIP] et travaux terminés Le château de la Roseraie de Carpentras en 3D (Vidéo) 0 83 13/12 11:52:01
Fracoris 
Questions & Réponses Blender 2.8 dupliquer un cylindre sans deformation le long d une courbe    [1][2][3] 28 618 12/12 17:57:31
Rimpotche 
Questions & Réponses Ciel sans skybox ou skydome ? 7 188 12/12 15:37:51
Bibi09 
Questions & Réponses Problème de rendu ( novice ) 3 106 12/12 11:39:10
Rimpotche 
Questions & Réponses [résolu] Enlever les reflets des arbres dans le shader glass? 7 264 12/12 11:14:01
Bibi09 
[WIP] et travaux terminés [WIP] Teeny Tiny - Story 6 454 11/12 22:40:12
Bibi09 
Moteur de jeu GameBlender et alternatives [non résolu] Modifier un visage - ajouter machoire    [1][2] 13 671 11/12 12:37:06
Redstar 

Qui est en ligne
73 utilisateur(s) en ligne (dont 41 sur Forums)

Membre(s): 1
Invité(s): 72


Gilead_Maerlyn, plus...
Nouveaux membres
ErnieJms00 15/12/2019
JuanaLedfo 15/12/2019
RobertPoat 15/12/2019
Hamza-E 15/12/2019
marionnulenblender 14/12/2019
gladou 14/12/2019
Sybelog 14/12/2019
Seb_K 13/12/2019
friedpotato 12/12/2019
Imheretolalala 12/12/2019
Dernier Ajout
2019-11-05 01.JPG

Evènements à venir
Dec 29
Anniversaire d'ebrain
Jan 11
BUG de Lyon
Fev 15
Anniversaire de Dany
plus 277 plus d'élément(s)
 Par Mickaël Guédon [ebrain] © 2003-2019 The Blender Clan - hébergé par TuxFamily - Site déclaré à la CNIL sous le numéro 1155445