[linux-l] Re: SW-Design / Modules vs. Objects/Classes
Axel Weiß
aweiss at informatik.hu-berlin.de
So Okt 23 13:26:18 CEST 2005
Oliver Bandel schrieb:
> Hi,
>
> vielleicht interessant für die hier immer wieder auftauchenden
> Diskussionen um SW-Design...
>
> ...aus einem Paper (icfp99.ps) von Xavier Leroy:
>
> ======================================================================
>=
>
> Myth: OO programs are easier to extend
>
>
> Consider a type of "things" with several kinds of things and
> several operations over things.
>
> | FP-approach: | OO-approach:
> |
> | One function per | One class per kind of
> | operation, defined by | things, one method
> | pattern matching on | per operation
> | things |
>
> ---------------|-------------------------|-------------------------
> adding a new | Must edit all | Add one class, other
> kind of thing | functions, adding a | classes unchanged
>
> | new case to every |
> | pattern matching |
>
> ---------------|-------------------------|-------------------------
> adding a new | add one function, | Must edit all classes,
> operation over | other functions | adding a new method
> things | unchanged | to every class
> ---------------|-------------------------|-------------------------
>
> ======================================================================
>=
>
> Schön ist's, wenn eine Sprache beide Möglichkeiten unterstützt. :)
In C++ würde ich das doch so organisieren, dass die gemeinsame
Basisklasse eine neue Methode bekommt (zweite Zeile).
Erfordert diese von Objekten abgeleiteter Klassen spezielle Handhabung,
hat man grundsätzlich zwei Möglichkeiten:
1. Die Methode ist virtuell, also spät an die erbende Klasse gebunden.
Dann muss man in jeder erbenden Klasse eine (neue) Implementierung
bereitstellen (wie im Text).
2. Die Basisklasse hat ein Konzept, zur Laufzeit den Typ der erbenden
Klasse zu erfragen (z. B. durch einen enum). Dann muss die neue Methode
nicht zwangsläufig virtuell sein, und es genügt eine Implementierung in
der Basisklasse.
Im Fall 1 gibt es beliebig viele abgeleitete Klassen, und die Basisklasse
kennt keine von ihnen. Im zweiten Fall ist es genau umgekehrt, d. h. für
jede neue erbende Klasse muss die Basisklasse 'aufgebohrt' werden. Das
entspricht aber gerade dem Verhalten in der ersten Spalte oben.
Fazit: C++ ist sowohl eine objektorientierte als auch eine Funktionale
Sprache. Es liegt am Programmierer/Designer, welche Konzepte im
Vordergrund stehen. Sie lassen sich auch problemlos mischen.
Axel
Mehr Informationen über die Mailingliste linux-l