Datenkapselung

Design Patterns, Erklärungen zu Algorithmen, Optimierung, Softwarearchitektur
Forumsregeln
Wenn das Problem mit einer Programmiersprache direkt zusammenhängt, bitte HIER posten.
Antworten
Benutzeravatar
joeydee
Establishment
Beiträge: 1224
Registriert: 23.04.2003, 15:29
Kontaktdaten:

Re: Datenkapselung

Beitrag von joeydee »

Leider noch mehr Tipperei und Kopfarbeit, aber eine gute Möglichkeit dass nur die registrierten Komponenten und niemand sonst z.B. an der Objektposition was ändern können, sehe ich im Observer-Pattern: das Objekt registriert einen Listener zum Event "ChangePosition" bei seiner Komponente. Diese löst nur Events aus statt Eigenschaften des Objekts direkt zu beeinflussen. Das Objekt selbst kümmert sich bei gefeuerten Events dann selbst um die Ausführung und ändert seine Eigenschaften, welche dadurch auch private bleiben können.

Das wäre im allereinfachsten Fall eine private Funktion im Objekt, deren Referenz gezielt an die Komponente weitergegeben wird, welche sie dadurch bei Bedarf aufrufen darf. Wer die Referenz nicht hat, darfs auch nicht. Und da die Referenz in der Komponente ebenfalls private bleiben kann, bleibt diese auch hier nach außen geheim.

Ich habe hier gerade nur AS zur Verfügung, aber ich glaube damit wirds klar:

Code: Alles auswählen


	public class PLObject{
		
		private var x:Number;//private position
	
		//add a new component to this object	
		public function registerComponent(component:PLComponent){
			component.changePositionX=setPositionX;//register event listener for event "changePositionX"
		}
	
		//event handler for event "changePositionX"
		private function setPositionX(value:Number){
			x=value;
			trace("PLObject: position x is set to "+x);//log output
		}

	}


	public class PLComponent{
		
		private var _changePositionX:Function;//event handler for event "changePositionX"
		
		//register a handler function for event "changePositionX"
		public function set changePositionX(handler:Function){
			_changePositionX=handler;
		}
		
		//test changing a private value in parent object
		public function updateX(anyValue:Number){
			if(_changePositionX)_changePositionX(anyValue);// fire event "changePositionX" if it has a handler
		}
		
	}

//test it!

var myObject:PLObject=new PLObject();
var myComponent:PLComponent=new PLComponent();

myObject.registerComponent(myComponent);//add component to object

myComponent.updateX(15);// --> "PLObject: position x is set to 15"

//other ways to acces the PLObject property "x" will fail:
//myObject.x=8;//error
//myObject.setPositionX(8);//error
//myComponent.changePositionX(8);//error


odenter
Establishment
Beiträge: 207
Registriert: 26.02.2009, 11:58

Re: Datenkapselung

Beitrag von odenter »

Jonathan hat geschrieben:@exploid
Es geht hier um ein Spiel und nicht um eine Bibliothek die potentiell von vielen anderen benutzt wird, daher denke ich nicht, dass getter/setter hier Sinn machen. Sollte ich irgendwann eine Überprüfung einbauen wollen, muss ich nur die entsprechende Funktion erstellen und die 50 trivialen Compilerfehler abarbeiten, was im Zweifelsfalle mit suchen/ersetzen geht. Das dauert dann ungefähr 5 Minuten. Aber bis dahin habe ich eine übersichtliche und aufgeräumte Klassenschnittstelle weniger Tipparbeit und übersichtlicheren Code (weil weniger () durch Funktionsaufrufe).
Letztendlich geht es mit dem ganzen Kapseln ja darum, dass man keine Daten von außen verändern kann, sobald man einen setter hat, der den Wert einfach so übernimmt, hat man mit ein wenig Arbeit einfach mal gar nichts erreicht. Weil man immer noch genauso von außen zugreifen kann, nur umständlicher.
Naja bei den set/get Methoden, bauste halt nur Deine zusätzliche Prüfung und brauchst keine 50 Compiler-Fehler abarbeiten.
Ist aber ja letztlich Dein Code, und wenn Du mit suchen/ersetzen arbeiten willst, mach das. :)
Antworten