Hallo mensen,

Kort vraagje over wat jullie denken wat netter/beter is.
Ben bezig met een nieuws systeem in OOP. Nou heb ik een abstracte klasse 'Message' (zodat deze niet geinitialiseerd kan worden) deze wordt overorven door 2 andere klassen. 'ServerMessage' en 'ClientMessage'.

ServerMessage staat voor het bericht wat al in de database staat. Deze bevat dan onder andere methodes om de tabel waardes in een klasse te krijgen.

ClientMessage staat voor een bericht wat moet worden toegevoegd aan de database. Deze bevat oa. een methode om het bericht toe te voegen in de database.


Mijn vraag is dus of dit een juiste manier is om OOP te gebruiken of zouden jullie gewoon alle methodes in 1 'Message' klasse proppen, en met bijvoorbeeld een boolean controleren of het bericht al in de database is gevoegd?

Hier nog even een tekeningtje van de klasse structuur.
voor de duidelijkheid 'Message' is abstract omdat er geen instantie van gemaakt mag worden. De constructor van 'ServerMessage' is protected omdat er alleen via een statische methode een instantie van mag worden gemaakt.


Plaatje: http://img28.picoodle.com/img/img28/3/8/13/f_messageclasm_2516b49.jpg
Mij lijkt het niet echt een goeie aanpak. Wat verschilt de ServerMessage nu van de ClientMessage? In mijn ogen is een Message een Message. Of die wel of niet in de database staat zou niet uit mogen maken. De Message heeft hoe dan ook een user en een inhoud. En een uniek id, al is dat nog niet toegewezen aan de nog-niet-opgeslagen Message.

Zelf zou ik Message gewoon een algemene definitie laten zijn van een Message, welke verder op geen manier afhankelijk is van andere klassen. De Message staat op zichzelf en kan voor vanalles, waar toepasselijk, gebruikt worden.

Daarnaast maak je een MessageStore, een klasse die de instanties van alle Messages beheert en opslaat en uit de database trekt. Deze heeft bijvoorbeeld 2 methods, MessageStore::put(Message $message) en MessageStore::findMessageById(int $id), waarbij de eerste een message kan opslaan (INSERT of UPDATE afhankelijk van of $message al een id heeft) en de tweede instanties kan terughalen.

Op deze manier koppel je de klasse Message helemaal los van de manier van opslaan. Stel dat je een tweede opslagbron voor Messages wilt hebben, bijvoorbeeld een XML service, dan hoef je alleen maar een nieuwe MessageStore te maken. En het leuke is dat de Message-instanties die ze beiden gebruiken universeel zijn. Het is immers een en dezelfde klasse. Messages worden dus per definitie onderling uitwisselbaar. Als laatste hoef je alleen bij het aanmaken van de Store te bepalen welke opslagmethode er wordt gebruikt. De rest van je code is volledig onafhankelijk van hoe er met je Messages wordt omgesprongen achter de schermen ervan uitgaande dat de API van alle Stores gelijk is.

edit: Zie voor een voorbeeld m'n laatste post in dit topic
Leerzame post :) dankje wel, hier kan ik wat mee.

Reageren