blogdriver不能添加随笔,而且像很多软件一样,告诉我“不好了,程序错了“,但是从不告诉我为什么错了,哪里错了。
关于对象建模还有疑惑,比如Order和Customer,
可以这样
class order
{
int CustomerID;
int OrderID
void AddOrder()
}
class Customer
{
int CustomerID;
}
这是很笨的形式,不算是面向对象的
改进一下
class order
{
Customer Customer
}
class Customer
{
int CustomerID;
OrderCollection OrderList;
void AddOrder();
OrderCollection GetOrderList();
}
但是这样的话,要实例化一个Order还要实例化一个Customer对象,而且根据OrderID得到Order对象要通过Customer对象来完成。
打印 | 张贴于 2004-04-30 12:11:00 | Tag:拥抱变化

留言反馈
首先你的设计有几个的潜在问题:
如果你为每一个Order都实例化一个Customer对象,是不实用的。
浪费资源不说,如果Customer对象数据发生变化,如何同步每个Order中的Customer数据将是一个问题。
当然,这涉及到Order的生命周期,如果你是做WebService后台程序,那你多半会在用户对话期间保持这些Order对象,
这个问题的严重程度足以让你放弃这种设计。
但如果你生成一个Order的实例就立即使用,使用完毕立即丢弃,那就不必考虑这个问题。(这种情况比较少见)
你可以说,我在整个系统里对于一个Customer只有一个实例。但是由谁来管理和查询这些实例呢?如果你设计一个
CustomerManager来管理这些实例,你会发现回到用CustomerID标识Customer是个不坏的主意。
另外,把Customer放置在Order中,就意味着一个Order只能有一个Customer,这在某些特殊情况下可能是不成立的。
取决于你的系统需求。
回到你的问题:
"要实例化一个Order还要实例化一个Customer对象,而且根据OrderID得到Order对象要通过Customer对象来完成。"
"要实例化一个Order还要实例化一个Customer对象" 只对了一半。
"根据OrderID得到Order对象要通过Customer对象来完成。"是不对的。
下面我来说说为什么:
"要实例化一个Order还要实例化一个Customer对象" 为什么只对了一半?
首先让我们想一下什么时候系统中需要实例化一个Order :
1. 客户下订单;
2. 查询订单信息。
客户下订单时,客户信息已经在系统中了。你可以在初始化Order的时候把这个已知的客户信息传递过去。
在你查询订单的时候,系统中该客户可能没有实例存在。你才需要初始化该客户的实例。
"根据OrderID得到Order对象要通过Customer对象来完成。"是不对的。
你可以写一个OrderManager来完成查询。
最后,让我们看一看把Customer放置到Order中的优点是什么?
比较显著的优点是:
如果你的Order对象需要经常使用Customer中的数据/方法,你这种方式消耗时间比较少。
作一比较:
用CustomerID连接至Customer:
Customer cust = OrderManager.getCustomerById(this.CustomerID);
cust.xxxx();
直接使用:
this.Customer.xxxx();
但是相比起上面提到的若干问题,这个优点也许应该放弃。
动力火锅 和 冰云 提供的设计都能够解决你的问题。
再是只load key,然后封装起来
Collection getOrders();
void setOrders(Collection c)
void addOrder(Order o);
}
class Order {
Customer getCustomer();
void setCustomer(Customer c);
}
class OrderService {
void saveOrder(Order o)
}
class CustomerService{
Customer findById(Long id);
}
Client :
Order o = new Order();
o.setCustomer(getCustomerService().findById(cid));
getOrderService().saveOrder(o);
that's the code from my project.
{
int OrderId;
//Date, Product, Price etc ...
}
class Customer
{
int CustomerId;
//Name, Tel, etc...
}
class OrderManager
{
OrderCollection mOrderList;
URRESULT AddOrder(Order A, Customer C);
Order GetOrderById(int OrderId);
OrderCollection GetOrdersByCustomerId(int CustomerId);
Customer GetCustomerByOrderId(int OrderId);
}
这样如何?