• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

Klassen

T!P-TOP

Mitglied
Ich beschäftige mich nun seit einer Weile mit OOP und nun stell ich mir die Frage wie ich das mit den Klassen machen sollte.

Also derzeit hab ich ne MySQL Klasse. 3 Methoden, natürlich die 2 bekannten magischen Methoden und eine, die mir n Query ausführt.

Hab vor, ein ganz kleines Game zu programmieren und jetzt weiß ich halt nicht, ob ich versuchen Sollte, weniger Klassen zu verwenden oder eben mehr?
Ich will jetzt ja nicht ne eigene Klasse für Statistik, Nachrichten system, Gebäude baun, login, registrieren etc. schreiben.
Sinn von OOP is ja einerseits die Wiederverwendbarkeit von Klassen.

Aber einerseits wäre das doch im Sinne von UML falsch, wenn ich da jetzt auf einmal Methoden von einer Login Klasse für die Registrierung benutze!?
Aber nun dutzende Methoden in eine Klasse zu stecken mit der ich alle Userfunktionen abdecke wäre ja auch blöd, weil das würd ja die Ladezeit enorm erhöhen!?

Wie kann man das am besten lösen?

MfG
 
Eine Klasse sollte so wenig wie möglich können. Ich bin mittlerweile dazu übergegangen, nicht von oben nach unten zu entwickeln, sondern umgekehrt. Ansonsten stehst du genau vor der Frage, die du jetzt hast.

OOP bedeutet, dass ein Objekt möglichst für eine Aufgabe zuständig ist. Wenn du aber erst überlegst, was dein Objekt am Schluss können muss, wird das schwierig, weil es ja soviel können muss.

Schau dir mal die Anzahl der Klassen in einem Java Framework, wie z.b. Spring oder struts, an. Das geht in die hunderte und du wirst kaum Klassen finden, die mehr als eine Bildschirmseite Code haben.
 
Du möchtest bestimmt deine Klassen jeweils nur einfache Aufgaben übernehmen lassen und diese vernünftig aufteilen:
Code:
<?php
namespace MyProject\Auth;
class Login { }
class Register { }
class Logout { }
Wobei die Klassen in je eine Datei kommen und von einem Autoloader geladen werden. Vielleicht möchtest du dir mal ein PHP-Framework wie Zend Framework ansehen: Zend Framework: Documentation: Zend Framework &amp; MVC Introduction - Zend Framework Manual
Da wird auch MVC erklärt.
 
Und aus was für einem Grund denkt man hier das der Java way of life gut für PHP währe? :)
 
Und aus was für einem Grund denkt man hier das der Java way of life gut für PHP währe? :)

Der "Java way of life" ist OOP. Da kann man praktisch nicht strukturiert programmieren.
Führt zwar zum Teil zu sinnlosen Auswüchsen wie statischen Methoden (ala Math.random() etc..) anstannt ganz normalen Funktionen, aber um OOP zu lernen ist Java imho ideal.
Kannst es auch den C++ way of life oder was weis ich nennen.

Wenn man nur ein bissel skripted brauch man kein OOP, aber wenn die Codezeilen in den 4,5 oder 6 stelligen Bereich wachsen behält man ohne kaum die Übersicht.
 
Naja so ganz OOP ist der Java Way of Life ja nun auch nicht. Das sieht man schon alleine daran, das Java immer noch primitive Datentypen benutzt. ;)

Der "Java way of life" ist OOP. Da kann man praktisch nicht strukturiert programmieren.
Führt zwar zum Teil zu sinnlosen Auswüchsen wie statischen Methoden (ala Math.random() etc..) anstannt ganz normalen Funktionen, aber um OOP zu lernen ist Java imho ideal.
Kannst es auch den C++ way of life oder was weis ich nennen.

Wenn man nur ein bissel skripted brauch man kein OOP, aber wenn die Codezeilen in den 4,5 oder 6 stelligen Bereich wachsen behält man ohne kaum die Übersicht.
 
Ja, das passt zu den sinnlos (?) statischen Funktionen, die Klassen im Grunde nur für Namespacing nutzen. Math.random könnte völlig problemlos auch math_random heißen (jedenfalls, wenn es Funktionen gäbe).

Java hat übrigens Objektentsprechungen für ich glaube jeden primitiven Datentyp (manchmal nützlich für Typehinting). Ich weiß allerdings aus dem Kopf nicht, ob sowas möglich ist:

Code:
Integer n = new Integer();
n.randomize();

Da ergibt es aber womöglich dann doch mehr Sinn, etwas wie Math.random als Factory aufzufassen (klingt etwas schief), die Integer-Objekte erzeugt, statt jede denkbare (etwa mathematische) Methode an eine Integer-Klasse zu heften.

Na ja, andererseits sind primitive Datentypen für mich nicht wirklich ein Grund, Java nicht als objektorientierte Sprache zu bezeichnen, aber das mag kontextbezogene Definitionssache sein.

* * *​

