States字段的使用规范
背景
为了统一数据库表的状态字段,统一数据库表设计,简化字段在程序开发中的使用方式。
解决方式
States对应位域枚举StatesFlags。
/// <summary>
/// 数据状态枚举
/// </summary>
[Flags]
[DataContract]
[EnumDescription("状态")]
public enum StatesFlags
{
/// <summary>
/// 可用状态
/// </summary>
[XmlEnum("")]
[EnumDescription("可用")]
[EnumMember]
Enabled = ,
/// <summary>
/// 停用状态
/// </summary>
[XmlEnum("")]
[EnumDescription("停用")]
[EnumMember]
Disabled = << ,
/// <summary>
/// 移除(相当于逻辑删除)
/// </summary>
[XmlEnum("")]
[EnumDescription("移除")]
[EnumMember]
Removed = << ,
/// <summary>
/// 已确认(已经审核通过)
/// </summary>
[XmlEnum("")]
[EnumDescription("已确认")]
[EnumMember]
Confirmed = << ,
/// <summary>
/// 锁定
/// </summary>
[XmlEnum("")]
[EnumDescription("锁定")]
[EnumMember]
Locked = << ,
/// <summary>
/// 锁定登录
/// </summary>
[XmlEnum("")]
[EnumDescription("锁定登录")]
[EnumMember]
LockLogin = <<
}
业务模型使用方式
在业务模型中,需要关注模型的特定状态集,写入新的状态时使用模型中的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)); }
}
![]() |
文章作者:花生(OutMan)
发布地址:http://www.cnblogs.com/WangHuaiSheng/ 发布时间:2017-12-02 本文版权归作者和博客园共有,欢迎转载, 但未经作者同意必须保留此段声明, 且在文章页面明显位置给出原文连接。 |
States字段的使用规范的更多相关文章
- .NET设计规范————命名规范
NET设计规范:约定.惯用法与模式———命名规范 前言: 最近在看<.NET设计规范:约定.惯用法与模式>一书,主要还是讲.NET的设计规范,以前对这一块也不是特别在意, ...
- 1.4.2 solr字段类型--(1.4.2.1)字段类型定义和字段类型属性
1.4.2 solr字段类型 (1.4.2.1) 字段类型定义和字段类型属性. (1.4.2.2) solr附带的字段类型 (1.4.2.3) 使用货币和汇率 (1.4.2.4) 使用Dates(日期 ...
- RFC2616-HTTP1.1-Header Field Definitions(头字段规定部分—译文)
part of Hypertext Transfer Protocol -- HTTP/1.1 RFC 2616 Fielding, et al. 14 头字段规定 该章节定义了HTTP1.1标准所包 ...
- 3.命名规范《.NET设计规范》
3.命名规范 3.1 大小写约定 使用合适的大小写增强名字可读性. 3.1.1 标识符的大小写规则 标识符的每个单词首写字幕大写.不要用下划线. PascalCasing camelCasing Pa ...
- 翻页bug 在接口文档中应规范参数的取值区间
<?php$a=array("red","green","blue","yellow","brown&q ...
- 一个数字从后向前输入每一位数字,Camel和Pascal命名规范,IsValid()
int num = int.Parse(Console.ReadLine()); ; ) { n = num % ; num /= ; Console.WriteLine(n); } Camel和Pa ...
- odoo字段属性
以下为可用的非关联字段类型以及其对应的位置参数: Char(string)是一个单行文本,唯一位置参数是string字段标签. Text(string)是一个多行文本,唯一位置参数是string字段标 ...
- 翻页bug 在接口文档中应规范参数的取值区间 接口规范
<?php$a=array("red","green","blue","yellow","brown&q ...
- 第六章 Odoo 12开发之模型 - 结构化应用数据
在本系列文章第三篇Odoo 12 开发之创建第一个 Odoo 应用中,我们概览了创建 Odoo 应用所需的所有组件.本文及接下来的一篇我们将深入到组成应用的每一层:模型层.视图层和业务逻辑层. 本文中 ...
随机推荐
- VMware Tools安装方法及共享文件夹设置方法
正确安装好VMware Tools后,可以实现主机与虚拟机之间的文件共享, 可以设置共享文件夹,以及在主机与虚拟机之间直接进行复制黏贴的操作. 安装方法: 选择"虚拟机"-> ...
- uva242,Stamps and Envelope Size
这题紫薯上翻译错了 应该是:如果有多个并列,输出邮票种类最少的那个,如果还有并列,输出最大面值最小的那个 坑了我一个下午 dp[p][q]==1表示可以用不超过q张组成面额p 结合记忆化,p从1开始枚 ...
- .NET采集数据,放入数据库总结
第一次做采集Json的还简单一些但是XML的简直了......... JSON //采集数据 public string GetBetRecordToRepository()//随便你返回什么 { t ...
- 阻塞队列BlockingQueue
BlockingQueue最终会有四种状况,抛出异常.返回特殊值.阻塞.超时,下表总结了这些方法: 抛出异常 特殊值 阻塞 超时 插入 add(e) offer(e) put(e) offer(e, ...
- LINUX 笔记-top命令
top命令经常用来监控linux的系统状况,比如cpu.内存的使用. top - :: up day, :, users, load average: 0.00, 0.01, 0.00 Tasks: ...
- Git相关操作三
1.显示当前分支: git branch 输入上述命令可以显示出分支,*所在的分支为当前分支. 2.新建分支: git branch new_branch new_branch为新建分支的名称,注意该 ...
- label联动checkbox
label联动checkbox时,若label包含在checkbox外层时label不需for属性,设置label的display属性为block时可以使整个div联动.
- VPS搭建离线下载服务器——后网盘时代
动机 由于学习的需要,在国外某服务器厂商购买了vps服务(至于是哪个厂商就不说啦).但是呢,就算用作梯子,一个月1T的流量总是用不完.最经觉得自己营养充足,想找点电影看看. 无奈现在百度网盘的速度真的 ...
- bug:翻页
本章主要分享下,个人测试经历中遇见过的翻页bug 一.列表翻页 1.bug1:去请求翻页page=0,从0页开始算.一般来说page=0 和 page=1的数据是一模一样,所以翻第2页时会发现和第1页 ...
- python基础6 迭代器 生成器
可迭代的:内部含有__iter__方法的数据类型叫可迭代的,也叫迭代对象实现了迭代协议的对象 运用dir()方法来测试一个数据类型是不是可迭代的的. 迭代器协议是指:对象需要提供next方法,它要么返 ...