数据结构论坛

首页 » 分类 » 问答 » 漫画Git中的的数据结构和算法设计
TUhjnbcbe - 2021/8/31 9:00:00
大家好哇~欢迎来到波波和阿菌神奇的“科普”频道!今天,我们为大家介绍程序员是如何怎么存档并管理文件版本的。大家要做好心理准备,今天的“科普”稍有点点硬核,阿菌想从需求分析,产品设计,代码实现等全方位角度为大家“科普”,综合的东西较多,可能不太好看懂......但内容应该还是有点点意思的,毕竟阿菌总是写一些乱七八糟的东西,如果暂时感觉难以消化可以考虑先收藏吖~在开始之前,我们先为大家介绍一个概念,叫:版本管理。我们先从日常生活讲起。阿菌这坏小子有时会想回到自己的过去,比如说回到小学时候的自己,回到初中时的自己,回到高中时的自己,或者回到大学前的自己,重读一次大学等等......人生的每个阶段,我们都可以看成自己的一个版本,比如说小学版的阿菌,初中版的阿菌,高中版的阿菌,大学版的阿菌......要是老天真的给我们每个阶段都存了档,那我们就可以回到过去的版本,重新开始了!从旧版本发展出新的人生,或许我们的人生可以拥有好几条分支路线呢......虽然目前看来不太现实,就算真的有得选,阿菌也绝不会回到过去的版本,因为阿菌不敢保证在另一条人生分支上,还能遇到波姐......咳咳,打住!虽然人生没有存档,但是电脑上的文件可以存档!大家考虑以下场景:假设学院安排我们做一次毕业晚会宣传活动,既要有PPT,又要有文稿,还得有海报。于是我们高高兴兴地把全学院的本科生资料编写到了PTT,文稿和海报里。这个时候,学院说:怎么可以只有本科生的资料?研究生的相关资料也要加进去!然后我们在现有的PPT,文稿和海报里,加入了研究生的资料。接着学院说:临时通知,研究生的晚会另外举行!大家可能就傻眼了:我们已经在PPT,文稿和海报里加了研究生的信息,而且已经和本科生的内容融合到了一起,这删起来也太麻烦了吧!!!要是我们提前把本科生的策划资料保存为一个版本就好了,这样就能直接把本科生的版本交给学院,完成工作。现在场景有了,痛点有了,接下来我们着手设计一款软件产品来解决这个问题(有同学会说,阿菌你扯淡,我每个版本复制一份就行啦,搞个软件出来干嘛?呃呃,坚持看完就懂啦,它不只存档这么简单哦。我们手动拷贝存档容易出现各种各样的问题,比如忘了存,忘了存在哪,存的顺序搞乱了等等......试过就会有体会哦)。现在我们有一个文件夹,文件夹目录下有PPT,文稿和海报,要不我们就在这里创建多一个文件夹用于存档吧!把名字起名为“.jun”就好啦!现在我们创建好了一个“.jun”文件夹用于存放当前目录的版本信息,接下来我们要思考的是,该如何保存各个文件的版本?在计算机领域,我们来到的环节应该叫设计底层数据结构,我们可以把“.jun”文件夹看成一个数据库,这个数据库会用来保存当前文件夹下文件的版本数据。嗯,不如这样吧!我们就把这些.doc、.psd、.ppt文件称为object吧!(反正也不知道叫什么好)我们在“.jun”文件夹下创建一个“objects”文件用于存放各个object的信息,这样,我们就有了一个object数据库了!呃,听起来好像很厉害,其实阿菌只是创建了两个文件夹......现在我们想想一个object该存些什么东西比较好,究竟什么东西才能精准定位一个文件的版本信息呢?想来想去,不如这样吧,我们一个object至少得包含三个信息:1.文件的原本信息,我们PPT,WORD文档中的内容就叫原本信息,直接保存原本信息可能需要很大的空间(至少和这些文件本身一样大),我们可以先压缩,再保存。2.object的类型,考虑到我们当前文件夹下除了有PPT,文稿和海报之外,以后还可能放新的文件或者新的文件夹,文件和文件夹都应该叫object,只不过可以用不同的类型区分他们。(大家可以在这留个心眼,这是这款版本控制管理软件的精华部分,后面就知道啦)3.一串字符数字,我们起个专业点的名字叫哈希值,用于标识当前的object,每个object都有独一无二的哈希值(其实就一串乱七八糟的数字字符,这样不容易重复)。看到这里,大家可能会有疑惑:你们为啥一直在说怎么设计,我们更想知道的是,为什么这么设计?下面揭示谜底:大家先看第一张图,当前文件夹下的PPT,文稿和海报,我们可以分别用三个object表示:由于他们放在同一个目录下,于是我们可以用一个大的object来标记他们,我们把这个大object的类型定义为tree(树干的感觉),这个treeobject对等的就不是一个个文件了,而是一个文件夹:细心的读者朋友会发现:咦?这个treeobject貌似已经包含了当前文件夹下的所有文件信息,也就是说,这个treeobject貌似已经可以记录当前文件夹的版本信息了!我们可以通过这个treeobject找到PPT,文稿和海报对应的object们,这些object保存有PPT,文稿和海报某个时间点的原信息,我们只要把这些信息解压出来,就能把文件夹恢复到曾经存档时候的样子了。接下来的问题是:我们不会只保留一份存档,我们会保存很多份存档,如何才能把一系列存档组织起来呢?接下来我们引入一个新的object类型,我们叫起名叫
1
查看完整版本: 漫画Git中的的数据结构和算法设计