Poo class abstraite

Sujets variés concernant le développement en PureBasic
Avatar de l’utilisateur
microdevweb
Messages : 1798
Inscription : mer. 29/juin/2011 14:11
Localisation : Belgique

Poo class abstraite

Message par microdevweb »

Un des gros avantage de la poo est l'utilisation de classes abstraites. Ce type de classe n'a pas de raison d'être sans héritage mais cela aide grandement l'ajout ou mise à jour de fonctionnalités.

Image

Voici une petit code d'un logiciel de dessin simplifié démontrant l'utilisation d'une classe abstraite en Pb.

Ce code est développé en 3 couches "MVC" model; view; controller

:arrow: DOWLOAD

voici par exemple le code de la classs abstraite

Code : Tout sélectionner

; ****************************************************************************************************
; PROJECT       : TUTO_POO
; PACKAGE       : TUTO_POO.model
; DESIGNED WITH : PB 5.60
; NAME          : Form ABSTRACT CLASS
; VERSION       : 1
; DATE          :
; AUTHOR        : microdevWeb
; DESCRIPTION   :
; *****************************************************************************************************
DeclareModule Form
  Structure _struct
    *methods
    x.l
    y.l
    selected.b
  EndStructure
  Enumeration 
    #RECTANGLE
    #CIRCLE
  EndEnumeration
  Declare super(x,y,*this._struct,*methods)
EndDeclareModule

Module Form
  ;-* GETTERS
  Procedure getPosX (*this._struct)
    With *this
      ProcedureReturn \x
    EndWith
  EndProcedure
  
  Procedure getPosY (*this._struct)
    With *this
      ProcedureReturn \Y
    EndWith
  EndProcedure
  
  Procedure isSelected (*this._struct)
    With *this
      ProcedureReturn \selected
    EndWith
  EndProcedure
  ;}
  ;-* SETTERS
  Procedure setPosX (*this._struct,posX)
    With *this
      \x = posX
      ProcedureReturn #True
    EndWith
  EndProcedure
  
  Procedure setPosY (*this._struct,posY)
    With *this
      \y = posY
      ProcedureReturn #True
    EndWith
  EndProcedure
  
  Procedure setSelected (*this._struct,state.b)
      With *this
        \selected = state
        ProcedureReturn #True
      EndWith
    EndProcedure
  ;}
  ;-* PRIVATE METHODS
  
  ;}
  ;-* PUBLIC METHODS
  
  ;}
  ;-* CONSTRUCTOR DON'T INSTANCIATE
  Procedure super(x,y,*this._struct,*methods)
    With *this
      Protected nbOctets
      If Not setPosX(*this,x):ProcedureReturn #False : EndIf
      If Not setPosY(*this,y):ProcedureReturn #False : EndIf
      CompilerIf #PB_Compiler_Processor= #PB_Processor_x86
        nbOctets = 4
      CompilerElse
        nbOctets = 8
      CompilerEndIf
      ;we take the maximum of methods
      \methods = AllocateMemory(nbOctets * 12)
      ;we take the number of abstract methods
      MoveMemory(*methods,\methods,nbOctets * 4)
      ;we take the result of max methods - number of abstract methods
      MoveMemory(?METHODS,\methods + nbOctets * 4,nbOctets * 8)
      ProcedureReturn *this
    EndWith
  EndProcedure
  ;}
  DataSection
    METHODS:
    Data.i @getPosX()
    Data.i @getPosY()
    Data.i @isSelected()
    Data.i @setPosX()
    Data.i @setPosY()
    Data.i @setSelected()
  EndDataSection
EndModule
Et le code d'une classe enfant

Code : Tout sélectionner

; ****************************************************************************************************
; PROJECT       : TUTO_POO
; PACKAGE       : TUTO_POO.model
; DESIGNED WITH : PB 5.60
; NAME          : Rectangle
; VERSION       : 1
; DATE          :
; AUTHOR        : microdevWeb
; DESCRIPTION   :
; *****************************************************************************************************
DeclareModule Rectangle
  Structure _struct Extends Form::_struct
    width.l
    height.l
  EndStructure
  Declare new(x,y,width,height)
EndDeclareModule

