数据类设计_数据类型的自顶向下设计&自底向上设计

前言

        讨论数据类型设计的两种一般方法--自顶向下设计和自底向上设计

引入

        笔者引入一个概念:数据类型的归同--将不同类型归于同一类型.他的写法不好,当做一个拓展.

归同举例

        假设你给朋友带了点礼物,一个香蕉盒里装了若干条香蕉,一个苹果盒里装了若干个苹果.怎样用代码来表示?

//礼物类型
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个),汉字.

小结

        数据类型设计的一个思路

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

重庆彭枫

你的鼓励是我创作的动力,谢谢

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值