OOmodelling probleempje bij bouwen van Forumpje

Pagina: 1
Acties:

  • metaal
  • Registratie: Juli 2001
  • Laatst online: 31-01-2025
Ik hoop dat jullie zin hebben om door deze lap tekst heen te lezen, maar dit lijkt me een zeer interessant probleem. Je kan proberen het eerste stuk over te slaan en gelijk beginnen met het stukje onder 'Het Probleem'.

---

Ik ben bezig een forum te bouwen in jsp. Niet omdat ik per se een forum nodig heb, maar om wat ervaring op te doen met jsp/servlets etc. Laat je niet afschrikken als je niks met jsp doet, daar ligt het probleem niet waar ik het over wil hebben.

Ik heb nu een klasse Forum gemaakt, met attributen als 'forumId', 'title' en 'description'. Om een lijstje van forums weer te geven op de startpagina heb ik de klasse ForumDAO gemaakt, met de methode 'findAll'. Die geeft een Collection terug met daarin al de forums die er bestaan. (DAO = Data Access Object, die voert alle SQL sjit uit, zodat de klasse Forum zich daarmee niet hoeft te bemoeien)

Hetzelfde verhaal geld ook voor de klasse Topic, die heeft attrubuten zoals 'topicId' en 'subject'. Om een lijstje te maken van alle topics die in een bepaald forum zitten heb ik weer een DAO - TopicDAO in dit geval dus - met een methode findByForumId() die een Collection terugspuugt met instanties van Topic die in het gevraagde forum staan.


Bij een Topic hoort natuurlijk een User (die em gepost heeft). De meest correcte manier om een lijst van topics te maken zou als volgt zijn:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
...

// int forumId = het id van het forum waar we nu een lijst
// met topics voor maken

TopicDAO topicDAO = TopicDAO.getInstance();
UserDAO userDAO = UserDAO.getInstance();

Collection topicList = topicDAO.findByForumID(forumId);
Iterator topicIterator = topicList.iterator();

while(topicIterator.hasNext()) {
    Topic topic = (Topic)topicIterator.next();
    int userId = topic.getPostUserId(); // Levert de userId op van de user die 
                                        //   het bericht geplaatst heeft
    User user = userDAO.findByUserId(userId);
    
    out.printLn("<tr>");
    out.printLn(" <td>" + topic.getSubject() + "</td>");
    out.printLn(" <td>" + user.getName() + "</td>");
    out.printLn("</tr>");
}
...


...
ok, ik hoop dat jullie nog niet slapen :)
...

Het Probleem:
Het nadeel is bij deze methode is dat voor elke onderwerp in de lijst een 'select from user' wordt uitgevoerd. Het zou natuurlijk veel sneller gaan als er in een keer een join wordt uitgevoerd op de tabbellen met de gevens voor topics en users. Maar dit levert wat mij betreft een niet helemaal "net" objectmodel op. (Waar ik aan denk is dat TopicDAO dus die join uitvoert en de klasse Topic een attribuut 'postUserName' ofzo heeft, ipv 'postUserId')


Mijn vraag aan jullie
Hoe zouden jullie dit probleem aanpakken, op de manier dat Topic een attribuut heeft met daarin gelijk de username ipv een userid, of hebben jullie een betere aanpak? Misschien een of andere constructie waarin TopicDAO en UserDAO samenwerken, en er een soort buffertje wordt bijgehouden waarin de gegevens van de join staan? Leef je uit!


---

Nog even een klein puntje voor de echt J2EE freaks: Jullie zullen mij wel willen adviseren om EJB's te gebruiken, die dit soort problemen al voor me regelen, maar ik vond in dit geval dat EJB's enzo gebruiken een beetje te vergelijken is met 'een kanon op een mug schieten'.

  • Orphix
  • Registratie: Februari 2000
  • Niet online
Soms moet je van een 'net, correct' model afstappen om de performance te waarborgen. Ik zou in dit geval 100% zeker weten door middel van een join bij elk topic direct de gebruikersnaam opvragen.
De TopicDAO zou dan een User object kunnen maken en deze als member van Topic opslaan.

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 15:49
Wat je in feite aan het doen bent, is de gegevens die als 'rijen' in de database staan in Java te encapsuleren in 'klassen'. Feitelijk bevatten ze dezelfde informatie: een topic tabel heeft kolommen voor id, poster en naam; een topic klasse heeft attributen/methoden voor id, poster en naam. Op zich een prima methode om te abstraheren van de databaseimplementatie.