Module Rectangle
  ;-* GETTERS
  Procedure getRectangleWidth (*this._struct)
    With *this
      ProcedureReturn \width
    EndWith
  EndProcedure
  
  Procedure getRectangleHeight (*this._struct)
    With *this
      ProcedureReturn \height
    EndWith
  EndProcedure
  ;}
  ;-* SETTERS
  Procedure setRectangeWidth (*this._struct,width)
    With *this
      \width = width
      ProcedureReturn #True
    EndWith
  EndProcedure
  
  Procedure setRectangleHeight (*this._struct,height)
    With *this
      \height = height
      ProcedureReturn #True
    EndWith
  EndProcedure
  
  ;}
  ;-* PRIVATE METHODS
  
  ;}
  ;-* ABSTRACT METHODS
    Procedure draw (*this._struct)
      With *this
        ; we take red color for differentiating the rectangles
        If \selected
          VectorSourceColor($FF0000FF)
        Else
          VectorSourceColor($FF8CB4D2)
        EndIf
        AddPathBox(\x,\y,\width,\height)
        FillPath()
      EndWith
    EndProcedure
    
    Procedure mouseIsOnMe (*this._struct,x,y)
      With *this
        If (x > = \x And x <= (\x + \width)) And (y > = \y And y <= (\y + \height))
          ProcedureReturn *this
        EndIf
        ProcedureReturn #False
      EndWith
    EndProcedure
    
    Procedure whoIam (*this._struct)
      With *this
        ProcedureReturn Form::#CIRCLE
      EndWith
    EndProcedure
    
  ;}
  ;-* PUBLIC METHODS
  
  ;}
  ;-* DESTRUCTOR is considered as a abstract method
  Procedure free(*this._struct)
    With *this
      ClearStructure(*this,_struct)
    EndWith
  EndProcedure
  ;}
  ;-* CONSTRUCTOR
  Procedure new(x,y,width,height)
    Protected *this._struct = AllocateStructure(_struct)
    With *this
      If Not Form::super(x,y,*this,?METHODS) : ProcedureReturn #False : EndIf
      If Not setRectangeWidth(*this,width) : ProcedureReturn #False : EndIf
      If Not setRectangleHeight(*this,height) : ProcedureReturn #False : EndIf
      ProcedureReturn *this
    EndWith
  EndProcedure
  ;}
  DataSection
    ; It's very important: placed on the  first places the abstract methods
    METHODS:
    ; ABSTRACT METHODS
    Data.i @draw()
    Data.i @mouseIsOnMe()
    Data.i @whoIam()
    Data.i @free()
    ; CLASSICAL METHODS
    Data.i @getRectangleWidth()
    Data.i @getRectangleHeight()
    Data.i @setRectangeWidth()
    Data.i @setRectangleHeight()
  EndDataSection
EndModule
Windows 10 64 bits PB: 5.70 ; 5.72 LST
Work at Centre Spatial de Liège
Avatar de l’utilisateur
Micoute
Messages : 2522
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: Poo class abstraite

Message par Micoute »

Une fois de plus je dis bravo microdevweb et merci pour le partage, car je suis fan.
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 5.73 PB 6.00 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Avatar de l’utilisateur
Kwai chang caine
Messages : 6962
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: Poo class abstraite

Message par Kwai chang caine »

Alors moi aussi 8O
J'y comprends toujours absolument rien, qu'est ce tu veux ? on fait pas d'un âne un cheval de course et la POO c'est comme SEGA...c'est plus fort que moi :oops: , mais je suis super FAN du sujet.
Encore merci de partager et d'avoir le courage de continuer à essayer de nous instruire 8)
Marche niquel avec W10 X64 (v5.61 X86)
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Avatar de l’utilisateur
microdevweb
Messages : 1798
Inscription : mer. 29/juin/2011 14:11
Localisation : Belgique

Re: Poo class abstraite

Message par microdevweb »

Je sais que cela parait beaucoup de travail, mais je travail sur mon Class maker version 2, et en suivant l’excellent tuto de falsam il permettra d'inclure directement le code dans l'ide.
Windows 10 64 bits PB: 5.70 ; 5.72 LST
Work at Centre Spatial de Liège
Avatar de l’utilisateur
Kwai chang caine
Messages : 6962
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: Poo class abstraite

Message par Kwai chang caine »

