gutti: wieso objektorientiert?

Hallo zusammen,
ich möchte orinzipiell ein Perl-Script schreiben mit dem man Datensätze einer MySQL Datenbank bearbeiten kann. Man soll über den Browser Objekte die in dieser Datenbank sind ändern können.

Als Beispiel möchte ich so ein Objekt in den Datenbestand aufnehmen:
Methode1:

#!/usr/bin/perl -w
add(daten);

sub add {
[code zum hinzufügen in db]
}

oder Objektorientiert (Methode2):

#!/usr/bin/perl -w
use verwaltung;
my $objekt = verwaltung->new();
$verwaltung->add(daten);

mit entsprechender verwaltung.pm:
package verwaltung;

sub new {
 my $class = shift;
 my $reference = {};
 bless($reference,$class);
 return($reference);
}

sub add {
[code zum hinzufügen in db]
}

So -  was ist jetzt der Vorteil der zweiten (objektorientierten) Variante? Ich mag mir schon vorher Gedanken machen wie ich die Programmierung angehe aber steig da noch nicht so ganz durch.
Wie würdet ihr vorgehen?

Danke :)

  1. Hallo,

    So -  was ist jetzt der Vorteil der zweiten (objektorientierten) Variante? Ich mag mir schon vorher Gedanken machen wie ich die Programmierung angehe aber steig da noch nicht so ganz durch.

    Fragst Du allgemein, weil Du die Vorteile  Objektorientierter Programmierung wissen willst?

    Oder willst Du es speziell für Perl wissen?
    Denn in Perl ist die OO wirklich ziemlich angeflanscht und nicht unbedingt "sexy" in der Benutzung, finde ich.
    Deswegen hängt es sehr vom Zweck und von der Projektgröße (und vom eigenen Gusto) ab, ob man OO in Perl programmiert.

    Falls Deine Frage aber allgemein war: Für mich ist der Hauptvorteil der OO-Programmierung (neben denen im Link oben genannten) der Umstand, dass man in der Realität fast immer mit Objekten/Klassen zu tun hat, und selten mit (reinen) Prozeduren.
    Da man beim Programmieren immer versucht, die reale Welt abzubilden, ist OO-orientierte Programmierung das, was eher unserem Denken entspricht:

    Z.b.: Ich kenne nicht 20 verschiedene Tätigkeiten "fahren", sondern nur eine, aber die ist abhängig vom Objekt.
    "Führe" ich "prozedural", müsste ich mir zig verschiedene Vorgänge merken.

    fahre_fahrrad (...);
    fahre_auto(...);
    fahre_altes_auto(...);

    Ich müsste auch ein Objekt erst fragen, wie ich es fahren soll.
    switch(obj.type) {
       case 'fahrrad' : fahre_fahrrad (obj); break;
       ...
       default: geh_zu_fuss();
    }

    Nicht auszudenken, wenn ich eines Tages ein neues fahrbares Objekt kennenlerne (ein Skateboard z.b.) :) .

    In der Realität habe ich aber nur Objekte mit denen ich "fahren" kann (Fahrräder, Autos, und davon vielleicht Spezialfälle (also ein "altes Auto") - ich merke mir nicht verschiedene Vorgänge sondern nur die Objekte, und wie ich sie benutze.

    interface Fahrzeug {
       function drive();
    }

    class fahrrad implements Fahrzeug  {
       public function drive() {
          this.aufsteigen ();
          this.treten();
       }
    }

    class auto implements Fahrzeug  {
       public function drive (){
           this.kupplung("treten")
           this.zuendung();
           this.setGang(1);
           this.kupplung("loslassen");
       }
    }

    class altesAuto implements Fahrzeug extends auto {
       public function drive() {
            this.yoke_ziehen();
            super.drive();
       }
    }

    Und alle diese wunderbaren Objekte hören auf den einzigen Methodenaufruf "drive()" und wissen dann selbst, was zu tun ist.

    Grüße,
    Jörg

    1. Hallo,
      erstmal vielen Dank für deine Antwort.

      Oder willst Du es speziell für Perl wissen?
      Denn in Perl ist die OO wirklich ziemlich angeflanscht und nicht unbedingt "sexy" in der Benutzung, finde ich.
      Deswegen hängt es sehr vom Zweck und von der Projektgröße (und vom eigenen Gusto) ab, ob man OO in Perl programmiert.

      Ja ich wills jetzt auch speziell für Perl wissen. Ich habe mir das angeschaut: http://de.selfhtml.org/perl/sprache/objekte.htm und naja ob ich jetzt daten->add(); (mit dem sub Teil in einer extra Datei) oder add(daten) (mit dem sub Teil in der selben Datei) schreibe erscheint mir grad gleichwertig.

      Der User soll simpel gesagt bei mir über ein HTML-Formular die Daten, welche in die DB hinzugefügt werden sollen (oder entfernt, geändert etc.) übergeben.

      Grüße
      gutti

      1. Oder willst Du es speziell für Perl wissen?
        Denn in Perl ist die OO wirklich ziemlich angeflanscht und nicht unbedingt "sexy" in der Benutzung, finde ich.
        Deswegen hängt es sehr vom Zweck und von der Projektgröße (und vom eigenen Gusto) ab, ob man OO in Perl programmiert.

        Ja ich wills jetzt auch speziell für Perl wissen. Ich habe mir das angeschaut: http://de.selfhtml.org/perl/sprache/objekte.htm und naja ob ich jetzt daten->add(); (mit dem sub Teil in einer extra Datei) oder add(daten) (mit dem sub Teil in der selben Datei) schreibe erscheint mir grad gleichwertig.

        Inwiefern speziell für Perl gleichwertig?
        Das eine ist Objektorientiert, das andere nicht. Wenn dir nicht klar ist, was die Vor- und Nachteile von OOP sind, dann macht die Frage keinen Sinn.

        Der User soll simpel gesagt bei mir über ein HTML-Formular die Daten, welche in die DB hinzugefügt werden sollen (oder entfernt, geändert etc.) übergeben.

        Stell dir vor: es gibt Rennautos und Traktoren, deine Fragen (Thesen) klingen jetzt so, "ich will mich einfach fortbewegen ob ich jetzt ein Rennauto verwende oder einen Traktor, erscheint mir grad gleichwertig" - da ich annehme, dass du den Unterschied zwischen den beiden Fortbewegungsmitteln kennst, müßte dir diese These seltsam vorkommen, genauso geht es uns mit deiner OOP Frage. Jörg hat dir ja versucht zu erklären was das Konzept ist, es gibt im Internet auch reichlich informationen darüber, du solltest wenn du interesse an dem Thema hast, dir mal ein paar suchen.

        Struppi.

      2. Hallo nochmal,

        Ja ich wills jetzt auch speziell für Perl wissen. Ich habe mir das angeschaut: http://de.selfhtml.org/perl/sprache/objekte.htm und naja ob ich jetzt daten->add(); (mit dem sub Teil in einer extra Datei) oder add(daten) (mit dem sub Teil in der selben Datei) schreibe erscheint mir grad gleichwertig.

        Dem Rechner ist es auch schnurz, ob Du OO-programmierst oder nicht, insofern stimmt "gleichwertig" schon - ausführen wird er es natürlich in jedem Fall, und geschwindigkeitsmäßig machts auch keinen Unterschied (bzw. wenn ist OO sogar eine Winzigkeit langsamer, wenn überhaupt).

        Es hängt eher von dem Projekt ab:
        Ist das nur ein kleines Projekt, ein paar wenige hundert Zeilen...dann kann man das auch noch sehr gut prozedural lösen, und muss sich in Perl nicht mit diesem Bless-Referenzen-Kram herumärgern.

        Für alle größeren Projekte, oder Projekte, an denen mehere Programmierer sitzen, empfiehlt sich aber OO-Programmierung, weil sie (wie gesagt) näher an unserem Denken dran ist, und auch wieder-verwendbarer - dadurch wird es einfach inuitiver, damit umzugehen, man kennt sich schneller im Code aus, es passieren einem weniger Fehler usw.

        Es ist Geschmacksache, aber etwas wie daten->add() ist auch nicht unbedingt ein Vorzeige-Beispiel von OO-Programmierung - es zeigt zwar das Prinzip (das ist denke ich auch die Absicht des SELFHTML-Artikels) aber nicht unbedingt die Vorteile.

        Ob ich schreibe:
        add_data ("Test", "Selfhtml", 47);
        oder
        $data = new DataObject ("Test", "Selfhtml", 47)
        $data->add();

        macht tatsächlich wenig unterschied, da ich in beiden Fällen noch sehr nah an der Implementierung (Daten, Tabellen,...) klebe.
        Interessanter wird es, wenn ich Objekte konstruiere, die sich von der eigentlichen Implementierung loslösen. Z.b. ein Konto:

        my $konto = new Konto();
        $konto->setEigentuemer("Joerg");
        $konto->load();
        $konto->einzahlen(100);
        $konto->abheben(100);
        $konto->save();

        Ein Programmierer, der dieses Konto-Objekt benutzt, braucht nicht mehr wissen, WAS genau bei "save" oder "load" passiert (vermutlich sowas wie eine Datenbank-Abfrage, aber wie gesagt, das kann ihm egal sein). Er muss nur das Konto-Objekt kennen, und welche Methoden (load,save,einzahlen,abheben) es hat.

        So kann das Konto ein Programmierer entwickeln, während ein anderer z.b. eine Verwaltung von Konten programmieren kann, ohne dass beide die Details des anderen wissen müssen.

        Natürlich kann man diese Dinge auch durch andere Prinzipien erreichen als OO-Programmierung und umgekehrt kann man seine Klassen und Objekte auch so schlecht bauen, dass die Objektorienierung gar nix bringt.

        -> Fazit: OO-programmierung ist ein Hilfs- aber kein Allerheilmittel, um wartbare, wiederverwendbare Software zu schreiben...nicht mehr, nicht weniger.

        Viele Grüße,
        Jörg

        1. Herzlichen Dank für eure ausführlichen Antworten :)
          Werde mich jetzt noch mehr zu lesen und das dann testen.

          Grüße
          gutti