Um mal den Bogen zum Thread zu kriegen: Hier ging es um die Abgrenzung zu prozeduraler Programmierung. Die ist in Java definitiv gegeben, da es glaube ich nicht möglich ist, Funktionen oder Prozeduren zu definieren, sondern nur (Klassen-)Methoden.

Der Sinn von Namespaces ist es, Namenskonflikten zu vermeiden.

Zum Thema "Wieso OOP?" habe ich zufällig kürzlich auf php.de was geschrieben, das ich mal stumpf kopiere:

Funktionen sind natürlich nicht "per se" schlecht (stating the obvious, eh? ;)). OOP bringt allerdings viele Vorteile mit sich, die vor allem in umfangreicheren Projekten zum Tragen kommen.

Ich habe dazu leider keine gute Quelle griffbereit und möchte nicht mit "Buzzwords" um mich werfen, ohne sie zu erklären. Vielleicht so viel: OOP gruppiert Funktionalität in logischen Einheiten. Beim Einsatz muss (oder besser: darf) ich mich als Programmierer dann jeweils auf diejenige Funktionalität konzentrieren, die der Kontext hergibt. Ein Objekt bietet nur eine überschaubare Anzahl an Methoden an. Bei einem prozeduralen Programmierstil könnte ich theoretisch zu jedem Zeitpunkt jede Funktion mit jedem Argument aufrufen. Das wäre vor allem bei unbekanntem Code nur sehr schwer zu durchblicken. Versuche ich das bei OOP, wirft PHP automatisch aufschlussreiche Fehler (zum Beispiel bei falschen Methodenaufrufen oder falschen Objekttypen als Parametern). OOP verringert also üblicherweise durch diverse Hilfestellungen und Vorschriften die Komplexität, die der Programmierer managen muss.

Das führt zu einer Reihe an günstigen Nebeneffekten wie etwa der Vereinfachung von Teamarbeit oder der besseren Wiederverwendbarkeit von Bestandteilen eines Projekts, weil sich Abhängigkeiten wesentlich einfacher erkennen lassen, als wenn potentiell an jedem Punkt der Anwendung jede Funktion aufgerufen werden könnte.

Viele dieser Vorteile lassen sich bei rein prozeduraler Programmierung nur durch ganz extreme Disziplin (das meine ich nicht als Floskel ;)) und die Einhaltung projektspezifischer (nicht wie bei OOP allgemein standardisierter) Konventionen erreichen.

Tendentiell gilt es abzuwägen. Bei einem Umfang von "einigen Funktionen" wird sich niemand beschweren, dass der Code nicht zu überblicken ist. Aber je länger der Code wird und je weniger diszipliniert bei der Anordnung und Benennung und dem Einsatz von Funktionen vorgegangen wird, desto eher wirst du in Erklärungsnöte geraten, wenn du nicht auf OOP setzt.

Ich persönlich arbeite bei Produktionscode nahezu immer rein objektorientiert, für simple Codebeispiele oder schnell zusammengehackte Dinge halte ich mich dagegen oft an einfache Funktionen, da es in diesen Fällen oftmals keinen Sinn ergibt, Funktionalität in ein größeres Ganzes einsortieren zu wollen. Solche Entscheidungen sind aber auch subjektive Erfahrungssache.

PS: Ich bin weitgehend überzeugt davon, dass sehr gute Programmierer (wiederum keine Floskel) auch große Projekte prozedural programmieren können, ohne Nachteile zu erfahren. Aber generell empfehlen würde ich es nicht.​

* * *​

T!P-TOP schrieb:
Aber einerseits wäre das doch im Sinne von UML falsch, wenn ich da jetzt auf einmal Methoden von einer Login Klasse für die Registrierung benutze!?
Aber nun dutzende Methoden in eine Klasse zu stecken mit der ich alle Userfunktionen abdecke wäre ja auch blöd, weil das würd ja die Ladezeit enorm erhöhen!?

Ladezeit ist an der Stelle kein Argument, sondern einzig und allein die logische Unterteilung zählt.

Wenn du keinen Anfang findest, würde ich auch empfehlen, dir mal MVC anzusehen beziehungsweise deine Anwendung anhand von Gruppierungen möglicher Aktionen durchzuplanen.

Für ein Nachrichtensystem könntest du zum Beispiel die folgenden Aktionen definieren:

Code:
list   - Zeige alle Nachrichten an
show   - Zeige eine bestimmte Nachricht an
create - Erstelle eine neue Nachricht
delete - Lösche eine Nachricht

Die müssen nun irgendwie über URLs aufgerufen werden können, etwa zusammengefasst unter einem "messages"-Pfad:

Code:
http://example.org/messages/list
http://example.org/messages/show
http://example.org/messages/create
http://example.org/messages/delete

Das wäre nach MVC nun ein Controller "Messages", der über die Methoden list, show, create und delete verfügt.

Das wäre der Grundgedanke.

Edit: Ein gutes Tutorial zum Zend Framework:

- http://akrabat.com/zend-framework-tutorial/

Das mag aber alles ein wenig zu übertrieben sein für den Anfang. Na ja, angucken schadet nicht.
 
Zuletzt bearbeitet:
Zurück
Oben