Je komt in de problemen met efficientie omdat de operaties die je in de database uit kan voeren niet overeenkomen met de operaties die je in je klassenmodel kunt uitvoeren. Op de database zou je een enkele query kunnen doen die paren van topics met topicstarter oplevert, maar je hebt daar geen methode voor (en ook niet een datatype dat zo'n paar kan bevatten, trouwens).

Er zijn in principe een oneindig aantal operaties mogelijk op een database, door het gebruik van SQL. Een beperkt aantal daarvan (het opvragen van enkele rijen en de velden daarin, bijvoorbeeld) heb je al geëncapsuleert in de methoden van je klassen. Het is dus niet meer dan logisch dat als je database-operaties tegenkomt, die nog niet als methoden bestaan maar je wel nodig hebt, je daarvoor methoden toe voegt aan de geschikte klassen.

Het dilemma dat overblijft, is dan bij welke klasse de gewenste functionaliteit thuishoort. In het algemene geval kunnen we daar nog wel een tijdje over discussieren, want dat hangt maar net af van conventies die je gebruikt, de mogelijkheden van de taal waarmee je werkt, het gezichtspunt dat je het best bevalt en je persoonlijke voorkeur. In dit specifieke geval lijkt het me duidelijk dat de TopicDAO de klasse is die alle methoden die voor de gehele topic-tabel gelden beheert. Daar zou een methode die alle paren van topics en auteurs retourneert dus goed bij passen.

Ik wil trouwens opmerken dat het opbouwen van de complexere operatie uit simpelere operaties met wat eigengemaakte logica (zoals je nu doet) geen geschikte oplossing is. Niet alleen is het onnodig inefficient (zoals je zelf al zegt) maar je bent nu ook bezig met het implementeren van algoritmen die al (in geoptimaliseerde en gegarandeerd correcte vorm) in de databaseserver aanwezig zijn. Dat is zonde van de moeite. Als je toch een databaseserver ter beschikking hebt, laat die dan doen waar 'ie goed voor is. Het combineren van rijen, zoals je hier doet, is daar een uitstekend voorbeeld van.

Om een lang verhaal kort te maken: mijn advies is het toevoegen van een operatie aan de TopicDAO die de gewenste gegevens rechtstreeks bij de databaseserver ophaalt.

  • Nielsz
  • Registratie: Maart 2001
  • Niet online
Ik vindt OO programmeren trouwens al complete overhead...

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 15:49
Nielsz schreef op 01 oktober 2002 @ 15:17:
Ik vindt OO programmeren trouwens al complete overhead...
Dat vind ik een beetje een domme uitspraak. Vast staat dat het een ongenuanceerde en onbeargumenteerde uitspraak is en daar heeft niemand iets aan. Als je niets zinnigs toe te voegen hebt, onthoud je dan van commentaar, alsjeblieft.

  • Nielsz
  • Registratie: Maart 2001
  • Niet online
ik ben geen moderator. Verder zal ik zo erop in gaan..

  • metaal
  • Registratie: Juli 2001
  • Laatst online: 31-01-2025
Orphix schreef op 01 oktober 2002 @ 15:07:
Soms moet je van een 'net, correct' model afstappen om de performance te waarborgen.
Daar was ik al bang voor ;)
Ik zou in dit geval 100% zeker weten door middel van een join bij elk topic direct de gebruikersnaam opvragen.
De TopicDAO zou dan een User object kunnen maken en deze als member van Topic opslaan.
Eigenlijk is dit wel een van de beste oplossingen denk ik - nu je het voorsteld. Maar mijn probleem is dan toch nog een beetje dat TopicDAO zich bezig houd met het invullen van de velden van een User object, terwijl dat de taak zou moeten zijn van UserDAO. Maar daar is vast wel iets op te vinden in de zin van een samenwerking tussen TopicDAO en UserDAO... denk ik... (Ja, ik weet het, ik ben erg. ;) Misschien overdrijf ik het ook wel een beetje, dat gedoe met een zo 'net en correct mogelijk' model te bouwen)

  • Nielsz
  • Registratie: Maart 2001
  • Niet online
