Antworten auf deine Fragen:
Neues Thema erstellen

Welche Methode ist besser, bzw. ist logischer ? Probleme mit Klassen !

MrManko

Nicht mehr ganz neu hier

Hi @ all,

Ich habe ein kleines, denkerisches Problem bei der Planung meines Projektes. Just by the way: Ich arbeite das erste mal mit Klassen und versuche alles was ich über OOP gelernt habe in dieses Übungsporjekt einfließen zu lassen.

Doch zu meinem eigentlichen Problem. Bei dem Übungsprojekt handelt es sich um einen kleinen popeligen Blog, der keinen höheren Sinn hat, ausser das gelernte anzuwenden.

Ein Blog hat ja wie das nunmal so ist Artikel. Diese Artikel sehe ich als Objekt an. In meinem Klassendiagramm sieht es folgendermaßen aus:

+----------------+
+ Artikel_Class +
+----------------+
+ - autor +
+ - datum +
+ - inhalt +
+ - usw... +
+----------------+
+ new_article() +
+ del_article() +
+ update_article() +
+----------------+

So, doch nun ist meine Frage: Macht diese Klasse überhaupt Sinn, denn alle Informationen die ich zu einem Artikel habe, liegen ja in meiner Datenbank, auf die kann ich mit einer Datenbankklasse zugreifen und alle Inforamtionen per SQL auslesen und diese dann mit meiner Array Klasse zwischenspeicher, ich bräuchte also gar kein Objekt der Artikel klasse.

Hier ein fiktives Beispiel, vllt versteht ihr mich dann besser:

PHP:
<?php
    // Der ganze include Kram für die Klassen

    $sql = new Query();
    $res = $sql->doQuery("SQL_CODE");

    $arr = new Arr('artikel_arr');

    foreach($res as $value) {
        $arr->fill_arr('text', $value['text']);
        $arr->fill_arr('autor', $value['autor']);
        // usw...
    }
?>
Das Array, das ich erzeuge wird dann später von einer Template Engine entgegen genommen.

Also, macht die Artikel Klasse überhaupt sinn ? Ist es im Sinne der OOP besser immer wieder ein neues Objekt von der Klasse Artikel zu erzeugen , die Eigenschaften zu setzen um sie dann direkt wieder auszulesen ? Aus meiner Sicht ist das sinnlos und Ressourcenverschwendung ? Was ist eure Meinung dazu ???

MfG
MrManko
 

saila

Moderatorle

AW: Welche Methode ist besser, bzw. ist logischer ? Probleme mit Klassen !

Naja, das Problem ergibt sich dadurch, dass du im Grunde Blogsätze mit Userdaten zusammenwürfelst.

Im Grunde müssten für eine Blog-App. die Klassen:
db,
session-management
user,
blog,
images

Es würde sich ggf. anbieten, jede Klasse an die db-Klasse anzuhängen (extends). Wichtig dabei sind dann allerdings die Sichbarkeiten korrekt zu vergeben!
 

MrManko

Nicht mehr ganz neu hier

AW: Welche Methode ist besser, bzw. ist logischer ? Probleme mit Klassen !

Okay, verstehe ich, aber macht Vererbung Sinn ? Ein Blog ist keine Datenbank, das wäre ja als würde in der Natur ein Nilpferd einen Hund gebären und Nilpferdeigenschaften an den Hund weitergeben.

Um in anderen Klassen MySQL Queries loszulassen könnte ich auch jeweils in den einzelnen Klassen Objekte von der MySQL Klasse erzeugen, das macht aus meiner Sicht mehr Sinn.

Ein anderer Gedanke, der mir gerade kam ist: Ich könnte in der Klasse Artikel eine Methode definieren, die mir entweder einen einzelnen oder Alle Artikel zurückgibt und diese Informationen dann in einem Array auffangen.

Sprich die SQL Anweisungen von der Klasse Artikel ausführen zu lassen.

Ich habe das Gefühl ich drehe mich im Kreise, was OOP angeht. Gibt es dort überhaupt ein richtig oder falsch, oder ist das worüber ich mir gerade Gedanken mache nur eine Stilfrage ?

MfG MrManko
 

saila

Moderatorle

AW: Welche Methode ist besser, bzw. ist logischer ? Probleme mit Klassen !

Hmm - ein richtig gibt es und ein falsch gibt es sicherlich auch :)

Stilfragen gibt es neben richtig oder falsch natürlich auch und ist in den meisten Fällen auch ein Streitfrage.

