Information Hiding ( Private / Public ) mit OO

Übersicht BlitzMax, BlitzMax NG FAQs und Tutorials

Neue Antwort erstellen

 

Dreamora

Betreff: Information Hiding ( Private / Public ) mit OO

BeitragFr, Jan 07, 2005 18:45
Antworten mit Zitat
Benutzer-Profile anzeigen
In Modulen ist es häufig der Fall, dass man Nutzer des Modules gewisse Dinge nicht sehen lassen will. Sei es weil er dadurch Rückschlüsse auf den Code ziehen könnte oder weil er dadurch auf Dinge zugreifen könnte, die im Extremfall das Module nicht mehr so funktionieren lassen wie es soll.

Deswegen gibts in Blitz Max den Mechanismus des Information Hidings, das heisst: Man versteckt beim compilieren des Modules Informationen, die späteren Nutzern, welche den Sourcecode nicht haben, vorenthalten bleiben soll.

Dazu bieten sich in Blitz Max die Keywords public und private an.

public ist dabei der Standard. Prinzipiell wird alles was wir an Types, const, global und Funktionen in ein Modul packen von aussen sichtbar sein. Wollen wir dies verhindern, so wird

private benötigt. Alles was private folgt und nicht durch ein public wieder geändert wird, ist ausserhalb nicht sichtbar und kann ausserhalb auch nicht verwendet werden.

Für Funktionen, globals und const stellt dabei private kein problem dar, da wir einfach in public funktionen schreiben können, die darauf zugreifen.

Trickreich wirds jedoch, wenn wir die implementationen von Types verschwinden lassen wollen.
Deshalb habe ( durch unbewusste Ideen anderer unterstützt ) unzählige Stunden damit verbracht, dahinter zu kommen, wie dieser Mechanismus in Blitz Max funktioniert, denn er wird dringend benötigt.

Den Aufbau eines Sources mit Information Hiding seht ihr nachfolgend:


Modulsource:

Code: [AUSKLAPPEN]


Strict

Module datastructure.stack


Private

' Stack Implementation

Type TStack_Element
   Field _element:Object
   Field _connected:TStack_Element
   
   Function create:TStack_Element( _elem:Object )
      ' create a TStack_Element
      
      Local temp:TStack_Element   = New TStack_Element
      
      temp._element            = _elem
      Return temp
      
   End Function
   
   Method Delete()
      _element    = Null
      _connected    = Null
   End Method
End Type

Type TStack_Imp Extends TStack
'   Implementation of stack
   Field _top:TStack_Element
   Field _count:Int
   
   Function create:TStack_Imp()
      Local temp:TStack_Imp   = New TStack_Imp
      Return temp
   End Function
   
   Method push( _elem:Object )
      Local temp:TStack_Element
         
      temp         = TStack_Element.create( _elem )   
      temp._connected   = _top
      _top         = temp
      _count          :+ 1

   End Method
   
   Method pop:Object ()
      Local ret:Object
      
      If _count > 0
         _count         :- 1
         ret            =    _top._element
         _top         =   _top._connected
      EndIf
      Return ret
   End Method
   
   Method top:Object ()
      Return _top._element
   End Method
   
   Method count:Int ()
      Return _count
   End Method
   
   Method clear()
   
      While count() > 0
         pop()
      Wend
      
   End Method
End Type


Public
' Module Export


Type TStack

   Function create:TStack()
      Local temp:TStack = TStack_Imp.create()
      Return TStack( temp )
   End Function

   Method push( _elem:Object ) Abstract
   
   Method pop:Object () Abstract
   
   Method top:Object () Abstract
   
   Method count:Int () Abstract
   
   Method clear() Abstract

End Type



Testsamplesource:

Code: [AUSKLAPPEN]

Strict

Local stack:TStack   = TStack.create()
Local i:Int

For i = 1 To 2000
   stack.push( String("Test "+i) )
Next

Print "Elemente im Stack: " + stack.count()
Print "Erstes Element: " + String( stack.pop() )

flushmem
Print "Benötigter Speicher: " + MemAlloced()

stack.clear
FlushMem
Print "Benötigter Speicher: " + MemAlloced()
Print "Anzahl Elemente: " + stack.count()

Delay 10000
End
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG FAQs und Tutorials

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group