Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[PHP] Real-life OOP -> poll

Pagina: 1
Acties:
  • 172 views sinds 30-01-2008
  • Reageer

  • SH4D3H
  • Registratie: Juni 2004
  • Laatst online: 04-10 13:25
Goedemiddag heren (en dames ;)),

Inleiding
Ik ben al enige tijd bezig met het leren over en beoefenen van object georiënteerd programmeren.
Binnenkort is het de bedoeling dat ik met een aantal anderen ga samenwerken aan een groot project, maar door gebrek aan real-life voorbeelden in (bijna) alle boeken vraag ik me af of ik wel op de goede weg ben en ik de boel niet ga verprutsen door het totaal verkeerd te doen.

Voorbeelden
De voorbeelden in de boeken zijn vrijwel altijd slecht.
Niet slecht van kwaliteit, hoewel sommige dat wel zijn, maar slecht qua gekozen voorbeelden.
Om een aantal voorbeelden te noemen, de klassen: auto, gebouw, hond, etc …
Als het dan om inheritance gaat krijg je vage voorbeelden als: dier->vogel, dier->kat, etc …
Komt er eens een real-life voorbeeld is het een MySQL klasse of iets dergelijks.

Vraag
Mijn vraag is dan ook het maken van een real-life klasse die een poll gaat voorstellen.
De keuze voor de poll lijkt me wel een leuke en toch niet echt ingewikkeld.

Database
Even vier simpele databasetabellen:
polls met de velden id, vraag, datum
answers met de velden id, antwoord
poll_answers met de velden poll_id, answer_id
votes met de velden id, antwoord_id, datum, ip

Uitwerking
Er komt een klasse poll die een aantal answers heeft en elk answer heeft een aantal votes.
De meesten kunnen zoiets vast wel visualiseren, dus geef ik een voorbeeld van hoe zo'n ding wordt weergegeven:
PHP:
1
2
3
4
5
6
7
$poll = new Poll($id);
echo '<h1>' . $poll->getQuestion() . '</h1>';
echo '<ul>';
foreach( $poll->getAnswers() as $answer )
   // echo $answer roept ofc. de toString() function aan :)
   echo '<li>' . $answer . '(' . $answer->countVotes() . ')</li>';
echo '</ul>';

De structuur is dus (onderstreept zijn de klassen):
poll
- aantal vars
- answers
-- aantal vars
-- votes

Zouden jullie dit ook zo doen?
Of is er een veel betere manier?
De answers klasse zou op deze manier bijvoorbeeld wel 10000 klassen votes kunnen bevatten...

  • BikkelZ
  • Registratie: Januari 2000
  • Laatst online: 24-11 23:24

BikkelZ

CMD+Z

Hoofdklasse is natuurlijk poll. Functies:

- showPoll($voted = true) --> laat de poll zien (standaard alleen resultaat laten zien, dat is veiliger)
- vote($id) --> vote op answer met die id

Verder nog een array met als index de answerID

Answer is ook een klasse. Functies:

- getVotes() --> aantal votes wat gegeven is
- getAnswer() --> antwoord retourneren
- vote() --> functie die de vote opslaat

Verder is een bezoeker altijd een klasse, maar dat is op framework niveau het liefste. Die moet samenwerken met showPoll() en vote() om er voor te zorgen dat die controle er is. Soms bieden frameworks (Zend) je ook redelijk eenvoudige interfaces om dat soort userrechten dingetjes mooi af te vangen.

vote() is een actie die tot resultaat heeft dat de int votes ++ doet, geen tastbaar element. Tenzij je, net zoals een tastbaar stembriefje, je op de een of andere manier nog wil weten van welke persoon deze afkomstig is. Kan me niet voorstellen wat het is verder, maar ik zou het dan alsnog alleen op databaseniveau opslaan.

[ Voor 19% gewijzigd door BikkelZ op 10-09-2007 14:35 ]

iOS developer


  • Grijze Vos
  • Registratie: December 2002
  • Laatst online: 28-02 22:17
