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

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

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

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

     

      

  • 相关阅读:
    【凸优化】【长链剖分】【2019冬令营模拟1.8】tree
    2019冬令营集训1月7-10日总结
    item()方法遍历字典
    contiue和break的用法
    内存地址与变量值的关系
    Python垃圾回收机制
    Python的小整数池
    常量的命名和注意事项
    基本运算符
    Python中最简单快捷的输出方式
  • 原文地址:https://www.cnblogs.com/WangHuaiSheng/p/7954074.html
Copyright © 2011-2022 走看看