前言
讨论数据类型设计的两种一般方法--自顶向下设计和自底向上设计
引入
笔者引入一个概念:数据类型的归同--将不同类型归于同一类型.他的写法不好,当做一个拓展.
归同举例
假设你给朋友带了点礼物,一个香蕉盒里装了若干条香蕉,一个苹果盒里装了若干个苹果.怎样用代码来表示?
//礼物类型
struct Gift{
AppleBox ab; //苹果盒
BananaBox bb; //香蕉盒
}
//苹果盒类型
struct AppleBox{
Box bx;
vector<Apple> va; //若干苹果
}
//香蕉盒类型
struct BananaBox{
Box bx;
vector<Banana> vb; //若干香蕉
}
如果用一个叫水果盒的类来表示(两个水果盒对象)
//礼物类型
struct Gift{
vector<FruitBox> vfb;
}
//水果盒类型
struct FruitBox{
Box bx;
vector<Apple> va; //若干苹果
vector<Banana> vb; //若干香蕉
}
可能已经看出来了,这是一种很蹩脚的设计,的确是这样的,笔者反向提个醒.哪怕是这样写也好
//水果盒类型
struct FruitBox{
Box bx;
}
//香蕉盒类型
struct BananaBox : public FruitBox{
vector<Banana> vb; //若干香蕉
}
//苹果盒类型
struct AppleBox : public FruitBox{
vector<Apple> va; //若干苹果
}
表达出了继承关系. 还有一个天下所有类型的祖宗类:Object---见笔者其他贴.那也是个思路.
数据类型归同是应该避免的一种写法.因为他会将数据类型的定义变得混乱(尽管语法不报错).
数据的自顶向下设计
每个数据都可以采用一种通用的描述:数据对象A由数据对象B,C组成.数据对象B由数据对象D,E组成,数据对象C由数据对象F,G,H组成,直到原子对象(不可再分对象,表示为字长单元或者位)---以上数据个数不固定.在此基础上给每个数据对象设计类型.问题是不确定同一层的数据对象是否可归于同一类型--例如B和C,D和E,F、G和H之间是否可以归于一类.但其实这无关紧要,可以后面修改.
举个例子:厉害小学有6个年级,每年级有n个班,每个班上有n个学生.假设每个年级每个班都是相同的,则"学校","年级","班级","学生"的定义如下:
//小学定义
struct Primary_school{
Grade grades[6]; //用vector也是一样的,因为每个小学已固定为6个年级,所以可以数组表达
}
//年级定义
struct Grade{
vector<Ban> vb; //每年级若干个班
}
//班定义,英文的班是class,所以用Ban代替
struct Ban{
vector<Student> vs; //每班若干学生
}
//学生定义略
随后逐次向上,根据数据类型生成数据对象
现在4到6年级有1项兴趣教学(1到3年级没有此项),在数据类型中要表达,则做修改如下:
//小学定义
struct Primary_school{
Grade grades[3]; //3个低年级
InterestGrade i_grades[3] //3个高年级
}
//低年级定义
struct Grade{
vector<Ban> vb;
}
//高年级定义
struct InterestGrade{
string interest;
vector<Ban> vb;
}
数据自顶向下设计是概念性的设计,是一种"模糊"设计.
数据的自底向上设计
数据的自底向上设计与自顶向下设计相对应,通用描述如下:数据对象F,G,H构成数据对象C,数据对象D,E构成数据对象B,数据对象B和C构成数据对象A
数据的自底向上设计是一种准确的设计.如上面的例子,在声明Grade类型时会自动分析出两种类型.根据两种类型的特征还可以确定派生关系,便于归属同一基类,方便操作(针对所有年级)
//小学定义
struct Primary_school{
Grade grades[6]; //6个年级
}
//低年级定义
struct Grade{
vector<Ban> vb;
void fun(); //基类方法
}
//高年级定义,派生于Grade,便于所有年级操作
struct InterestGrade:public Grade{
string interest;
void fun(); //派生类方法
}
意义
1. 数据类型的设计,可以先由自顶向下设计做"大概"设计,再由自底向上设计出完整数据类型.
2.由语言明确包含链,以此描绘数据走向.
例如:小明是厉害小学 |六年级| 三班|的学生.这里有4个名词,每个名词对应一个数据类型,且从上到下存在包含关系.
又如:枫:声母是f,音节是feng.对应的数据类型:字典,声母集合,音节集,具体音节(4个),汉字.
小结
数据类型设计的一个思路

1927

被折叠的 条评论
为什么被折叠?



