你真的会合理的使用构造函数吗?
真的会用构造函数,来有优化代码量么?
巧用构造函数
比如来个实例,有一段代码如下:
var userCourseSchedule=new UserCourseSchedule { CourseId = viewModel.CourseId, UserId = viewModel.UserId, StartTime = DateTime.Now, CreateTime = DateTime.Now, UpdateTime = DateTime.Now, HaveLearnThemeNumble = Convert.ToInt16(havelearnNumber), CourseStatus = LearningState.Study };
看完这段代码,会觉得有什么不妥的地方吗? 或者说,有什么可以优化的地方吗?
如果,你可以看出可以优化的地方,请先不要往下看,先把怎么优化写下来,发表评论一下,好让我看到,谢谢。
如果,你觉得这代码很正常,没有要优化的,那么请接着往下看,(最好自己先思考一下,这就是一个产生对象的代码,想一下能不能优化呢?)。
--实体类如下
public class UserCourseSchedule : EntityBase<Int32> { /// <summary> /// 用户编号 /// </summary> [Display(Name = "用户编号")] [Required] public Int32 UserId { get; set; } /// <summary> /// 课程编号 /// </summary> [Display(Name = "课程编号")] [Required] public Int32 CourseId { get; set; } /// <summary>a /// 已学主题数 /// </summary> [Display(Name = "已学主题数")] [Required] public Int16 HaveLearnThemeNumble { get; set; } /// <summary> /// 开始时间 /// </summary> [Display(Name = "开始时间")] [Required] public DateTime StartTime { get; set; } /// <summary> /// 更新时间 /// </summary> [Display(Name = "更新时间")] [Required] public DateTime UpdateTime { get; set; } /// <summary> /// 课程状态 /// </summary> [Display(Name = "课程状态")] [Required] public LearningState CourseStatus { get; set; } /// <summary> /// 课程 /// </summary> [ForeignKey("CourseId")] public CourseInfo CourseInfo { get; set; } }
你思考完了吗? 那我就说一下我怎么做的,说的不好,请直接指出,千万不要含蓄着不说啊,咱软件工程师就是直接了当。
1. 首先像 时间字段 (CreateTime,StartTime ,UpdateTime ) 都是取当前时间,这是不会变的,所以就可以把初始化值放到构造函数中。
那么现在产生的代码是:
var userCourseSchedule=new UserCourseSchedule { CourseId = viewModel.CourseId, UserId = viewModel.UserId, HaveLearnThemeNumble = Convert.ToInt16(havelearnNumber), CourseStatus = LearningState.Study };
一看,有什么差别,少了三行代码,如果这个对象要产生2次,那么就节省了6行,产生N 个对象,那么就是 (n*3)行代码.
实体类如下:
public class UserCourseSchedule : EntityBase<Int32> { /// <summary> /// 默认构造函数 /// <para>会对一些默认值进行初始化</para> /// </summary> public UserCourseSchedule() { StartTime = DateTime.Now; CreateTime = DateTime.Now; UpdateTime = DateTime.Now; } /// <summary> /// 用户编号 /// </summary> [Display(Name = "用户编号")] [Required] public Int32 UserId { get; set; } /// <summary> /// 课程编号 /// </summary> [Display(Name = "课程编号")] [Required] public Int32 CourseId { get; set; } /// <summary>a /// 已学主题数 /// </summary> [Display(Name = "已学主题数")] [Required] public Int16 HaveLearnThemeNumble { get; set; } /// <summary> /// 开始时间 /// </summary> [Display(Name = "开始时间")] [Required] public DateTime StartTime { get; set; } /// <summary> /// 更新时间 /// </summary> [Display(Name = "更新时间")] [Required] public DateTime UpdateTime { get; set; } /// <summary> /// 课程状态 /// </summary> [Display(Name = "课程状态")] [Required] public LearningState CourseStatus { get; set; } /// <summary> /// 课程 /// </summary> [ForeignKey("CourseId")] public CourseInfo CourseInfo { get; set; } }
2. 发现 CourseStatus(枚举) 字段,初始化时候,也一直都用一个初始值,所以又少一个字段。
var userCourseSchedule=new UserCourseSchedule { CourseId = viewModel.CourseId, UserId = viewModel.UserId, HaveLearnThemeNumble = Convert.ToInt16(havelearnNumber) };
实体类:
public class UserCourseSchedule : EntityBase<Int32> { /// <summary> /// 默认构造函数 /// <para>会对一些默认值进行初始化</para> /// </summary> public UserCourseSchedule() { StartTime = DateTime.Now; CreateTime = DateTime.Now; UpdateTime = DateTime.Now; CourseStatus = LearningState.Study; } /// <summary> /// 用户编号 /// </summary> [Display(Name = "用户编号")] [Required] public Int32 UserId { get; set; } /// <summary> /// 课程编号 /// </summary> [Display(Name = "课程编号")] [Required] public Int32 CourseId { get; set; } /// <summary>a /// 已学主题数 /// </summary> [Display(Name = "已学主题数")] [Required] public Int16 HaveLearnThemeNumble { get; set; } /// <summary> /// 开始时间 /// </summary> [Display(Name = "开始时间")] [Required] public DateTime StartTime { get; set; } /// <summary> /// 更新时间 /// </summary> [Display(Name = "更新时间")] [Required] public DateTime UpdateTime { get; set; } /// <summary> /// 课程状态 /// </summary> [Display(Name = "课程状态")] [Required] public LearningState CourseStatus { get; set; } /// <summary> /// 课程 /// </summary> [ForeignKey("CourseId")] public CourseInfo CourseInfo { get; set; } }
3. 既然优化到这里,为了节省代码量与美观度,那就再产生一个有参的构造函数,把需要传值的字段的值作为参数。
最后代码是这样的:
var userCourseSchedule=new UserCourseSchedule(viewModel.CourseId,viewModel.UserId,Convert.ToInt16(havelearnNumber));
实体类:
public class UserCourseSchedule : EntityBase<Int32> { /// <summary> /// 默认构造函数 /// <para>会对一些默认值进行初始化</para> /// </summary> public UserCourseSchedule() { StartTime = DateTime.Now; CreateTime = DateTime.Now; UpdateTime = DateTime.Now; CourseStatus = LearningState.Study; } /// <summary> /// 初始化函数 /// </summary> /// <param name="courseId">课程编号</param> /// <param name="userId">用户编号</param> /// <param name="havelearnNumber">已学主题数</param> public UserCourseSchedule(int courseId, int userId, short havelearnNumber) { StartTime = DateTime.Now; CreateTime = DateTime.Now; UpdateTime = DateTime.Now; CourseStatus = LearningState.Study; CourseId = courseId; UserId = userId; } /// <summary> /// 用户编号 /// </summary> [Display(Name = "用户编号")] [Required] public Int32 UserId { get; set; } /// <summary> /// 课程编号 /// </summary> [Display(Name = "课程编号")] [Required] public Int32 CourseId { get; set; } /// <summary>a /// 已学主题数 /// </summary> [Display(Name = "已学主题数")] [Required] public Int16 HaveLearnThemeNumble { get; set; } /// <summary> /// 开始时间 /// </summary> [Display(Name = "开始时间")] [Required] public DateTime StartTime { get; set; } /// <summary> /// 更新时间 /// </summary> [Display(Name = "更新时间")] [Required] public DateTime UpdateTime { get; set; } /// <summary> /// 课程状态 /// </summary> [Display(Name = "课程状态")] [Required] public LearningState CourseStatus { get; set; } /// <summary> /// 课程 /// </summary> [ForeignKey("CourseId")] public CourseInfo CourseInfo { get; set; } }
这样下来,虽然实体类代码增加了,但生产一个对象,就省下9行对象,那么生产对象就是(n*9)行,最主要是代码视觉上有提高。
我觉得用实体类产生对象,会更符合单一职责些。
这样还有一个好处就是,某一天,要新加一个字段,只需在构造函数中,加就好,不用找哪里有 New 这个对象,不小心漏掉了。
希望这内容,可以更多的人看到,也给我一些指导,谢谢。
真实的代码如下: