Zum Inhalt springen

„Fragile Base Class Problem“ – Versionsunterschied

aus Wikipedia, der freien Enzyklopädie
[gesichtete Version][gesichtete Version]
Inhalt gelöscht Inhalt hinzugefügt
K korr.
K rückgängig gemacht; nein, genau dann nicht. Ist das so unverständlich? Bitte melde Dich auf der Disk.
 
(25 dazwischenliegende Versionen von 16 Benutzern werden nicht angezeigt)
Zeile 1: Zeile 1:
Das '''Fragile Base Class Problem''' (FBC) ist ein Fehlverhalten von [[Software]], das bei der [[Objektorientierung|objektorientierten]] [[Softwareentwicklung]] beim [[Version (Software)|Versionswechsel]] der eingesetzten Basissoftware auftreten kann und mit dem [[Vererbung (Programmierung)|Vererbungsmechanismus]] zusammenhängt. Es kann auftreten, wenn diese Technik der Objektorientierung als Implementierungsvererbung zur Wiederverwendung von [[Quelltext]] eingesetzt wird.
{{Dieser Artikel|erläutert das semantische Fragile Base Class Problem. Für das syntaktischen Fragile Base Class Problem siehe [[Fragile Binary Interface Problem]]}}


Die Entwickler einer „zerbrechlichen“ [[Basisklasse]], die keine genaue und vollständige Kenntnis über die Nutzung ihrer Implementierungen haben können, sind bei einer Änderung nicht in der Lage, die negativen Konsequenzen vorauszuahnen, die sich für spezialisierende [[Klasse (objektorientierte Programmierung)|Klassen]] hieraus ergeben.
Das '''Fragile Base Class Problem''' (FBC) ist ein Fehlverhalten von [[Software]], das bei der [[objektorientierung|objektorientierten]] [[Softwareentwicklung]] beim [[Version (Software)|Versionswechsel]] der eingesetzten Basissoftware auftreten kann und mit dem [[Vererbung (Programmierung)|Vererbungsmechanismus]] zusammenhängt. Es kann auftreten, wenn dieses Sprachmittel als Implementierungvererbung zur Wiederverwendung von [[Quelltext]] eingesetzt wird.


Die Entwickler einer „zerbrechlichen“ [[Basisklasse]], die keine genaue und vollständige Kenntnis über den Einsatz ihrer Implementierungen haben können, sind bei einer Änderung nicht in der Lage, die negativen Konsequenzen vorauszuahnen, die sich für spezialisierende [[Klasse (objektorientierte Programmierung)|Klassen]] hieraus ergeben. Die Gründe hierfür sind vielfältig, im Wesentlichen liegt ein Missverständnis zwischen den Entwicklern der Basisklasse und denen der verwendende Spezialisierungen vor. Dies liegt zumeist daran, dass die Funktionalität der Basisklasse und auch das von den Spezialisierungen erwartete Verhalten nicht ausreichend präzise spezifiziert ist.
Die Gründe hierfür sind vielfältig, im Wesentlichen liegt ein Missverständnis zwischen den Entwicklern der Basisklasse und denen der verwendenden Spezialisierungen vor. Dies liegt zumeist daran, dass die Funktionalität der Basisklasse und auch das von den Spezialisierungen erwartete Verhalten nicht ausreichend präzise spezifiziert sind.

== Beispiel ==
Ein einfaches Beispiel lässt sich mittels einer Basisklasse <code>BagOfInt</code> veranschaulichen, also ein [[Container (Informatik)|Container]] zur Speicherung ganzer Zahlen. Diese Klasse beinhaltet folgende Funktionalität ([[Methode (Programmierung)|Methoden]]):
* <code>Add</code>: Hinzufügen eines Elements (einer Zahl)
* <code>AddAll</code>: Hinzufügen einer Menge von Zahlen (durch Übergabe eines anderen <code>BagOfInt</code>)
* <code>GetSize</code>: Ermittlung der Anzahl der enthaltenen Zahlen
* <code>GetAt</code>: Zugriff auf ein bestimmtes Element mittels eines Index

Diese Klasse sei nun Bestandteil einer [[Klassenbibliothek]] und wird von einem Entwickler, der diese einsetzt, zu einer Klasse <code>TotalizingBagOfInt</code> erweitert, also spezialisiert. Die [[Vererbung (Programmierung)|erbende]] Klasse hat die zusätzliche Eigenschaft, dass sie die Gesamtsumme aller in dem Container enthaltenen Zahlen mitführt. Der Entwickler erreicht dies durch [[Überschreiben (Programmierung)|Überschreiben]] der Methode <code>Add</code>, in der die Gesamtsumme ständig aktualisiert wird.

In einer neueren Version entscheidet sich nun der Entwickler der Basisklasse, die Methode <code>AddAll</code> nicht mehr wie bisher auf die Methode <code>Add</code> derselben Klasse zurückzuspielen, sondern die Methode aus Optimierungsgründen anderweitig zu implementieren.

