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 应用所需的所有组件.本文及接下来的一篇我们将深入到组成应用的每一层:模型层.视图层和业务逻辑层. 本文中 ...
随机推荐
- Java IO流 思维导图
- LINUX 笔记-cp命令
常用参数: -a :将文件的特性一起复制 -p :连同文件的属性一起复制,而非使用默认方式,与-a相似,常用于备份 -i :若目标文件已经存在时,在覆盖时会先询问操作的进行 -r :递归持续复制,用于 ...
- django中使用sha1,md5加密
# salt 盐 使用sha1加密算法,返回str加密后的字符串 # 提高字符串的复杂的 from hashlib import sha1 def get_hash(str, salt=None): ...
- R学习笔记 第三篇:数据框
数据框(data.frame)用于存储二维表(即关系表)的数据,每一列存储的数据类型必须相同,不同的数据列的数据类型可以相同,也可以不同,但是,每列的长度必须相同.数据框的每列可以有唯一的命名,在已创 ...
- CentOs 系统启动流程相关
CentOS的启动流程 1)加载BIOS 的硬件信息,获取第一个启动设备 2)读取第一个启动设备MBR 的引导加载程序(grub) 的启动信息 3)加载核心操作系统的核心信息,核心开始解压缩,并尝试驱 ...
- 04-从零玩转JavaWeb-JVM内存详情分析
JVM内存划分栈与栈帧 JVM将内存主要划分为: 方法区 虚拟机栈 本地方法栈 堆 程序计数器 一.方法区:存放字节码,常量 ,静态变量,是一个共享的区域 二.虚拟机栈:执行方法其实就是栈帧入栈,出栈 ...
- JMeter 压力测试使用CSV参数
表示之前从没用过JMeter所以记录一下使用过程 Apache JMeter是Apache组织开发的基于Java的压力测试工具.用于对软件做压力测试,它最初被设计用于Web应用测试,但后来扩展到其他测 ...
- centos7 防火墙 配置
1.查看Firewall 服务状态 systemctl status firewalld 2.查看Firewall 的状态 firewall-cmd --state 注意: firewalld默认配置 ...
- HDU1005 Number Sequence (奇技淫巧模拟)
A number sequence is defined as follows: f(1) = 1, f(2) = 1, f(n) = (A * f(n - 1) + B * f(n - 2)) mo ...
- 状压DP小结
看了一个多星期状压DP,总算有点明白,大概可以分为两种:数据是在矩阵中的,数据是线性的,在矩阵中的一般就是排兵布阵这一种的,还有一种线性结构中给定条件让你求最大权值,比如求最大权值路线,TSP问题等, ...
