kostenloser Webspace werbefrei: lima-city


Classen-Struktur-Logik

lima-cityForumProgrammiersprachenPHP, MySQL & .htaccess

  1. Autor dieses Themas

    programtools

    programtools hat kostenlosen Webspace.

    Hi,
    in PHP durch Klassen Ordnung und Struktur einzubringen und eine gewisse OOP zu haben ist mE. sinnvoll.

    Allerdings habe ich eine kleine Logik-Hürde zu bewältigen, ich versuch emal ein Beispiel zu geben:

    Ich habe Bilder (Class: Image - repräsentiert ein Bild) und Benutzer (Class: User - repräsentiert einen Benutzer).

    Szenario: User möchte einem bild folgen, klickt also den 'follow' Button des bildes.

    Hat nun die Klasse des Users eine Methode 'User->follorImage($Image)', der das Bild übergeben wird dem der Benutzer folgt? Demnsach wüsste der Benutzer bzw. die den Benutzer repräsentierende Instand der User-Class welchen Bildern der User folgt.

    Oder würde eher dem Bild der Benutzer als 'Follower' zugewiesen, also hätte die Image-Class eine Methode 'addFollower($User)', somit wüsste ein Bild im falle einer Aktualisierung des Statusses welche Benutzer ihm folgen und wer informiert werden müsste.

    Oder wird es beiden zugewiesen? Wie würdet Ihr ein solches 'Problem' lösen?

    Die Datenbank wäre ja so aufgebaut:
    Tabelle: User (id | name ...)
    Tabelle: Images (id | src ...)
    Tabelle: Images_follower (id | user_id | image_id )

    Vielen Dank für Ideen oder Erfahrungen!

    Grüße


    Beitrag zuletzt geändert: 27.5.2014 1:04:05 von programtools
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. ich versuche mal hier in rahmen zu bleiben, weil die thematik ihn über allen grenzen sprengt.
    programtools schrieb:
    … Szenario: User möchte einem bild folgen, klickt also den 'follow' Button des bildes …
    ist mein favorit (die begründung später).

    Oder würde eher dem Bild der Benutzer als 'Follower' zugewiesen, also hätte die Image-Class eine Methode 'addFollower($User)', somit wüsste ein Bild im falle einer Aktualisierung des Statusses welche Benutzer ihm folgen und wer informiert werden müsste.
    und das hier scheint für mich obskur zu sein.

    Oder wird es beiden zugewiesen?
    was ja unbegründbare redundaz wäre.

    begründung
    ein wichtiger grundprinzip in der oo* ist: so wenig wie möglich und so viel wie nötig (gilt allerdings für alle arten von programmierungstechniken).
    aus dem folgt: ein objekt sollte nur eigenschaften und funktionen haben, die ein echtes objekt auch aufweist. demnach kann in meinem oo*-welt (also die dinge als nachahmungen aus der realen welt) nur der betrachter ein bild folgen, aber das bild kann den betrachter, der es folgt, nicht über die änderung von sich selbst unterrichten. bilder haben keine - wie auch immer geartete - funktionen. sie haben nur eigenschaften (künstlername, entstehungsdatum, -land, sujet …). jetzt könnte aber jemand einwerfen: 'ja, aber bilder erzeugen gefühle und gedanken, das wäre dann eine funktion des bildes'. dann muss ich leider sagen, dass sie (bilder/gefühle) in menschen entstehen und der urheber das auge-gehirn combo ist, das offensichtlich die implizite funktion hat, aus bildinhalte gedanken und gefühle zu erzeugen. das gehört allerdings in andere wissenschaftzweige [biologie, semiotik]).

    natürlich die andere (zweite) lösung von dir ist auch denkbar, aber ich vote aus obiger begründung für die erste.

    die entscheidung liegt klar bei dir. um sie am besten zu treffen, solltest dich dringend in die literatur etwas gründlicher einlesen (lohnt sich für die zukunft deines programmes: verständlichkeit, wartbarkeit …), daher hier noch eine kurze zusammenfassung von all den wichtigsten oo*-dingen:

    die OO* familie besteht aus
    1. OOA object oriented analyse
    2. OOD o. o. design
    1 u. 2 sind manchmal zusammengefasst unter OOAD oder OOA&D (vor allem in UML-dunstkreis)
    3. OOP o. o. programming

    google ergebnisse ohne zusatz und mit 'site:de' (als quasi-statistik von bekanntheitgrad)
    OOA   (   693.000;  88.000)
    OOD   (33.600.000; 284.000)
    OOAD  (   573.000;  13.300)
    OOA&D (    87.200;   2.910)
    OOP   ( 5.430.000; 125.000)

    p.s.: aus meiner sicht hast du also kein oop, sonder ein ooa u./o. ood problem!

    Beitrag zuletzt geändert: 28.5.2014 18:31:59 von czibere
  4. Autor dieses Themas

    programtools

    programtools hat kostenlosen Webspace.

    czibere schrieb:
    p.s.: aus meiner sicht hast du also kein oop, sonder ein ooa u./o. ood problem!


    Stimt, und vielen Dank für deine gute Ausführung.

    Ich stimme zu, Variante 1) ist auch für mich die logischere.

    Angenommen jedoch, das Bild hat nicht nur getter sondern auch setter, kann zB. als "Bild der Woche" ausgezeichnet werden. Jetzt brauche ich eine Liste der Follower, die das Bild-Object ja aber nicht kennt.

    Wie löse ich das nun, oder macht eine 3. Klasse Sinn? Soll ja nach wie vor 'schlank' und überschaubar bleiben!

    Ich kann natürlich dem Bild einfach die Methode "getFolllower" geben, welche dann auf die DB zugreift.
    Frage ist halt, ob das nicht etwas zu unsauber ist, weil ja der Bezug zwischen den Objecten nicht ganz da ist, dafür eben auf Datenbank-ebene.

    Wie du ja bereits gesagt hast, redundanzen sollen in jedem fall vermieden werden!

    LG und nochmals vielen Dank!!

  5. programtools schrieb:
    ... Wie löse ich das nun, oder macht eine 3. Klasse Sinn? ...
    natürlich. und nicht nur, sonder auch eine 4. in deinem fall:
    class user2image extends image und
    calss image2user extends user
    oder du arbeitest mit aggregierten classen, was noch dazu den vorteil hat, dass wenn die funktion fertig ist, die eventuell riesige datenmengen automatisch verschwinden aus dem speicher.
  6. Autor dieses Themas

    programtools

    programtools hat kostenlosen Webspace.

    czibere schrieb:
    natürlich. und nicht nur, sonder auch eine 4.


    Okay, also soll ich quasi die DB-Struktur in meinen Objecten auch abbilden?

    Macht an sich Sinn, so ganz verstehe ich aber noch nicht, wie die logische Struktur sein soll.
    Um beim Beispiel zu bleiben, ich möchte das Bild ($image ^= Instanz der Image-Class) in den Bild der Woche status setzen:

    $image->makeImageOfTheWeek();


    Jetzt müsste ich ja noch seperat alle Follower benachrichtigen...
    (Angenomen getFollower() würde ein Array mit den Followern (Instanzen der User-Class) zurückgeben)

    $imus = new Image2User();
    $follower = $imus->getFollower();
    foreach($follower as $user){
       $user->notice("Das bild dem du folgst ist Bild der Woche...");
    }


    Wäre es aber nicht sinnvoller das direkt in $image->makeImageOfTheWeek(); zu erledigen?
    Oder irre ich mich da?

    Sind die "Erweiterungen" der Klasen doch sinnvoll, weil ich gewisse Methoden (Funktionalität) ja nicht bei jedem Image 'mitschleppen' will?

    Was genau meinst du mit aggregierten classen? Hab da mal was mit __get() gelesen und das Prinzip ist ja, dass die Daten nicht sofort beim Initialisieren (__construct) geladen werden sondern erst wenn benötigt oder? Aber diese image2user Classe würde doch schon dafür sorgen, dass die Instanz nur wenn nötig erschaffen wird, d.h. können die Daten auch gleich geladen werden... oder?

    Liebe Grüße und vielen Dank für deine Hilfe!!

    Beitrag zuletzt geändert: 29.5.2014 0:58:45 von programtools
  7. (sorry! ich habe außer meinem job noch 2 weingärten und einen gemüsegarten. die dulden keine vernachlässigung!)

    programtools schrieb:
    czibere schrieb:
    natürlich. und nicht nur, sonder auch eine 4.
    Okay, also soll ich quasi die DB-Struktur in meinen Objecten auch abbilden?
    unbedingt.

    ... Um beim Beispiel zu bleiben, ich möchte das Bild ($image ^= Instanz der Image-Class) in den Bild der Woche status setzen:
    $image->makeImageOfTheWeek();
    für mich kann das bild sich logischerweise nicht auszeichnen, daher:
    $user->decorateImage($imageID)


    Jetzt müsste ich ja noch seperat alle Follower benachrichtigen...
    (Angenomen getFollower() würde ein Array mit den Followern (Instanzen der User-Class) zurückgeben)
    $imus = new Image2User();
    $follower = $imus->getFollower();
    foreach($follower as $user){
       $user->notice("Das bild dem du folgst ist Bild der Woche...");
    }
    Wäre es aber nicht sinnvoller das direkt in $image->makeImageOfTheWeek(); zu erledigen?
    Oder irre ich mich da?
    dazu gibt es sogar ein ziemlich exaktes beispiel: observer.
    auf der seite des authors(, oder aber auch hier, bekommt man weitere php-feinheiten serviert).

    ... Was genau meinst du mit aggregierten classen? ..., dass die Instanz nur wenn nötig erschaffen wird, d.h. können die Daten auch gleich geladen werden... oder?
    wozu daten im speicher zu halten, die nur beding u/o. temporär gebraucht werden?
    aggregieren:
    class CUser {
    	// ...
    	
    	public function observe() {
    		$img = new CImage([$userID]); // aggregierte klasse
    		foreach(...) {
    			// hier sammelst die benötigten daten
    			$this->imagesOfTheWeek[] = $img->...;
    		}
    	}	// nach verlassen von observe() ist $img (instance of CImage) zerstört,
    	    // speicher freigegeben.
    }
    du hast jetzt eig. verschiedene möglichkeiten, was dir gefällt kann ich ja nicht sagen ;) eins ist sicher, ich würde der klasse CImage keine einzige funktion verpassen.

    Beitrag zuletzt geändert: 6.6.2014 5:26:34 von czibere
  8. Autor dieses Themas

    programtools

    programtools hat kostenlosen Webspace.

    czibere schrieb:
    (sorry! ich habe außer meinem job noch 2 weingärten und einen gemüsegarten. die dulden keine vernachlässigung!)


    Kein Problem, ich war selbst die letzten Tage verhindert ;)


    czibere schrieb:

    ... Um beim Beispiel zu bleiben, ich möchte das Bild ($image ^= Instanz der Image-Class) in den Bild der Woche status setzen:
    $image->makeImageOfTheWeek();
    für mich kann das bild sich logischerweise nicht auszeichnen, daher:
    $user->decorateImage($imageID)




    In dem Fall würde ich aber doch eine User Klasse erweitern, da die Methode 'decorateImage' ja nicht standartmäßig für User bereitsteht sondern speziell in meinem Projekt, oder?

    Und eine User2Image Classe wäre ja garnicht notwendig, soweit ich das sehe?

    Das allgemeine Problem liegt stark darin, dass eben Klassen ideal eigenständig sind (nach meinem Verständniss), aber natürlich eine gewisse vernetzung und Übergreifung unabdingbar ist.

    Vielen Dank dir auf jeden Fall!!

    Grüße
  9. programtools schrieb:
    ..., da die Methode 'decorateImage' ja nicht standartmäßig für User bereitsteht sondern speziell in meinem Projekt, oder?
    das verstehe ich nicht so richtig. also nach meinem geschmack sollte jeder user die methode standardmäßig haben, dass er ja ungehindert images in den besagten status versetzen kann.
    Und eine User2Image Classe wäre ja garnicht notwendig, soweit ich das sehe?
    das war auch nur ein gedanke, was man eventuell ins aug fassen könnte. wenn du es willst, könnte ich in deinen code reinsehen um überhaupt ein bild von deinem vorhaben zu erlangen. dafür solltest ihn als .zip o. .bz2 irgendwo mal zurverfügung stellen.

    Beitrag zuletzt geändert: 22.6.2014 2:02:41 von czibere
  10. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!