Page 1 sur 1

[Utilitaire] Getters & Setters

Publié : dim. 19/août/2018 23:24
par microdevweb
Bonjour à tous,

Personnellement avec un module et une structure je préfère encapsulé mes données et passé par des getters et des setters plutôt que de donner accès directement à la structure.

L'avantage est que si les données sont lue ou écrite à divers endroit du programme et que l'on doivent modifié les données lues ou reçues (exemple éviter une division par zéro) ou ne devra agir que sur le getter ou setter concerné sans rien modifié d'autre.

Cette tache peut être fastidieuse, j'ai donc à l'aide de l'excellent tutoriel de falsam conçu un petit utilitaire pour faire cette tache qui copie le code dans le presse papier.

Image

Je préfère vous poster le code car de cette manière vous pourrez le modifié à votre sauce.

Remarque : Windows only car l'api SendMessage_ est utilisée

Code : Tout sélectionner

#Font = 0
#MAIN_FORM = 0
Enumeration 
  #withName
  #LST 
  #BT_VALIDE
  #BT_CANCEL
EndEnumeration
Structure item
  name.s
  type.s
EndStructure
Global NewList myItem.item(),withName.s
Procedure Exit()
  End
EndProcedure

Procedure Parse()
  Protected selected.s = RemoveString(GetClipboardText(),Chr(13))
  
  ; count number of lines
  Protected nl = CountString(selected,Chr(10))
  Protected i,lng.s
  For i = 1 To nl + 1
    lng = StringField(selected,i,Chr(10))
    AddElement(myItem())
    With myItem()
      \name = Trim(StringField(lng,1,"."))
      \type = LCase(Trim(StringField(lng,2,".")))
    EndWith
  Next
EndProcedure

Procedure valide()
  Protected code.s
  withName = GetGadgetText(#withName)
  If Not Len(withName)
    MessageRequester("Getters & Setters","Please set name of with",#PB_MessageRequester_Info)
    ProcedureReturn 
  EndIf
  With myItem()
    ForEach myItem()
      code + "Procedure."+\type+" get_"+\name+"()"+Chr(10)
      code +"  ProcedureReturn "
      If Len(withName)
        code + withName+"\"
      EndIf
      code + \name +Chr(10)
      code + "EndProcedure"+Chr(10)+Chr(10)
      code + "Procedure set_"+\name+"("+\name+"."+\type+")"+Chr(10)
      If Len(withName)
        code + withName+"\"
      EndIf   
      code +" " + \name+" = "+\name + Chr(10)
      code + "EndProcedure"+Chr(10)+Chr(10)
    Next
    SetClipboardText(code)
    MessageRequester("Getters & Setters","Your code has ban copied into the clipboard",#PB_MessageRequester_Info)
    Exit()
  EndWith
EndProcedure

Procedure fillLst()
  ClearGadgetItems(#LST)
  ForEach myItem()
    AddGadgetItem(#LST,-1,myItem()\name)
  Next
EndProcedure

Procedure Run()
  ;Load scintilla component
  Protected HandleIDESci=Val(GetEnvironmentVariable("PB_TOOL_Scintilla"))  
  Protected y = 10
  If HandleIDESci
    ;copy to memory the user selected
    SendMessage_(HandleIDESci, #WM_COPY,0,0)   
  Else
    MessageRequester("Warning", "Please run this software only from Purebasic ide",#PB_MessageRequester_Warning)
    Exit()
  EndIf
  ; Make window
  LoadFont(#Font, "", 10)
  
  SetGadgetFont(#PB_Default, FontID(#Font))
  
  OpenWindow(#MAIN_FORM, 0, 0, 200, 320, "Gadget Editor", #PB_Window_SystemMenu | #PB_Window_ScreenCentered | #PB_Window_Tool)
  StickyWindow(#MAIN_FORM, #True)
  
  TextGadget(#PB_Any,10,y,180,30,"Name of with")
  y + 40
  StringGadget(#withName,10,y,180,30,"")
  y + 40
  ListViewGadget(#LST,10,y,180,180)
  y + 190
  ButtonGadget(#BT_CANCEL,10,y,70,30,"Cancel")
  ButtonGadget(#BT_VALIDE,120,y,70,30,"Ok")
  Parse()
  fillLst()
  SetActiveGadget(#withName)
  
  BindEvent(#PB_Event_CloseWindow,@Exit(),#MAIN_FORM)
  BindGadgetEvent(#BT_CANCEL,@Exit())
  BindGadgetEvent(#BT_VALIDE,@valide())
  
  Repeat : WaitWindowEvent() : ForEver
EndProcedure

Run()
copié coller du tuto de falsam :mrgreen:

■ Installation.
- Compiler le code ci-dessus
- Allez dans le menu Outils de votre IDE et sélectionner l'item Outils Personnalisés
- Cliquez sur le bouton Nouveau
- Sélectionner l’exécutable de votre utilitaire (GadgetEditor.exe) dans le champ de saisie Ligne de commande.
- Cocher la case Attendre la fin du programme.
- Donner un nom à votre application dans le champ Nom.
- Cliquer sur le champ Raccourci puis presser simultanément la combinaison de touches Ctrl + Entree
- Pour finir cliquer sur Ok

Re: [Utilitaire] Getters & Setters

Publié : lun. 20/août/2018 8:13
par Kwai chang caine
POOMan a écrit :Personnellement avec un module et une structure je préfère encapsulé mes données et passé par des getters et des setters
Et ça donne un POOtit peu plus de gout au code :wink: :lol:
En tout cas merci du partage 8)