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 应用所需的所有组件.本文及接下来的一篇我们将深入到组成应用的每一层:模型层.视图层和业务逻辑层. 本文中 ...
随机推荐
- Go 终极指南:编写一个 Go 工具
https://arslan.io/2017/09/14/the-ultimate-guide-to-writing-a-go-tool/ 作者:Fatih Arslan 译者:oopsguy.com ...
- PHP四种基本排序算法
PHP的四种基本排序算法为:冒泡排序.插入排序.选择排序和快速排序. 下面是我整理出来的算法代码: 1. 冒泡排序: 思路:对数组进行多轮冒泡,每一轮对数组中的元素两两比较,调整位置,冒出一个最大的数 ...
- python参考手册一书笔记之第一篇上
在python2和python3的版本差异很大输出hello world的方法在2里支持在3里就不支持了. print 'hello world' #在2中支持 print ('hello world ...
- 有两组随机生成的(0~99999)Int32数据A和B,将A按顺序判断在B中是否存在并记录在Boolean型的C中
http://www.cnblogs.com/asxinyu/p/4504487.html
- common lisp的宏的工作模式
(defmacro our-expander (name) ‘(get ,name ’expander))(defmacro our-defmacro (name parms &body bo ...
- C#中判断语句 if、if-else if、switch-case
1.if一般用于一个条件的判断: 2.if-else if 一般用于多个条件的判断: 3.switch-case一般用于多个条件的判断. 注:if-else if与switch-case的区别在于:一 ...
- ES6 class的继承使用细节
ES6 class的继承与java的继承大同小异,如果学过java的话应该很容易理解,都是通过extends关键字继承. class Animal{ constructor(color){ this. ...
- Best MVC Practices(最优的MVC布局)
Best MVC Practices 最优的MVC布局策略 Model View Controller 1.数据层 2.视图层 3.控制器层 Although Model-View-Controlle ...
- POJ2318 TOYS(叉积判断点与直线的关系+二分)
Calculate the number of toys that land in each bin of a partitioned toy box. Mom and dad have a prob ...
- CodeForces - 556C Case of Matryoshkas
//////////////////////////////////////////////////////////////////////////////////////////////////// ...