Je sais que cela parait beaucoup de travail
C'est un doux euphémisme :mrgreen:
Surtout pour un profane comme moi, ça me parait même insurmontable (comme en vieillissant, beaucoup trop de choses d'ailleurs) :oops:
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Avatar de l’utilisateur
JohnJohnsonSHERMAN
Messages : 648
Inscription : dim. 13/déc./2015 11:05
Localisation : Allez, cherche...
Contact :

Re: Poo class abstraite

Message par JohnJohnsonSHERMAN »

Trés intéressant !
Maintenant que je code surtout en C++, je comprends enfin le fonctionnement de la POO, et ses possibilités géniales :) Alors voir que tout cela peut s'adapter en PB, c'est exellent ! Merci :)
"Le bug se situe entre la chaise et le clavier"
Votre expert national en bogage et segfaults.

CPU : AMD A8 Quad core - RAM 8Gb - HDD 2To
  • Windows 10 x64 - PB 5.61 x64
  • Linux Ubuntu 16.04 LTS x64 (dual boot) - PB pas encore réinstallé
Avatar de l’utilisateur
Kwai chang caine
Messages : 6962
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: Poo class abstraite

Message par Kwai chang caine »

. Maintenant que je code surtout en C++
T'as de la chance :| et aussi surement des neurones montés pour 8)
Depuis 10 ans que je cherche à trouver une bonne raison pour me labourer la tronche, hors mis le fait de me la peter en reunion en répondant "en c/c++" à la maudite question :"Vous êtes développeur...quel langage utilisez vous ?"
Je croyais avoir reuni la chèvre et le choux en étant obligé d'utiliser un langage POO pour sélénium, ou autres navigateurs headless :idea:
Mais même là j'ai débandé....parce que le c++ est has been en poo...les développeurs de nouvelles librairies en ont plus que pour Python, Rubi, Php, C#,... :|
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Avatar de l’utilisateur
microdevweb
Messages : 1798
Inscription : mer. 29/juin/2011 14:11
Localisation : Belgique

Re: Poo class abstraite

Message par microdevweb »

@Kwai chang caine,

Encore une fois de plus, la Poo est un autre concept d'analyse et pas beaucoup plus difficile que le procédural. Elle demande seulement plus de rigueur, mais une fois mise en place est plus facile à coder que de jouer avec des centaines de procédures ou l'on fini par ce perdre. Ici chaque class à sa fonction et doit être autant que possible indépendante des autres. Dans le projet démontré ici, il n'y à rien de plus simple que d'ajouté une nouvelle forme, il suffit juste d'ajouté une class (par exemple ligne) qui hérite de forme et d'ajouter cette fonction au menu.

Note voici l'analyse uml du projet, l'ajouter au post :roll:

Image

Remarque : il serais en vérité assez simple de transformer pb, avec une vrai syntaxe Poo. Il suffirais de lancer un logiciel de conversion à la précompilation qui au final donnerais le code si dessus. Par contre l’auto complétion de l'ide ne fonctionnerais pas avec cette syntaxe.

Moi ce que j'aime dans Pb, ce n'est pas tellement la syntaxe parceque

Code : Tout sélectionner

if a=b
    makeThis()
EndIf

; ou

if(a == b){
   makeThis();
}
l'une ou l'autre ne me gène pas, ce que j'aime surtout c'est son compilateur qui donne un exe performant et de petite taille.
Windows 10 64 bits PB: 5.70 ; 5.72 LST
Work at Centre Spatial de Liège
Avatar de l’utilisateur
Kwai chang caine
Messages : 6962
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: Poo class abstraite

Message par Kwai chang caine »

pas beaucoup plus difficile que le procédural
Tu dis ça parce que tu as compris, que peut être aussi que tu l'apprécies.
Dans le procédural, en fin de compte une fois que t'as compris que la procedure est un cube ou y'a des instructions dedans et qui devient à son tour une instruction, que cette boite doit être typée.....bas t'as tout compris
Apres bien sur, y'a des instructions plus compliquées, mais pas vraiment ou peu obligatoires....comme les prototrucs, les interfaces, les callback, les threads...

Mais dans la POO, j'entends des gros mots qui paraissent importants, sinon on ne fait pas vraiment de la POO, mais de la pseudo....
Et quand je crois tous les connaitre...j'en entends encore un autre 8O :?

