Page 1 sur 2
Ecriture POO plus "standard" dans PureBasic
Publié : mar. 20/avr./2010 10:06
par Dionyzos
Bonjour,
Tout d'abord, j'espère que je ne vais pas déclencher un troll avec ce sujet
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 ?
Re: Ecriture POO plus "standard" dans PureBasic
Publié : mar. 20/avr./2010 10:30
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.
Re: Ecriture POO plus "standard" dans PureBasic
Publié : mar. 20/avr./2010 13:19
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

Re: Ecriture POO plus "standard" dans PureBasic
Publié : mar. 20/avr./2010 15:04
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...

Re: Ecriture POO plus "standard" dans PureBasic
Publié : mar. 20/avr./2010 17:34
par Backup
ptete aussi que Purebasic est un langage procedurale !!
c'est ptete pour ça qu'il n'est pas objet ...
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
Re: Ecriture POO plus "standard" dans PureBasic
Publié : mar. 20/avr./2010 18:47
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
Enfin , la poo ne vera jamais le jour sous purebasic. à moins que Fred ne ponde un " Advanced-PureBasic"

Re: Ecriture POO plus "standard" dans PureBasic
Publié : mar. 20/avr./2010 19:02
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 !!
bah , c'est pas pour moi

Re: Ecriture POO plus "standard" dans PureBasic
Publié : mar. 20/avr./2010 19:13
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)
Re: Ecriture POO plus "standard" dans PureBasic
Publié : mar. 20/avr./2010 20:25
par flaith
il y a aussi un tuto ("Using OOP in Purebasic") sur le site de srod
http://www.nxsoftware.com/
Re: Ecriture POO plus "standard" dans PureBasic
Publié : mar. 20/avr./2010 20:51
par Dionyzos
Alors attention, je recentre un peu le débat
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

Re: Ecriture POO plus "standard" dans PureBasic
Publié : mar. 20/avr./2010 20:54
par cha0s
G-Rom a écrit :Enfin , la poo ne vera jamais le jour sous purebasic. à moins que Fred ne ponde un " Advanced-PureBasic"

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
Re: Ecriture POO plus "standard" dans PureBasic
Publié : mar. 20/avr./2010 21:16
par Dionyzos
@
cha0s : Sauf erreur de ma part, mais tes liens semblent morts

Re: Ecriture POO plus "standard" dans PureBasic
Publié : mar. 20/avr./2010 21:17
par cha0s
Re: Ecriture POO plus "standard" dans PureBasic
Publié : mar. 20/avr./2010 21:25
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 ?

Re: Ecriture POO plus "standard" dans PureBasic
Publié : mar. 20/avr./2010 21:53
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 !
Et pour répondre à ça :
pardon , mais en quoi Purebasic est meme de loin POO ?
Ben j'vois pas non plus !
