De la POO ou presque sans le savoir avec Pure Basic

Sujets variés concernant le développement en PureBasic
Avatar de l’utilisateur
falsam
Messages : 7317
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

De la POO ou presque sans le savoir avec Pure Basic

Message par falsam »

« Par ma foi ! il y a plus de quarante ans que je dis de la prose sans que j'en susse rien, et je vous suis le plus obligé du monde de m'avoir appris cela. »

C'est en ces termes que dans le Bourgeois gentilhomme, Monsieur Jourdain apprend, au cours d'un échange avec son maître de philosophie, qu'il dit de la prose depuis longtemps, sans le savoir.

Pure Basic n'obéit pas aux règles de la P.O.O (Programmation Orientée Objet) et c'est tant mieux. Pourtant sans le savoir, j’espère vous faire comprendre que vous faites de la P.O.O.

P.O.O. en résumé
La P.O.O. consiste en la définition et l'interaction de préfabriqués logiciels appelés objets.

Chaque objet possède une structure interne matérialisée par des variables appelées aussi attributs, et un comportement matérialisé par des fonctions ou procédures, ici appelées méthodes.

Je n'en dirais pas plus. Les moteurs de recherches sont vos amis si vous souhaitez obtenir plus d'information.

Du code procédurales aux modules ..... à vous de choisir.
A travers ces différents codes, le cahier des charges sera le suivant:
  • - player : Création d'une structure d'un joueur, (ça ressemble à une class mais ça s’arrête là)
  • - SetLife() Création d'une procédure qui attribuera un nombre de vie à un joueur
  • - GetLife() Création d'une procédure qui retournera le nombre de vie d'un joueur
Et voila le premier code tout simple : Du pure procédural. Je n'ai pas dit du pure bonheur hein ?

Code : Tout sélectionner

;Structure d'un joueur
Structure player
  PosX.i  ;Position X
  PosY.i  ;Position Y
  Life.i  ;Nombre de vies
EndStructure

;Donne des points de vie à un joueur
Procedure SetLife(*This.player, Life)
  *This\Life = Life
EndProcedure

;Retourne le nombre de vies restant d'un joueur
Procedure GetLife(*This.player)
  ProcedureReturn *This\Life
EndProcedure

;-Zone de test

;Création de deux joueurs (On instance chacun des joueur avec la structure Player)
Define Player1.player
Define Player2.player

;Ajout du nombre de vies pour chacun de ces deux joueurs 
SetLife(Player1, 4)
SetLife(Player2, 5)

;Controle du nombre de vie
Debug GetLife(Player1)
Debug GetLife(Player2)
Dernière modification par falsam le sam. 23/août/2014 21:22, modifié 5 fois.
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
falsam
Messages : 7317
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

De la POO ou presque avec Pure Basic : L'interface

Message par falsam »

Interface et Pseudo P.O.O. : Les interfaces jettent les bases pour une Programmation Orientée Object avec PureBasic. Voyons ce que donne le même code au sein d'une interface.

Code : Tout sélectionner

;Création de l'interface Player
Interface InterfacePlayer
  SetLife(Life) 
  GetLife()
EndInterface

;Structure d'un joueur: Propriétés et méthodes
Structure player  
  *Method ;Association de méthodes (Voir DataSection)
  
  PosX.f  ;Position X
  PosY.f  ;Position Y
  Life.i  ;Nombre de vies
EndStructure

;Contruction d'un joueur
Procedure.i NewPlayer()
  Protected *This.player = AllocateMemory(SizeOf(player))
  
  If Not *This
    ProcedureReturn #False
  EndIf
  
  *This = AllocateMemory(SizeOf(player))
  
  With *This
    \Method = ?Method
    \PosX = 0 
    \PosY = 0
    \Life = 3
  EndWith
  
  ProcedureReturn *This
EndProcedure

;Donne des points de vie à un joueur
Procedure SetLife(*This.player, Life)
  *This\Life = Life
EndProcedure

;Retourne le nombre de vies restant d'un joueur
Procedure GetLife(*This.player)
  ProcedureReturn *This\Life
EndProcedure

;La data section contiendra les noms des deux procédures 
DataSection
  Method:
  Data.i @SetLife(), @GetLife()
EndDataSection

;-Zone de test

;Création de deux joueurs instanciés avec l'interface; Player 
Player1.InterfacePlayer = NewPlayer()
Player2.InterfacePlayer = NewPlayer()

;Ajout du nombre de vies pour chacun de ces deux joueurs : Methode SetLife()
Player1\SetLife(4)
Player2\SetLife(5)

;Controle du nombres de vie : Méthode GetLife()
Debug Player1\GetLife()
Debug Player2\GetLife()
Dernière modification par falsam le mer. 06/août/2014 19:25, modifié 2 fois.
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
falsam
Messages : 7317
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: De la POO ou presque avec Pure Basic : Les modules

Message par falsam »

Les modules sont un moyen facile d'isoler un morceau de code, permettant ainsi la réutilisation d'un code et son partage sans risque de conflit de nom. Tout le code de la section Module sera maintenu privé à ce Module.

Code : Tout sélectionner

