Sven: Vorteile und Beispiele zur OOP

Hallo,

technisch/theoretisch gesehen müsste ich OOP können. Allerdings fehlte mir bisher der praktische Bezug zur objektorientierten Programmierung - da helfen auch keine 1000 Tutorials und How-Tos, da hilft nur: Es einfach zu machen.

Das würde ich bei meinem nächsten Projekt gerne tun, und zwar in PHP. Bisher hab ich immer zig lose Funktionen gehabt, und kam damit gut klar. Beispielsweise eine Funktion gibAlter(), die als Parameter die ID des betroffenen Nutzers übermittelt bekam und mir dann als Rückgabewert den Timestamp des Geburtsdatums lieferte.

Wenn ich das jetzt objektorientiert lösen will, würde das heißen: Ich erstelle eine Klasse user, und darin viele Funktionen.

Dann könnte ich mit $user->$age  beispielsweise das Alter erhalten, oder mit $user->$email  die E-Mail Adresse des Nutzers?

Könnte mir vielleicht jemand noch ein paar typische Beispiele nennen, wo man in einem Community-Script Klassen verwenden würde? Das würde mir vermutlich sehr weiterhelfen, einfach um mich auf ein paar Ideen zu bringen, wo sich OOP einsetzen lässt.

Grüße
Sven

  1. Hallo,
    naja das Konzept der OOP lässt sich mit PHP nur relativ schlecht verwirklichen, da einfach bei jedem Seitenaufruf ein Script abläuft.
    Programmiert man stattdessen Programme (in C# oder Java z.B.), wird einem das Konzept der OOP deutlich klarer und welcher Vorteile dieses hat.

    Ganz gut finde ich das Paxisbuch Objektorientierung
    http://openbook.galileocomputing.de/oo/

    auch wenn es unter PHP nur bedingt Verwendung findet.

    Also:
    In PHP wird meistens zusammengehörige Funktionalitäten in Klassen gekapselt, ein Beispiel wäre deine User Klasse.
    Ein anderes Beispiele wäre z.B. für ein PN System ($pn->schreibePN($an, $betreff, $text), $pn->loeschePN($id) etc.) die entsprechende Klasse etc.

    Aus Faustregeln kann man sagen, dass man pro Datenbanktabelle ungefähr eine Klasse hat, sofern die DB-Tabelle keine Tabelle für eine n:m Beziehung ist.

    Sonst helfen Klassen auch sehr bei der Wiederverwendung von Code. Wenn man sich bestimmte Bibliothken für PHP anschaut (z.B. unter pear.php.net, oder ein PHP AJAX Framework etc.), dann sind diese auch in Klassen gebündelt. So verhindert man einfach, dass sich zwei Funktionen mit gleichen Namen aber für andere Bibliotheken in die Quere kommen.
    Außerdem ist es deutlich übersichtlicher für den Programmierer, wenn er dort eine Klasse für eine bestimmte Funktionalität (z.B. E-Mails versenden) hat statt ganz viele Funktionen.

    Grüße
    Klaus

    1. echo $begrüßung;

      naja das Konzept der OOP lässt sich mit PHP nur relativ schlecht verwirklichen, da einfach bei jedem Seitenaufruf ein Script abläuft.
      Programmiert man stattdessen Programme (in C# oder Java z.B.), wird einem das Konzept der OOP deutlich klarer und welcher Vorteile dieses hat.

      Auch C# und Java spielen im Bereich der Webanwendungen in der selben Liga wie PHP und sind an die Gegebenheiten des Request-Response-Spielchens gebunden. Trotzdem bleiben sie zu dem Zweck objektorientiert repektive sind die auf Webanwendungen spezialisierten Teilbereiche beider Umgebungen (ASP.NET vs. JSF & Co.) hauptsächlich objektorientiert gelöst[1]. Und ebenso wie bei PHP werden Objekte nur für den einen Request benötigt, erstellt und an dessen Ende wieder beseitigt. Dass es sowohl bei ASP.NET als auch im Java-Umfeld Objekte gibt, die auf Anwendungsebene und damit länger als einen Request lang leben, bei PHP dies aber nicht der Fall ist, ändert ja nichts an der grundlegenden Möglichkeit, Requests objektorientiert abzuarbeiten. Andererseits ist PHP zwar für das Web entwickelt worden, aber ebenso lassen sich damit wie unter .NET und Java auf längere Laufzeiten ausgelegte Desktop- oder Server-Anwendungen erstellen.

      Objektorientiert oder nicht ist also nicht prinzipiell an die Ablaufumgebung gebunden.

      [1] Wenn man es drauf anlegt, kann man auch unter ASP.NET [2] imperative aussehende Lösungen erstellen. Vermutlich auch mit JSF (Java Server Faces) doch da kenne ich mich nicht gut genug aus.

      Ganz gut finde ich das Paxisbuch Objektorientierung
      http://openbook.galileocomputing.de/oo/
      auch wenn es unter PHP nur bedingt Verwendung findet.

      Das liegt vermutlich daran, dass andere Sprachen mehr der Möglichkeiten zum Anwenden der derzeit populären OOP-Features bieten. Bei PHP ist die Objektorientierung mehr oder weniger als nette Dreingabe zu sehen, die man auch ignorieren kann. Teilweise müssen aber auch einige der im Buch verwendeten Sprachen passen, wenn es zu solchen Themen wie Mehrfachvererbung kommt.

      In PHP wird meistens zusammengehörige Funktionalitäten in Klassen gekapselt,

      Das "meistens" sehe ich darin begründet, dass PHP hauptsächlich als Anfängersprache oder Sprache für kleinere Projekte gesehen wird.

      Wenn man sich bestimmte Bibliothken für PHP anschaut (z.B. unter pear.php.net, oder ein PHP AJAX Framework etc.), dann sind diese auch in Klassen gebündelt. So verhindert man einfach, dass sich zwei Funktionen mit gleichen Namen aber für andere Bibliotheken in die Quere kommen.

      Das ist auch ein guter Punkt. Durch die Bindung der Methoden und Eigenschaften an die Klassen schafft man sich quasi Namensräume und muss weniger Aufwand in die globale Eindeutigkeit von Bezeichnern stecken.

      echo "$verabschiedung $name";

      1. Hallo,

        naja das Konzept der OOP lässt sich mit PHP nur relativ schlecht verwirklichen, da einfach bei jedem Seitenaufruf ein Script abläuft.
        Programmiert man stattdessen Programme (in C# oder Java z.B.), wird einem das Konzept der OOP deutlich klarer und welcher Vorteile dieses hat.

        Auch C# und Java spielen im Bereich der Webanwendungen in der selben Liga wie PHP und sind an die Gegebenheiten des Request-Response-Spielchens gebunden.

        Naja C# und Java werden eher für den Nicht-Web(HTTP)-Bereich verwendet. Natürlich gibt es Asp.Net oder JSP/JSF für Webanwendung, persönlich finde ich aber, dass das OO-Konzept in ASP.Net besser durchtritt als in PHP. Dort löst ein (ASP.Net) Button ein bestimmtes Event aus, wenn man diesen drückt, und dieses löst dann wieder ein Methodenaufruf zum Abhandeln des Events aus.
        Klar, dies wird dem Programmierer alles nur vorgegaukelt und im Hintergrund läuft es so ab wie bei PHP (Request-Response), aber bei Asp.Net hat man schon eher das Gefühl Objekt orientiert zu programmieren.

        Ich meinte aber eigentlich das sich OOP viel besser bei normalen Softwareanwendungen verwenden lässt, also soetwas wie Office, ein Browser oder ein FTP Server, als das man es im Web verwenden kann. Durch die Zustandslosigkeit der HTTP Verbindung muss man eben viele Einschränkungen hinnehmen und OO-Programmierung im Web ist eben anders als die OO-Programmierung einer Windows-Anwendung (o.ä.).
        Ich wollte nur sagen, dass man das Konzept und die Vorteile des OOP erheblich besser erkennt, wenn man mit C#/Java o.ä. mal eine größere Nicht-Web-Anwendung (am besten mit graphischer Oberfläche) programmiert hat.

        Persönlich finde ich PHP toll, da dieses um einiges instinktiver ist als ASP.Net oder JSP. Bei PHP weiß man, wie die Seite generiert wird (das Script läuft von oben nach unten ab) und kann dieses auch erheblich leichter beeinflussen.
        Bei ASP.Net ist eben vieles versteckter und man hat nicht ganz diesen (nahezu) linearen Ablauf. Ist eben eine andere Art zu programmieren.
        (Und mit JSP kann ich mich gar nicht anfreunden)

        Aber durch die Besonderheiten des HTTP Protokolls muss man eben Einschränkungen machen die es so bei z.B. einer Windows-GUI-Anwendung nicht gibt. Dort kommt in meinen Augen das Konzept der OOP besser durch.

        Deswegen, wie gesagt, verwendet man in PHP meisten Klassen um Funktionalitäten zu bündeln. Viele Konzepte wie Polymorphie lassen sich in PHP nur sehr schlecht ausnutzen.
        Verstärkend kommen die typischen Anwendungsfelder hinzu, die man mit PHP normalerweise löst (viel PHP Anwendung sind 'nur' Frontends für die dahinterliegende Datenbank. Also ein paar SELECT, INSERT und UPDATE Befehle).

        Ich hoffe mein Standpunkt ist etwas klarer geworden. Also ich kann es nur empfehlen, evt. mal mit C# eine (lokale) Anwendung zu programmieren. Dies hilft einem auch später wenn man dann eine PHP Anwendung schreiben muss. So erkennt man dann relativ schnell die Klassen die man benötigt und wie man wo sinnvoll Klassen/Objekte einsetzen kann.

        Grüße
        Klais

        1. Hallo Klaus,

          Naja C# und Java werden eher für den Nicht-Web(HTTP)-Bereich verwendet.

          An der Aussage kann man durchaus zweifeln. Der Markt für (individuelle) Webanwendungen ist zur Zeit so groß im vergeleich zu Desktopanwendungen, dass ich mir zumindest nicht so sicher bin, ob es nicht mehr C#- und Java-Webanwendungen gibt.

          Klar, dies wird dem Programmierer alles nur vorgegaukelt und im Hintergrund läuft es so ab wie bei PHP (Request-Response), aber bei Asp.Net hat man schon eher das Gefühl Objekt orientiert zu programmieren.

          Das ist meines erachtens ein entscheidender Punkt. OOP ist in der typischen, datenbankbasierten Webanwendungen, bei der im Wesentlichen die Webanwendung HTTP-Requests in Datenbankanfragen und zurück übersetzt, schwieriger einzusetzten. Man kann OOP zur Organisation dieses Transformationsprozesses einsetzen (das ist ja, was man mit dem MVC-Ansatz im wesentlichen tut.). Eine Anwendung, bei der auch das Datenmodell objektorientiert aufgebaut ist, ist aber umständlicher zu realisieren und bringt erstmal nicht so viel nuten. Solche Datenobjekte sollen ja Zustand und Verhalten der "Realität" abbilden. Der Zustand wird aber bei solchen Anwendungen in der Datenbank abgelegt und das Verhalten über Datenbankzugriffe realisiert.
          Erst mittels Frameworks, die die Datenbank und evtl. auch die HTTP-Requests vor der eigentlichen Anwendung verbergen und eine Umgebung ähnlich einer Desktopanwendung vorgaukeln, kann man OOP wirklich optimal anwenden. Also Object-Relation-Mapping für die Datenbank-Seite und etwas wie Java Server Faces (oder ASP.NET?), das Ereignisorientierte GUI-Programmierung ermöglicht, für die HTTP-Seite.
          Gerade im PHP-Umfeld gibt es da wohl noch relativ wenig und wenn doch, wird es in typischen PHP-Anwendungen nicht verwendet.

          Ich hoffe mein Standpunkt ist etwas klarer geworden. Also ich kann es nur empfehlen, evt. mal mit C# eine (lokale) Anwendung zu programmieren.

          Dem würde ich auch zustimmen. Webanwendungen eignen sich meiner Meinung nach auch nur begrenzt um OOP wirklich zu lernen. Man kann Webanwendungen objektorietiert schreiben, aber um nicht an den notwendigen Klimmzügen zu scheitern, muss man dazu eigentlich schon wissen, wie man wirklich objektorientierte Anwendungen baut.

          Grüße

          Daniel

          1. Hellihello,

            Erst mittels Frameworks, die die Datenbank und evtl. auch die HTTP-Requests vor der eigentlichen Anwendung verbergen und eine Umgebung ähnlich einer Desktopanwendung vorgaukeln, kann man OOP wirklich optimal anwenden. Also Object-Relation-Mapping für die Datenbank-Seite und etwas wie Java Server Faces (oder ASP.NET?), das Ereignisorientierte GUI-Programmierung ermöglicht, für die HTTP-Seite.
            Gerade im PHP-Umfeld gibt es da wohl noch relativ wenig und wenn doch, wird es in typischen PHP-Anwendungen nicht verwendet.

            nur empfehlen, evt. mal mit C# eine (lokale) Anwendung zu programmieren.
            Dem würde ich auch zustimmen. Webanwendungen eignen sich meiner Meinung nach auch nur begrenzt um OOP wirklich zu lernen. Man kann Webanwendungen objektorietiert schreiben, aber um nicht an den notwendigen Klimmzügen zu scheitern, muss man dazu eigentlich schon wissen, wie man wirklich objektorientierte Anwendungen baut.

            Eine ähnliche Diskussion im Archiv: http://forum.de.selfhtml.org/archiv/2008/11/t179625/#m1185564 - auch über die dahinter stehende Philosophie.

            Ich sehe es mittlerweile so: unabhängig vom Model (das es beim Zend-Framework so erstmal nicht gibt ("a model can be anything" Model !== Datenbank bzw. nicht unbedingt) ist das ganze komplett objektorientiert programmiert. Es existieren nur Klassen, sowohl als abstrakte wie auch als Interfaces von denen ggf. geerbt wird. So ist ja PEAR auch aufgebaut, was die Klassenstrukturen angeht. Das ist das, was PHP in dem Zusammenhang zu bieten hat und es funktioniert offenbar recht gebrauchstauglich in diversen Bedarfsszenarien.

            Dank und Gruß,

            frankx

            --
            tryin to multitain  - Globus = Planet != Welt
  2. Hallo,

    technisch/theoretisch gesehen müsste ich OOP können. Allerdings fehlte mir bisher der praktische Bezug zur objektorientierten Programmierung - da helfen auch keine 1000 Tutorials und How-Tos, da hilft nur: Es einfach zu machen.

    In der modernen Softwareentwicklung ist objektorientiertes Design bei der Anwedungssoftwareentwicklung kaum noch wegzudenken. Abgesehen von Wartbarkeit, Erweiterbarkeit - die in der Form prozedural gar nicht möglich ist -, und Lesbarkeit, ist objektorientiertes Design bei den diversen "Design Pattern" eigentlich die Grundvoraussetzung um diese realisieren zu können.
    Und jetzt, wo PHP OOP schon relativ vernünftig kann, wird es meiner Meinung nach in diesem Bereich auch immer wichtiger.
    Ergänzend zu Klaus' Antwort möchte ich noch hinzufügen, dass man Klassen gut anhand von Substantiven bei der Beschreibung des Programms, bzw Webseite o.ä. erkennen kann.

    Als grobes Beispiel:
    Es soll eine Community erstellt werden, wo verschiedene Benutzer mehrere Foreneinträge schreiben können, als ich Nachrichten an andere Benutzer.
    Hieraus ergeben sich konzeptionell einmal folgende Klassen:

    Benutzer
    ----------------------------
    vorname
    nachname
    passwort
    avatarurl
    ----------------------------
    getter- und setter-Methoden
    ----------------------------

    Foreneintrag
    ----------------------------
    titel
    datum
    text
    antwort
    ----------------------------
    getter- und setter-Methoden
    ----------------------------

    Nachricht
    ----------------------------
    vonwem
    anwem
    titel
    datum
    nachrichtentext
    ---------------------------
    getter- und setter-Methoden
    ---------------------------

    usw...
    Zusammenfassungen, Erweiterungen von Klassen, o.ä ergeben sich durch eine halbweg vernünftige Projektentwicklung.

    Markus

  3. Hi,

    ich kann dir nur meine bescheidene Erfahrungswerte dazu mitteilen.
    Ich habe das eine Weile versucht und bin zu dem Schluss gekommen, dass ich mit Funktionen besser zurecht komme. Warum? Der übersichtlichkeit wegen und vor allem, kurioserweise genau aus dem Grund warum man OOP praktizieren soll, der Wiederverwertbarkeit. Denn durch die Abhängigkeiten der einzelnen Funktionen untereinander ergibt sich für mich(für andere ist das bestimmt anders) keine wirklich modulare Bauweise.

    Aber ich muss dazu sagen, dass ich mir ein anderes Hilfsmittel gecodet habe, eine eigene Functionslibrary, mit der ich bei Bedarf alle eigenen Funktionen genau wie die hauseigegen PHP Funktionen einsetzen kann, und das jetzt noch zusätzlich in den Klassen anzuprechen wäre unnötig und unkomfortabel.

    Wenn ich das jetzt objektorientiert lösen will, würde das heißen: Ich erstelle eine Klasse user, und darin viele Funktionen.

    Genau, aber warum wenn das alles in einer Funktion zu lösen ist?

    Dann könnte ich mit $user->$age  beispielsweise das Alter erhalten, oder mit $user->$email  die E-Mail Adresse des Nutzers?

    oder mit gibAlter('email') zb.

    Könnte mir vielleicht jemand noch ein paar typische Beispiele nennen, wo man in einem Community-Script Klassen verwenden würde? Das würde mir vermutlich sehr weiterhelfen, einfach um mich auf ein paar Ideen zu bringen, wo sich OOP einsetzen lässt.

    Ja, es gibt unzählige Beispiele auf: http://www.phpclasses.org/
    wovon ich die meissten Beispiele funktionbasierend lösen würde.

    Wie gesagt, nur meine persönliche Meinung.
    Will man Job/Auftragsmässig weiterkjommen, muss man aber OOP beherrschen.
    Mike

    1. echo $begrüßung;

      Wenn ich das jetzt objektorientiert lösen will, würde das heißen: Ich erstelle eine Klasse user, und darin viele Funktionen.
      Genau, aber warum wenn das alles in einer Funktion zu lösen ist?

      Das ist es ja nicht. Es sei denn, du meinst das so, dass jede Funtionalität statt als Methode einer Klasse als eigenständige Funktion realisert werden soll. Nun, wenn mehrere Funktionen darauf spezialisiert sind, mit der gleichen Datenstruktur zusammenzuarbeiten, warum sollte man dann nicht diese Datenstruktur und die sie bearbeitenden Funktionen zu einem Gebilde zusammenfassen?

      echo "$verabschiedung $name";

  4. Hellihello

    http://framework.zend.com wird von der Firma der PHP-Entwickler betrieben in Anbetracht aller bisherigen Frameworks/Libraries, die es bis dato so gibt (Ruby on Rails, Django, CakePHP, Symfony, PEAR und all dem, was Java an gutem so vorgebracht hat).

    Ist zwar vermutlich "overdone" für Dich aber zeigt, was OOP (in PHP) bedeutet.

    Objekte bzw. Klassen haben Zuständigkeiten. Diese abzugrenzen ist der wesentliche Punkt. Plastischer wird das vermutlich, bei Destopanwendungen, weil Du da wirkliche Objekte hast, zum draggen und droppen etc. Bei Webanwendungen hast du dann eben "nur" ein Request-Objekt, ein Response-Objekt, einen Router, einen Dispatcher und ein View-Objekt.

    Zum Verständnis könnte man ruhig auch mal klassenorientiertes Programmieren sagen. Denn statische Klassenmethoden spielen ja auch eine Rolle und die Funktionen (=Zuständigkeiten) sind ja in den Klassen definiert.

    Dank und Gruß,

    frankx

    --
    tryin to multitain  - Globus = Planet != Welt