Hotel mixin sample -- accommodation mixin
(The accommodation mixin includes basic billing)
This slice of the software
- remembers who has been accommodated in which room
- keeps track of consumption of beverages (beer and soda)
Each week and each occupied room is represented by an instance of
AccommodationInfo
in the repository and stores the name of the guest (assumed
to be unique) and the room number where he or she has been
accommodated for the week. Consumption is reported every morning
by the cleaning lady, who also refills the fridge in the room.
This slice is more or less orthogonal to making reservations, but note
that actually accommodating a guest who has reserved a room
requires to move his data from the Repository<IReservationInfo>
to the Repository<IAccommodationInfo>
. For this reason, the
AccommodationMixin
depends on the ReservationMixin
, but
keep in mind that the AccommodationMixin
extends Hotel.Base
, not
the ReservationMixin
. (Look at the diagram above again, if this
confuses you.)
The AccommodationMixin
holds an instance of the
Repository<IReservationInfo>
and exposes the following simple
methods. They work in analogous manner as their counterparts in
the ReservationMixin
:
- bool IsRoomFree (int number) - int? FindFreeRoom () // returns null if none is found - IAccommodationInfo Find (string name) // ditto
(Just as in the reservation mixin, CountAccommodations ()
and ClearAccommodations ()
are not part of the interface,
because they are support for testing.)
As explained before, an accommodation can be understood as a
reservation for the current week. For this reason, IsRoomFree
,
FindFreeRoom
and Find
don't sport a week-parameter, as their
siblings in the ReservationMixin
do.
IsRoomFree
has a twist, because it must make sure
- that there is no reservation for the room and the current week
(after all, it might be waiting for being claimed by the reserving party
AND
- that the room is not occupied by another guest already (this part is handled by the method
IsRoomFreeOfAccommodation
)
(An alternative implementation would set and clear
the corresponding reservation info for the current week
whenever someone is accommodated.)
In code:
public virtual bool IsRoomFreeOfAccommodation (int number) { return _accommodationRepository.Find ().Count (accInfo => accInfo.Number == number) == 0; } public virtual bool IsRoomFree (int number) { return Base.IsRoomFree (number, Calendar.Week ()) && IsRoomFreeOfAccommodation (number); }
FindFreeRoom ()
and Find
ultimately look into the accommodation repository,
what is more or less analogous to the reservation mixin's methods of the same names.
In code:
public virtual int? FindFreeRoom () { for (int iter = 0; iter < Hotel.Base.Hotel.NumberOfRooms; iter++) { if (IsRoomFree (iter)) { return iter; } } return null; } public virtual IAccommodationInfo Find (string name) { return _accommodationRepository.Find ().SingleOrDefault<IAccommodationInfo> (elem => elem.Name == name); }
The analogous operations to Reserve
and Cancel
are
Accommodate
and CheckOut
. Accommodate
giveth, CheckOut
taketh,
just like Reserve
and Cancel
. More deja-vus:
Accommodate
throws an exception if no rooms are availableAccommodate
throws an exception if the name for accommodation already is in the repositoryCheckOut
throws an exception if the cancelee can't be found in the repository
Apart from that, CheckOut
returns an amount of money as decimal
,
i.e. the Total
as computed by the Bill
.