读书人

为什么在设计Model的时候会经常出现小

发布时间: 2012-01-05 22:36:54 作者: rapoo

为什么在设计Model的时候会经常出现我中有你你中有我的设计?
先看一个例子

Event class
[code=C#]
public class Event
{
public Event()
{
ReservedTickets = new List <TicketReservation> ();
PurchasedTickets = new List <TicketPurchase> ();
}

public Guid Id { get; set; }
public string Name { get; set; }
public int Allocation { get; set; }
public List <TicketReservation> ReservedTickets { get; set; }
public List <TicketPurchase> PurchasedTickets { get; set; }

public int AvailableAllocation()
{
int salesAndReservations = 0;
PurchasedTickets.ForEach(t => salesAndReservations += t.TicketQuantity);
ReservedTickets.FindAll(r => r.StillActive()).ForEach(r => salesAndReservations += r.TicketQuantity);
return Allocation - salesAndReservations;
}

public bool CanPurchaseTicketWith(Guid reservationId)
{
if (HasReservationWith(reservationId))
return GetReservationWith(reservationId).StillActive();
return false;
}

public TicketPurchase PurchaseTicketWith(Guid reservationId)
{
if (!CanPurchaseTicketWith(reservationId))
throw new ApplicationException(DetermineWhyATicketCannotbePurchasedWith(reservationId));

TicketReservation reservation = GetReservationWith(reservationId);


TicketPurchase ticket = TicketPurchaseFactory.CreateTicket(this, reservation.TicketQuantity);
reservation.HasBeenRedeemed = true;
PurchasedTickets.Add(ticket);
return ticket;
}

public TicketReservation GetReservationWith(Guid reservationId)
{
if (!HasReservationWith(reservationId))
throw new ApplicationException(String.Format( "No reservation ticket with matching id of ‘{0}’ ", reservationId.ToString()));
return ReservedTickets.FirstOrDefault(t => t.Id == reservationId);
}

private bool HasReservationWith(Guid reservationId)
{
return ReservedTickets.Exists(t => t.Id == reservationId);
}

public string DetermineWhyATicketCannotbePurchasedWith(Guid reservationId)
{
string reservationIssue = " ";
if (HasReservationWith(reservationId))
{
TicketReservation reservation = GetReservationWith(reservationId);
if (reservation.HasExpired())
reservationIssue = String.Format( "Ticket reservation ‘{0}’ has expired ", reservationId.ToString());
else if (reservation.HasBeenRedeemed)
reservationIssue = String.Format( "Ticket reservation ‘{0}’ has already been redeemed ", reservationId.ToString());


}
else
reservationIssue = String.Format( "There is no ticket reservation with the Id ‘{0}’ ", reservationId.ToString());
return reservationIssue;
}

private void ThrowExceptionWithDetailsOnWhyTicketsCannotBeReserved()
{
throw new ApplicationException( "There are no tickets available to reserve. ");
}

public bool CanReserveTicket(int qty)
{
return AvailableAllocation() > = qty;
}

public TicketReservation ReserveTicket(int tktQty)
{
if (!CanReserveTicket(tktQty))
ThrowExceptionWithDetailsOnWhyTicketsCannotBeReserved();

TicketReservation reservation = TicketReservationFactory.CreateReservation(this, tktQty);
ReservedTickets.Add(reservation);
return reservation;
}
}
[/code]

TicketReservation class
[code=C#]
public class TicketReservation
{
public Guid Id { get; set; }
public Event Event { get; set; }
public DateTime ExpiryTime { get; set; }
public int TicketQuantity { get; set; }
public bool HasBeenRedeemed { get; set; }
public bool HasExpired()
{
return DateTime.Now > ExpiryTime;


}
public bool StillActive()
{
return !HasBeenRedeemed && !HasExpired();
}
}
[/code]

TicketPurchase class
[code=C#]
public class TicketPurchase
{
public Guid Id { get; set; }
public Event Event { get; set; }
public int TicketQuantity { get; set; }
}
[/code]

Event类包含了TicketPurchase类和TicketReservation类的聚合,同时TicketPurchase类和TicketReservation又引用了Event类。为什么要这样设计?这样设计的好处是什么?

[解决办法]
这就是封装,调用方便
[解决办法]
构造函数!!!!
[解决办法]
代码很长,不想看,我只记得课本上说要"低耦合,高内聚“
[解决办法]
不稀奇也不古怪

你是你父亲的儿子,你父亲是你的爹

现实世界本来就是一个立体结构,只是俺们这些程序员暂时还没有像生物学家用3d模型描述分子结构的工具语言,只能用2d的东西去描述3维,只能试图从不同角度的view去拼接3维,自然就是你中有我,我中有你
[解决办法]


MODEL 层的设计有很多啊,

你去用动软一类的代码生成器 就会感觉到噢.

读书人网 >.NET

热点推荐