Ecriture POO plus "standard" dans PureBasic

Vous avez une idée pour améliorer ou modifier PureBasic ? N'hésitez pas à la proposer.
Avatar de l’utilisateur
Dionyzos
Messages : 53
Inscription : jeu. 05/févr./2004 19:57

Ecriture POO plus "standard" dans PureBasic

Message par Dionyzos »

Bonjour,

Tout d'abord, j'espère que je ne vais pas déclencher un troll avec ce sujet :wink:

J'ai commencé à regarder la façon de coder en objet dans PureBasic, et je ne trouve pas que ce soit super intuitif et pratique comme méthode d'écriture :? (ce n'est que mon avis)

Pourquoi ne pas avoir implémenter une syntaxe du genre :

Code : Tout sélectionner

Class MaClasse
    ; les attributs...
    var1.l
    var2.s

    ; le constructeur...
    Procedure MaClasse()
        ...
    EndProcedure


    ; les méthodes...
    Procedure MaMethode1()
        ...
    EndProcedure

    Procedure MaMethode2()
        ...
    EndProcedure
EndClass
Et qu'on utilise ensuite la classe comme ceci :

Code : Tout sélectionner

monObjet = new MaClasse()

monObjet\var1 = 5
monObjet\var2 = "bonjour"
monObjet\MaMethode1()
...
Je pense que ce code est plus proche de la syntaxe "Objet" des autres langages et est (à mon sens) plus simple à comprendre.

Qu'en pensez-vous ?
Cls
Messages : 620
Inscription : mer. 22/juin/2005 8:51
Localisation : Nantes

Re: Ecriture POO plus "standard" dans PureBasic

Message par Cls »

Tu peux regarder du coté de ce code de Dräc :

Code : Tout sélectionner

;=======================================================================
; OOP
;
; A set of instructions to equip PureBasic with
; OOP concepts. It is a possible implementation
; allowing basic concepts as:
; - instanciation,
; - encapsulation,
; - simple inheritance,
; - overload,
; - abstract/concret Classes,
; - composition/agregation.
;
; Dräc -  Oct 2007 : * Init_Mbers:EndInit_Mbers block became a private
;                      block of the OOP implementation used by a new
;                      block New:EndNew.
;                    * Externalisation of the header from Method, New &
;                      Free macros for an easy service.
;                    * Additional macros to an easy declaration of
;                      Methods, New and Free (DeclareMethods, DeclareNew
;                      DeclareFree)
; Dräc - Sept 2007 : creation
;=======================================================================

Macro Mtd
*this\Instance\Md
EndMacro

;///////////////////////////////////////////////////////
; OBJECT CLASS
;///////////////////////////////////////////////////////

;-------------------------------- Class --------------------------------
;
; Object class declaration.
;
; Syntax:
;         Class(ClassName)
;           [Mthd1()]
;           [Mthd2()]        <-- Interface declaration
;           ...
;         Methods(ClassName)
;           [<*Mthd1>]
;           [<*Mthd2>]       <-- methods table declaration
;           ...
;         Members(ClassName)
;           [<variable1>]    <-- members declaration
;           ...
;         EndClass(ClassName)
;------------------------------------------------------------------------
Macro Class(ClassName)
  ; Declare the class interface
  Interface ClassName#_ 
EndMacro
Macro Methods(ClassName) 
  EndInterface 
  ;Declare the methods table structure
  Structure Mthds_#ClassName 
EndMacro
Macro Members(ClassName) 
  EndStructure
  ; Create the methods table
  Mthds_#ClassName.Mthds_#ClassName
  ; Declare the members
  ; No mother class: implement pointers for the Methods and the instance
  Structure Mbrs_#ClassName#_
    *Methods
EndMacro 
Macro EndClass(ClassName)
  EndStructure
  Structure Mbrs_#ClassName Extends Mbrs_#ClassName#_
    *Instance.ClassName
  EndStructure
  ; Merges methods and members into an StructureUnion in order to
  ; symetrize their use and to benefit of 'automatic accessors'
  ; Syntax:
  ;         Object\Md\Method() to use method
  ;         Object\Mb\Member to access a member
  Structure ClassName
   StructureUnion
     *Md.ClassName#_     ; The methods
     *Mb.Mbrs_#ClassName ; The menbers
   EndStructureUnion
  EndStructure
EndMacro

;------------------------------- ClassEx -------------------------------
;
; Object class declaration.
; Use when the object inherite from an other class.
;
; Syntax:
;         ClassEx(ClassName, MotherClass)
;           [Mthd1()]
;           [Mthd2()]                       <-- Interface declaration
;           ...
;         MethodsEx(ClassName, MotherClass)
;           [<*Mthd1>]
;           [<*Mthd2>]                      <-- methods table declaration
;           ...
;         MembersEx(ClassName, MotherClass)
;           [<variable1>]                   <-- members declaration
;           ...
;         EndClass(ClassName)
;------------------------------------------------------------------------
Macro ClassEx(ClassName, MotherClass)
  ; Declare the class interface extended from the mother class
  Interface ClassName#_ Extends MotherClass#_
EndMacro
Macro MethodsEx(ClassName, MotherClass) 
  EndInterface
  ;Declare the methods table structure extended from the mother class 
  Structure Mthds_#ClassName Extends Mthds_#MotherClass
EndMacro
Macro MembersEx(ClassName, MotherClass)  
  EndStructure
  ; Create the methods table
  ; and initialize first with the methods from the mother class
  Mthds_#ClassName.Mthds_#ClassName
  CopyMemory(@Mthds_#MotherClass, Mthds_#ClassName, SizeOf(Mthds_#MotherClass))
  ; Declare the members extended from the mother class
  Structure Mbrs_#ClassName#_ Extends Mbrs_#MotherClass#_
EndMacro


;///////////////////////////////////////////////////////
; OBJECT METHODS
;///////////////////////////////////////////////////////
; private macro
Macro MethodHeader(ClassName, Mthd)  ; Header of the Method
  Mthd#_#ClassName(*this.Mbrs_#ClassName 
EndMacro
;-------------------------------- Method --------------------------------
;
; Object method implementation.
;
; Syntax:
;         Method(ClassName, Mthd) [,<variable1 [= DefaultValue]>,...])
;           ...
;           [ProcedureReturn value]
;         EndMethod(ClassName, Mthd)
;------------------------------------------------------------------------

Macro DeclareMethod(ClassName, Mthd) 
  Declare MethodHeader(ClassName, Mthd)
EndMacro

Macro Method(ClassName, Mthd) 
    ProcedureDLL MethodHeader(ClassName, Mthd)
EndMacro
Macro EndMethod(ClassName, Mthd)
  EndProcedure
  ; Save the method adress into the methods table
  Mthds_#ClassName\Mthd=@Mthd#_#ClassName()
EndMacro

;///////////////////////////////////////////////////////
; OBJECT INITIALISATION
;///////////////////////////////////////////////////////
; private macros
Macro Declared_Init_Mbers_Arg(ClassName) ; for an easy service of the Init_Mbers argument declared
  *input.Mbrs_#ClassName =0, arg1.l=0, arg2.l=0, arg3.l=0, arg4.l=0, arg5.l=0
EndMacro
Macro Used_Init_Mbers_Arg()              ; for an easy service of the Init_Mbers argument used
  *input, arg1, arg2, arg3, arg4, arg5
EndMacro

;----------------------------- Init_Mbers -------------------------------
;
; Object members initialisation.
; Used by the New method
;
; Syntax:
;         Init_Mbers(ClassName)
;           ...
;         EndInit_Mbers
;------------------------------------------------------------------------
Macro Init_Mbers(ClassName)
  Method(ClassName, Init_Mbers), Declared_Init_Mbers_Arg(ClassName))
