Car Rental Case Study in UML
Car Rental Case Study in UML
218
219
220
221
222
create customer
create car
book
request
cancel
user
pickUp
real world customer
billing
return
<<extend>>
<<extend>>
<<actor>>
PersistentStore
early return
billing clerk
late return
223
224
225
226
227
228
229
230
Class Diagram
Customer
Name : String
create(n:String):Customer
book(s:DateT,e:DateT,ct:CatET)
cancel(b:Booking)
pickUp(b:Booking):Car
return(cr:Car)
<<structure>>
DateT
<<enumeration>>
CatET
E / economy
S / standard
L / luxus
Car
LicenceNo : String
Cat : CatET
create(l:String,ct:CatET):Car
0..1 car
1 customer
Assignment
Registration
0..* booking
searchAvailCar():Car
post Cat<=result.Cat and result.available
Booking
Start : DateT
End : DateT
Cat : CatET
PickedUp : Boolean
Return : DateT
0..1 booking
create(cs:Customer,s:DateT,e:DateT,ct:CatET):Booking
searchAvailCar():Car
assignCar(cr:Car)
returnCar()
car : Car
car : Set(Car)
Start<=End
car.notEmpty implies Cat<=car.Cat
231
ada:Customer
LicenceNo="ABC123"
Cat=S
Name="Ada"
customer
car
Registration
booking
Assignment
b:Booking
Start="11/20"
End="11/23"
Cat=E
PickedUp=true
Return=undef
booking
232
Today="11/22"
Start="11/20"
End="11/23"
Cat=E
PickedUp=true
booking Return=undef
Registration
booking
Assignment
car
customer
vw:Car
ada:Customer
LicenceNo="ABC123"
Cat=S
Name="Ada"
customer
Registration
booking
bob:Customer
Name="Bob"
b2:Booking
Start="11/16"
End="11/18"
Cat=L
PickedUp=true
Return="11/17"
ford:Car
LicenceNo="DEF456"
Cat=E
233
Today="11/23"
Start="11/20"
End="11/23"
Cat=E
PickedUp=false
Return=undef
booking
Assignment
car
ada:Customer
Name="Ada"
customer
vw:Car
LicenceNo="ABC123"
Cat=S
car
Registration
booking
Assignment
b2:Booking
Start="11/22"
End="11/30"
Cat=S
PickedUp=true
Return=undef
booking
booking
Assignment
car
ford:Car
LicenceNo="DEF456"
Cat=E
234
235
pickUp()
return()
mustReturn
236
BOOK
PICKUP :
pickUp(b) [bookingBelongsToCustomerAndIsDue] /
findAvailableCarAndLinkBookingToFoundCar
booked
BOOK
create(n) /
createNewCustomer
noReturns
cancel(b) [bookingBelongsToCustomer
and bookingOpenOrDue and
onlyOneBookingForCustomer] /
recordCancelation
PICKUP
return(cr) [onlyOneCurrentBookingForCustomer
and noOpenDueBookingForCustomer
and carBelongsToCustomer and
carUnavailableOrDue] /
handleBooking
return(cr)
[onlyOneCurrentBookingForCustomer
and existsOpenDueBookingForCustomer
and carBelongsToCustomer and
carUnavailableOrDue] /
handleBooking
mustReturn
return(cr) [moreThanOneCurrentBookingForCustomer
and carBelongsToCustomer and
carUnavailableOrDue] /
handleBooking
BOOK
cancel(b) [bookingBelongsToCustomer
PICKUP
and bookingOpenOrDue] /
recordCancelation
237
open
when(todayIsTheBookingsStartDay)
when(todayIsAfterTheBookingStartDay) /
recordCancelation
due
closed
assignCar(cr) /
linkBookingAndCarAndRecordPickUp
returnCar() /
unlinkBookingAndCarAndRecordReturnDay
current
238
create(l,ct) / createNewCar
available
carAssigned
carReturned
unAvailable
carReturned
due
when(todayIsTheBookingsEndDay)
239
BOOK
( booking->select(open)->size>0 or
booking->select(due)->size>0 ) and
booking->select(current)->size=0
booked
cancel(b)
[ CANOK and CAN2noReturns ]
noReturns
booking->select(current)->size>0
return(cr)
[ RETOK and RET2booked ] /
RETACT
BOOK
return(cr)
[ RETOK and RET2noReturns ] /
RETACT
RET2mustReturn: booking->select(current)->size>1
mustReturn
RETACT: cr.booking.returnCar()
booking->select(open)->size=0 and
booking->select(due)->size=0 and
booking->select(current)->size=0
return(cr)
[ RETOK and RET2mustReturn ] /
RETACT
cancel(b)
[ CANOK ]
PICKUP
240
booked
BOOK
[ CAN2booked ]
cancel(b)
[ CANOK ]
create(n) /
Name=n
[ CAN2noReturns ]
RETOK: booking.car->includes(cr) and
(cr.unAvailable or cr.due)
[ RET2booked ]
noReturns
PICKUP
BOOK
[ RET2noReturns ]
return(cr)
[ RETOK ] /
RETACT
RET2mustReturn: booking->select(current)->size>1
[ RET2mustReturn ]
mustReturn
RETACT: cr.booking.returnCar()
booking->select(open)->size=0 and
booking->select(due)->size=0 and
booking->select(current)->size=0
cancel(b)
[ CANOK ]
booking->select(current)->size>0
PICKUP
241
open
when(Today=Start)
customer.cancel(self) /
PickedUp=false
when(Today>Start) /
PickedUp=false;
customer.cancel(self)
due
assignCar(cr) /
link(Assignment,[self,cr]);
PickedUp=true
closed
returnCar() / unlink(Assignment,[self,car]);
Return=Today
current
242
booking.returnCar()
unAvailable
due
when(Today=booking.End)
243
create("Ada")
ada:Customer
noReturns
create("ABC123",S)
vw:Car
available
book("11/20","11/23",E)
create(ada,"11/20","11/23",E)
b:Booking
booked
open
Today=b.Start
due
pickUp(b)
searchAvailCar()
vw
assignCar(vw)
unAvailable
current
vw
mustReturn
Today=b.End
due
return(vw)
returnCar()
noReturns
available
closed
244
create("Ada")
ada:Customer
ada:Customer
noReturns
create("ABC123",S)
ada:Customer
vw:Car
vw:Car
available
book("11/20","11/23",E)
create(ada,"11/20","11/23",E)
b:Booking
booked
ada:Customer
b:Booking
vw:Car
ada:Customer
b:Booking
vw:Car
ada:Customer
b:Booking
vw:Car
open
Today=b.Start
due
pickUp(b)
searchAvailCar()
vw
assignCar(vw)
unAvailable
current
vw
mustReturn
Today=b.End
due
return(vw)
returnCar()
noReturns
available
closed
245
246
4. pickUp(b)
5. return(vw)
customer
car
booking {new}
ada:Customer {new}
b:Booking {new}
3.1 create(ada,"11/20","11/23",E)
4.1 searchAvailCar()
4.2 assignCar(vw)
5.1 returnCar()
car {transient}
vw:Car {new}
247
create("Ada")
ada:Customer
noReturns
book("11/20","11/23",E)
create(ada,"11/20","11/23",E)
booked
b:Booking
open
Today=b.Start
due
pickUp(b)
searchAvailCar()
create("ABC123",S)
vw:Car
available
vw
assignCar(vw)
unAvailable
current
vw
mustReturn
Today=b.End
due
return(vw)
returnCar()
noReturns
available
closed
248
create("Ada")
ada:Customer
ada:Customer
noReturns
book("11/20","11/23",E)
create(ada,"11/20","11/23",E)
booked
b:Booking
ada:Customer
b:Booking
ada:Customer
b:Booking
vw:Car
ada:Customer
b:Booking
vw:Car
ada:Customer
b:Booking
vw:Car
open
Today=b.Start
due
pickUp(b)
searchAvailCar()
create("ABC123",S)
vw:Car
available
vw
assignCar(vw)
unAvailable
current
vw
mustReturn
Today=b.End
due
return(vw)
returnCar()
noReturns
available
closed
249
1. create("Ada")
2. book("11/20","11/23",E)
3.2 create("ABC123",S)
3. pickUp(b)
4. return(vw)
customer
booking {new}
ada:Customer {new}
car {transient}
b:Booking {new}
2.1 create(ada,"11/20","11/23",E)
3.1 searchAvailCar()
3.3 assignCar(vw)
4.1 returnCar()
car
vw:Car {new}
250
create("Ada")
ada:Customer
noReturns
book("11/20","11/23",E)
create(ada,"11/20","11/23",E)
booked
b:Booking
open
Today=b.Start
due
Today>b.Start
cancel(b)
noReturns
closed
251
create("Ada")
ada:Customer
noReturns
book("11/20","11/23",E)
create(ada,"11/20","11/23",E)
b:Booking
booked
open
noReturns
closed
cancel(b)
Today<b.Start
252
create("Ada")
ada:Customer
noReturns
create("ABC123",S)
vw:Car
available
book("11/20","11/23",E)
create(ada,"11/20","11/23",E)
booked
b:Booking
open
Today=b.Start
due
pickUp(b)
searchAvailCar()
vw
assignCar(vw)
vw
unAvailable
current
available
closed
mustReturn
return(vw)
returnCar()
noReturns
Today=b.End
253
create("Ada")
ada:Customer
noReturns
create("ABC123",S)
vw:Car
available
book("11/20","11/23",E)
create(ada,"11/20","11/23",E)
b:Booking
booked
open
Today=b.Start
due
pickUp(b)
searchAvailCar()
vw
assignCar(vw)
vw
unAvailable
current
mustReturn
Today>b.End
due
return(vw)
returnCar()
noReturns
available
closed
254
Today=b1.Start
vw:Car
b1:Booking
ada:Customer
b2:Booking
ford:Car
available
due
booked
open
available
assignCar(vw)
unAvailable
Today=b1.End
Today=b2.Start
current
mustReturn
due
due
return(vw)
available
closed
assignCar(ford)
current
unAvailable
255
Today=b1.Start
vw:Car
b1:Booking
ada:Customer
b2:Booking
ford:Car
available
due
booked
open
available
assignCar(vw)
unAvailable
Today=b1.End
Today=b2.Start
current
mustReturn
due
due
assignCar(ford)
current
return(vw)
available
closed
unAvailable
256
6.6 Closing
6.6 Closing
257
Customer::pickUp(b):Car
testAvailableCars
[noCarAvailable]
[carAvailable]
result=b.searchAvailCar()
chooseAnAvailableCar
purchaseANewCar
connectTheBookingToTheCar
b.assignCar(result)
indicateThatACarHasBeenPickedUp
returnTheCar
return(result)
6.6 Closing
258
Customer::pickUp(b):Car
Car.allInstances->exists(cr|
cr.available and cr.Cat>=b.Cat)
testAvailableCars
[else]
[carAvailable]
result=someAvailableCar
result=someNewCar
[true]
[false]
result:=Car.allInstances->
select(cr|cr.available and
cr.Cat>=b.Cat)->any
result:=Car.create(newLicNo,b.Cat)
link(Assignment,[b,result])
b.car:=b.car->including(result)
b.pickedUp=true
b.pickedUp:=true
return(result)
return(result)
6.6 Closing
259
[diagrams ok]
modify object
diagram
modify class
diagram
modify statechart
diagram
modify sequence
diagram
6.6 Closing
260
OD
CD
SC
SeqD