科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道面向对象的应用服务层设计之二

面向对象的应用服务层设计之二

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

应用软件系统,从本质上来说,是计算机对现实世界的模拟。现实世界中的实体对象,在软件系统中,表现为需要处理的数据。在面向对象的系统中,这是通过"类"和"对象"来表示的。

作者:中国IT实验室 来源:中国IT实验室 2007年9月11日

关键字: 应用 面向对象 编程

  • 评论
  • 分享微博
  • 分享邮件
  

    数据实体的表示
  
    应用软件系统,从本质上来说,是计算机对现实世界的模拟。现实世界中的实体对象,在软件系统中,表现为需要处理的数据。在面向对象的系统中,这是通过"类"和"对象"来表示的。
  
    参考著名的"MVC"模式,类可以分成实体类(M)、控制类(C)、和边界类(V),分别代表了实体对象、控制和界面显示。系统中需要处理的数据,在面向对象的系统中,属于实体类部分。
  
    在考虑数据实体层的设计策略的时候,需要把握以下要点:
  
    ◆ 一致的数据表示方式。在一个系统中,数据的表示方式必须尽可能统一,同时,在处理单个数据和多个数据的时候,处理方式尽可能一致。
  
    ◆ 因为数据通常是需要存储到数据库中,因此,良好的映射方法是必需的。
  
    ◆ 处理好对象的粒度,即所谓的粗粒度对象、细粒度对象。
  
    一般例子
  
    考虑一个现实的例子,一个仓库中的产品(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]
  {
  get{ return (FormDetail)base[nIndex];
  }
  }
  }
  
  
  
    这么做的好处在于,在操作集合中的对象时,不必进行类型转换的操作。
  
    ◆数据集的表示方法。
  
    采用这种方法,通常是直接把从数据库查询中获取的数据集(Recordset)作为数据处理对象。这种方法在ASP应用程序中是非常常见的做法。这种做法简单,初学者很容易掌握,但是弊病也很多。
  
    EJB的方法
  
    在J2EE体系中,对实体对象的处理的典型方法是Entity Bean。J2EE中使用Entity Bean来表示数据,以及封装数据的持久化储存(同数据库的交互)。由于Entity Bean比较消耗资源,而且采用的是远程调用的方式来访问,因此,在需要传递大量数据,或者在不同的层次之间传递数据的时候,往往还会采用一些诸如"值对象"(Value Object)的设计模式来提升性能。关于J2EE中的设计模式的更多内容,读者可以参考《J2EE核心模式》一书。
  
    JDO的方法
  
    相对于J2EE这个昂贵的方法来说,JDO提供了一个相对"轻量级"的方案。在JDO中,你可以采用一般的做法,编写实体类,然后,通过一些强化器对这些类进行强化,以使其符合JDO的规范,最后,你可以通过PersistenceManager来实现对象的持久化储存。
  
    无论是EJB还是JDO,在同数据库进行映射的时候,都选用了XML配置文件的方式。这是一种灵活的方式。由于XML强大的表达能力,我们可以很好的用它来描述代码中的实体类和数据库之间的映射关系,并且,不用在代码中进行硬编码,这样,在情况发生变化的时候,有可能只需要修改配置文件,而不用去修改程序的源代码。关于EJB和JDO的配置文件的更多的信息,各位可以参考相关的文档,这里不再赘述了。
  
    然而,使用XML配置文件的方式并不是唯一的方法,在微软提供的一些案例中,如Duwamish示例,就没有采用这种方式。至于开发人员在开发过程中具体采用哪种方式,是需要根据具体情况进行权衡和取舍的。
  
    Websharp的方法
  
    Websharp在数据的表现上,充分利用了.Net Framework类库中DataSet的功能,设计了一个EntityData类。这个类继承了DataSet,并增加了一些属性和方法。同样的,同数据库的映射关系,也是采用XML配置文件的方式。
  
    在实际的应用中,要获取一个实体对象,可以通过如下方式取得:
  
  EntityData Customer=EntityDataManager. GetEmptyEntity("Customer");
  
  
  
    然后,可以通过如下方式来访问这个对象的属性:
  
  string CustomerID=Customer["CustomerID"]
  
  
  
    可以看到,这种方式同传统的方式有点不同。在这种方式下,数据的表现形式只有一个,那就是EntityData。其好处是明显的,不用为每个实体都单独编写一个类,能够大大减少代码的编写量。其缺点也很明显,那就是不能利用编译器类型检测的功能,如果在调用对象的属性的时候,写错了属性的名称,就可能出错,但是,这个问题可以通过工具来解决。
  
    关于这个方面更加详细的信息,可以参见拙文:
  
    《利用.Net框架开发应用系统 》
  
    《 实战揭秘:开发.Net平台应用系统框架》
  

查看本文来源

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章