[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