Nach Austausch der Version der Basisklasse funktioniert nun die spezialisierende Klasse <code>TotalizingBagOfInt</code> nicht mehr, wenn die Methode <code>AddAll</code> verwendet wird. Der Entwickler dieser Klasse müsste nun diese Methode auch überschreiben. In der Ursprungsversion tat er das nicht, beispielsweise weil er durch Ausprobieren erkannt hatte, dass es nicht nötig war.


== Literatur ==
== Literatur ==
* Leonid Mikhajlov, Emil Sekerinski: [http://www.cas.mcmaster.ca/~emil/publications/fragile/ecoop98.pdf ''A Study of The Fragile Base Class Problem'']. In: ''Proceedings of the 12th European Conference on Object-Oriented Programming'', Seite 355–382, 1998, ISBN 3-540-64737-6
* Leonid Mikhajlov, Emil Sekerinski: [http://www.ifs.uni-linz.ac.at/~ecoop/cd/papers/1445/14450355.pdf ''A Study of The Fragile Base Class Problem''] (PDF; 355&nbsp;kB). In: ''Proceedings of the 12th European Conference on Object-Oriented Programming'', Seite 355–382, 1998, ISBN 3-540-64737-6
* Bernhard Lahres , Gregor Rayman: ''Praxisbuch Objektorientierung. Von den Grundlagen zur Umsetzung''. Galileo Press, Bonn 2006, ISBN 3-89842-624-6
* Bernhard Lahres, Gregor Rayman: ''Praxisbuch Objektorientierung. Von den Grundlagen zur Umsetzung''. Galileo Press, Bonn 2006, ISBN 3-89842-624-6


[[Kategorie:Objektorientierte Programmierung]]
[[Kategorie:Objektorientierte Programmierung]]

[[en:Fragile base class]]

Aktuelle Version vom 15. Januar 2017, 11:21 Uhr

Das Fragile Base Class Problem (FBC) ist ein Fehlverhalten von Software, das bei der objektorientierten Softwareentwicklung beim Versionswechsel der eingesetzten Basissoftware auftreten kann und mit dem Vererbungsmechanismus zusammenhängt. Es kann auftreten, wenn diese Technik der Objektorientierung als Implementierungsvererbung zur Wiederverwendung von Quelltext eingesetzt wird.

Die Entwickler einer „zerbrechlichen“ Basisklasse, die keine genaue und vollständige Kenntnis über die Nutzung ihrer Implementierungen haben können, sind bei einer Änderung nicht in der Lage, die negativen Konsequenzen vorauszuahnen, die sich für spezialisierende Klassen hieraus ergeben.

Die Gründe hierfür sind vielfältig, im Wesentlichen liegt ein Missverständnis zwischen den Entwicklern der Basisklasse und denen der verwendenden Spezialisierungen vor. Dies liegt zumeist daran, dass die Funktionalität der Basisklasse und auch das von den Spezialisierungen erwartete Verhalten nicht ausreichend präzise spezifiziert sind.

Ein einfaches Beispiel lässt sich mittels einer Basisklasse BagOfInt veranschaulichen, also ein Container zur Speicherung ganzer Zahlen. Diese Klasse beinhaltet folgende Funktionalität (Methoden):

  • Add: Hinzufügen eines Elements (einer Zahl)
  • AddAll: Hinzufügen einer Menge von Zahlen (durch Übergabe eines anderen BagOfInt)
  • GetSize: Ermittlung der Anzahl der enthaltenen Zahlen
  • GetAt: Zugriff auf ein bestimmtes Element mittels eines Index

Diese Klasse sei nun Bestandteil einer Klassenbibliothek und wird von einem Entwickler, der diese einsetzt, zu einer Klasse TotalizingBagOfInt erweitert, also spezialisiert. Die erbende Klasse hat die zusätzliche Eigenschaft, dass sie die Gesamtsumme aller in dem Container enthaltenen Zahlen mitführt. Der Entwickler erreicht dies durch Überschreiben der Methode Add, in der die Gesamtsumme ständig aktualisiert wird.

In einer neueren Version entscheidet sich nun der Entwickler der Basisklasse, die Methode AddAll nicht mehr wie bisher auf die Methode Add derselben Klasse zurückzuspielen, sondern die Methode aus Optimierungsgründen anderweitig zu implementieren.

Nach Austausch der Version der Basisklasse funktioniert nun die spezialisierende Klasse TotalizingBagOfInt nicht mehr, wenn die Methode AddAll verwendet wird. Der Entwickler dieser Klasse müsste nun diese Methode auch überschreiben. In der Ursprungsversion tat er das nicht, beispielsweise weil er durch Ausprobieren erkannt hatte, dass es nicht nötig war.