如何设计模型

通常情况,我们在设计模型的时候基本上是按照都是按照对象的属性都合并在一个模型中,其实当在设计这个对象的模型的时候,我们有没有考虑过模型粒度细化呢,虽然模型粒度细化会提高维度的成本,但是也提高的系统的灵活性,首要条件就是模型的粒度细化要合理化。(本文只讲设计不讲模型属性字段的属性问题)

1、通常的模型设计

2、细化的模型设计

3、讨论一下C#的类框架继承问题

一、通常的模型设计:回忆一下,平时我们在设计模型的时候是不是都按对象的属性设计呢?比如以下:

    /// <summary>
    /// 注册模型
    /// </summary>
    [Serializable]
    public class RegModel
    {
        private string _AccountName;
        /// <summary>
        /// 账号
        /// </summary>
        public string AccountName
        {
            get { return _AccountName; }
            set { _AccountName = value; }
        }

        private string _AccountPass;
        /// <summary>
        /// 账号密码
        /// </summary>
        public string AccountPass
        {
            get { return _AccountPass; }
            set { _AccountPass = value; }
        }

        private string _Email;
        /// <summary>
        /// 邮箱
        /// </summary>
        public string Email
        {
            get { return _Email; }
            set { _Email = value; }
        }
    }

    /// <summary>
    /// 发布模型
    /// </summary>
    [Serializable]
    public class PublishModel
    {
        private string _AccountName;
        /// <summary>
        /// 发布人账号
        /// </summary>
        public string AccountName
        {
            get { return _AccountName; }
            set { _AccountName = value; }
        }

        /// <summary>
        /// 发布时间
        /// </summary>
        public Nullable<DateTime> PublishTime
        {
            get;
            set;
        }
    }

其实我们回头看看这个设计方法是不是存在了一个重复的属性呢(可能由于国人还是比较喜欢做重复的事情吧,包括我也被强逼写重复的东西,唉)?为什么我们不能将模型先设计好呢?比如注册模型、人员模型、发布模型,将模型都合理化的细化。

二、细化的模型设计。如何达到模型粒度细化的设计呢?首先我们要感谢编程的的“继承”师父。我们来看看以下的模型设计

    /// <summary>
    /// 时间模型
    /// </summary>
    [Serializable]
    public class TimeModel
    {
        /// <summary>
        /// 共用时间设置
        /// </summary>
        public Nullable<DateTime> TimeSet
        {
            get;
            set;
        }

        private Nullable<DateTime> _RegDateTime;
        /// <summary>
        /// 注册时间
        /// </summary>
        public Nullable<DateTime> RegDateTime
        {
            get { return _RegDateTime; }
            set { _RegDateTime = value; }
        }

        private Nullable<DateTime> _EditDateTime;
        /// <summary>
        /// 编辑时间
        /// </summary>
        public Nullable<DateTime> EditDateTime
        {
            get { return _EditDateTime; }
            set { _EditDateTime = value; }
        }

        private Nullable<DateTime> _PublishDateTime;
        /// <summary>
        /// 发布日期
        /// </summary>
        public Nullable<DateTime> PublishDateTime
        {
            get { return _PublishDateTime; }
            set { _PublishDateTime = value; }
        }

        private Nullable<DateTime> _LoginDateTime;
        /// <summary>
        /// 登录时间
        /// </summary>
        public Nullable<DateTime> LoginDateTime
        {
            get { return _LoginDateTime; }
            set { _LoginDateTime = value; }
        }
    }

    /// <summary>
    /// 登录模型
    /// </summary>
    [Serializable]
    public class LoginModel : TimeModel
    {
        private string _Account;
        /// <summary>
        /// 账号
        /// </summary>
        public string Account
        {
            get { return _Account; }
            set { _Account = value; }
        }

        private string _AccountPass;
        /// <summary>
        /// 账号的密码
        /// </summary>
        public string AccountPass
        {
            get { return _AccountPass; }
            set { _AccountPass = value; }
        }

    }

    /// <summary>
    /// 个人信息模型
    /// </summary>
    [Serializable]
    public class PersonModel : LoginModel
    {
        private string _PersonName;
        /// <summary>
        /// 人的姓名
        /// </summary>
        public string PersonName
        {
            get { return _PersonName; }
            set { _PersonName = value; }
        }

        private string _PersonNickName;
        /// <summary>
        /// 人的昵称
        /// </summary>
        public string PersonNickName
        {
            get { return _PersonNickName; }
            set { _PersonNickName = value; }
        }
    }
    /// <summary>
    /// 个人附属信息模型
    /// </summary>
    [Serializable]
    public class PersonInfoModel : PersonModel
    {
        private string _Email;
        public string Email
        {
            get { return _Email; }
            set { _Email = value; }
        }

        private string _MobileTelNumber;
        /// <summary>
        /// 移动电话
        /// </summary>
        public string MobileTelNumber
        {
            get { return _MobileTelNumber; }
            set { _MobileTelNumber = value; }
        }
    }
    /// <summary>
    /// 文章模型
    /// </summary>
    [Serializable]
    public class ArticleModel : PersonModel
    {
        private string _Content;
        /// <summary>
        /// 文章内容
        /// </summary>
        public string Content
        {
            get { return _Content; }
            set { _Content = value; }
        }

        public int _ViewTimes;
        /// <summary>
        /// 查阅次数
        /// </summary>
        public int ViewTimes
        {
            get { return _ViewTimes; }
            set { _ViewTimes = value; }
        }
    }

我们通过继承的方式,将模型粒度合理性的细化,就可能达到,我们不用天天都在写重复性的模型属性了,有新的对象出来,首先,我们要想到这个对象要有那些属性(功夫)。

三、讨论一下C#的框架继承问题:

很多时候,我也在考虑一个问题,人都不是都是一个习惯性的动物呢(引用《流氓校长》剧的一句话)。很多人通常都习惯将“继承者”称为子,“被继承”者称为父,其实在我的心目中,继承的关系不是“父子”关系,而是“师父”关系(请看我的第二问的称呼),我为什么要称它为“师父”关系呢?首先我要讲述的一个问题就是“父子”关系,因为“父子”关系是限死“子”只有一个“父”,这样设计起来就不太灵活多样化了(可能由于编程是外佬创造了,脑袋没有师父这个概念)。那么我们来讨论一个“师父和徒弟”的关系。我们都很清楚的知道,徒弟可以拜多个师父,那么这个徒弟就可以有多个师父的功夫了,而已这个徒弟一功夫可以按自己的意愿学自己想要的功夫,就不会有很多杂的东西在其中了,然后不同的师父接自己的徒弟(虽然这个徒弟已经学了很多个师父的功夫)的时候,就只会要接收对应师父的功夫而已了。我们再回头看看刚才的“继承”方式的模型设计,我们还是发现其中存在一些问题,比如:我们注册需要“注册时间”,但不需要“编辑时间”,而文章我需要发布时间、编辑时间,但不需要注册时间,等等。因为这样会导致我们的模型会被胀了。

在C#下,我们只能继承一个类,而不能继承多个类,也是一个模具啊,谁叫那是外国佬的东西呢,唉......

原文地址:https://www.cnblogs.com/magic_evan/p/1946096.html