Stel dat ik een class topic heb, met een functie 'getTopic($id)'.
Deze haalt de titel op, de categorienaam, de text, de poster, het aantal reacties.

Als ik nou wil reageren op dat item, dan wil ik dus de category hebben van dat item. Nou moet ik $topic->getTopic($id) doen, om die informatie binnen te halen.
Of ik moet een functie bouwen die hetzelfde doet als de andere functie, maar wat velden weglaat. Tja, overhead....

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 15:49
Sorry :o ;)
Verder zal ik zo erop in gaan..
Voortaan liever eerst erop ingaan en dan pas posten, want dit is natuurlijk niet de bedoeling. Doet ook een beetje denken aan van die mensen die een probleem tegenkomen, hier een topic openen, en dan pas gaan proberen het op te lossen en dan dus na een half uur terugkomen met de melding dat ze de oplossing al gevonden hebben en dat iedereen die ondertussen gereageerd heeft zijn tijd heeft verspilt.

  • mulder
  • Registratie: Augustus 2001
  • Laatst online: 31-08 15:46

mulder

ik spuug op het trottoir

Nielsz schreef op 01 oktober 2002 @ 15:28:
Stel dat ik een class topic heb, met een functie 'getTopic($id)'.
Deze haalt de titel op, de categorienaam, de text, de poster, het aantal reacties.

Als ik nou wil reageren op dat item, dan wil ik dus de category hebben van dat item. Nou moet ik $topic->getTopic($id) doen, om die informatie binnen te halen.
Of ik moet een functie bouwen die hetzelfde doet als de andere functie, maar wat velden weglaat. Tja, overhead....
Fout in de implementatie dan. Get topic zou het topic moet op halen, vervolgens $topic->categorie->naam of $topic->categorie->id

oogjes open, snaveltjes dicht


  • Nielsz
  • Registratie: Maart 2001
  • Niet online
Don Facundo schreef op 01 oktober 2002 @ 15:33:
[...]


Fout in de implementatie dan. Get topic zou het topic moet op halen, vervolgens $topic->categorie->naam of $topic->categorie->id
Ik val over je 'vervolgens'.
Bedoel je dat je 3 queries moet hebben :?

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 15:49
Nielsz schreef op 01 oktober 2002 @ 15:28:
Stel dat ik een class topic heb, met een functie 'getTopic($id)'.
Deze haalt de titel op, de categorienaam, de text, de poster, het aantal reacties.

Als ik nou wil reageren op dat item, dan wil ik dus de category hebben van dat item. Nou moet ik $topic->getTopic($id) doen, om die informatie binnen te halen.
Of ik moet een functie bouwen die hetzelfde doet als de andere functie, maar wat velden weglaat. Tja, overhead....
In theorie (maar dan maak je het wel ingewikkeld) kun je een proxy instantieren, die pas de gewenste velden ophaalt als er om gevraagd wordt. In PHP is dat wel te doen met getter/setter methoden, in Perl met functies en in C/C++ door de attributen met methoden op te vragen.

Eventueel kun je de constructor vertellen welke velden je nodig gaat hebben en welke 'ie alvast mag gaan ophalen.

In de praktijk kun je prima al die velden tegelijk ophalen of een specifieke methode implementeren die alleen de categorie opvraagt (als dat echt een hele belangrijke operatie is). Je weet toch wel wat je wel en niet nodig hebt.

Dit soort dillemma's spelen trouwens ook een grote rol bij het ontwikkelen van gedistribueerde systemen (waarbij de call overhead relatief groot is). Niet onbelangrijke systemen hiervoor zijn CORBA en Java Remote Method Invocation. Als object georienteerd werken voor zo'n systeem inderdaad per definitie een grote overhead met zich mee zou brengen, dan zouden de Object Management Group en Sun zich daar waarschijnlijk niet aan gewaagd hebben.

