[Alg/O-R(/PHP5)] wijzigingen in een collectie doorvoeren

Pagina: 1
Acties:

  • Michali
  • Registratie: Juli 2002
  • Laatst online: 22-03 18:12
Ik ben van plan voor een nieuwe project eerst mijn O-R framework te herschrijven. Voor het bijhouden van een collectie van objecten in een parent object heb ik nu een speciaal collectie object geschreven die wijzigingen direct doorvoert en dus de bewerkingen gelijk van kracht laat zijn op de database. Dit wil ik weg werken zodat ik met collecties kan doen wat ik wil.

Ik wil gewoon een plain array hebben waarin ik nieuwe items kan stoppen en waaruit ik ze ook gewoon weer weg kan halen. Als ik dan voor het object aangeef dat de wijzigingen opgeslagen moeten worden, dan wil aan de kant van de data access layer dus bekijken wat er allemaal is uitgevoert met die array en hoe dit moet worden doorgevoert als acties richting de database.

Nu weet ik alleen niet goed hoe ik dit voor elkaar moet krijgen. Ik weet toevallig dat hibernate ook zoiets ondersteund, maar hoe dat werkt weet ik niet. Ik zou bij het laden van een collectie een kopie van de array bewaren en dan achteraf vergelijken met de eventueel gewijzigde. Dat lijkt me echter ook niet de meest zuivere en performance bewuste methode.

Heeft iemand dit wel eens geprobeerd? Ik ben wel benieuwd naar ideeen hierover. Het hoeft trouwens niet persé in php te zijn. Ik hoef in princiepe helemaal geen code te zien, het gaat meer om het idee er achter, dat zou toepasbaar moeten zijn in meerdere talen.

Noushka's Magnificent Dream | Unity


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 15-04 22:07

NMe

Quia Ego Sic Dico.

Michali schreef op vrijdag 01 april 2005 @ 15:27:
Nu weet ik alleen niet goed hoe ik dit voor elkaar moet krijgen. Ik weet toevallig dat hibernate ook zoiets ondersteund, maar hoe dat werkt weet ik niet. Ik zou bij het laden van een collectie een kopie van de array bewaren en dan achteraf vergelijken met de eventueel gewijzigde. Dat lijkt me echter ook niet de meest zuivere en performance bewuste methode.
Ik zal alleen op dit punt reageren omdat ik de rest niet begrijp (of er gewoon geen verstand van heb :P). Als je nou in je array bijhoudt wanneer iets voor het laatst gewijzigd is, dan hoef je niet het hele array te kopiëren, maar alleen die wijzigingstijden. Dat klinkt me een stuk zuiniger in de oren wat betreft geheugengebruik. :)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • Michali
  • Registratie: Juli 2002
  • Laatst online: 22-03 18:12
-NMe- schreef op vrijdag 01 april 2005 @ 15:58:
[...]

Ik zal alleen op dit punt reageren omdat ik de rest niet begrijp (of er gewoon geen verstand van heb :P). Als je nou in je array bijhoudt wanneer iets voor het laatst gewijzigd is, dan hoef je niet het hele array te kopiëren, maar alleen die wijzigingstijden. Dat klinkt me een stuk zuiniger in de oren wat betreft geheugengebruik. :)
Dat is juist wat ik wil voorkomen. Met zulke acties ligt die verantwoordelijkheid dan toch weer bij degene die de array gebruikt. Ik wil dit 100% transparant doen. Ik zal het nog eens beter proberen uit te leggen.

Het gaat eigenlijk dus om 2 lagen, de business logica/domein laag en de data acces laag. In de domein laag kan bijvoorbeeld een class Customer zitten welke een collectie Orders kan bevatten. Bij het ophalen van een Customer uit de database wordt automatisch een array opgehaalt met Orders (behalve bij een lazy load, maar dat is niet van belang hier) welke dan aan de Customer gegeven wordt. Nu wil ik dus dat als er bijvoorbeeld een Order aan de array is toegevoegt dat deze wijziging automatisch wordt doorgevoerd als het object de opdracht krijgt zich weer op te slaan. Dit moet echter volledig onafhankelijk van de Customer class zijn, het enige wat de customer doet is de array weer terug geven waarop dan een controle uitgevoerd moet worden om te kijken of er iets gewijzigd is.

Pseudo code ter voorbeeld:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
class Customer
{
  private orders = array

  public function setOrders(orders) { ... }

  public function getOrders() { ... }

  public function addOrder(order) { ... }

  public function removeOrder(order) { ... }
}

class Order
...

class CustomerMapper
{
  public function get(id)
  {
    // select sql query
    customer = new Customer();
    // vul gegevens in uit de record set via set methodes
    orders = Persistence.getRelated('Order', customer); // retourneert een array met orders
    customer.setOrders(orders);
    // sla de status van de array orders op
    return customer;
  }