Et pourtant, je me souviens encore avoir acheté mon premier livre quant est sorti le .NET, je m'étais dit cool, ils ont du virer les défauts de VB6 :D
Mais quand j'ai commencé à essayer de comprendre, je lisais le livre dans le rayon mayonnaise de Auchan vautré sur le caddie que je poussais, et avec ma femme (pas de perte de temps pour ces trucs "inutiles" :mrgreen:)
Donc, quand j'ai lu pour la première fois, la sacro sainte métaphore de la voiture, sa couleur, sa marque, ...que ceux qui ont compris me rabâchent depuis des années, et essaient désespérément de me faire comprendre :oops:, et bien, j'ai pas trouvé ça trop con....au premier regard.
C'est après que le mariage entre la POO et moi s'est vite consumé :| quand on a commencer à parler de pleins de nouveaux mots ou chaque fois, j'avais envie de rentrer chez mémé ou il y faisait chaud la simplicité :cry:
Il suffirais de lancer un logiciel de conversion à la précompilation qui au final donnerais le code si dessus.
En fait, je me suis aperçu au fil du temps que beaucoup de langages font ça, regarde :
- PB il transforme le PB en ASM
- SB le PB en JS
Je ne m'y connais pas assez en langages, mais en analysant bien, pas mal d'eux ne sont "que" des traducteurs...car au final, ils traduisent tous en langage machine pour ce qui est des EXE

D'ailleurs j'avais lu que l'ASM avait été inventé pour traduire le langage machine qui était humainement inbuvable
Puis que le C avait été inventé pour traduire et simplifier l'ASM qui était devenu à son tour imbuvable...etc

C'est un peu comme les "poiscailles" :lol:

Image
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Avatar de l’utilisateur
microdevweb
Messages : 1798
Inscription : mer. 29/juin/2011 14:11
Localisation : Belgique

Re: Poo class abstraite

Message par microdevweb »

@Kwai chang caine,

La Poo c'est une question de choix, et c'est le mien raison pour-la-quel je code de moins en moins en pb.
Windows 10 64 bits PB: 5.70 ; 5.72 LST
Work at Centre Spatial de Liège
Avatar de l’utilisateur
JohnJohnsonSHERMAN
Messages : 648
Inscription : dim. 13/déc./2015 11:05
Localisation : Allez, cherche...
Contact :

Re: Poo class abstraite

Message par JohnJohnsonSHERMAN »

@microdevweb : Pareil pour moi ;) Je trouve la POO trés pratique. Et malheureusement avec mes études j'ai de moins en moins d'occasions de coder en PB. N'empêche de temps à autre ca fait du bien :lol:
"Le bug se situe entre la chaise et le clavier"
Votre expert national en bogage et segfaults.

CPU : AMD A8 Quad core - RAM 8Gb - HDD 2To
  • Windows 10 x64 - PB 5.61 x64
  • Linux Ubuntu 16.04 LTS x64 (dual boot) - PB pas encore réinstallé
Avatar de l’utilisateur
Kwai chang caine
Messages : 6962
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: Poo class abstraite

Message par Kwai chang caine »

La Poo c'est une question de choix
Bah non malheureusement :|
Car maintenant la plupart des lib récentes sont maintenant en POO, donc pas pilotable par PB :?
Depuis de nombreuses années j'essaie de trouver un truc qui marche pour créer un robot WEB, je compte même plus les méthodes fondamentalement différentes que j'ai utilisées.
Et quoi que je fasse, je reviens sur des lib POO, Selenium et autres
Mais c'est pas la première fois que quinquin fait une super lib dans d'autres domaines et que je peux me la mettre sur l'oreille avec PB :|
C'est pourquoi, la mort dans l'ame, je me suis dit qu'il serait temps d'essayer de regarder C++ pour piloter ces fameuses libs, mais lorsque j'ai vu que même C++ n'est plus utilisé 8O au profit de PYHON, RUBY (Pouark, non seulement POO, mais script...tout ce que j'aime :? ) j'ai éteind l'ordinateur, j'ai poussé le clavier au fond, la souris sur la droite, j'ai croisé les bras, posé ma grosse tête entre ces deux derniers....et j'ai pleuré seul au monde dans mon bureau :cry: :mrgreen:
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Patrick88
Messages : 1564
Inscription : mer. 21/janv./2004 18:24

Re: Poo class abstraite

Message par Patrick88 »

bah... j'ai re découvert le bbc basic, pas celui qui tournait sur les bécanes Acorn Arm d'il y a 10-15ans, ni sur les raspberry pi d'aujourd'hui, mais celui pour windows.

entièrement procédural, il se paye le luxe d'avoir une lib pour accéder à "com automation" (COMate chez pb) sans pseudo objet ou objet tout court.
juste des appels aux api et ça marche. en démo un truc pour faire "parler" Windows, ou pour écrire dans excel ou word ou....

xojo(ex real-basic) ou b4j le font aussi mais à grand renfort de "class" ou que sais-je...

la poo c'est juste une façon de programmer, celle d’aujourd’hui, qui sait demain...
et moi je suis rester bloqué à hier, alors ta poo ;)
ce qui ne m'émpèche nullement d'aller voir du coté du c#, vb.net, javascript... c++ mais beurk finalement.

