zoukankan      html  css  js  c++  java
  • States字段的使用规范

    背景

    为了统一数据库表的状态字段,统一数据库表设计,简化字段在程序开发中的使用方式。

    解决方式

    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));
    
            }
        }

       


     文章作者:花生(OutMan)

    发布地址:http://www.cnblogs.com/WangHuaiSheng/ 

    发布时间:2017-12-02

    本文版权归作者和博客园共有,欢迎转载,

    但未经作者同意必须保留此段声明,

    且在文章页面明显位置给出原文连接。

     

      

  • 相关阅读:
    Mybatis配置文件中Insert 元素标签添加配置有哪些呢?
    Mybatis配置文件中Select元素标签输入参数有多少种输入方式呢?
    Mybatis配置文件如何进行配置呢?
    Centos安装 Apache Benchmark
    本地连接阿里云上的mysql centos
    python 导出项目需要的库
    Nginx报错:nginx: [error] OpenEvent("Global gx_reload_14944") failed (2: The system cannot find the file specified)
    windows安装uwsgi报错 AttributeError: module 'os' has no attribute 'uname'
    P3346 [ZJOI2015]诸神眷顾的幻想乡(广义后缀自动机)
    P6139 【模板】广义后缀自动机(广义 SAM)
  • 原文地址:https://www.cnblogs.com/WangHuaiSheng/p/7954074.html
Copyright © 2011-2022 走看看