Vaak komt het er trouwens op neer, dat een pure OO aanpak te inefficient is en er dus een compromis wordt gezocht. Vaak is de meest efficiente oplossing dan even efficient als die waarin niet OO gewerkt zou worden (al blijft er soms niet veel over van de OO aanpak). Een OO orientatie en sich hoeft dus geen probleem te zijn, al moet je weten wanneer je je moet beperken.

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 15:49
Nielsz schreef op 01 oktober 2002 @ 15:35:
Ik val over je 'vervolgens'.
Bedoel je dat je 3 queries moet hebben :?
Ik denk dat Don Facundo bedoelt dat je één keer een topic opvraagt (waarbij alle attributen worden gequeried) en vervolgens van datzelfde object verschillende attributen worden opgevraagd, die allemaal lokaal beschikbaar zijn.

Het is in 't algemeen trouwens een stuk minder inefficient om 50% extra attributen op te vragen, dan om 50% extra queries te doen.

  • metaal
  • Registratie: Juli 2001
  • Laatst online: 31-01-2025
Nielsz schreef op 01 oktober 2002 @ 15:28:
Stel dat ik een class topic heb, met een functie 'getTopic($id)'.
Deze haalt de titel op, de categorienaam, de text, de poster, het aantal reacties.

Als ik nou wil reageren op dat item, dan wil ik dus de category hebben van dat item. Nou moet ik $topic->getTopic($id) doen, om die informatie binnen te halen.
Of ik moet een functie bouwen die hetzelfde doet als de andere functie, maar wat velden weglaat. Tja, overhead....
Ik ben denk ik te vergeten te vertellen dat ik met een topic een thread bedoel, maar omdat ik mijn programma in java schrijf wil ik geen last hebben met verwarring met de klasse java.lang.Thread.

Ik neem aan dat jij met categorie zoiets bedoeld als hier 'Programming & Webscripting' is?

  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

Nielsz schreef op 01 oktober 2002 @ 15:17:
Ik vindt OO programmeren trouwens al complete overhead...
Persoonlijk vind ik ook compleet zinloos. Het feit dat je erg eenvoudig objecten kan afschermen doordat je alles kan encapsulaten heeft een goeie programmeur gewoon niet nodig. Goeie programmeurs die maken geen fouten.

Het feit dat je van objecten kan overerven is ook zinloos, want ik maak zelf wel een nieuwe record structuur aan waarin alle velden nog een keer staan. Dit bespaard me gewoon enorm veel werk.

Het feit dat je door polymorphisme op verschillende manieren tegen 1 object kan aankijken is alleen storend, want als ik er op een andere manier tegen aan had willen kijken had ik nog wel een object aangemaakt.

Ik ben het volledig met je eens dat oo zinloos is.

  • mulder
  • Registratie: Augustus 2001
  • Laatst online: 31-08 15:46

mulder

ik spuug op het trottoir

Nielsz schreef op 01 oktober 2002 @ 15:35:
[...]

Ik val over je 'vervolgens'.
Bedoel je dat je 3 queries moet hebben :?
Ja zeker, op het moment dat je categorie nodig hebt haal je het object op. (En ik tel er 2, 1 voor topic en 1 voor categorie)

oogjes open, snaveltjes dicht


  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

Ik was in mijn vorige reply dus een beetje sarcastisch ;)

Als je nou had gezegd dat het huidge oo programmeren niet anders is dan een slap aftreksel van handige features uit het functionele paradigma, een handje vol leuke type structuren vermengt met een enorme lading eigenschappen uit het ouderwetse procedurele paradigma. Wel handig is maar totaal niet vernieuwend, dan kan ik je gelijk geven dat oo inderdaad overgewardeerd is.

  • metaal
  • Registratie: Juli 2001
  • Laatst online: 31-01-2025
Alarmnummer schreef op 01 oktober 2002 @ 15:42:
[...]

Persoonlijk vind ik ook compleet zinloos. Het feit dat je erg eenvoudig objecten kan afschermen doordat je alles kan encapsulaten heeft een goeie programmeur gewoon niet nodig. Goeie programmeurs die maken geen fouten.

Het feit dat je van objecten kan overerven is ook zinloos, want ik maak zelf wel een nieuwe record structuur aan waarin alle velden nog een keer staan. Dit bespaard me gewoon enorm veel werk.

Het feit dat je door polymorphisme op verschillende manieren tegen 1 object kan aankijken is alleen storend, want als ik er op een andere manier tegen aan had willen kijken had ik nog wel een object aangemaakt.