Pat
Avatar de l’utilisateur
microdevweb
Messages : 1798
Inscription : mer. 29/juin/2011 14:11
Localisation : Belgique

Re: Poo class abstraite

Message par microdevweb »

@Kwai chang caine,

Robot Web ? Je ne voie pas ce que tu veux dire?
Windows 10 64 bits PB: 5.70 ; 5.72 LST
Work at Centre Spatial de Liège
Avatar de l’utilisateur
Kwai chang caine
Messages : 6962
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: Poo class abstraite

Message par Kwai chang caine »

Ce sont des programmes qui se chargent d'automatiser les opérations redondantes sur le WEB
Ce sont ce genre de programmes qui gonflent tous les créateurs et administrateurs de sites, car ce sont des "moulinettes" qui scan des milliers de sites, s'inscrivent sur un forum par exemple et récupèrent des données, quant ils les bombardent pas de pub à la con que les admins se font un plaisir d’effacer quotidiennement :D
On les appellent les robots, ou BOT quant on est intime avec eux :mrgreen:

Mais par ailleurs, ce ne sont pas leur fonction principale, mal utilisés ils paraissent nocifs, mais une de leur principale fonction dans le monde professionnel, est :

De tester des sites à longueur de journée, ceux qui sont en place, mais aussi eux qui sont en cours de prog, tester tous les liens, vérifier qu'il sont pas down, tester les requêtes, etc...

Mais aussi récupérer les données sur un site, pour les gérer par la suite par un autre programme, en fin de compte une extraction lorsque le site n'a pas l'option.

Ou aussi faire des statistiques d'un site, comparer les prix (Tres utilisé par les sites de vente pour comparer H24 les prix de la concurence, et ajuster leurs prix à leur tour, ils l'on même avoué à la télé 8O)

Et aussi, la gestion complete de centaines, voir milliers de données sur des sites dont nous n'avons pas la main, creation de comptes, d'annonces, etc...

Pour ce faire, il faut que l'on puisse tout faire ce qu'un humain peut faire sur un site.
Remplir les champs, cliquer les liens, valider les pages, etc...

Et moi c'est plusieurs de ces options que je cherche à faire correctement depuis une dizaine d'années, pour mon entreprise et aussi pour moi-même
A mes débuts, il n'y avait presque pas de librairies, mais comme le web est désormais de partout, les besoins de faire ce que je t'ai cité ce sont fait de plus en plus sentir, d'où la création de librairies comme
SELENIUM, MECHANIZE, SCRAPPY, ROBOT FRAMEWORK, et des dizaines d'autres..comme quoi j'suis pas le seul :lol:
Mais aussi des navigateurs headless (Sans interface) comme PHANTOMJS, etc ...
https://fr.wikipedia.org/wiki/Navigateur_sans_t%C3%AAte
permettant ce genre de manipulations pour peu que l'on ne soit pas une burne comme moi :mrgreen:

Comme l'a dit Patriiiiiiiiiick (désolé, :mrgreen: j'peut pas me retenir :oops: ) au début l'OLE (Object link embeded) était une des méthodes les plus utilisée en pilotant le "fameux" IE par le protocole COM (Component object model) de crocro..
Ca marchait pas trop mal...mais depuis que IE est une daube...et ben on peut plus bien l'utiliser

Apres y'a eu aussi les automates REPL (Read–eval–print loop) insérés dans les add-ons de FF ou Chrome...mais bon..ça marche quand c'est la mode.
Actuellement j'utilise justement un REPL pour faire mon travail répétitif, faute de mieux.
Mais y'a encore d'autres méthodes..en fait y'en a tellement, qu'on abandonne à force de lire, d'essayer, et de débander :lol:

Une certaine quantité sont en JAVA et je déteste danser :?
Et plein d'autres sont aussi faciles à utiliser qu'un meuble confo à monter sans documentation
Et presque toutes sont faites en POO, donc inutilisables en PB

Enfin bref.....ça commence vraiment à me les broyer menu menu :|
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Répondre