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