.NET类的问题,比较常见。但是对于设计方面,大家可能接触得很多,不过具体的问题可能不经意间就略过了。本文将结合作者自己的开发里程,简述.NET类的设计问题。
虽然搞.NET已经有N年,好像是从C#出生就开始了。可是因为只是业余,只是爱好,都是自摸的,到现在连个.NET类都设计不好,很是郁闷啊!还好,现在知道有博客园这个地方来学习解决问题了。
本人闲着没事干,于是想设计一个超级平台来协助处理日常工作、生活、学习、娱乐等各方面的问题,而且想采用最新最快捷的技术,比如WPF、Silerlight、ORM等。于是开始着手,这几天就碰到了这样的一个问题,也许我这样做本身就是问题,只有请各位大侠指点。
现在有一消费类Expense用于消费记账,其中它需要用到一个账户Account来支付。可用于支付帐户的类型有信用卡CreditCard、现金Cash、支票Check等等。
每次记账,我需要将所使用的账户信息存储起来以备查询或统计,于是Expense需要有个Account的属性。
我这里想了两个方案,一个是将Expense的Account设计为接口或抽象类,而CreditCard等一干账户类型都实现或继承于它。二是设计Expense的Account为一个类,而这个Account类有个Category属性,这个属性设计为接口或抽象类,然后CreditCard继承于Category。
我这里最不好解决的问题是将要保存的信息存储到像MS SQL Server这样的关系型数据库中,再有不好解决的问题是如何从数据中取回并生成相应对象的问题。比如,如果用第二种Account表的Category字段存储的内容是什么呢?如果将它设置成账户类型的名称,如CreditCard,然后子表CreditCard关联到父表Account倒可解决存储的问题,可是取回时又成问题了,因为CreditCard的数据无法恢复。
以下是我设计的数据库实体图
还有一个类似的问题,就是中国的行政区划。
中国的区划比较复杂(整个世界的都是,中国更甚),是一个不规则的组织结构或者树。
我是这么考虑的:
1.最顶层的是国家级,其属性有名字、首都、语言、文字、货币......
2.接着是省一级的行政单位(省、自治区、直辖市,香港也算这一级,可是有货币属性,文字也不一样),其属性有的有省会(直辖市又没有)、国家...
3.然后是市这一级(市、自治州),属性有名称、省、地理坐标...
4.县一级(县、市、区、旗、自治县等等...——复杂吧,名称很多,中国特色),属性有名称、市(这里面还有省直接管辖的,就不好搞了)
5.乡一级(乡、镇、街道......)
6.村一级(居委会.....)
开始我设计了六个类,后来想如果外国人加进来怎么办(我是设计联系人的时候要用到地址,还有在GIS地图里要用到),我所了解的美国好像不是这个结构的。于是我就将行政区设计成一个类District,其中有个属性为抽象或接口类型DistrictCategory,还有Name(string)、Capital(District)、Higher(District,上级)等属性,然后上面说的6种类型的行政区Country、Province、City、County等等都继承自DistrictCategory,它们包含自己独特的属性。比如在国家和市这一级里有电话区号,村有邮政编码等等属性。行政区之间的关系由其District类型的Higher属性来确定。
这里我也遇到了一个持久化和取回的问题,都与DistrictCategory类型的Category属性有关。首先是持久化,这里要设计7个数据库表,我想省事用O/R框架好像不行,对象存储时要根据不同的类别存储到不同的表里。接着是取回的问题,我根据一个District的Name属性查询到了这个相应的记录,可是我无法知道其相关的属性到哪个表示类型的表里面去找,至少不能用程序表达。
示例如下:
- District china = new District();
- china.Name = "中华人民共和国";
如果要是取回,我是找到了浙江这条记录,可是程序如何知道
原文标题:类的设计问题
链接:http://www.cnblogs.com/hooke/archive/2009/11/04/1595836.html