EndMacro
Macro EndInit_Mbers()
  EndProcedure
EndMacro

;---------------------------- Init_MbersEx ------------------------------
;
; Object members initialisation.
; Used by the New method when the object inherite from an other class.
;
; Syntax:
;         Init_MbersEx(ClassName, MotherClass)
;           ...
;         EndInit_Mbers
;------------------------------------------------------------------------
Macro Init_MbersEx(ClassName, MotherClass)
  Init_Mbers(ClassName)
  ;Call the object initialisation method of the mother class
  Init_Mbers_#MotherClass(*this, Used_Init_Mbers_Arg())
EndMacro

;///////////////////////////////////////////////////////
; OBJECT CONSTRUCTORS
;///////////////////////////////////////////////////////
; private macro
Macro New_body(ClassName)   ; Commun body of a New method
  Shared Mthds_#ClassName
  ;Allocate the memory required for the object members
  *this.Mbrs_#ClassName = AllocateMemory(SizeOf(Mbrs_#ClassName))
  ;Attach the methods table to the object
  *this\Methods=@Mthds_#ClassName
  ;The object is created than initialised (like this, aggregated/composite objects are available during init)
  ;Create the object
  *this\Instance= AllocateMemory(SizeOf(ClassName))
  *this\Instance\Md = *this
  ;Now init members 
  Init_Mbers_#ClassName(*this, Used_Init_Mbers_Arg())