Ik ben het volledig met je eens dat oo zinloos is.
Tja misschien dat je het persoonlijk beter en makkelijker vindt. Maar als je met een team van 20 mensen gaat werken aan een programma, dan is het heel makkelijk dat bijvoorbeeld de programmeur die zich bezig houd met de presentatie niks hoeft te weten (en ook niks mag weten) van hoe de databaseprogrammeur de boel in elkaar heeft geschroeft. En dan valt die overhead best mee.

Er zijn nog wel meer redenen, maar daar wil ik nu even niet op ingaan, its een beetje off-topic.

Verwijderd

In mijn Java forum (spam spam ;)) doe ik het zo. Ik gebruik maar twee 'data providers': BoardProvider en CategoryProvider, deze bevatten een lijst met alle aanwezige fora en categoriën, de reden dat ik gebruik maak van deze aparte objecten is omdat dit gegevens zijn die ik tussen requests door cache, maar dit terzijde.

Ik abstraheer niet volledig van de gebruikte database maar neem aan dat elke database server die het forum ooit zal gebruiken over een bepaalde SQL set beschikt die ik dan hardcode in de code. Op de Viewtopic pagina bijvoorbeeld join ik twee tabellen (messages en members). Alle member gegevens geef ik een member_ prefix (SELECT members.username AS member_username etc.). Een van de constructoren van mijn Member class (new Member(ResultSet rs, String prefix)) heb ik ingericht om ook velden met een bepaalde prefix in te kunnen lezen. Je krijgt dan zoeiets:

code:
1
2
3
4
5
6
ResultSet rs = conn.createStatement.executeQuery("JOIN bla bla");
while(rs.next()) {
   TopicMessage message = new TopicMessage(rs);
   Member member = new Member(rs, "member_");
   // ....
}


wellicht niet supermooi, maar het werkt wel prettig.

  • Nielsz
  • Registratie: Maart 2001
  • Niet online
metaal schreef op 01 oktober 2002 @ 15:39:
[...]
Ik neem aan dat jij met categorie zoiets bedoeld als hier 'Programming & Webscripting' is?
Ja, in m'n reply venster wil ik dus ook laten zien in welk categorie (in mijn project noem ik het namelijk geen forum maar een categorie ;) ) hij reageert.
Don Facundo schreef op 01 oktober 2002 @ 15:42:
[...]


Ja zeker, op het moment dat je categorie nodig hebt haal je het object op. (En ik tel er 2, 1 voor topic en 1 voor categorie)
Dus jij gaat voor een $topic->gettopic() 3 queries uitvoeren? Of ga jij een join dynamisch opbouwen? (daar zal je vast blij van worden :+ )

Echt efficient kan je dat niet noemen.
Alarmnummer schreef op 01 oktober 2002 @ 15:45:
Ik was in mijn vorige reply dus een beetje sarcastisch ;)

Als je nou had gezegd dat het huidge oo programmeren niet anders is dan een slap aftreksel van handige features uit het functionele paradigma, een handje vol leuke type structuren vermengt met een enorme lading eigenschappen uit het ouderwetse procedurele paradigma. Wel handig is maar totaal niet vernieuwend, dan kan ik je gelijk geven dat oo inderdaad overgewardeerd is.
Goh :+
Weet je wat het is? Ik hoor van iedereen dat OO zo geweldig is, maar als je er eens wat dieper naar kijkt, blijkt dat je een hoop kromme dingen moet coden om het 'OO' te houden. En JA, ik programmeer zelf ook OO, maar niet elke regel, ik heb bijvoorbeeld bij m'n topicindex gewoon ff snel een querietje neergeplant, en zo heb ik in 3 regels code m'n topiclist in beeld. Als je echt alles OO wilt hebben ben je
a) lang bezig, en
b) je programma is lang niet zo efficient.


Maar dat kan natuurlijk ook gewoon aan mijn programmeeromgeving liggen :X :D 8)7

  • razor-x
  • Registratie: Februari 2001
  • Laatst online: 05-06 07:37
Alarmnummer schreef op 01 oktober 2002 @ 15:42:
[...]

Goeie programmeurs die maken geen fouten.
Sinds wanneer is een programmeur een robot?
Iedere programmeur maakt fouten, hoe goed of slecht hij ook is

  • Nielsz
  • Registratie: Maart 2001
  • Niet online
