Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Mieux programmer : chapitre 2 #57

Draft
wants to merge 1 commit into
base: master
Choose a base branch
from
Draft

Conversation

aureliendossantos
Copy link
Member

Chapitre 2 : Logique et design

  • La complexité d'un algorithme
  • Les design patterns
  • Les paradigmes orienté objet et fonctionnel

@GoulvenC Peux-tu review en réécrivant les blocs de code dans la syntaxe que tu souhaites ?
Ici, ajouter une méthode sound à la Factory, différente selon qu'on soit un chat ou un chien. Si l'exemple te convient toujours. J'ai laissé ce que tu avais écrit 🙂
https://github.com/gamedevalliance/fairedesjeux.fr/compare/programmation?expand=1#diff-a4f7489b9ad3fbe34a50ad760c0590b17d38fe81704fead547ba3f72cc5396d6R15

Ici, la classe Car peut avoir une couleur personnalisée définie par le constructeur. Je sais pas quelle syntaxe tu voudrais pour l'indiquer.
https://github.com/gamedevalliance/fairedesjeux.fr/compare/programmation?expand=1#diff-67987862f4495b705ad1da18e4f5f6de72974d9a302b689813f7b92bdb5fcaa6R24

@aureliendossantos aureliendossantos added the Formation Rédaction de formation label Dec 14, 2022
@aureliendossantos aureliendossantos self-assigned this Dec 14, 2022
@netlify
Copy link

netlify bot commented Dec 14, 2022

Deploy Preview for fairedesjeux ready!

Name Link
🔨 Latest commit 6f0acd6
🔍 Latest deploy log https://app.netlify.com/sites/fairedesjeux/deploys/639a318ba4ac130008898086
😎 Deploy Preview https://deploy-preview-57--fairedesjeux.netlify.app
📱 Preview on mobile
Toggle QR Code...

QR Code

Use your smartphone camera to open QR code link.

To edit notification comments on pull requests, go to your Netlify site settings.

Copy link

@gr-im gr-im left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Je pense que le cours est très (trop) ambitieux et qu'il serait peut-être plus accessible s'il montrait une collection de recipes sur des améliorations concrètes suivi d'une explication concrète de pourquoi il s'agit d'une amélioration?


Dans le chapitre précédent, nous avons vu les opérateurs, les types, les fonctions et les structures de données. La base de la programmation, c'est d'utiliser tous ces outils pour construire un algorithme : un programme fait pour résoudre un problème.

