首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

为什么在设计Model的时候会经常出现小弟我中有你你中有小弟我的设计

2012-01-05 
为什么在设计Model的时候会经常出现我中有你你中有我的设计?先看一个例子Eventclass[codeC#]publicclassE

为什么在设计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 层的设计有很多啊,

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

热点排行