Je kunt met 1 tabel minder doen. Poll en Answers hebben eigenlijk een 1:n relatie, nu implementeer je een n:n relatie.

Ok, je krijgt wel dat antwoord "yes" meerdere entries heeft in je answers tabel, maar ik heb zelf nog geen nut gezien in het re-usen van answers. Is sowieso vervelend mocht je het antwoord willen editen (nuanceren) na aanmaken van de poll.
Je klasse structuur reflecteert dit ook overigens.

Verder zit je klasse structuur m.i. wel goed in elkaar, maar het is dan ook een uitermate klein en niet zo spannend voorbeeld.

[ Voor 20% gewijzigd door Grijze Vos op 10-09-2007 14:55 ]

Op zoek naar een nieuwe collega, .NET webdev, voornamelijk productontwikkeling. DM voor meer info


  • BikkelZ
  • Registratie: Januari 2000
  • Laatst online: 24-11 23:24

BikkelZ

CMD+Z

Grijze Vos schreef op maandag 10 september 2007 @ 14:53:
Je kunt met 1 tabel minder doen. Poll en Answers hebben eigenlijk een 1:n relatie, nu implementeer je een n:n relatie.
Inderdaad.
Grijze Vos schreef op maandag 10 september 2007 @ 14:53:Verder zit je klasse structuur m.i. wel goed in elkaar, maar het is dan ook een uitermate klein en niet zo spannend voorbeeld.
Waar ga je de klasse Votes dan voor gebruiken?

iOS developer


  • SH4D3H
  • Registratie: Juni 2004
  • Laatst online: 04-10 13:25
Grijze Vos schreef op maandag 10 september 2007 @ 14:53:
Je kunt met 1 tabel minder doen. Poll en Answers hebben eigenlijk een 1:n relatie, nu implementeer je een n:n relatie.
Zou inderdaad ook kunnen, behalve als je veel Ja/Nee/Misschien polls hebt ofzo.
Verder zit je klasse structuur m.i. wel goed in elkaar, maar het is dan ook een uitermate klein en niet zo spannend voorbeeld.
Heb je een suggestie voor iets beters dan?

Verwijderd

[didactisch]
Wat is een 'hoofdklasse'?
[/didactisch]

  • BikkelZ
  • Registratie: Januari 2000
  • Laatst online: 24-11 23:24

BikkelZ

CMD+Z

Verwijderd schreef op maandag 10 september 2007 @ 15:12:
[...]

[didactisch]
Wat is een 'hoofdklasse'?
[/didactisch]
RTFM http://fi.wikipedia.org/wiki/Hoofdklasse |:( :X }:O

Maar hoe noem jij zoiets dan?

iOS developer


Verwijderd

BikkelZ schreef op maandag 10 september 2007 @ 14:32:
Hoofdklasse is natuurlijk poll. Functies:

- showPoll($voted = true) --> laat de poll zien (standaard alleen resultaat laten zien, dat is veiliger)
Bedoel je dat die showPoll alle html eruitgooit? dan lijkt me de gescheiden opzet van de TS beter, hoef je niet in je poll code te duiken als je een andere opmaak wilt en kun je veel makkelijker je poll code tussen verschillende sites en verschillende opmaken sharen.

  • mOrPhie
  • Registratie: September 2000
  • Laatst online: 21-11 07:55

mOrPhie

❤️❤️❤️❤️🤍

SH4D3H schreef op maandag 10 september 2007 @ 15:04:
[...]

Zou inderdaad ook kunnen, behalve als je veel Ja/Nee/Misschien polls hebt ofzo.
Dus je gaat answers hergebruiken over verschillende polls? Daar zou ik echt niet aan beginnen. Afgezien van dat het een onbeheersbaar geheel wordt (standaard antwoorden komen echt minder voor dan je denkt) is het nergens voor nodig. Normalisatie kan ook te ver gaan. :)

Een answer (Answer->id) aan de vote is in dit geval de betere optie imho. :)

