需求:
对于枚举类型字段,一般数据库中存储的是整型值,但在业务处理中使用整型值可读性不强,且显示对应中文描述不方便。
例如订单状态的枚举值为:0:未支付 1:支付中 2:已支付 3:已退款,现在有一个需求需要在业务中判断订单的状态,处理相应的逻辑,并将订单状态对应的中文描述提示给用户。
那么普通的处理方式可能如下:
function HandleOrderStaus(orderStatus: integer): string;
begin
case orderStatus of
0: begin
//...此处处理未支付的逻辑
result := '未支付';
end;
1: begin
//...此处处理支付中的逻辑
result := '支付中';
end;
2: begin
//...此处处理已支付的逻辑
result := '已支付';
end;
3: begin
//...此处处理已退款的逻辑
result := '已退款';
end;
default:
result := '未知的支付状态';
end;
end;
此方法的缺点:在代码中用0、1、2、3表示订单状态,可读性不强,且对应中文描述不方便管理
解决方案:
一、枚举类型+常量数组
定义订单状态的枚举类型:
type
//订单状态 0:未支付 1:支付中 2:已支付 3:已退款
TOrderStatus = (osUnpaid=0, osPaying=1, osPaid=2, osRefund=3);
定义常量数组表示订单状态对应的中文描述,数组的下标用枚举类型:
const
//订单状态中文描述常量数组
ARR_ORDERSTATUS: array[TOrderStatus] of string = ('未支付', '支付中', '已支付', '已退款');
用枚举值进行业务逻辑处理:
function HandleOrderStaus(status: Integer): string;
begin
case TOrderStatus(status) of
osUnpaid: begin
//...此处处理未支付的逻辑
result := ARR_ORDERSTATUS[osUnpaid];
end;
osPaying: begin
//...此处处理支付中的逻辑
result := ARR_ORDERSTATUS[osPaying];
end;
osPaid: begin
//...此处处理已支付的逻辑
result := ARR_ORDERSTATUS[osPaid];
end;
osRefund: begin
//...此处处理已退款的逻辑
result := ARR_ORDERSTATUS[osRefund];
end;
default:
result := '未知的支付状态';
end;
end;
遍历显示所有订单状态中文描述:
function ShowAllOrderStatus: string;
var
val: string;
begin
Result := '';
//遍历数组,返回所有订单状态中文描述
for val in ARR_ORDERSTATUS do
begin
Result := Result + ' -- ' + val;
end;
end;
枚举值和整形相互转换:
//将枚举值转为整形
Ord(osPaid)
//将整形转为对应枚举值
TOrderStatus(0)
二、枚举类型+字典类型
定义订单状态的枚举类型:
type
//订单状态 0:未支付 1:支付中 2:已支付 3:已退款
TOrderStatus = (osUnpaid=0, osPaying=1, osPaid=2, osRefund=3);
初始化订单状态字典、遍历:
procedure ShowAllOrderStatus;
var
val: string;
orderStatusDict: TDictionary<TOrderStatus, string>; //订单状态字典
pair: TPair<TOrderStatus, string>; //用于存储临时键值对的变量
begin
orderStatusDict := TDictionary<TOrderStatus, string>.Create;
try
//初始化字典
orderStatusDict.Add(osUnpaid, '未支付');
orderStatusDict.Add(osPaying, '支付中');
orderStatusDict.Add(osPaid, '已支付');
orderStatusDict.Add(osRefund, '已退款');
//使用 pair 遍历字典,显示到 TMemo 控件(mmoOrderStatus)
for pair in orderStatusDict do
begin
mmoOrderStatus.Lines.Add(IntToStr(Ord(pair.Key)) + ': ' + pair.Value);
end;
//仅遍历字典的 values 值
for val in orderStatusDict.Values do
begin
mmoOrderStatus.Lines.Add(val);
end;
//显示“未支付”
mmoOrderStatus.Lines.Add(orderStatusDict[osUnpaid]);
finally
orderStatusDict.Free;
end;
end;