EndMacro
Macro NewHeader(ClassName)  ; Header of the New method
  New_#ClassName(Declared_Init_Mbers_Arg(ClassName))
EndMacro

Macro FreeHeader(ClassName) ; Header of the Free method
  Free_#ClassName(*Instance.ClassName)
EndMacro

;-------------------------------- New -----------------------------------
;
; Object  constructor.
; Return the adress of the new instance.
;
; INPUT:
; Input data by referent.
;
; Syntax:
;         New(ClassName)
;           ...
;         EndNew
; Use:
;         *Object.ClassName = New_ClassName([*input])
;------------------------------------------------------------------------
Macro DeclareNew(ClassName) ; Used to declare a New method
  Declare NewHeader(ClassName)
EndMacro

Macro New(ClassName)
  DeclareMethod(ClassName, Init_Mbers), Declared_Init_Mbers_Arg(ClassName))
	Procedure.l NewHeader(ClassName)
	  New_body(ClassName)
	  ProcedureReturn *this\Instance  
	EndProcedure
	Init_Mbers(ClassName)
EndMacro
Macro EndNew
  EndInit_Mbers()
EndMacro

;-------------------------------- NewEx -----------------------------------
;
; Object  constructor.
; Return the adress of the new instance.
;
; INPUT:
; Input data by referent.
;
; Syntax:
;         NewEx(ClassName, MotherClass)
;           ...
;         EndNew
;
; Use: (idem than New() method above)
;
;         *Object.ClassName = New_ClassName([*input])
;------------------------------------------------------------------------
Macro NewEx(ClassName, MotherClass)
	DeclareMethod(ClassName, Init_Mbers), Declared_Init_Mbers_Arg(ClassName))
	Procedure.l NewHeader(ClassName)
	  New_body(ClassName)
	  ProcedureReturn *this\Instance  
	EndProcedure
	Init_MbersEx(ClassName, MotherClass)
EndMacro

;------------------------------- Free -----------------------------------
;
; Object destructor.
;
; INPUT:
; Require the object instance.
;
; !! Don't forget to free all aggregated/composite objects here !!
;
; Syntax:
;         Free(ClassName)
;           ...
;         EndFree
;
; Use:
;         Free_ClassName(*Object.ClassName)
;------------------------------------------------------------------------
Macro DeclareFree(ClassName); Used to declare a Free method
  Declare FreeHeader(ClassName)
EndMacro

Macro Free(ClassName)
Procedure FreeHeader(ClassName)
  If *Instance
EndMacro
Macro EndFree
  FreeMemory(*Instance\Md)
  FreeMemory(*Instance)
  EndIf
EndProcedure
EndMacro
A utiliser comme suit :

Code : Tout sélectionner

; Objet dérivé des macros OOP (par Drac)
XIncludeFile #LIBRARY_PATH + "\OOP.pb"

; ______________________________________________________________________________
;- Classe Application
; ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
Class(Application)
  ; Déclarations des méthodes
  Run() 
  
  ; Définition des méthodes
  Methods(Application)
    *Run
  
  ; Variables de classe
  Members(Application)
    config_file.s
    
