• 全部
  • 问答

数据结构设计的思索

Explorer 2002-08-10 06:35:25
我们可以经常听到设计模式,泛性编程,这些对于软件设计都是非常重要的。但是,一直以来,我都有一个困惑,对于实际问题中的数据结构的的设计是非常重要的,为什么没有人讨论了?我觉得有一些数据结构也能像设计模式一样应该被总结出来,因为一些系统的数据结构的设计具有很大的相似性,良好的数据结构的设计会使整个系统清晰。
我曾经自己设计过,也读过他人设计的一些项目,总是觉得刚开始接口定义的很完美,但是后来的数据结构总是不能很好的和接口配合,甚至有时为了迁就数据结构而变更接口。这也许是我个人经验不够吧。
下面有一个例子,来源于一个实际的项目(毕业设计)。希望各位大侠提出自己的数据结构的设计,或者提出其他的例子讨论,最后总结出最合适的设计。
1、已知信息:使用一组类来抽象一个文件,文件来源于实际的PDB文件,他实际上是一个文本文件;他包含的内容分多个层次:
一个文件可能包含多个MODEL,而每个MODEL又包含多个CHAIN,每个CHAIN包含多个Residue,一个Residue对应多个文本行。(X,Y,Z表示坐标点,各不相同)
MODEL 1
RESIDUE1 1 CHAIN_A X Y Z ...
RESIDUE1 2 CHAIN_A X Y Z ...
RESIDUE1 3 CHAIN_A X Y Z ...
RESIDUE1 4 CHAIN_A X Y Z ...
RESIDUE1 5 CHAIN_A X Y Z ...
RESIDUE2 6 CHAIN_A X Y Z ...
RESIDUE2 7 CHAIN_A X Y Z ...
RESIDUE2 8 CHAIN_A X Y Z ...
RESIDUE2 9 CHAIN_A X Y Z ...
.
.
.
RESIDUE99 147 CHAIN_B X Y Z ...
.
.
.
MODEL 2
RESIDUE1 1 CHAIN_A X Y Z ...
RESIDUE1 2 CHAIN_A X Y Z ...
RESIDUE1 3 CHAIN_A X Y Z ...
.
.
.
MODEL 3
.......
2、要求:因为要对文本中的数据进行各种计算,所以要求最终的类要能够灵活、快速(这一点比较重要)的组织视图,并要对上层隐藏实际的数据结构。
上层要求的视图:按CHAIN、RESIDUE来获取数据;取得各个MODEL、CHAIN的信息;
3、我的设计(下面有很多简写)
方案1
//描述每个文本行
class line
{
public:
int id_; // 对应于第二行 1,2,3,....
float x_,y_,z_;
};
//描述residue号码相同的几个文本行
class residue
{
public:
int id_; //表示号码
list<line> lines_;
};
//描述chain号码相同的部分
class chain
{
public:
int id_ ; //chain 的号码
list<residue> res_;
};
//描述model号码相同的部分
class model
{
public:
int id_ ;
list<chain> chains_;
};
//描述一个文件
class pdbfile
{
list<model> models_;
public:
//读取文件
void read(const char*);
....
//读数据部分
bool getfirstmodel(modle&);
bool getnextmodel(model&);
bool getfirstchain(const model&,chain&);
bool getnextchain(const model&,chain&);
bool getfirstresidue(const chain&,residue&);
bool getnextresidue(const chain&,residue&);
bool getfirstline(const residue&,line&);
bool getnextline(const residue&,line&);
....
};
在实际使用过程中,发现非常繁琐(4重循环),并且效率低下(每次提取数据都要拷贝),而我又不想将存储的数据格式告诉上层(相让上层处理多种文件格式)
后来,偶然想到要是数据库该如何存储这些数据了,于是有了第二种方案



方案二
class line
{
public:
int modelid_;
int chainid_;
int residueid_;
int lineid_;

float x,y,z;....
};
class pdbfile
{
list<line> data_;
public:
...
};
这种方法没有具体实现,也许在理解上比第一种会好一些(我不喜欢多维数组),但使用时还是非常繁琐

这个例子应该算比较典型,文件是层次结构是怎么定义他的结构
所以请各位畅所欲言,给出你们的想法。谢谢

...全文
111 点赞 收藏 5
写回复
5 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
zalyer 2003-03-15
呵呵.你到专题研究里看看
回复
ysqu 2003-03-09
教材都这样
回复
fireseed 2003-03-09
太复杂
回复
xhncmecx 2003-03-09
up
回复
winphoenix 2003-03-08
回复
发帖
C语言
创建于2007-09-28

6.3w+

社区成员

C语言相关问题讨论
申请成为版主
帖子事件
创建了帖子
2002-08-10 06:35
社区公告
暂无公告