Thread Liskovsches Sommerloch (19 answers)
Opened by rosti at 2025-06-25 09:13

haj
 2025-06-25 11:11
#197073 #197073
User since
2015-01-07
577 Artikel
BenutzerIn

user image
Solche Beispiele ohne Berücksichtigung der tatsächlich vorhandenen Methoden und der Möglichkeiten der Programmiersprache sind immer wurmstichig.

Ein Weichmacher ist in dem Wikipedia-Artikel auch schon drin:
Quote
Zu beachten ist hierbei, dass die Entscheidung jeweils abhängig vom konkreten Fall ist. Ist beispielsweise eine Manipulation der geometrischen Figur nach der Erzeugung nicht vorgesehen, so kann Kreis durchaus von Ellipse abgeleitet sein: Dass die Achsen unabhängig voneinander skaliert werden können, ist dann keine Eigenschaft der Klasse Ellipse, und somit muss sie auch keine Eigenschaft von Kreis sein, um Kreis zur Unterklasse von Ellipse zu machen.

Dass Manipulation von Objekten nach der Erzeugung nicht erlaubt sein soll, ist Thema eines anderen Dogmas, das auch schnell mal an praktische Grenzen stößt. In unserem Fall ist es aber hilfreich: Wenn die Methode scale nicht das vorhandene Objekt verändert, sondern ein neues erzeugt, dann kann (muss, im Sinn von Liskov) die Klasse Kreis die Methode beispielsweise wie folgt schreiben:

Code (perl): (dl )
1
2
3
4
5
6
7
8
sub scale {
    my $self = shift;
    my ($x,$y) = @_;

    return defined($y) ?
       Eclipse->new($x * $self->x, $y * $self->x) :
       Kreis->new($x * $self->x);
}


Wenn das Objekt selbst verändert werden soll, dann muss man laut Barbara Liskov mit so etwas klarkommen:
Code (perl): (dl )
1
2
my $kr = Kreis->new(1);
$kr->scale(2,3);

Das Ergebis dieser Manipulation wäre dann kein Kreis mehr. Aber wir reden hier von Perl, so dass uns das nicht vor unlösbare Probleme stellt:
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
sub scale {
    my $self = shift;
    my ($x,$y) = @_;

    if (defined $y) {
        bless $self, 'Eclipse';
        $self->scale(@_);
    }
    else {
        $self->set_x($x * $self->x); 
    }
}

Solches Umtaufen ist natürlich grenzwertig, weil die Anwendung damit klarkommen muss, dass $kr nicht unbedingt ein Kreis bleibt. OO-Dogmatiker bekommen da Schnappatmung. Das kann nur funktionieren, wenn die Klassen zum gleichen Projekt gehören, aber erstens ist das oft der Fall und zweitens ist das für jede Art der Vererbung hilfreich. Die meisten Programmiersprachen sowie das Perldoc:perlclass-Perl erlauben kein Umtaufen, und ich habe ein gewisses Verständnis dafür.

View full thread Liskovsches Sommerloch