  public function update(customer)
  {
    // update sql query
    orders = customer.getOrders();
    // controleer hier of wijzigingen zijn aangebracht en
    // verwijder relaties of maak ze aan op basis van deze controle
  }
}


Ik hoop dat het zo iets duidelijker is.

edit:

he ik zie dat je een modje bent geworden, feli man :) (of is het een 1 april grap :P )

[ Voor 6% gewijzigd door Michali op 01-04-2005 16:20 ]

Noushka's Magnificent Dream | Unity


  • Michali
  • Registratie: Juli 2002
  • Laatst online: 22-03 18:12
Ik ga het toch maar oplossen met een kopie van die array en daarmee vergelijken. Na een potje denken lijkt me dat toch niet zoveel problemen geven en gaat het de performance ook niet veel beinvloeden. Als ik een array met object namelijk toewijs aan een andere variabel die als kopie moet fungeren, dan wordt dit automatisch een array met referenties naar dezelfde objecten. Dat moet dus niet zo veel problemen geven.

Mischien dat iemand er nog een leuk idee over heeft?

Noushka's Magnificent Dream | Unity


  • Mithrandir
  • Registratie: Januari 2001
  • Laatst online: 08-05 11:43
Wat je zou kunnen doen is in plaats van een gewone array te gebruiken, er een soort van wrapper class omheen maken.

Die wrapper class krijgt dan dus functies als 'editRow', 'deleteRow', enzovoorts. Misschien wel niet zo netjes (je moet namelijk iedere access naar dat array herschrijven), maar wel heel zeker.

Wat gebeurt er bijvoorbeeld als je zo'n array gaat (her)sorten? Ik hoop voor je dat je dan niet opeens alle rows in je database gaat updaten :o

Verbouwing


Verwijderd

Nou heb ik geen ervaring met PHP5, dus of dat daar ook kan weet ik niet, maar kan je array niet subclassen? Dan kan je geheel transparant bijhouden wat er verandert.

  • Michali
  • Registratie: Juli 2002
  • Laatst online: 22-03 18:12
Mithrandir schreef op zondag 03 april 2005 @ 10:52:
Wat je zou kunnen doen is in plaats van een gewone array te gebruiken, er een soort van wrapper class omheen maken.

Die wrapper class krijgt dan dus functies als 'editRow', 'deleteRow', enzovoorts. Misschien wel niet zo netjes (je moet namelijk iedere access naar dat array herschrijven), maar wel heel zeker.
Dat zou ik best willen doen, maar dan vallen toch een hoop php functies af. Ik wil dit toch echt graag los houden van de domein laag. Dit is dus eigenlijk wat ik al heb zo ongeveer.
Wat gebeurt er bijvoorbeeld als je zo'n array gaat (her)sorten? Ik hoop voor je dat je dan niet opeens alle rows in je database gaat updaten :o
Dat sorteren maakt niets uit. Ik ga namelijk voor ieder item na of hij in de kopie (het orgineel dus) voorkomt, als dat niet zo is, dan moet een item toegevoegt worden. Per item unset ik dan de overeen komende in de kopie. Als er dan nog items overblijven betekent dat dat die verwijderd moeten worden, omdat deze niet meer voorkwamen in de bewerkte versie.
Verwijderd schreef op zondag 03 april 2005 @ 10:52:
Nou heb ik geen ervaring met PHP5, dus of dat daar ook kan weet ik niet, maar kan je array niet subclassen? Dan kan je geheel transparant bijhouden wat er verandert.
array is geen object helaas, maar Mithrandir zijn oplossing zou wel kunnen.

offtopic:
lol, 2 dagen geen reactie en dan ineens twee dezelfde minuut

[ Voor 3% gewijzigd door Michali op 03-04-2005 10:59 ]

Noushka's Magnificent Dream | Unity


  • ludo
  • Registratie: Oktober 2000
  • Laatst online: 01-03 18:17
Michali schreef op zondag 03 april 2005 @ 10:58:
array is geen object helaas, maar Mithrandir zijn oplossing zou wel kunnen.
Misschien moet je eens naar de SPL (Standard PHP Library) kijken. Hierin zit onder andere een ArrayObject die je makkelijk kunt extenden :)

[edit]Zie ook dit artikel Introducing PHP 5's Standard Library

[ Voor 16% gewijzigd door ludo op 03-04-2005 11:34 ]


  • Michali
  • Registratie: Juli 2002
  • Laatst online: 22-03 18:12
ludo schreef op zondag 03 april 2005 @ 11:32:
[...]
Misschien moet je eens naar de SPL (Standard PHP Library) kijken. Hierin zit onder andere een ArrayObject die je makkelijk kunt extenden :)

[edit]Zie ook dit artikel Introducing PHP 5's Standard Library
Thanks! Dat valt zeker te overwegen. Ik ga er eens goed naar kijken.

Noushka's Magnificent Dream | Unity

Pagina: 1