Thread Kritik an OOP (48 answers)
Opened by hlubenow at 2017-07-12 03:18

hlubenow
 2017-07-12 16:10
#186833 #186833
User since
2009-02-22
875 Artikel
BenutzerIn
[default_avatar]
2017-07-12T06:14:10 rosti
Das ist ein ziemlicher Unsinn der da verbreitet wird: Objekte senden Messages an Objekte -- So ein Stuss!

Objekte sind Instanzen von Klassen, nicht nur in Perl!

Und dann schauen wir doch mal in ein gutes Buch, wie z.B. Eric Foster Johnson definiert, was ein Objekt ist:

Quote
Ein Perl-Objekt ist eine Referenz die weiß zu welcher Klasse sie gehört.


In dieser Konsequenz kann ein Objekt gar keine Methoden anderer Klassen aufrufen, jeglicher Datenfluss spielt sich immer nur innerhalb einer Klasse ab!

Tut mir leid, da muß ich widersprechen. Man kann Objekte als "Maschinen" verstehen, mit denen ein Benutzer etwas machen kann. Insbesondere natürlich, wenn eine Klasse eine reale Maschine wie z.B. ein Auto oder einen Getränkeautomaten abbildet. Wenn man also z.B. ein Getränkeautomatenobjekt hat, kann man sagen:
Code (perl): (dl )
$getraenkeautomat->gibMirEineCola();

Das ist ein Methodenaufruf. Und wenn Objekte miteinander kommunizieren, dann tun sie das dadurch, daß sie die - öffentlichen - Methoden des anderen Objekts aufrufen. Natürlich kann ein Objekt also eine Methode einer anderen Klasse aufrufen.
Ich glaube, an der Stelle mußt Du noch etwas dazulernen. Warum auch nicht?

Das Problem dabei ist, daß die eine Klasse die andere Klasse kennen muß, um ihre Methode aufrufen zu können. Und dann kommt noch der Kontrollfluß dazu. Der ja aus der einfachen imperativen Programmierung stammt, und nicht auf gleichzeitiges Kommunizieren von Objekten ausgelegt ist.
Am Ende treten genau die Probleme auf, daß man seine Objekte in einer Hierarchie strukturiert hat (nach allerhand Rumdrucksen wurde ich in einem Forum etwas verschämt auf MVC hingewiesen, jetzt weiß ich, daß man deshalb verschämt war, weil das letztlich auch nicht funktioniert), und man aber eine Kommunikation eines untergeordneten Objekts mit einem anderen untergeordneten Objekt irgendwo braucht, und man das am liebsten direkt machen möchte. So entsteht dieser "Schweizer Käse", den er beschreibt.

Lohnenswertes Video in jedem Fall: Wenn er recht hat, ist das doch eine bemerkenswerte Aussage. Und wenn er widerlegt werden kann, würde man auch eine Menge daraus lernen.
Zeitverschwendung ist das in keinem Fall, wenn man sich überhaupt mit diesen Dingen beschäftigt.

---
Übrigens: Wenn man genau hinhört, dann stellt er die Regel
Quote
messages cannot pass object references

als theoretische Verhaltensregel für OOP-Programmierung auf, und nicht als technische Unmöglichkeit. Er sagt dann ja auch:
Quote
I've never seen a Java or C# code-base, that follows that rule.

Er meint also, es gibt in der OOP-Theorie bestimmte Verhaltensregeln, an die sich aber niemand hält, weil es so eben nicht funktioniert. Er meint also: "Messages pass object references all the time, although, in theory, it's not allowed."

Beispiel: $user kommuniziert mit $getraenkeautomat:
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#!/usr/bin/perl

use warnings;
use strict;

package Getraenkeautomat;

    sub new {
        my $classname = shift;
        my $self = {bottles_of_cola => 10};
        return bless($self, $classname);
    }

    sub gibMirEineCola {
        my $self = shift;
        if ($self->{bottles_of_cola} > 0) {
            print "Bitteschoen!\n";
            $self->{bottles_of_cola}--;
            print "Noch $self->{bottles_of_cola} Flaschen Cola uebrig.\n";
        }
    }

package Man;

    sub new {
        my $classname = shift;
        my $self = {thirst => 0};
        return bless($self, $classname);
    }

    sub sweat {
        my $self = shift;
        my $getraenkeautomat = shift;
        print "Ganz schoene Hitze, ich werde durstiger.\n";
        $self->{thirst}++;
        if ($self->{thirst} > 1) {
            print "Ich brauche eine Cola!\n";
            $getraenkeautomat->gibMirEineCola();
        }
    }

package main;

my $getraenkeautomat = Getraenkeautomat->new();
my $user = Man->new();
$user->sweat($getraenkeautomat);
$user->sweat($getraenkeautomat);

Last edited: 2017-07-12 16:35:16 +0200 (CEST)

View full thread Kritik an OOP