Die vererbung ist dir noch nicht so in gänze klar (wobei es keine Vererbung sein muss). Es würde auch reichen, das das inizialisierte Obje (db) in die jeweilige Klasse zu übergeben.
Warum - weil du letztlich innerhalb der jeweiligen Klassen auch ausschl. diese Arbeiten zur Klassenbenennung abwickelst. Die db-Klasse oder auch session-Klasse sind zwar je nach Projekt sehr wichtig, stellen jedoch in letzter Linie eine Art Helfer-Klasse dar. Diese haben oder hat lediglich die Aufgabe den Transport von und zur Datenspeicherung abzuwickeln. Gleiches gilt für die session-Klasse. soll lediglich helfen, die Daten solange der User aktiv ist eben zur Verfügung zu stellen.

Primäre Klassen sind da wiederum user und blog.

Und um den Kreis der Verwirrung zu schliessen - stellt wiederum jede Klasse eine Helfer-Klasse dar. Wichtig ist lediglich, das man im Sinne der OO arbeitet. Da dies nun ausschliesslich das Objekt selbst betrifft (db, user, session, blog, usw.) sollte man also entsprechend das ganze auch aufbereiten.
 

MrManko

Nicht mehr ganz neu hier

AW: Welche Methode ist besser, bzw. ist logischer ? Probleme mit Klassen !

Ich glaube ich beginne langsam zu verstehen. Also ist es gar nicht so falsch, die Klassen DB und Session in der Klasse Artikel zu instanzieren (frei nach dem Motto $this->mysql = new query;)

Wenn dies im Sinne der OOP ist (Es sind ja nach deinen lehrreichen Beitrag Helferklassen) ist es auch gar nicht mehr abwegig die MySQL Queries in methoden der Klasse Artikel ablaufen zu lassen. Dieses Ergebnis nimmt dann mein Hauptskript entgegen schreibt es in ein anderes Array um und löscht das tempöräre MySQL array.

Ist dieser Gedankengang nun korrekter ?

Erstmal vielen herzlichen Dank für deine Hilfe =) Ich frage mich mittlerweile wie oft du mir schon geholfen hast, saila ^^

Mfg
MrManko
 

Duddle

Posting-Frequenz: 14µHz

AW: Welche Methode ist besser, bzw. ist logischer ? Probleme mit Klassen !

Ich beziehe mich mal etwas weniger auf deine Frage, sondern will nur einen allgemeinen Tipp zur Denkweise mit Klassen geben:
Ein Vorteil der OOP ist die damit verbundene Modularisierung deiner Anwendung. Anstatt alles miteinander zu vermischen, trennst du Zuständigkeiten auf und arbeitest nur gegen die Schnittstellen der Klassen.

Beispiel:
Deine Artikel-Klasse sollte so geschrieben werden, dass sie ausschliesslich für einen Artikel steht, entsprechende Funktionalität nach aussen anbietet und möglichst wiederverwendbar ist. Wenn du in 2 Jahren nochmal eine andere Anwendung schreibst, die auch Artikel verwendet (muss ja kein Blog sein), kannst du im Idealfall deine alte Artikel-Klasse ohne Veränderung übernehmen.

Was aber, wenn diese ein oder zwei neue Funktionen braucht? Dann hättest du ja mehrere Artikel-Klassen, die sich nur leicht unterscheiden. Soetwas ruft direkt nach Vererbung: Deine neue Artikel-Klasse könnte dann ein Spezialfall (Kindklasse) der alten Artikel-Klasse sein. Deine neue Hauptanwendung kann dann ohne Probleme gegen die Schnittstellen der alten Artikel-Klasse arbeiten und verliert keine Funktionalität.

Um das mit den Schnittstellen nochmal zu verdeutlichen, noch ein verwandtes Beispiel: sagen wir, deine Artikel-Klasse erstellt ihren eigenen Content über eine nach aussen verfügbare Methode (bei dir wohl new_article()?). Dabei muss sie natürlich irgendwelche Layout-Sachen berücksichtigen (z.B. hat jeder Artikel eine fettgeschriebene Überschrift, eine kursives Erstellungsdatum, usw.). Anstatt nun also innerhalb von new_article() die entsprechenden Formatierungen durchzuführen, sollte diese Aufgabe an eine dafür zuständige Klasse weitergereicht werden, nennen wir sie Layout.

Da es verschiedene Layout-Formate gibt, aber jedes Layout letztlich irgendwelchen Content entsprechend auszeichnen soll, sollte diese Funktion definitiv von jeder Layout-Unterklasse angeboten werden. Also sollten sie jeweils ein Layout-Interface implementieren, damit man sofort sieht, dass diese jeweilige Klasse eine ganz bestimmte Funktion anbietet.