Imaginons que l'on souhaite récupérer uniquement les chiens dans la liste des animaux de notre refuge. C'est un algorithme très simple, mais qui peut être écrit de plusieurs façons différentes ! On peut filtrer la liste avec une boucle *for in* ou bien avec une fonction de premier ordre.
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Je ne suis pas sur que avec une fonction de premier ordre soit correcte. Je préférerais avec la fonction filter, qui elle, prend une fonction en argument (parce que c'est celle passée en argument qui est de premier ordre).


La méthode du [tri par sélection](https://fr.wikipedia.org/wiki/Tri_par_s%C3%A9lection) passe en revue tous les éléments, trouve le plus petit et le place au début de la liste, avant de recommencer avec le reste de la liste. Plus stupide, le [bogosort](https://fr.wikipedia.org/wiki/Tri_stupide) mélange tous les éléments au hasard en espérant tomber sur le bon ordre. C'est un algorithme si inefficace que si vous avez beaucoup d'éléments à trier, vous pourriez bien ne jamais tomber sur la bonne solution ! D'autres tris sont bien plus performants, mais seraient plus difficiles à résumer en quelques lignes...

Pour juger de la performance d'un algorithme, on peut étudier sa **complexité**, aussi appelée temps de calcul. Dans le cas le plus simple, un algorithme est noté O(*n*), nous indiquant que son temps de résolution augmente linéairement avec le nombre d'éléments étudiés.
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Je pense que j'ajouterais que dans le cas de la complexité en temps, on observe le traitement de manière pessimiste.

@@ -0,0 +1,49 @@
---
title: "Les design patterns"
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Je pense que cette rubrique arrive prématurément. Je pense qu'il vaut mieux introduire les patterns progressivement, quand l'exemple l'impose. De mon point de vue, les motifs de conceptions sont une contrainte lié à un langage (et/ou à une collection d'outils) et quand ils sont présentés de manière théorique, je pense que ça à tendance à tendre vers le charlatanisme (je ne parle pas spécifiquement de votre rubrique, mais des livres dédiés).

Comme le dit l'adage, quand on a un marteau, tout ressemble à un clou ! Attention à ne pas utiliser un pattern complexe pour régler un problème simple.
:::

Les design patterns existent avant tout pour combler un manque d'outils dans certains langages (on peut parler d'un manque d'**abstraction**). De la même manière que les fonctions de premier ordre sont plus sûres et lisibles que des boucles for, une abstraction fournie par votre langage serait plus expressive et plus simple qu'un design pattern.
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Même si je préfère la programmation fonctionnelle, je serais très curieux de comprendre en quoi les fonctions de premier ordre sont plus sûres que les boucles ?

L'exemple qui va suivre peut sembler curieux, mais pas de panique. Le but est simplement de comprendre le concept, non pas ce design pattern spécifiquement.
:::

Prenons un exemple avec un pattern Factory pour créer des animaux. Tous les animaux auront la même structure : un objet contenant un attribut nom et une méthode sound pour leur cri. Plutôt que de réécrire plusieurs fois le même code, on va créer une `AnimalFactory` qui, en fonction du type de l'animal, va créer l'objet adapté.
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Je trouve que c'est exemple est étrange, qu'apporte-t-il de plus qu'un constructeur ?
D'où mon insistance pour présenter progressivement les motifs en fonction de leurs besoins.
(ici, Factory peut résoudre de l'absence de surcharge ou de la décoration, ce qui n'est pas le cas dans cet exemple).

Comment on lines +9 to +10
- la **programmation orientée objet**, largement majoritaire dans le développement de jeux ;
- la **programmation fonctionnelle**, moins présente dans les jeux, mais qui nous permettra de comprendre comment on peut penser les programmes différemment.
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Personnellement, je n'aime pas opposer les deux. Tous les langages OOP modernes étant aussi fonctionnels, en ajoutant que je ne suis pas du tout convaincu que les deux paradigmes soient les deux plus populaires...

Comment on lines +14 to +21
Comme son nom l'indique, l'orienté objet pense les programmes comme un assemblage de briques logiques que l'on appelle des objets. Un objet contient :

- des variables qui le définissent, que l'on appelle des attributs ou des propriétés ;
- des fonctions qui lui sont propres, que l'on appelle des méthodes.

Afin de faciliter la création de ces objets, on utilise des classes, qui servent de modèle. Une classe définit les propriétés et méthodes que peut avoir un certain type d'objet, et fournit une méthode pour créer des objets héritant de cette classe.

Par exemple, on peut créer une classe Voiture avec un poids et une vitesse fixe. La couleur de chaque voiture pourra être différente. La classe propose aussi une méthode `drive()` qui fait avancer la voiture en fonction de sa vitesse.
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ce paragraphe est relativement faux, parce que si je suis votre définition, ce code est OOP :

module Car = struct 

  type t = {
      weight : int
    ; speed : float 
    ; position : int * int
   ; color : string

  }

  let make ?(weight = 1500.0) ?(speed = 60) ?(position = (0, 0)) color = 
     { weight; speed; position; color}

  let drive ({ position = (x, y), _} as car) = 
     { car with position = (x + speed * 0.1, y) }

end

Ce qui n'est pas le cas.

- des variables qui le définissent, que l'on appelle des attributs ou des propriétés ;
- des fonctions qui lui sont propres, que l'on appelle des méthodes.

Afin de faciliter la création de ces objets, on utilise des classes, qui servent de modèle. Une classe définit les propriétés et méthodes que peut avoir un certain type d'objet, et fournit une méthode pour créer des objets héritant de cette classe.
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ce qui ne s'applique que à l'OOP orienté classes (mais il existe d'autres forme d'OOP, notamment celle orientée prototype, à la Self, Js ou Io)

@@ -0,0 +1,132 @@
---
title: "Les paradigmes orienté objet et fonctionnel"
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Je trouve aussi que cette rubrique arrive prématurément.


#### Éviter les effets de bord

Une des choses qui peut causer un code spaghetti est un programme avec des fonctions ou des méthodes qui ont trop d'effets de bord, autrement dit des effets secondaires qui ne sont pas la valeur de retour de la fonction.
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Est-ce que c'est vrai ? Je pense que la présence d'effets est relativement décorélé de la notion de "code spaghetti". Peut-être qu'il faudrait clarifier le sens que vous donnez à ce mot ? (Pour ma part, le code spaghetti, c'est un code qui est dur à maintenir et je trouve qu'il existe beaucoup d'effets de bords qui ont peut d'incidence sur la maintenabilité).

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Formation Rédaction de formation
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

2 participants