Metaal & razor-x, het was sarcastisch ;)

  • razor-x
  • Registratie: Februari 2001
  • Laatst online: 05-06 07:37
Nielsz schreef op 01 oktober 2002 @ 15:56:
Metaal & razor-x, het was sarcastisch ;)
ooh eeh foutje

  • mulder
  • Registratie: Augustus 2001
  • Laatst online: 31-08 15:46

mulder

ik spuug op het trottoir

Goh :+
Weet je wat het is? Ik hoor van iedereen dat OO zo geweldig is, maar als je er eens wat dieper naar kijkt, blijkt dat je een hoop kromme dingen moet coden om het 'OO' te houden. En JA, ik programmeer zelf ook OO, maar niet elke regel, ik heb bijvoorbeeld bij m'n topicindex gewoon ff snel een querietje neergeplant, en zo heb ik in 3 regels code m'n topiclist in beeld. Als je echt alles OO wilt hebben ben je
a) lang bezig, en
b) je programma is lang niet zo efficient.


Maar dat kan natuurlijk ook gewoon aan mijn programmeeromgeving liggen :X :D 8)7
Het is soms idd de vraag om je niet te OO bezig bent. Ga maar eens een boel objecten serialized in je viewstate proppen :|

oogjes open, snaveltjes dicht


  • Nielsz
  • Registratie: Maart 2001
  • Niet online
Brrrr viewstate :X
Hier proppen ze rustig 18 pagina's ( 18 pagina's! ) viewstate mee, terwijl ze niet eens weten waarvoor. En maar afvragen waarom het zo traag is :D

  • Nielsz
  • Registratie: Maart 2001
  • Niet online
Het was best een leuke discussie, er zijn geen mensen meer die beweren dat 100% OO het beste is? >:)

  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

Jij komt uit de PHP hoek en daar heb je misschien een verkeerde indruk van oo opgedaan omdat daar veel features niet zijn ingebouwd (en daarom PHP dus ook niet gezien mag worden als een oo taal). Als je meer ervaring opdoet met een echte oo taal dan zul je de waarde ervan inzien en zien dat nu de php`er aan het spreken is en niet de oo`er

  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

Don Facundo schreef op 01 oktober 2002 @ 16:11:
Het is soms idd de vraag om je niet te OO bezig bent. Ga maar eens een boel objecten serialized in je viewstate proppen :|
En verder kan je oo niet veroordelen omdat er slechte oplossingen worden gekozen. Als bij het bouwen van een brug paperclips worden gebruikt ipv dikke stalen balken, wil niet zeggen dat staal een slecht materiaal is om bruggen te bouwen.

Je kan niet op basis van een verkeerde gekozen implementatie een paradigma gaan veroordelen.

  • mulder
  • Registratie: Augustus 2001
  • Laatst online: 31-08 15:46

mulder

ik spuug op het trottoir

Ik veroordeel oo helemaal niet, vind het juist geweldig, maar voor een bv dataview is soms niet echt prettig. En traag :P

oogjes open, snaveltjes dicht


  • Nielsz
  • Registratie: Maart 2001
  • Niet online
Alarmnummer schreef op 02 oktober 2002 @ 09:39:
Jij komt uit de PHP hoek en daar heb je misschien een verkeerde indruk van oo opgedaan omdat daar veel features niet zijn ingebouwd (en daarom PHP dus ook niet gezien mag worden als een oo taal). Als je meer ervaring opdoet met een echte oo taal dan zul je de waarde ervan inzien en zien dat nu de php`er aan het spreken is en niet de oo`er
Ik gebruik idd PHP het meeste, maar niet alleen PHP. Uit m'n 'opleiding' C++, en hier op m'n werk zit ik ook wat met .NET te prutsen, en daar komen in principe gewoon dezelfde dingen terug, en ik ben van mening dat mensen zich te veel op OO focussen, ipv van op het resultaat, en dus '3 weken' bezig zijn om maar een correcte oplossing te bedenken, die eigenlijk heel erg fout is, maar die alleen gemaakt wordt omdat het anders niet meer OO is.

  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

Persoonlijk vind ik databases niet echt goed aansluiten op mijn manier van denken. Voor mezelf vind ik in oo denken erg natuurlijk aanvoelen en ik wil in principe niet worden lastig gevallen met de tabellen,colommen,referende sleutels ed van de database.