Een experimentele community-site: https://technobabblenerdtalk.nl/. DM voor invite code.


  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 30-11 11:35

Janoz

Moderator Devschuur®

!litemod

Pollantwoorden zou ik zeker niet gaan hergebruiken. Gewoon een 1:n relatie tussen poll's en antwoorden. Ook een showPoll methode zou ik niet implementeren. Het stukje php code wat je in je startpost neergezet hebt is heerlijk clean-e viewcode die je het liefst niet gemekt wil hebben met je businesslogic.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • BikkelZ
  • Registratie: Januari 2000
  • Laatst online: 24-11 23:24

BikkelZ

CMD+Z

Verwijderd schreef op maandag 10 september 2007 @ 15:33:
[...]

Bedoel je dat die showPoll alle html eruitgooit? dan lijkt me de gescheiden opzet van de TS beter, hoef je niet in je poll code te duiken als je een andere opmaak wilt en kun je veel makkelijker je poll code tussen verschillende sites en verschillende opmaken sharen.
Ja het hangt er ook helemaal van af hoe de rest van je framework er om heen er uit gaat zien. Als je via MVC gaat werken dan heb je weer een andere indeling. In een PollView zou ik natuurlijk weer wel code zetten. Dit is natuurlijk wel redelijk simpel spul, waar je geen drastische HTML opmaak in zet maar wel een karkas waar je wat CSS tegen aan gooit.

iOS developer


  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 30-11 11:35

Janoz

Moderator Devschuur®

!litemod

Dit topic lijkt (oa) mij beter passen in SEA.

*kick*

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • SH4D3H
  • Registratie: Juni 2004
  • Laatst online: 04-10 13:25
SH4D3H schreef op maandag 10 september 2007 @ 14:24:
De answers klasse zou op deze manier bijvoorbeeld wel 10000 klassen votes kunnen bevatten...
Hier zit ik dan vooral nog mee.
Heeft het wel nut om in de answers klasse een of meer instanties te hebben van een Votes klasse?
Ik bedoel, wat boeit het die Poll nu (of Answer) wie er wanneer gevote heeft?
Het gaat er slechts om DAT er gevote is.

Daarom ben ik, afgezien van die n:n relatie die eigenlijk overdone is :+, hier nog niet helemaal klaar mee.
Ook een showPoll methode zou ik niet implementeren. Het stukje php code wat je in je startpost neergezet hebt is heerlijk clean-e viewcode die je het liefst niet gemekt wil hebben met je businesslogic.
Nee, dat was het plan ook niet.
Gewoon alleen businesslogic, de rest boeit, iig voor dit topic, niet.

[ Voor 22% gewijzigd door SH4D3H op 10-09-2007 15:54 ]


  • BikkelZ
  • Registratie: Januari 2000
  • Laatst online: 24-11 23:24

BikkelZ

CMD+Z

SH4D3H schreef op maandag 10 september 2007 @ 15:52:
[...]

Hier zit ik dan vooral nog mee.
Heeft het wel nut om in de answers klasse een of meer instanties te hebben van een Votes klasse?
Ik bedoel, wat boeit het die Poll nu (of Answer) wie er wanneer gevote heeft?
Het gaat er slechts om DAT er gevote is.

Daarom ben ik, afgezien van die n:n relatie die eigenlijk overdone is :+, hier nog niet helemaal klaar mee.
Zou jij voor de klasse Bankrekening ook nog de klasse Euro en Eurocent maken? Wat is het verschil tussen de ene euro en de andere? Wat wil je nog meer weten behalve hoe veel het er zijn?

De klasse Vote zou pas nut hebben als er met de individuele vote nog wat gedaan wordt. Stel dat je een poll in een topic hebt, waarbij bij iedere poster vermeld staat wat en of die poster gevote heeft in de poll, dan heeft via die route een klasse Vote eventueel nog wel nut, anders niet.

iOS developer


  • SH4D3H
  • Registratie: Juni 2004
  • Laatst online: 04-10 13:25
