数据结构设计的思索

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:
...
};
这种方法没有具体实现,也许在理解上比第一种会好一些(我不喜欢多维数组),但使用时还是非常繁琐

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

...全文
132 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
zalyer 2003-03-15
  • 打赏
  • 举报
回复
呵呵.你到专题研究里看看
ysqu 2003-03-09
  • 打赏
  • 举报
回复
教材都这样
fireseed 2003-03-09
  • 打赏
  • 举报
回复
太复杂
xhncmecx 2003-03-09
  • 打赏
  • 举报
回复
up
winphoenix 2003-03-08
  • 打赏
  • 举报
回复

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