zoukankan      html  css  js  c++  java
  • 你必须要知识的架构知识~第四章 抽象类展现代码的层次感

    有几天没写这方面的文章了,坦白说,没灵感,今天晚上,还是要写点东西,准备说一下抽象类在架构设计中的层次感,其实一说到抽象类,大家第一个就会想到基类,由通用属性和通用方法组成的类,可能定义一些规范,而自身又可以实现一些统一功能的类,这都是抽象类的表现,我不想把书本上的话拿出来说,也不想把某校培训学校名师的话拿来说,我只想从我的代码中说问题,因为大家真正想听的,想看的是这些“术语“在代码中的应用,不是吗?呵呵。

    这几天又看了看EF的code first模块,就是把实体类设计好,然后运行后,将用到的类进行数据表的自动生成,我也曾经说过,code first使“面向对象更加面向对象”了,但如果是团队开发的话,这种模块可能会有点乱,给数据统一带来一些坏味道,为何?说一个场景:张三建了一张user表,李四不知道张三建了user表,他希望用到一个用户类型的实体,所以李四也可能建立了一个userbase表,这时,当他们运行程序后,数据库可能会有两个功能相同的用户表,这就是数据上的不统一,其实code first对象小项目还是很不错的选择,大型项目建议还是用database first,即,先设计数据库,再生成实体对象。

    用code first说一个抽象类的用法:

    首先对于实体表应该会有一个主键,为了保险起见,我们用long类型,也就是sqlserver里的bitint ,C#里int64,保留字是long,代码可能是这样

    image

    /// <summary>
      /// 实体基类
      /// </summary>
      public abstract class BaseEntity
      {
          /// <summary>
          /// 統一主鍵
          /// </summary>
          [Key]
          [Display(AutoGenerateField = false)]
          public virtual long ID { get; set; }

       }

    而继承它的实体,将会享有一个long类型的主键,名为ID,实体代码可能是这样

    /// <summary>
       /// 用户表
       /// </summary>
       public class UserBase : BaseEntity
       {
           public UserBase()
           {
           }
           /// <summary>
           /// 用户名
           /// </summary>
           [Required(MessageType.RequiredField, "UserName")]
           public string UserName { get; set; }
           /// <summary>
           /// 密码
           /// </summary>
           [Required(MessageType.RequiredField, "Password")]
           public string Password { get; set; }
           /// <summary>
           /// 电子邮件
           /// </summary>
           public string Email { get; set; }
       }
    其时,抽象类很多时间是为我们提供一些可以复习的虚方法,它使程序开发更具灵活性和扩展性,同时也不破解面向对象的原则。
    代码可能是这样
    /// <summary>
       /// Controller基类
       /// </summary>
       internal abstract class BaseController : System.Web.Mvc.Controller
       {
           /// <summary>
           /// 数据统一操作对象
           /// 子类根据自己的具体需要进行创建
           /// </summary>
           protected Data.IRepository _iRepository { get; set; }
           /// <summary>
           /// 用户操作权限
           /// </summary>
           protected int UserOperatorRole { get; set; }
           /// <summary>
           /// 当前登陆的用户ID
           /// </summary>
           protected long Current_UserID { get; set; }
       }
    这是一个controller的基类型,它提供了一个指向数据层的引用,这个引用我们多用接口来表示,即在基类声明一个接口类型,然后在派生类中建立符合这个接口的实例,而建立什么样的实体(SQL数据库的,MYSQL数据库的,内存的等等)操作,由具体的业务决定,具体业务可能是这样
    public class HomeController : BaseController
      {
          public HomeController()
              : this(new DataRepository()) { }
    
          public HomeController(IRepository iRepository)
          {
              _iRepository = iRepository;
          }
    ……
    }
    我们可以看到,在默认情况下,HomeController类型会建立一个DataRepository进行对数据操作实现,当然,在构造方法中,我们会为其它业务流出一个实体的方法,也就是public HomeController(IRepository iRepository) 这个方法。
    在抽象方法对项目结构层次感这篇文章中,我们应该可以体会到,在开发项目时,第一要善于将可以抽象的对象进行抽象,第二将可能出现的情况通过抽象类或者接口提前预留出来,这是很重要的。
    谢谢各位阅读,有事您留……
  • 相关阅读:
    HDU 4472 Count DP题
    HDU 1878 欧拉回路 图论
    CSUST 1503 ZZ买衣服
    HDU 2085 核反应堆
    HDU 1029 Ignatius and the Princess IV
    UVa 11462 Age Sort
    UVa 11384
    UVa 11210
    LA 3401
    解决学一会儿累了的问题
  • 原文地址:https://www.cnblogs.com/lori/p/2388454.html
Copyright © 2011-2022 走看看