我有一个进程将数据读入150多个临时数组,处理数据并从临时数组复制到工作数组中。工作阵列在一个全局数组中,因此我可以导入多个数据,这意味着我可以重复同一个过程多达100次,最后使用大数组中的一组数据来保存我可以使用,比较和执行的100倍工作数据。如何重构数组之间的复制/移动数据?
我有150个以上的阵列,所以150倍:
// for each array
SetLength(myData[Idx].WorkNames,Length(tmpNames)); // <- prepare to copy
for i := 0 to High(tmpNames) do // <- copy
myData[Idx].WorkNames[i]:=tmpNames[i];
SetLength(tmpNames,0); // <- clear tmp array
4行代码对于每个阵列 - 150x4 = 600 LOC +初始+空行 - 大约900 LOC。
这里是我做的例子:
type
TName = record
NameID:integer;
Description:string;
end;
TItem = record
ItemID:integer;
Description:string;
Active:boolean;
end;
TWorkData = record
WorkDataType:string;
WorkNames:array of TName;
WorkItems:array of TItem;
end;
var
AllWorkData:array of TWorkData; // <- global array that has all work data - up to 100x sets of work data
tmpNames:array of TName; // <- tmp arrays before saving to work array
tmpItems:array of TItem; //
procedure TForm1.Button1Click(Sender: TObject);
var i,Idx:integer;
begin
// 1. read data into tmp arrays
ReadDataIntoTmpArrays;
ProcessTmpData;
// 2. copy tmp arrays into work data
Idx:=GetWorkDataIdx; // <- work data sequence number; start with 0
AllWorkData[Idx].WorkDataType:=GetWorkDataName(Idx);
SetLength(AllWorkData[Idx].WorkNames,Length(tmpNames));
SetLength(AllWorkData[Idx].WorkItems,Length(tmpItems));
for i := 0 to High(tmpNames) do
AllWorkData[Idx].WorkNames[i]:=tmpNames[i];
for i := 0 to High(tmpItems) do
AllWorkData[Idx].WorkItems[i]:=tmpItems[i];
// 3. clear tmp arrays
SetLength(tmpNames,0);
SetLength(tmpItems,0);
end;
问:有什么我能做到这一点更容易维护,重构代码?
这行'AllWorkData [0] .WorkNames:= tmpNames;'说:'[dcc32错误] Unit1.pas(90):E2008 Incompatible types'。我究竟做错了什么? –
这是因为.'WorkNames'和'tmpNames'是不属于赋值兼容的不同类型。改用'TArray'代替'T'的适当类型。 –
啊哈,现在有用。所以,你建议用'TArray'替换所有'T'阵列...... –