EndClass(Application)

; _______________________________________
;- Méthode Run
; ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
Method(Application, Run))

  Debug "Méthode RUN"
  
EndMethod(Application, Run)


; _______________________________________
;- Constructeur
; ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
New(Application)
EndNew


; _______________________________________
;- Destructeur
; ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
Free(Application)
EndFree

Je l'ai utilisé pour écrire un framework MVC pour PureBasic.
Avatar de l’utilisateur
Dionyzos
Messages : 53
Inscription : jeu. 05/févr./2004 19:57

Re: Ecriture POO plus "standard" dans PureBasic

Message par Dionyzos »

Oui, j'avais déjà vu ce code. Et en effet il permet de se rapprocher de l'écriture habituelle objet, mais ca reste une astuce (un très jolie astuce, ne rien voir de péjoratif dans le terme, au contraire) pour faire de l'objet.
Alors que moi je parlais d'écriture Objet en natif dans le langage ; avec de vrais mots clés comme 'Class' & 'EndClass', 'new', 'public', 'private', ...

Maintenant, je n'oublie pas que PB a pour vocation de départ d'être un langage performant et simple à utiliser (donc plutôt procédural), et le transformer en langage objet risquerait justement de le rendre moins performant et simple.

Je pense qu'il doit rester un langage avant tout procédural, mais quitte à rajouter une couche objet, autant qu'elle soit simple à implémenter.

Par contre j'ai bien conscience que c'est plus facile à dire qu'à faire, et que c'est pas en un claquement de doigt que ca va arriver ;)
Cls
Messages : 620
Inscription : mer. 22/juin/2005 8:51
Localisation : Nantes

Re: Ecriture POO plus "standard" dans PureBasic

Message par Cls »

Je suis d'accord avec toi : une sur-couche objet apporterait un gros + au langage.

Il existe en effet quelques astuces, comme le code précédent, qui permettent de s'en rapprocher mais une intégration en natif serait l'idéal. Quand ce jour arrivera, je crois que PB retiendra l'attention de plus d'une entreprise. Pour l'heure, rêvons... ;)
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Ecriture POO plus "standard" dans PureBasic

Message par Backup »

ptete aussi que Purebasic est un langage procedurale !!

c'est ptete pour ça qu'il n'est pas objet ... :roll:

enfin s'que j'en dis .... :)

voyez Purebasic comme une surcouche de l'assembleur
et vous comprendrez beaucoup de chose

par exemple sur le fait qu'il ne propose pas des masses de fonctions evoluées entre autres...

purebasic est "bas niveau" par rapport a VB ;)

c'est a dire que si tu veux une fonction, ben a toi de la faire....
j'aurai aimé moi une collection enorme de fonctions bien simple a ecrire
et qui apporte tout un tas de facilité comme un basic quoi :)

petit a petit... on verra
G-Rom
Messages : 3641
Inscription : dim. 10/janv./2010 5:29

Re: Ecriture POO plus "standard" dans PureBasic

Message par G-Rom »

la poo est quand même pratique , rapide ( regarde ogre3d ) , d'ailleurs , si pb gérais la poo aussi bien que le c++ , je me casserais pas les coucougniette a faire de la poo->procédural :D

Enfin , la poo ne vera jamais le jour sous purebasic. à moins que Fred ne ponde un " Advanced-PureBasic" :D
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Ecriture POO plus "standard" dans PureBasic

Message par Backup »

si Pb passait en Poo , alors je n'y comprendrai plus rien !
deja que c'est pas simple ;)

mais alors en POo...pfuiiii

les classes, les methodes.... en plus ils changent le nom de truc que j'ai mis 20 piges a comprendre avec d'autres noms !! :lol:

bah , c'est pas pour moi :)
Avatar de l’utilisateur
TazNormand
Messages : 1297
Inscription : ven. 27/oct./2006 12:19
Localisation : Calvados (14)

Re: Ecriture POO plus "standard" dans PureBasic

Message par TazNormand »

Salut

