程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Delphi >> 領域驅動設計實踐——流水號生成器(下)(4)

領域驅動設計實踐——流水號生成器(下)(4)

編輯:Delphi

2. 生成編號

Code

1 function TNumberRule.GetNextNumber(const number: string): string;
2 begin
3  ParseNumber(number);
4  BuildNumber;
5  Result := GenerateNumber;
6 end;
7
8 // ParseNumber負責根據各個NumberPart的Length把編號拆成多個段,BuildNumber中封裝了規則的更新邏輯,GenerateNumber則生成編號。
9
10 procedure TNumberRule.BuildNumber;
11 var
12  part: TNumberPart;
13  value: string; // 拆分的編號
14  carrIEd: Boolean; // 進位標志
15  i: Integer;
16 begin
17  Assert(fParts.Count = fList.Count);
18  carrIEd := False;
19  for i := fParts.Count - 1 downto 0 do // 由低位向高位遍歷
20  begin
21   part := TNumberPart(fParts[i]);
22   value := fList[i];   
23   if part is TSequenceNumberPart then
24   begin
25    TSequenceNumberPart(part).SetValue(value);
26    if carrIEd or (i = fParts.Count - 1) then
27    begin
28     TSequenceNumberPart(part).Next(carrIEd);
29    end
30   end
31   else if (part is TDateTimeNumberPart) and
32    not SameText(TDateTimeNumberPart(part).Value, value) then
33   begin
34    ResetSequenceParts(part); // 如果日期不同則重置序列部分編號
35   end;
36  end;
37  if carrIEd then
38  begin
39   raise ENumberException.Create(SNumberOutOfRange);
40  end;
41 end

P.S. 序列部分(TSequenceNumberPart)的核心功能實現委托給任意進制計算器(BaseNCalculator),具體可參考源代碼。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved