[OCL] Vanaf klassediagram

Pagina: 1
Acties:

  • vegterb
  • Registratie: Juni 2001
  • Laatst online: 16-04 10:23

vegterb

[ZzZ]Vighter

Topicstarter
Voor mijn studie ben ik bezig met OCL, ik heb al wat consult gehad, maar kan mijn docenten niet lastig blijven vallen. Het is me alleen nog niet helemaal duidelijk of ik het nou goed doe, dus vraag ik het hier aan de OCL-Experts B)

Onderstaande code is voor de tabel 'User' waarin de volgende operaties staan:
+loginUser
+newUser
+editUser
+deleteUser
+viewUser

Zelf ben ik er al tot gekomen dat de eerste 4 regels goed zijn. Mijn boek (OOSE = Object Oriënted Software Engineering) maakt het niet goed duidelijk. Natuurlijk komt een boek nooit met de voorbeelden die je wil zien, maar sommige dingen zijn mij niet duidelijk.

Zo weet ik niet of je neer moet zetten dat je iemand verwijderd, als er namelijk een user verwijderd wordt is dat een specifiek opgegeven user, moet dat erin staan of kun je gewoon neerzetten -1?

En restriction, d.w.z. dat alleen een Admin (Restriction 2 in de database) users mag verwijderen. Dat leek me zo het best staan, naar wat ik kon vinden.

Note: Ben er al enkele dagen mee bezig (En ja, dit is alles ;))

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Context User::LoginUser (username, password) pre:
   !exist(username) and !exist(passwordl)
Context User::createNewUser(username, email) pre:
   !exist(username) or !exist(email)
Context User::editUser (restriction) pre:
   IF !extist(Restriction(1)) THEN
      Context User::SaveEditUser (username, email) pre:
         !exist(username) or !exist(email)
      Context User::SaveEditUser Post:
         isSaveEditUser()
   ELSE
      Respons = EditUser.error
Context User::deleteUser (Restriction) pre:
   !exist(Restriction(2))
Context User::deleteUser (Restriction) post:    
   getId_User() = @pre.getId_user() -1
Contect user::ListViewUser (Restriction) pre:
   !exist(Restriction(0,1,2))


code:
1
2
3
4
5
6
7
8
9
10
11
12
Context Diet::listViewDeletedDiet (Restriction, MarkedDeleted) pre:
   !exist(Restriction(2)) and !exist(MarkedDeleted)
Context Diet::DeleteDeletedDiet (Restriction, MarkedDeleted, Deleted) 
   pre:
   !exist(Restriction(2)) and ! exist(MarkedDeleted)
   post:
   !exist(Deleted)
Context Diet::PlaceBackDeletedDiet (Restriction, MarkedDeleted, UncheckDeleted) pre:
   Pre:
   !exist(Restriction(2)) and ! exist(MarkedDeleted)
   post:
   !exist(UncheckDeleted)

My Laptop Specificaties vs My Desktop Specificaties


Verwijderd

Voor de mensen onbekend met OCL: http://www.klasse.nl/ocl/

Persoonlijk weet ik weinig af van OCL, maar dacht dat het misschien wel relevant was om deze info toe te voegen aan het topic.

  • The Fox NL
  • Registratie: Oktober 2004
  • Laatst online: 29-04 10:44
Eerst even dit: ik ben zelf geen expert in OCL, heb er wel eens aan geroken. Onderstaande is dus onder voorbehoud.

Als ik zo naar de code kijk klopt er niet een OCL query, je gebruikt een andere notatie dan het officiele OCL. Bijvoorbeeld:
* Je gebruikt bijvoorbeeld ! terwijl ocl helemaal geen ! kent maar not gebruikt.
* Je gebruikt @pre.blablabla, dat moet zijn blablabla@pre.
* OCL staat voor Object Constraint Language, jij hebt het over tabellen (die zelfs functies bevatten?).
Bij mijn opmerkingen hieronder ga ik voor het gemak maar even uit van jou interpretatie van OCL.

Je pre-conditie voor het inloggen van een user zegt dit:
!exist(username) and !exist(passwordl)
Je zegt dus dat de username en password waarmee je inlogt niet mogen bestaan, beetje krom niet, enkel niet bestaande users mogen inloggen ;) ? Als je de ! weghaalt voor beide exists klopt het wel.

De preconditie van newUser zegt dat de username of het email adres niet mogen bestaan. Ik weet niet wat de bedoeling is van je database, maar op die manier kun je twee dezelfde usernames krijgen, in combinatie met loginUser die enkel kijkt naar username en password krijg je conflicten als er twee dezelfde users inzitten (welke user moet ie nu inloggen?).

Ik zet mijn vraagtekens bij de postconditie van deleteUser. getId_User, wat geeft die methode precies terug? De hoogst gebruikte userId oid? Dan gaat het zeker fout -> heb drie users: 1, 2 en 3, ik verwijder user 2, de postconditie verwacht userId van 1, maar krijgt 3. Logischer is een postconditie die er ongeveer zo uitziet: userCount = userCount@pre - 1

Als je iets wilt verwijderen is Restriction 2 nodig zeg je. Maar bij alle deletes zie ik !exist(Restriction(2)) in de precondities staan. Je zegt dus dat Restriction 2 niet mag bestaan als je iets wilt verwijderen.

Verder nog twee typefoutjes :P : regel 2: passwordl; regel 6: extist

Succes verder...

  • Bluestorm
  • Registratie: Januari 2000
  • Laatst online: 20-08-2022
Ook mijn kennis van OCL is niet echt geweldig, maar wat ik me er van herinner is dat het toch vooral gaat over het beschrijven van toestanden van en de relaties tussen objecten.
Voor LoginUser(username,password) zou je iets willen beschrijven van:
code:
1
post: result = users.collect(u: User | u.username=username and u.password=password).notEmpty()

(Dus je eist dan dat er in de verzameling users minimaal één user is met de gegeven username en password)

Ik heb destijds een wat volledigere documentatie gehad van OCL, ik zal eens zoeken of ik die nog kan vinden. (Edit: Op http://neptune.irit.fr/Biblio/oclframe.html staan er wel een paar, deze lijkt wel goede introductie)

Misschien is het een goed idee om eerst eens in gewone tekst je pre en post condities te omschrijven. In ieder geval lijkt me een goed klassediagram wel een noodzaak voordat je er iets zinnigs uit krijgt.

[ Voor 28% gewijzigd door Bluestorm op 13-10-2005 01:04 ]

Tenminste... dat [ denk / zie / weet ] ik... | Javascript obfuscator | foto's en video's uploaden