Halihallo Andreas
Auf jeden Fall langsamer? - OK, 1 Milisekunde, aber höchstens. Langsam wird's erst, wenn man's nicht richtig programmiert ;)
OK, hatt ich nnur mal gehört, vielleicht täusche ich mich.
Nö, es ist leider oftmals die Standard-Antwort auf die Frage "Warum OOP und wie schaut's mit der Performance aus". Aber ich muss sagen, dass das nicht die feinste Antwort ist. Besser wäre: "Ja, OOP ist vielleicht etwas langsamer, obwohl das meist auf eine falsche Implementation zurückzuführen ist; aber schliesslich überwiegen die Vorteile vom schönen OOP-Style"...
Ach so! Also ich sage dann in auf der Warenkorbseite selbst nur Warenkorb=>hinzufügen(oder wie man das schreibt), und das bleibt dann natürlich immer gleich. Aber die Ausgabe ist immer noch dasselbe Problem! Wenn ich den Warenkorb anzeige, brauche ich ja eine SQl-Abfrage in der Warenorb Datei,
eben nicht! - Das soll ja eben vermieden werden. Ich werde dir nachfolgend mal ein kleines pseudo-Beispiel dazu machen.
ist eigentlich egal wo die steht, denn für das generieren einer Tabelle in einer Schleife brauche ich dann immer die speziellen Felder $warenkorb["preis"] und da kann ich Output und Funktionalität schon wieder nicht trennen, oder gibt es auch bei der html-Ausgabe eine Möglichkeit, das mit einer, vielleicht einer eigenen Klasse zu trennen? Aber wie?
Wäre möglich, würd ich aber nicht empfehlen. Die Klassen-methoden würden sich etwa auf folgende beschränken:
new
output_start (z. B. titel oder links ausgeben)
output_items (alle warenkorbinhalte ausgeben; ruft für jeden inhalt
output_item auf)
output_item (gibt den Inhalt eines Warenkorb-items aus z. B. "article_id: 15" oder "Anzahl: 17", "Preis: 30 EUR")
output_end (z. B. "falls sie noch fragen haben: ...")
Aber vielleicht habe ich ja noch ein allgemeinerers Verständnis-Problem mit OOP ;-)
Hm. Vielleicht können wir das ja beheben; ich liebe (und das musste ich auch zuerst lernen) nämlich OOP ;)
Naja, anscheinend kannst Du immer genau das, was ich gerade können will, sehr lustig ;-) Aber vielen Dank für Deine Antworten, lese ich immer sehr gerne, und das kommt letzte Zeit sehr oft vor!
Wohl wahr. Ich muss zugeben, dass mich deine Probleme auch immer interessieren (weil ich immer eine Antwort darauf weiss???) ;)
Aber vielleicht nochma, zurück zu Eunsatzmöglichkeiten von Klassen, am Beispiel des Onlineshops, z.B. habe ich eine Produktseite, Wo bestimmte Daten zu einem Produkt ausgelesen und angezeigt werden, udn dazu eine Tabelle mit allen möglichen Varrianten, Preisen... ich würde jetzt einfach drauflos programmieren, hätte immer einzelnde Schleifen... im ode stehem für die Tabellen... siehst Du bei sowas auch irgendwie eine Möglichhkeit Klassen zu verwenden? Wie ist das, Klassen zu kombinieren, hatte ich mal von gehört, aber nicht nicht wirklich verstanden :-)
so, jetzt rück ich mal mit einem Beispiel heraus:
Klasse User:
- new (das nennt man den Konstruktor)
- getName
- getCart (gibt eine Instanz der Klasse Cart zurück)
Klasse Cart:
- new
- getCartItems (gibt eine Instanz der Klasse CartItems zurück)
- getUser (gibt die Parent-Klasse (also User) zurück)
- getTotalPrice (iteriert über alle CartItems und berechnet den gesamtpreis)
Klasse CartItems:
- new
- getLength (wieviele Items haben wir denn im Warenkorb?)
- item( $i ) (gibt die Instanz der Klasse CartItem zurück, welche auf CartItemID $i zeigt [wahrscheinlich hast du in der Datenbank eine ID für jedes Warenkorbelement (CartItem) ] )
Klasse CartItem:
- new
- getArticle
- getCount (Anzahl bestellter Artikel)
- getPrice
Klasse Article:
- new
- getArticleID (eg. 17-9845-03)
- getName (eg. "Sony CD-R, 700MB, grün")
So, nun zum Hauptprogramm:
print "<h1> Ihr Warenkorb </h1>";
$user = new User( $UserID );
$cart = $user->getCart;
$cartitems = $cart->getCartItems;
for ( $i=0; $i < $cartitems->getLength; $i++ ) {
$cartitem = $cartitems->item( $i );
print "Artikelname: " . $cartitem->getArticle->getName;
print "Bestellnummer: " . $cartitem->getArticle->getArticleID;
print "Anzahl: " . $cartitem->getCount;
print "Preis: " . $cartitem->getPrice;
}
print "Totalpreis: " . $cart->getTotalPrice;
jetzt zur Methode getTotalPrice der Klasse Cart:
sub getTotalPrice {
my ($self) = @_; # sorry, ist eben Perl, $self o. ä
# gibt's auch in php (evtl. heisst das dort $this)
$cartitems = $self->getCartItems;
$tot_price = 0;
for ( $i=0; $i < $cartitems->getLength; $i++ ) {
$item = $cartitems->item( $i );
$tot_price += $item->getPrice;
}
return $tot_price;
}
Und jetzt sag mir, wo du je einen SQL-query gesehen hast? - du brauchst ihn lediglich für die Methoden, welche irgendwelche Daten aus der Datenbank lesen (z. B. getPrice oder getArticleID). Alles andere ist vollständig über Klassen/Methoden gemacht. Vorteil??? - Nun, das Interface dieser Methoden ist sehr allgemein gehalten und wird wohl in jeder Warenkorb-Umsetzung etwa das selbe sein (und das wird's auch noch in 1000 Jahren), aber dein Datenbankschema könnte wechseln, ja, du könntest sogar entscheiden nun ganz auf eine mysql-Datenbank zu verzichten und lieber alles in XML zu speichern. Das ist keine Problem, du musst einfach einige Methoden ändern, alles andere (z. B. eben die Hauptdateien zum Anzeigen des Warenkorbes), gleibt _genau_ gleich. Du musst dich beim Umstieg auf XML _kein bisschen_ um die GUI Programme kümmern (da du alle Daten über die Klassen holst).
Das meinte ich mit dem Trennen von Ausgabe und Funktionalität und hier liegt der Vorteil der OOP Programmierung...
Ich hoffe, dass du verstanden hast, worum es mir geht und wo ich die Vorteile des schönen OOP-Programmierens sehe...
Viele Grüsse
Philipp