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) 这个方法。
    在抽象方法对项目结构层次感这篇文章中,我们应该可以体会到,在开发项目时,第一要善于将可以抽象的对象进行抽象,第二将可能出现的情况通过抽象类或者接口提前预留出来,这是很重要的。
    谢谢各位阅读,有事您留……
  • 相关阅读:
    使用 kill 命令杀死 java进程,你用对了吗?
    脚本 启动/停止 jar包服务
    Zipkin和微服务链路跟踪
    nacos初探--作为配置中心
    第一次有人把“分布式事务”讲的这么简单明了
    SquishIt引起的HTTP Error 500.0
    imagesLoaded – 检测网页中的图片是否加载
    25个精美的创意机构和设计工作室网站案例
    使用 FocusPoint.js 实现图片的响应式裁剪
    设计师收藏的20款英文手写字体【免费下载】
  • 原文地址:https://www.cnblogs.com/lori/p/2388454.html
Copyright © 2011-2022 走看看