业务抽象——必要属性和可选属性一个例子

原创 2007年09月30日 18:14:00

 今天在看系统源码时,遇到了一个可选属性的例子,比较有代表性。

业务描述如下:

一个仓库管理系统,管理若干仓库(warehouse),每个仓库和若干货主(owner)发生业务。货主在仓库中存放若干种货物(item),货物包括名称(name)、编号(id)等属性。

那么,怎么设计DB呢?

第一反映是应该有这几张张表:Warehouse,Owner,Item,Owner_Warehouse_Relationship,Owner_Warehouse_Item_Relationship,其中Item表包含(ItemId,ItemName,...),Owner_Warehouse_Relationship表包含(OwnerId,WarehouseId),记录哪些货主可以和那些仓库发生关系;Owner_Warehouse_Item_Relationship表包含(Owner_Warehouse_Relationship_Id,ItemId),记录每对发生关系的货主和仓库间可以处理哪些货物。

然后去看数据库实现,和我的想法完全不同。数据库现有以下几张表:Warehouse,Owner,Item,Owner_warehouse_Relationship。相比之下,没有单独的Owner_Warehouse_Item_Relationship表,而Item表为(ItemId,ItemName,OwnerId),多了一个OwnerId字段,并且Item表的主键为ItemId+OwnerId而非上一种的ItemId。

向BA咨询这块的业务。BA解释说,实际业务中,每个货主有自己的一套编码体系,可以让不同货主为不同的货物选择相同的编码,保证每个货主内部ItemId唯一即可。听完后我想,这样的要求在第一种设计中也是可以实现的。那么这两种设计到底区别何在呢?

第一种设计,Item独立于OwnerId而存在,Domain中的Item对象没有指向Owner的引用;第二种设计,Item依赖于Owner存在,Domain中的Item对象包含一个指向Owner的非空引用。所以,区分这两种设计哪一个正确,等价于问:存在不依赖于Owner的Item吗

对于这个问题,我的直觉是Y,正如这世界上有长虹电视机和熊猫电视机,电视机可以脱离生产厂家而存在。然而,和BA深入讨论后发觉,恰恰是直觉欺骗了我。在目前的业务逻辑中,Item无法脱离Owner而存在。这里业务中的Item,指的是“长虹24"彩电”一类的东西,没有长虹(Owner)的彩电(Item)正如没有24"(尺寸)的彩电一样没有意义。

举数据库设计范式中教师表——课程表——授课表的例子,课程可以脱离教师而存在,这说明不考虑教师的课程仍然具有可比性。学生A修了数学,学生B也修了数学,我们就可以

 

Class a_math=studentA.getClasses().getMath();
Class b_math
=studentB.getClasses().getMath();
a_math.Equals(b_math)

至于这两门课是否是由一个老师上的并不重要。

Class类的Equals方法大概可以写成

 

public bool Equals(Object o)...{
       
// instanceof and some thing
       if (this.name.Equals(o.name)
           
return true;
       
//...
}

 

而对于ColorTV这个类,Equals想必要这样写

public bool Equals(Object o)...{
    
if (this.shellColor.Equals(o.shellColor)
       
&& this.size==o.size
        
&& this.owner,Equals(o.owner))  // Dose owner property exist?
   
return true;
}

两个彩电相等,光外壳、颜色相等不够,总得是同一个厂家的吧?你要说32寸黑色夏普和32寸黑色TCL能互换的话,专柜老板第一个就不答应。

按照第一种设计,Item中根本就没有Owner,要实现以上的操作很麻烦,所以还是第二种设计好。

总结一下,抽象业务对象的过程中,一定要深入了解业务,不能凭自己的经验行事。决定对象构成时要注意区分必要属性和可选属性。对于某个对象在某个属性设置为null后是否还有意义,一定要考虑清楚,防止出现这种看似有理的设计。

 

抽象类、抽象方法、抽象属性

在一个类前面加上“abstract”关键字,此类就成为了抽象类。一个方法类前面加上“abstract”关键字,此方法就成为了抽象方法。 抽象类一般用于表达一种比较抽象的事物,比如前面所说的“水果”,...
  • brightyanmin
  • brightyanmin
  • 2016年05月05日 16:25
  • 3370

C#源代码—演示抽象类与抽象属性的使用,命名空间的使用

C#源代码—演示抽象类与抽象属性的使用,命名空间的使用
  • heyuchang666
  • heyuchang666
  • 2016年01月13日 11:54
  • 940

Service层的抽象和实现

Service层,UserManager。 为什么把连接数据库的逻辑抽象出了DAO层,Service层还需要抽象和实现呢? 如果以后Service层用EJB。。。不用SSH架构,就能够理解了。...
  • AKAK714
  • AKAK714
  • 2015年08月21日 17:39
  • 283

如何:定义抽象属性(C# 编程指南)

如何:定义抽象属性(C# 编程指南) 下面的示例演示如何定义抽象属性。抽象属性声明不提供属性访问器的实现,它只声明该类支持属性,而将访问器实现留给派生类。下面的示例演示如何实现从基类继承的抽象属性。 ...
  • guyehanxinlei
  • guyehanxinlei
  • 2008年01月22日 10:22
  • 2037

业务抽象

计算机最根本的是数据处理,在此基础上层层抽象,最终呈现给用户的是用户所能接受的一种抽象。这个也是应用软件最根本最重要的地方。 拿操作系统来说,他将基本的计算机硬件抽象出文件,进程,地址空间等基本概念,...
  • lishengc
  • lishengc
  • 2011年04月19日 08:57
  • 985

dbcp属性说明及配置

initialSize :连接池启动时创建的初始化连接数量(默认值为0) maxActive :连接池中可同时连接的最大的连接数(默认值为8,调整为20,高峰单机器在20并发左右,自己根据应用场景...
  • yang3301happy
  • yang3301happy
  • 2013年01月28日 10:39
  • 708

行为抽象?数据抽象?属性?

OOA时,通常我们最能做到的就是将对象进行行为抽象,统一出接口,使之成为一系列的类家族,这样的抽象对于行为有所不同的对象体系来说是比较有用的,而假如这系列的对象只是在成员变量上有所不同,而行为上完全一...
  • coolIce007
  • coolIce007
  • 2005年06月05日 16:22
  • 1786

七:Java之封装、抽象、多态和继承

本文章介绍了关于Java中的面向对象封装、抽象、继承、多态特点 Java面向对象主要有四大特性:封装、抽象、继承和多态。...
  • u010893129
  • u010893129
  • 2014年06月28日 15:22
  • 3039

编译抽象语法树

编译抽象语法树   对大多数开发人员来说,编译就意谓着产生本地代码,给人感觉就是一个字,难。但是,并不一定要产生本地代码,对于 DSL,通常产生其他更加通用的编程语言。.NET 框架提供几个把抽象...
  • hadstj
  • hadstj
  • 2014年06月06日 15:35
  • 2704

hibernate学习笔记--可选的配置属性

在文档 表 3.3.  Hibernate配置属性 属性名 用途 hibernate.dialect 一个Hibernate Dialect...
  • u011644423
  • u011644423
  • 2014年08月10日 09:18
  • 410
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:业务抽象——必要属性和可选属性一个例子
举报原因:
原因补充:

(最多只允许输入30个字)