Op ben op dit moment wat aan het lezen over een OR (object relationeel) mapping tool: OJB waarmee je dus op basis van een OR mapping bestand zowel db code genereerd, als een databinding framework. Een databinding framework is dus een brug tussen de database en 'normale' code. Als programmeur ben ik alleen geinteresseerd aan de normale kant van die brug en ik wil die hele db niet weer zien.

  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

Nielsz schreef op 02 oktober 2002 @ 09:59:
[...]
Ik gebruik idd PHP het meeste, maar niet alleen PHP. Uit m'n 'opleiding' C++, en hier op m'n werk zit ik ook wat met .NET te prutsen, en daar komen in principe gewoon dezelfde dingen terug, en ik ben van mening dat mensen zich te veel op OO focussen, ipv van op het resultaat, en dus '3 weken' bezig zijn om maar een correcte oplossing te bedenken, die eigenlijk heel erg fout is, maar die alleen gemaakt wordt omdat het anders niet meer OO is.
Als je meer ervaring hebt met oo dan kijk je er echt anders tegen aan. In het begin vond ik oo ook maar niets en schreef gewoon procedureel. Maar na een tijdje zie je de meerwaarde er echt van in. Het lijk me verder niet slim om hier langer op in te gaan want ik weet wat voor stijfkoppen programmeurs zijn (is er zelf namelijk ook een) je moet gewoon zelf het licht even zien.

  • Nielsz
  • Registratie: Maart 2001
  • Niet online
Het is niet zo dat ik de meerwaarde niet zie van OO, ik bedoel, ik ben zelf ook OO bezig, en als ik het niet zag, dan zou ik het niet doen. Ik heb dus zeker wel het licht gevonden, en het is ook gewoon veel beter programmeren, maar ik zie overal nog 'te veel' geluiden in de trant van: "Ja, maar als ik dit zo doe dan is het niet OO meer". Dan denk ik van, waar ben je nou mee bezig, wil je een werkend product afleveren? Of wil je een OO product afleveren, wat toevallig ook nog naar de klant moet?

  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

Het probleem aan ad-hoc oplossingen is dat ze slecht te onderhouden zijn en naar mijn mening ook vaak buggy. En verder hou ik me ook niet altijd aan strikt oo voorwaarden, maar mijn systeem is wel goed opgezet en zo gauw je ad-hoc gaat werken zul je op lange termijn voor zeer grote problemen komen te staan.

  • Nielsz
  • Registratie: Maart 2001
  • Niet online
Naja, ik zal de bewuste regels eens in OO gooien (weer classes bouwen :z ), en kijken of ik het dan met je eens ben :P

  • metaal
  • Registratie: Juli 2001
  • Laatst online: 31-01-2025
Jammer dat deze discussie niet meer gaat waarover ik hem had gestart, maar ik wil toch even een reactie geven:


Even wat argumentjes:
Alarmnummer schreef op 01 oktober 2002 @ 15:42:
Persoonlijk vind ik ook compleet zinloos. Het feit dat je erg eenvoudig objecten kan afschermen doordat je alles kan encapsulaten heeft een goeie programmeur gewoon niet nodig. Goeie programmeurs die maken geen fouten.
Encapsulation is niet verzonnen omdat programmeurs zo slecht zijn, maar om een paar redenen.
Een daarvan is bijvoorbeeld dat het algoritme achter een klasse doodleuk compleet veranderd kan worden, zonder dat de mensen die die klasse gebruiken ook maar iets hoeven te veranderen aan hun programma.
Verder maakt het je het leven als programmeur een STUK makkelijker. Je krijgt alleen maar de dingen te zien die je echt nodig hebt.
Het feit dat je van objecten kan overerven is ook zinloos, want ik maak zelf wel een nieuwe record structuur aan waarin alle velden nog een keer staan. Dit bespaard me gewoon enorm veel werk.
Dat snap ik nou niet helemaal. Jij beweert dus dat alle velden van een recordstructuur (en dan ook namen zo nodig aanpassen e.d.) veel minder werk is dan ff intikken: "class MijnClass extends EenAndereClass"?

