面向对象的应用服务层设计(3) 在考虑数据实体层的设计策略的时候,需要把握以下要点: ◆ 一致的数据表示方式。在一个系统中,数据的表示方式必须尽可能统一,同时,在处理单个数据和多个数据的时候,处理方式尽可能一致。 ◆ 因为数据通常是需要存储到数据库中,因此,良好的映射方法是必需的。 ◆ 处理好对象的粒度,即所谓的粗粒度对象、细粒度对象。 一般例子 考虑一个现实的例子,一个仓库中的产品(ProdUCt),在系统中可以使用如下定义: public class Product{public string Name; //名称 public decimal Price;//价格 public int Count;//数量 } 可以按照如下方法使用Product类: Product p=new Product(); //……处理Product 这是一个包含了三个属性的Product类的定义。为了便于说明,在这里,我们尽量将问题简化了。 又例如,一张入库单可以使用如下定义: public class Form{public string ID; //入库单编号 public DateTime AddTime; //入库时间 public FormDetail[] FormDetails; //入库单明细 } public class FormDetail { public Product InProduct; //入库产品 public int Count; //入库数量 } 对于处理单个对象,通常采用上述的方法,但是,当我们需要处理相同类的一组对象,也就是处理一个对象集合的时候,就会有一些小小的麻烦。 如前所述,我们希望在处理单个对象和对象集合的时候,处理的方式尽量统一,这对于软件开发的意义是很大的。常用的处理对象集合的方法有: ◆数组表示的方法 例如,上面的例子中当一张入库单包含多条入库单明细的时候采用的方法。为了灵活性,也可以使用容器来,如Java中的Vector或C#的ArrayList(C#)。只是,在处理对象的时候,需要一个类型转换的操作。这个问题,在支持泛型的语言中不会存在,如使用C++的标准库的容器类。 ◆ObjectCollection方法。这个方法同上面的方法类似,不同之处在于,为每个实体类设计一个Collection类。例如,可以为FormDetail设计一个FormDetailsCollection类(C#): public class FormDetailsCollection: ArrayList { public void Add(FormDetail detail) { base.Add(detail); } public new FormDetail this[int nIndex] {