hotti: Konfiguration, OOP² oder doch nur Rad² ?

Beitrag lesen

hi,

Dependency Injection ist das simple Vorgehen, einem Objekt, welches ein anderes Objekt braucht, dieses andere Objekt nicht im Inneren per "new" zu erzeugen, sondern als Parameter über den Konstruktor oder eine Setter-Methode hineinzureichen.

Auf diese Weise kann man außerhalb des Objekts kontrollieren, welches Objekt man hineintut - und kann zum Testen ein passendes Mock-Objekt nehmen, und im Betrieb eines oder eins aus einer Auswahl von mehreren in Frage kommenden Arbeitsobjekten.

Das bring aber auch gewisse Gefahren mit sich, ein Objekt im Verlauf des Programms von außerhalb her zu ändern. Wenn das DI ist, gefällts mir ganz und gar nicht, da werden interne Abhängigkeiten nach draußen gereicht, die Übersicht geht zum Teufel und Schnittstellen zwischen den Klassen sind nicht mehr klar definiert.

In meinen privaten Projekten hat sich das Gegenteil von DI bewährt, anstatt das Erbe einer fremden Klasse anzutreten, bevorzuge ich die Delegation ausgewählter Methoden und das erfolgt ganz klar im Konstruktor.:

  
sub new{  
  my $class = shift;  
  my $self = bless{}, $class;  
  $self->{CGI} = CGI->new;   # CGI-Objekt als Attribut  
  return $self;  
}  

So! Und nun schauen wir mal nach draußen, da steht z.B.:

  
my $myobj = MyClass->new;  
$myobj->header;     # rufe eine delegierte Methode  
$myobj->param;      # rufe noch eine delegierte Methode  

Und jetzt kommts ganz dicke: Ich habe monatelang nichts am Code gemacht und muss mal eben nachschauen, wie das kommt, dass $myobj die header-Methode aufrufen kann: Dazu genügt EIN BLick in den Konstruktor, und nicht stundenlanges Wälzen von Programmcode ;)

Der Vorteil Delegation vs. Erbe: Es werden NICHT alle Methoden geerbt sindern nur die, die gebraucht werden. Das "Überlagern" ist denkbar einfach:

  
sub param{  
  my $self = shift;  
  return $self->{CGI}->param(@_); # alles drin ;)  
}  

Hotti