Overigens, bij het overerven worden niet alleen datastructuren, maar ook de functies die op die datastructuur van toepassing zijn overgeerft.
Stel dat jij al een klasse User hebt gemaakt voor je forum, en opeens komt er iemand op je af: "Hey, kan jij ook een forum maken voor mijn site van mijn bandje? Ik zou ook graag bij elke gebruiker vermeld willen hebben welk instrument elk lid op het forum speelt"
Dan lijkt het me een koud kunstje om even een "class BandLid extends User" te maken. Je hoeft je oude klasse (User) niet aan te passen, zodat je hem gewoon kan blijven gebruiken op je eigen forum, en je hoeft niet heel de zwik over te nemen om de nieuwe klasse te kunnen maken. En dan nu nog het grootste voordeel: Je kan gewoon tegen die gozer zeggen (die een stuk minder van jou code weet dan jij natuurlijk): maak die BandLid klasse lekker zelf maar.
Het feit dat je door polymorphisme op verschillende manieren tegen 1 object kan aankijken is alleen storend, want als ik er op een andere manier tegen aan had willen kijken had ik nog wel een object aangemaakt.
Polymorphisme zorgt er misschien juist voor dat de gebruiker van bepaalde klasse minder verward wordt: neem nou bijvoorbeeld de klasse TopicDAO. Jij dacht dat je direct tegen die klasse loopt aan te lullen als je bijvoorbeeld topicDAO.findByForumId() uitvoert. Not dus, de methode TopicDAO.getInstance() wordt opzettelijk gebruikt i.p.v. topicDAO = new TopicDAO().
De methode getInstance() zoekt een geschikte driverklasse op in een configfile, en maakt daar een nieuwe instantie van aan. Uiteindelijk wordt de methode findByForumId() uitgevoerd door de klasse CloudScapeTopicDAO (subklasse van TopicDAO), maar daar hoef je gelukkig niets van te weten, anders was het al lang veelste ingewikkeld geworden.


Verder wil ik zeggen dat ik dit forum niet OO maak omdat ik vindt dat OO programming het helemaal is. Ik denk dat OO heel belangrijk is op het moment dat je een groote applicatie gaat maken. De ontwikkeling van een programma zou gewoonweg niet meer beheerbaar zijn zonder OO technieken te gebruiken. Je hebt idd wel een beetje overhead als je OO bezig bent, maar dat is tegenwoordig te verwaarlozen.

  • corani
  • Registratie: December 2000
  • Laatst online: 05-10-2017

corani

__,,,_(^_^)_,,,__

Als je niet al te veel users in die database hebt staan, kun je ze natuurlijk ook allemaal in één keer inlezen als je je UserDAO maakt.. Dan heb je niet de overhead van x SQL aanroepen.

Maar ik heb niet het idee dat die x SQL aanroepen een probleem zijn? Ik bedoel, je vraagt toch niet alle topics in één keer op, in één grote lijst? Want dat zet je toch niet in één keer op het scherm. Je zet er maar een bepaald aantal neer, en dan lijkt me die extra overhead niet echt een groot probleem...

Laat me nou toch eens met rust man!
Iedereen die in telekinese gelooft, steek a.u.b. mijn hand op


  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

Je hebt helemaal gelijk ;)

Maar als je even goed had gekeken had je gezien dat ik de 3 kenmerken van oo proggen noemde en mijn afkraken was bedoelt als een 'reverse psychology' aanpak om oo te promoten :)

Lees anders mijn reply daarna nog maar eens :)

  • metaal
  • Registratie: Juli 2001
  • Laatst online: 31-01-2025
Alarmnummer schreef op 02 oktober 2002 @ 12:16:
Je hebt helemaal gelijk ;)

Maar als je even goed had gekeken had je gezien dat ik de 3 kenmerken van oo proggen noemde en mijn afkraken was bedoelt als een 'reverse psychology' aanpak om oo te promoten :)

Lees anders mijn reply daarna nog maar eens :)
Sorry, ik had het misschien idd iets anders moeten aanpakken, maar ik kon die drie argumenten van jou in dat ene bericht zo mooi gebruiken om even uit te leggen wat voor mij de reden is om OO programming te gebruiken. Maar ik had je reacties al wel gelezen (al was het idd niet aan mijn reactie te merken)
Pagina: 1