Il en faut pour tout le monde

Si on veut développer en objet, faut se tourner vers d'autres langages, .net par exemple.

Il y a d'ailleurs un super outil gratuit pour faire du C# ou du VB .net gratuitement : SharpDevelop (google est ton ami)
Image
Image
Avatar de l’utilisateur
flaith
Messages : 1487
Inscription : jeu. 07/avr./2005 1:06
Localisation : Rennes
Contact :

Re: Ecriture POO plus "standard" dans PureBasic

Message par flaith »

il y a aussi un tuto ("Using OOP in Purebasic") sur le site de srod http://www.nxsoftware.com/
Avatar de l’utilisateur
Dionyzos
Messages : 53
Inscription : jeu. 05/févr./2004 19:57

Re: Ecriture POO plus "standard" dans PureBasic

Message par Dionyzos »

Alors attention, je recentre un peu le débat 8)
pouf, pouf !

Si j'ai commencé à parler d'une méthode d'écriture "objet" native sous PureBasic, c'est parce que j'ai vu que dans les dernières versions il était possible de faire du pseudo-objet.
Et je voulais simplement dire que, quitte à ajouter une couche objet à PB, autant le faire jusqu'au bout et surtout de manière simple.
Sinon, en effet, laissons l'objet aux langages fait pour (Java, C++, C#,...)

Maintenant il s'agit que d'une couche ajoutée et non d'une refonte complète du langage, donc rien n'empêche ceux qui n'aiment pas l'objet de continuer à coder en full procédurale :)

Pour conclure, je n'aurais pas lancé cette suggestion si PB n'avait pas commencé à toucher du doigt le monde de la POO.

Voili :)
cha0s
Messages : 681
Inscription : sam. 05/mars/2005 16:09

Re: Ecriture POO plus "standard" dans PureBasic

Message par cha0s »

G-Rom a écrit :Enfin , la poo ne vera jamais le jour sous purebasic. à moins que Fred ne ponde un " Advanced-PureBasic" :D
PureBasic++ :p


@TazNormand : il y a aussi JAVA qui tourne sur beauuucoup d'OS
@ Dionyzos : j'ai commencé un pré-compilateur (que je ne finirait surement jamais) pour avoir une syntaxe POO like, si sa t'intéresse les sources sont sur google code http://www.purebasic.fr/french/viewtopi ... it=Chronos
Avatar de l’utilisateur
Dionyzos
Messages : 53
Inscription : jeu. 05/févr./2004 19:57

Re: Ecriture POO plus "standard" dans PureBasic

Message par Dionyzos »

@cha0s : Sauf erreur de ma part, mais tes liens semblent morts :(
cha0s
Messages : 681
Inscription : sam. 05/mars/2005 16:09

Re: Ecriture POO plus "standard" dans PureBasic

Message par cha0s »

Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Ecriture POO plus "standard" dans PureBasic

Message par Backup »

Dionyzos a écrit : Pour conclure, je n'aurais pas lancé cette suggestion si PB n'avait pas commencé à toucher du doigt le monde de la POO.

Voili :)
pardon , mais en quoi Purebasic est meme de loin POO ? 8O :)
Cls
Messages : 620
Inscription : mer. 22/juin/2005 8:51
Localisation : Nantes

Re: Ecriture POO plus "standard" dans PureBasic

Message par Cls »

Juste pour répondre à Dobro :

PB est un langage procédural, ok mais il n'a d'ailleurs jamais été question du contraire !

Reste qu'une sur-couche POO en parallèle du procédural (et plutôt de l'évènementiel) serait un énorme point positif. De nos jours, beaucoup d'entreprises et notamment de SSII développent en orienté objet. Si PB intégrait cette sur-couche, je suis persuadé que ce serait un tremplin pour notre langage préféré (mais c'est un autre débat).

Cela étant, il existe des astuces dont on a parlé qui permettent de s'en rapprocher un peu... Mais en natif ce serait top ! :D

Et pour répondre à ça :
pardon , mais en quoi Purebasic est meme de loin POO ?
Ben j'vois pas non plus ! :lol:
Répondre