你应该知道的States字段使用规范
程序员文章站
2022-06-17 10:35:54
前言
最近在工作中了遇到了一些内容,觉着有必要和大家分享下,我们为了统一数据库表的状态字段,统一数据库表设计,简化字段在程序开发中的使用方式,下面话不多说了,来一起看看详...
前言
最近在工作中了遇到了一些内容,觉着有必要和大家分享下,我们为了统一数据库表的状态字段,统一数据库表设计,简化字段在程序开发中的使用方式,下面话不多说了,来一起看看详细的介绍吧。
解决方式
states对应位域枚举statesflags。
/// <summary> /// 数据状态枚举 /// </summary> [flags] [datacontract] [enumdescription("状态")] public enum statesflags { /// <summary> /// 可用状态 /// </summary> [xmlenum("1")] [enumdescription("可用")] [enummember] enabled = 1, /// <summary> /// 停用状态 /// </summary> [xmlenum("2")] [enumdescription("停用")] [enummember] disabled = 1 << 1, /// <summary> /// 移除(相当于逻辑删除) /// </summary> [xmlenum("4")] [enumdescription("移除")] [enummember] removed = 1 << 2, /// <summary> /// 已确认(已经审核通过) /// </summary> [xmlenum("8")] [enumdescription("已确认")] [enummember] confirmed = 1 << 3, /// <summary> /// 锁定 /// </summary> [xmlenum("16")] [enumdescription("锁定")] [enummember] locked = 1 << 4, /// <summary> /// 锁定登录 /// </summary> [xmlenum("32")] [enumdescription("锁定登录")] [enummember] locklogin = 1 << 5 }
业务模型使用方式
在业务模型中,需要关注模型的特定状态集,写入新的状态时使用模型中的states, 读取时每一个状态独立提供读取实现。如下图中isremoved状态 以后大家一看代码就知道这个模型到底有几个状态
///<sumary> /// 状态集,写 ///</sumary> public statesflags states { get; set; } /// <summary> /// 只读 /// </summary> public bool isremoved => states.hasflag(statesflags.removed);
statesflags的4个扩展方法
/// <summary> /// 数据状态枚举 /// </summary> public static class statesflagsextends { /// <summary> /// 设置可用 /// </summary> /// <param name="states">状态</param> public static statesflags setenable(this statesflags states) { if (states.hasflag(statesflags.disabled)) states = states ^ statesflags.disabled; if (!states.hasflag(statesflags.enabled)) states = states | statesflags.enabled; return states; } /// <summary> /// 设置停用 /// </summary> /// <param name="states">状态</param> public static statesflags setdisable(this statesflags states) { if (states.hasflag(statesflags.enabled)) states = states ^ statesflags.enabled; if (!states.hasflag(statesflags.disabled)) states = states | statesflags.disabled; return states; } /// <summary> /// 移除状态 /// </summary> /// <param name="states">状态</param> /// <param name="state">要移除的状态</param> public static statesflags removestate(this statesflags states, statesflags state) { //也可以通过如下计算去除一个状态states = states & ~statesflags.disabled; return states ^ state; } /// <summary> /// 附加状态 /// </summary> /// <param name="states">状态</param> /// <param name="state">要附加的状态</param> public static statesflags attachstate(this statesflags states, statesflags state) { return states | state; } }
由于enable和disable是互斥的,所以对应有setdisable、setenable 。其它非互斥状态 提供 attachstate、removestate用于附加或移除状态。 如出现新的状态在statesflags中添加,状态为位域枚举,使用连续的数字移位操作,增加代码可读性。
附扩展方式测试代码
[testclass] public class statesflagstest { [testmethod] public void teststatesextends() { //赋初值 在用、锁定、移除 var state = statesflags.enabled | statesflags.locked | statesflags.removed; //调用setdisable方法,设为停用 state = state.setdisable(); assert.istrue(!state.hasflag(statesflags.enabled)); assert.istrue(state.hasflag(statesflags.disabled)); //调用setenable方法,设为在用 state = state.setenable(); assert.istrue(state.hasflag(statesflags.enabled)); assert.istrue(!state.hasflag(statesflags.disabled)); //调用removestate方法,移除状态 state = state.removestate(statesflags.locked); assert.istrue(!state.hasflag(statesflags.locked)); assert.istrue(state.hasflag(statesflags.removed)); //调用attachstate方法,附加状态 state = state.attachstate(statesflags.confirmed); assert.istrue(state.hasflag(statesflags.confirmed)); //直接调用方法,不赋值不能改变states的值 state.attachstate(statesflags.locked); assert.istrue(!state.hasflag(statesflags.locked)); } }
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对的支持。