Sagen wir, es gibt ein Layout namens SummerBlogLayout. Jetzt willst du aber nicht die gesamte Anwendung durchforsten nach "new SummerBlogLayout()", falls du statt SummerBlogLayout das neue WinterBlogLayout benutzen willst. Also sollte die Entscheidung, welches Layout gerade als aktuelle BlogLayout-Klasse gilt, wieder delegiert werden. In der Regel macht man sowas über eine Klasse, die Factory / Fabrik genannt wird, die das passende Layout zurückgibt.
Schau dir mal folgenden Code an:

PHP:
$layoutGenerator = new LayoutGenerator();
$bloglayout = $layoutGenerator->createLayout('blog');
$article = new Article();
$article->setLayout($bloglayout);
$article->new_article();
...
//Auszug aus Article
private $layout;
private $content = "{{h1}}Hello, World{{/h1}}"; //ausgedachtes Template-System
function setLayout(Layout $l) {
  $this->layout = $l;
}
function new_article() {
  echo $this->layout->styleContent($this->content);
}
...
//Auszug aus LayoutGenerator
function createLayout($layoutName) {
  switch($layoutName) {
    case "impressum":
      return new ImpressLayout();
      break;
    case "blog":
/*
hier ist die einzige Stelle im Code, 
an der SummerBlogLayout zu WinterBlogLayout geändert werden müsste
*/
      return new SummerBlogLayout(); 
      break;
    default:
      return new DefaultLayout();
  }
}
Ich hoffe, das Beispiel gut genug gewählt zu haben, um die Auftrennung von Zuständigkeiten klarer zu machen.

Sehr relevant ist hier übrigens das Thema der Entwurfsmuster, in denen solche sehr oft wiederkommenden Probleme mit bewährten Schablonen gelöst werden (u.a. auch das oben benutzte Factory-Muster).


Duddle
 
Zuletzt bearbeitet:

MrManko

Nicht mehr ganz neu hier

AW: Welche Methode ist besser, bzw. ist logischer ? Probleme mit Klassen !

@ Duddle

Ich kann deinem Beispiel in großen Teilen folgen und habe es auch mehr schlecht als recht verstanden, was aber wohl daran liegt, das ich Informatik nicht mehr in der Schule belegen kann/darf (scheiß Schulsystem NRW) und ich mir das jetzt alles mühselig selbst beibringe. Kannst du mir da vielleicht noch ein einfacheres Beispiel liefern ?

@ all

Ich habe mein Problem nun versucht folgendermaßen zu lösen:
Ich habe ein Interface DB das die Schnittstellen für jede Datenbankklasse die DB implementiert festlegt (sei es nun Postgre oder MySQL).

Diese MySQL Helferklasse binde ich dann in meiner Artikel Klasse ein, frei nach dem Motto:
PHP:
  $this->sql = new MySQL;
Dann habe ich in der Artikelklasse eine Methode, die mir z.B. alle Artikel aus der Datenbank auslesen kann und diese dann als Array zurückliefert.

Diesen Rückgabewert möchte ich in einer TemplateEngine auffangen und dann schlussendlich wenn alle Operation erfolgreich abgelaufen sind auf dem Bildschirm ausgeben.

Habe ich nun das zusammenspiel von Klassen etwas besser begriffen? Ist dieser Gedankgang OO und vorallem, halt ich mich an die Wiederverwndbarkeit und Erweiterbarkeit ??

Fragen über Fragen ...

MrManko
 
Bilder bitte hier hochladen und danach über das Bild-Icon (Direktlink vorher kopieren) platzieren.
Antworten auf deine Fragen:
Neues Thema erstellen

Willkommen auf PSD-Tutorials.de

In unseren Foren vernetzt du dich mit anderen Personen, um dich rund um die Themen Fotografie, Grafik, Gestaltung, Bildbearbeitung und 3D auszutauschen. Außerdem schalten wir für dich regelmäßig kostenlose Inhalte frei. Liebe Grüße senden dir die PSD-Gründer Stefan und Matthias Petri aus Waren an der Müritz. Hier erfährst du mehr über uns.

Stefan und Matthias Petri von PSD-Tutorials.de

Nächster neuer Gratisinhalt

03
Stunden
:
:
25
Minuten
:
:
19
Sekunden

Flatrate für Tutorials, Assets, Vorlagen

Zurzeit aktive Besucher

Statistik des Forums

Themen
118.565
Beiträge
1.538.067
Mitglieder
67.488
Neuestes Mitglied
Andrew56524
Oben