DeclareModule Player 
  ;Structure d'un joueur: Propriétés
  Structure player  
    PosX.f  ;Position X
    PosY.f  ;Position Y
    Life.i  ;Nombre de vies
  EndStructure
  
  ;Ajout de méthodes
  Declare.i NewPlayer() 
  Declare.i SetLife(*This.player, Life)
  Declare.i GetLife(*This.player)
EndDeclareModule

Module Player
  ;-Zone privée
  
  ;-Zone public
  
  ;Construction d'un joueur
  Procedure.i NewPlayer()
    Protected *This.player = AllocateMemory(SizeOf(player))
  
    If Not *This
      ProcedureReturn #False
    EndIf
  
    *This = AllocateMemory(SizeOf(player))
  
    With *This
      \PosX = 0 
      \PosY = 0
      \Life = 3
    EndWith
  
    ProcedureReturn *This
  EndProcedure

  ;Donne des points de vie à un joueur
  Procedure SetLife(*This.player, Life)
    *This\Life = Life
  EndProcedure

  ;Retourne le nombre de vies restant d'un joueur
  Procedure GetLife(*This.player)
    ProcedureReturn *This\Life
  EndProcedure
EndModule

;-Zone de test
UseModule Player

;Création de deux joueurs (Player représente le module et non pas la structure)
Player1 = Player::NewPlayer()
Player2 = Player::NewPlayer()

;Ajout du nombre de vies pour chacun de ces deux joueurs : Methode SetLife()
Player::SetLife(Player1, 4)
Player::SetLife(Player2, 5)

;Controle du nombres de vie : Méthode GetLife()
Debug Player::GetLife(Player1)
Debug Player::GetLife(Player2)
Dernière modification par falsam le mer. 06/août/2014 19:26, modifié 1 fois.
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
falsam
Messages : 7317
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: De la POO ou presque avec Pure Basic

Message par falsam »

C'est là que se termine l'histoire de nos deux joueurs perdus dans un systéme trés privé compoosé d'interface et de modules dans lequel ils ne seront jamais retrouvés.

Code : Tout sélectionner

DeclareModule Player 
  
  Interface InterfacePlayer
    SetLife(Life) 
    GetLife()
  EndInterface
  
  Declare.i NewPlayer() 
EndDeclareModule

Module Player
  ;-Zone privée
  
  ;Structure d'un joueur: Propriétés et méthodes
  Structure player  
    *Method ;Association de méthodes (Voir DataSection)
  
    PosX.f  ;Position X
    PosY.f  ;Position Y
    Life.i  ;Nombre de vies
  EndStructure
  
  ;-Zone Public
  ;Contruction d'un joueur
  Procedure.i NewPlayer()
    Protected *This.player = AllocateMemory(SizeOf(player))
  
    If Not *This
      ProcedureReturn #False
    EndIf
  
    *This = AllocateMemory(SizeOf(player))
  
    With *This
      \Method = ?Method
      \PosX = 0 
      \PosY = 0
      \Life = 3
    EndWith
  
    ProcedureReturn *This
  EndProcedure

  ;Donne des points de vie à un joueur
  Procedure SetLife(*This.player, Life)
    *This\Life = Life
  EndProcedure

  ;Retourne le nombre de vies restant d'un joueur
  Procedure GetLife(*This.player)
    ProcedureReturn *This\Life
  EndProcedure

  DataSection
    Method:
    Data.i @SetLife(), @GetLife()
  EndDataSection
EndModule

;-Zone de test
UseModule Player

;Création de deux joueurs instanciés avec l'interface Player 
Player1.Player::InterfacePlayer = Player::NewPlayer()
Player2.Player::InterfacePlayer = Player::NewPlayer()

;Ajout du nombre de vies pour chacun de ces deux joueurs : Methode SetLife()
Player1\SetLife(4)
Player2\SetLife(5)

;Controle du nombres de vie : Méthode GetLife()
Debug Player1\GetLife()
Debug Player2\GetLife()
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
graph100
Messages : 1318
Inscription : sam. 21/mai/2005 17:50

Re: De la POO ou presque sans le savoir avec Pure Basic

Message par graph100 »

Lorsque tu utilises

Code : Tout sélectionner

UseModule Player 
Ce n'est pas la peine de préciser le module ensuite.

Code : Tout sélectionner

 	;-Zone de test 
	UseModule Player 
	 
	;Création de deux joueurs instanciés avec l'interface Player  
	Player1.InterfacePlayer = NewPlayer() 
	Player2.InterfacePlayer = NewPlayer() 
	 
	;Ajout du nombre de vies pour chacun de ces deux joueurs : Methode SetLife() 
	Player1\SetLife(4) 
	Player2\SetLife(5) 
	 
	;Controle du nombres de vie : Méthode GetLife() 
	Debug Player1\GetLife() 
	Debug Player2\GetLife()
Je ne dirais rien sur le reste
_________________________________________________
Mon site : CeriseCode (Attention Chantier perpétuel ;))
F6LYON
Messages : 6
Inscription : lun. 06/avr./2009 20:08

Re: De la POO ou presque sans le savoir avec Pure Basic

Message par F6LYON »

Merci falsam,

L'approche, la progression, la synthèse tout est bien compris !
Même, par effet collatéral, l'emploi du pointeur pour passer la structure à la procédure.

Cordialement,
Répondre