I have finished studying the code up to the client proxy section on chapter 6. I have a few questions regarding the
CanReserveTicket
method of the TicketService class.
Why does Event.ReserveTicket need to throw an exception when it cannot complete? Why not just return null and let TicketService.ReserveTicket test for Null?
Like
Code:
public TicketReservation ReserveTicket(int tktQty)
{
if (!CanReserveTicket(tktQty))
return null;
//ThrowExceptionWithDetailsOnWhyTicketsCannotBeReserved();
TicketReservation reservation = TicketReservationFactory.CreateReservation(this, tktQty);
ReservedTickets.Add(reservation);
return reservation;
}
If throwing an exception is necessary, why do we not just assume Event.ReserveTicket will not fail since there is a surrounding try catch block on the TicketService.ReserveTicket method? Since we are already testing it in Event.ReserveTicket, why do we need to test again using the tester-doer pattern?
Like
Code:
try
{
Event Event = _eventRepository.FindBy(newGuid(reserveTicketRequest.EventId));
TicketReservation reservation;
reservation = Event.ReserveTicket(reserveTicketRequest.TicketQuantity);
_eventRepository.Save(Event);
response = reservation.ConvertToReserveTicketResponse();
response.Success = true;
}
catch (Exception ex)
{
// Shield Exceptions
response.Message = ErrorLog.GenerateErrorRefMessageAndLog(ex);
response.Success = false;
}
Or maybe a TryParse pattern would be a better choice (similar to my first question about testing for null)?
Like
Code:
reservation = Event.TryReserveTicket(reserveTicketRequest.TicketQuantity);
if (reservation == null) {
response = String.Format("There are {0} ticket(s) available", Event.AvailableAllocation());
response.Success = false;
}
else {
_eventRepository.Save(Event);
response = reservation.ConvertToReserveTicketResponse();
response.Success = true;
}