BikkelZ schreef op maandag 10 september 2007 @ 15:58:
[...]
Zou jij voor de klasse Bankrekening ook nog de klasse Euro en Eurocent maken? Wat is het verschil tussen de ene euro en de andere? Wat wil je nog meer weten behalve hoe veel het er zijn?
Nee.
De klasse Vote zou pas nut hebben als er met de individuele vote nog wat gedaan wordt. Stel dat je een poll in een topic hebt, waarbij bij iedere poster vermeld staat wat en of die poster gevote heeft in de poll, dan heeft via die route een klasse Vote eventueel nog wel nut, anders niet.
De klasse vote kan wordt aangemaakt en gesaved als er gevote wordt en op die manier kan er gekeken worden wie wat gevote heeft?
Of is een klasse Vote dan per definitie een slechte keus?

  • frickY
  • Registratie: Juli 2001
  • Laatst online: 27-11 09:24
Waarom is een answer geen object?
Een standaard answer object die voor elk mogelijk answer inherit wordt naar gelang het antwoord?
PHP:
1
2
3
4
5
6
7
8
9
class antwoord() {
  var $antwoord;
  function vote() {
  }
}
$antwoord1 = new antwoord;
$antwoord1->antwoord = "ja";
$antwoord2 = new antwoord;
$antwoord2->antwoord = "nee";


Zelfde voor votes, en de stelling. Hoe ver wil je gaan?
In je huidige opzet is je klasse slechts een verzameling functies. Is dit wel een goed praktijk-voorbeeld?

[ Voor 14% gewijzigd door frickY op 10-09-2007 16:19 ]


  • BikkelZ
  • Registratie: Januari 2000
  • Laatst online: 24-11 23:24

BikkelZ

CMD+Z

SH4D3H schreef op maandag 10 september 2007 @ 16:10:
De klasse vote kan wordt aangemaakt en gesaved als er gevote wordt en op die manier kan er gekeken worden wie wat gevote heeft?
Of is een klasse Vote dan per definitie een slechte keus?
Ik bekijk het echt puur vanuit het perspectief dat het een poll is waar je op kunt voten en als je er op gevote hebt (of niet ingelogd bent en niet mag voten bijvoorbeeld) je de resultaten ziet. Huis-tuin-en-keuken poll dus.

- Je User klasse gaat een soort interactie aan met je Poll klasse om te kijken of er gevote mag worden
- Je Poll klasse kan kijken of die ingelogde User toevallig al een vote voor deze poll in de database achter gelaten heeft

Je hebt wel een verschil tussen je database en je klassediagram, maar dat is helemaal niet erg. Ook op db-niveau bestaat een vote uit niet meer dan een user_id en een answer_id, voorzien van een timestampje. Meer een koppeltabel dan wat anders.

iOS developer


  • SH4D3H
  • Registratie: Juni 2004
  • Laatst online: 04-10 13:25
frickY schreef op maandag 10 september 2007 @ 16:17:
Waarom is een answer geen object?
Een answer is wel een object?

  • Grijze Vos
  • Registratie: December 2002
  • Laatst online: 28-02 22:17
BikkelZ schreef op maandag 10 september 2007 @ 14:59:
[...]

Waar ga je de klasse Votes dan voor gebruiken?
Als je je votes koppelt aan je users zou je een monitoring functie kunnen bouwen ermee. De vraag is of je dat wilt, maar nergens wordt gezegd dat voting anoniem moet zijn. ;)

Of misschien wil je je votes gaan gebruiken in je forum ofzo. En dan mag in bepaalde topics een user pas voten als hij gepost heeft in het topic, dan is het fijn om een $poll->UserHasVoted($userid) te kunnen implementeren. Die methode kan dan itereren over de votes ofzo.

[ Voor 28% gewijzigd door Grijze Vos op 10-09-2007 16:48 ]

Op zoek naar een nieuwe collega, .NET webdev, voornamelijk productontwikkeling. DM voor meer info

Pagina: 1