项目迭代开发手记--文件分割存储用例的实现过程(3)
2006-02-04 13:54:05 来源:WEB开发网 闂傚倷绶氬ḿ褍螞閹绢喖绠柨鐕傛嫹

核心提示:项目迭代开发手记--文件分割存储用例的实现过程(3) 上午的迭代2完成后,我们获得了一个有完整压缩流功能的实现代码,项目迭代开发手记--文件分割存储用例的实现过程(3),这次迭代完成的代码是可用的,我们在迭代2中完成了我们既定的任务,剩下来就使考虑图档文件的格式问题了,其实更主要的通过这次开发我们让新加入的组员获得了一
项目迭代开发手记--文件分割存储用例的实现过程(3)
上午的迭代2完成后,我们获得了一个有完整压缩流功能的实现代码,这次迭代完成的代码是可用的,我们在迭代2中完成了我们既定的任务。在下午的小组讨论中,我们继续考虑下一阶段的迭代目标,由于没有决定图档文件的格式,我们决定先不考虑图片格式的问题,先实现文件的分割功能。文件的分割主要是考虑当图档文件太大的时,数据库提交性能会变得非常慢,分割的目的就是改进提交的性能。
迭代3:
对向数据库提交的二进制流进行分割压缩;那么从数据库提取的时候要进行解压和拼接操作,以获得原始图档数据。
在分割功能的设计和编码前,我们重新审视了上午的代码——那个压缩类TLoadBinaryDataToDB,发觉该类似乎职责太多,它要负责把文件装载成流,然后才对流进行压缩和解压缩,我们发现UnComPRessStream函数有更好的通用性,只要是压缩的流就可以对其进行解压。而压缩功能在这个类里似乎只能对通过文件装载的流进行压缩,如果流是以另一种形式获得的,不是以文件装载的形式,那么我们不知道该如何对该流进行压缩。这里似乎违背了功能单一的职责,类既负责了流的装载,又负责流的压缩;于是我们对该类进行了重构已获得结构更好的的类,以增加类的重用性。
重构后的类只有两个公用的方法 CompressStream 和 UnCompressStream 它们都已流为参数,通过对传入流的处理来实现压缩和解压缩功能。
procedure TCompressStream.CompressStream(var stream: TMemoryStream);
var
iSize: Integer;
lDestStream: TMemoryStream;
lCompressionStream: TCompressionStream;
begin
lDestStream := TMemoryStream.Create;
lCompressionStream := TCompressionStream.Create(clMax, lDestStream);
try
iSize := stream.Size; //获得图像流的原始尺寸
stream.SaveToStream(lCompressionStream); //将原始图像流进行压缩,
// lDestStream中保存着压缩后的图像流
lCompressionStream.Free;
stream.Clear;
stream.WriteBuffer(iSize, SizeOf(iSize)); //写入原始图像的尺寸
stream.CopyFrom(lDestStream, 0); //写入经过压缩的图像流
finally
lDestStream.Free
end;
end;
解压缩函数
procedure TCompressStream.UnCompressStream(var stream: TMemoryStream);
var
DecompressionStream: TDecompressionStream;
Buffer: PChar;
Count: Integer;
begin
stream.ReadBuffer(Count, SizeOf(Count));
GetMem(Buffer, Count); //根据图像尺寸大小为将要读入的原始图像流分配内存块
DecompressionStream := TDecompressionStream.Create(stream);
try
DecompressionStream.ReadBuffer(Buffer^, Count); //将被压缩的图像流解压缩,
//然后存入 Buffer内存块中
stream.Clear;
stream.WriteBuffer(Buffer^, Count); //将原始图像流保存至 stream流中
stream.Position := 0;
finally
FreeMem(Buffer); // 释放内存
end;
end;
经过重构后,类TCompressStream无疑提高了重用性,同时有更好的结构。除去了把文件装载成流的功能后,TCompressStream职责变得更单一了。它对已任何形式获得得的流都可以进行压缩和解压缩。完成TLoadBinaryDataToDB重构我们开始考虑对流进行分割功能的实现。
在假定一个流被分割成5份,那么拼接时就要有一个顺序我们考虑在数据库增加一个顺序的字段来保存流各个块之间的分割顺序。
字段名 | 字段类型 | 字段长度 | 字段说明 | |
FID | Number | 主键 | ||
F_NAME | VarChar2 | 50 | 文件名称 | |
F_SERIAL | Number | 文件分割顺序号 | ||
F_BINARY_DATA | Long Row | 二进制数据 |
这样当迭代3完成的时候我们实现了对了流的分割压缩,文件分割存储用例到这里获得一个好的解决方案,通过小步的迭代前进我们可以在每一次迭代结束的时候获得可以使用的功能代码,剩下来就使考虑图档文件的格式问题了。其实更主要的通过这次开发我们让新加入的组员获得了一次很好的编程培训,更容易理解要实现一个功能的具体思路和步骤。
- ››开发Android 日历教程
- ››开发学院总结 Win 8实用技巧大全
- ››开发学院原创教程:把win8的IE10放桌面上方法(非...
- ››开发者眼中的Windows Phone和Android
- ››开发学院教你用SQL 语句最快速清空MySQL 数据表的...
- ››开发一个自己的HTML在线编辑器(一)
- ››开发一个自己的HTML在线编辑器(二)
- ››开发者在App Store上赚的钱比在Android Market上多...
- ››开发者应深入学习的10个Android开源应用项目
- ››开发移动 Web Ajax 应用
- ››开发者眼中的iPhone与Android
- ››迭代开发:WebSphere adapters 7.0 让您更灵活的开...
赞助商链接