Results 1 to 8 of 8

Thread: OO Programming

  1. #1

    Question OO Programming

    Dag Allemaal,

    Graag had ik wat advies gekregen van ervaren OOP.

    Stel ik heb een database met klanten,
    In mijn applicatie heb ik een object Order die op zijn beurt een object klant omvat.
    Wanneer ik nu een klant wil toekennen aan een order kan ik dit op veschillende manier doen. Wat is echter de beste methode?

    1) Via een zoekscherm met alle klanten :
    ik kies een klant en via de dataset waar ik in zocht, alle gegevens van mijn klantobject invullen.

    2) in mijn order opbject een procedure gebruiken :
    updateklant(klantnummer : integer;klant : TKlant);
    die dan op zijn beurt in mijn datamodule het klantobject via een query opvult

    3) in mijn klantobject een procedure gebruiken :
    updateklant(klantnummer : integer);
    die op zijn beurt in mijn datamodule de gegevenvens over de gezochte klant ophaalt en dan in mijn procedure van het klantobject toekent aan de attributen van
    dit klant object.

    Er zijn nog mogelijkheden, maar kort komt het erop neer of het goed is om in een object query's, tabellen, ... aan te spreken dan wel het veiliger is om het object zelf door te geven aan bv. een datamodule die op zijn beurt het object opvult...

    Wie kan er mij wat advies geven?

    Groeten RUBEN

  2. #2
    Beste Ruben,

    De objecten die jij wilt gaan gebruiken, zal je waarschijnlijk hoofdzakkelijk gebruiken om gegevens uit een tabel in op te slaan. In dit soort situaties is het verstandiger om via een datamodule de objecten te vullen. Dit houdt deze entiteiten klein en simpel.

    Marcel Vroone

  3. #3
    Toch zou je juist dan je datamodules als business objects moeten zien. Je hebt een object klant en een object order. De objecten zijn zelf verantwoordelijk voor het uitvoeren van de business rules: waar moet de data aan voldoen, wanneer mag een regel worden verwijderd...enz.

    De betreffende klant is in dit geval een eigenschap van de order en wordt dus bij de order opgeslagen. Nadat de klant is ingevoerd en gevalideerd door het klant object kan zijn ID worden ingevuld bij een order. In principe hoeft het orderobject niets meer met de klant te doen, die is tenslotte al gevalideerd. Tenzij een klant aan specifieke regels moet voldoen voordat hij een order kan plaatsen. De regel die je dan hanteerd is dat de eigenschappen van de klant komen, maar de controle bij de order.

    Dat wordt wat vaag, dus laat ik een voorbeeld geven. Bij een klant zijn altijd de volgende gegevens verplicht: Naam, Adres, Postcode, Woonplaats. Pas als een klant daadwerkelijk een order wil plaatsen moeten we over zijn KVK nummer beschikken. De validatie van klant ziet er dan als volgt uit:

    Code:
    if Naam.IsNull  then
      raise Exception.Create('Een vriendelijke melding');
    
    if Adres.IsNull  then
      raise Exception.Create('Een vriendelijke melding');
    
    enz..
    Er mag best een klant worden opgeslagen zonder KVK nummer, daar gaan we dus nog niet op controleren. Als er een order wordt geplaatst wordt het een ander verhaal, dan moet er bij de klant meer worden ingevuld. In de validatie van de ordergegevens zou dan komen staan:

    Code:
    if not VarIsEmpty(KlantID.NewValue) then
    begin
      Klant := TKlant.Create(self);
      try
        Klant.FindID(KlantID.NewValue);
    
        if Klant.KVKNummer.IsNull then
          raise Exception('KVK nummer klant is nog niet bekend');
      finally
        Klant.Free;
      end;
    Dus: het zoeken van de klant en het retourneren van een KVKNummer is een verantwoordelijkheid van het Klant object het geven van een foutmelding is een verantwoordelijkheid van het Order object.

    Ruben: om op je eerste punt terug te komen (zoekscherm), dat is een kwestie van user-interface en moet dus helemaal los staan van de object implementatie. Als je je business objecten schrijft zoals in dit voorbeeld maakt het niet uit hoe de gebruiker uiteindelijk een order en een klant koppelt het effect is hetzelfde: de business rules worden uitgevoerd. Misschien geef je je gebruiker wel beide mogelijkheden, als de opslag uiteindelijk maar op één plaats gebeurt. Het business object voert dan de regels uit en slaat de data op in de database.

    Maakt dit iets duidelijker??
    Marcel

  4. #4
    Bedankt voor de info!

  5. #5
    Old Navigator Matthijs's Avatar
    Join Date
    Mar 2001
    Location
    Ede, NL. Delphi: Delphi 7/2005 :). Matthijs schrijf je Matthijs
    Posts
    2,199
    Misschien even een (overbodige) aanvulling.
    Bij een goed OO-ontwerp is het dus zo dat objecten geen kennis hebben van andere objecten. Wat je dus in dit geval eigenlijk zou moeten doen is een Association-class maken (Order-Klant).
    Bij het maken van een instance van deze association-class wordt gecontroleerd of het KvK-nummer van de klant is ingevuld. (Om maar even bij het voorbeeld van Marcel te blijven.)
    What's in a sig?

    Would my posting be less valuable if it didnot have a sig? (Vrij naar William S.)

    Let op de kleine lettertjes. For all postings: e&oe!
    This program performed an illegal function, the police are on their way

  6. #6
    In theorie ben ik het met je eens, maar ik moet eerlijk zeggen dat ik het in de praktijk nooit zo doen. Hoe zou je dat invullen? Maak je dan een datamodule TOrderKlant waarin je de betreffende gegevens opvraagt/opslaat

    Marcel
    Is dol op OO discussies!!

  7. #7
    Old Navigator Matthijs's Avatar
    Join Date
    Mar 2001
    Location
    Ede, NL. Delphi: Delphi 7/2005 :). Matthijs schrijf je Matthijs
    Posts
    2,199
    Originally posted by Marcel
    In theorie ben ik het met je eens, maar ik moet eerlijk zeggen dat ik het in de praktijk nooit zo doen. Hoe zou je dat invullen? Maak je dan een datamodule TOrderKlant waarin je de betreffende gegevens opvraagt/opslaat

    Marcel
    Is dol op OO discussies!!
    Ja! Heerlijk he?
    Inderdaad ontkom je er in de praktijk niet aan om toch het een en ander minder OO te maken dan zou moeten.
    Tijdens de ontwerpfase moet je het echter toch doen, omdat je de boel dan helder en eenduidig houdt. De implementatie richting DBMS en UI is dan van later zorg. Gelukkig hoef ik als functioneel beheerder alleen de eerste stap en de laatste stap te controleren en heb met de realisatie weinig te maken
    Zal vanavond eens kijken wat ik nog in de discussie kan gooien!
    What's in a sig?

    Would my posting be less valuable if it didnot have a sig? (Vrij naar William S.)

    Let op de kleine lettertjes. For all postings: e&oe!
    This program performed an illegal function, the police are on their way

  8. #8
    Hebben jullie mijn vraag omtrent UML al eens bekeken?

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

Similar Threads

  1. Delphi COM Programming
    By GolezTrol in forum Boekhoek
    Replies: 8
    Last Post: 02-Sep-03, 17:09
  2. Game Programming Issues
    By OkkieBokkie in forum Artikelen & tips
    Replies: 8
    Last Post: 12-Jun-03, 20:13
  3. E-Book: Graphics Programming Black Book
    By Christiaan in forum Boekhoek
    Replies: 1
    Last Post: 25-May-03, 03:20
  4. Replies: 0
    Last Post: 08-Jan-03, 00:42
  5. Rimrock software programming glyphs
    By Marcel in forum Iconen & Bitmaps
    Replies: 0
    Last Post: 22-Jan-02, 23:23

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •