`
tubaluer
  • 浏览: 1446767 次
文章分类
社区版块
存档分类
最新评论
  • sblig: c / c++ 是不一样的都会输出 100
    j = j++

解析三层架构(3)---三层架构中的实体类和面向对象

 
阅读更多

上一篇写了关于三层架构的中分层的实例,对每一层是如何编写的做了几个demo.接下来利用一遍文章,谈一下对于实体类的一些看法.

在谈论实体类之前 ,想说一点关于面向对象的问题.刚开始接触面向对象的时候.当网上查了很多资料,也和其他人讨论了很多.究竟什么事面向对象,面向对象与面向过程有什么区别.由于开始没有实实在在的做过工程.教科书上都是写到:

面向对象的核心就是封装,继承,多态.然后接着教科书就会举一个例子.

定义一个学生类一般是,然后定义这个学生的属性(姓名 ,性别,生日,学号等等),最后定义几个这个学生的方法,比如说话,学习等.然后在控制台程序中输出一个学生说话…

这样说的真的是很对,我也非常相信这就是面向对象.但是这样的面向对象和我们工程中用到的似乎不一样.我们在三层架构中的DAL层 一般只有几个方法,属性到哪里了? 其他地方也是一样,每一个类几乎都不是我们想象的面向对象.

我在思考了一下明白,其实这个就是工程和实验的区别,学生是在做实验,根本没有考虑效率,维护等.而工程是必须要考虑的.那么,三层架构中是如何诠释面向对象的呢?我做如下理解:

面向对象第一步:抽象

在三层机构设计中,最能体现面向对象的地方就是数据库的设计.在数据库的设计中,我们去提取对象,也就是对业务进行抽象.抽象成一个个的表.每一个表就是一个对象.这个是面向对象的第一步,也是最关键的一步.可以这么说,如果一个系统的数据库设计完成了.那么工作量也就完成了70%了,其他的基本上是一些固定的劳动.

面向对象第二步:封装

一个完整的对象,应该有属性,方法.其中,在我们的三层架构中,如何去封装一个对象的呢?在传统的教学中,习惯用我上面说到的一个例子.但是在工程中,我们通常把一个对象去拆分开来,把这个对象的属性放到实体类中,为的是方便各层调用,让一行记录作为一个对象.

(当然,实体类的中用还用很多,究竟为什么会有实体类,我也有自己的理解.下面会说明一下我的观点)

把对这个对象的操作方法,放到另一个类中,这样减少了耦合性,让类的职责更加明确.另外把与客户,打交道的逻辑和显示,放到了BLL和UI里面.构成了三层架构.其实真正的对象应该就是DAL和Entity.

这样就和我们传统的面向对象相符合了.

至于,继承和多态,只是一种对对象的提炼.让他们更加符合自然规律,让代码更加有效率,可靠.

下面阐述一下我对实体类的看法.很多时候我们习惯性的就把数据库的字段对应到实体类,给它都弄个get set方法就得了.其实还有一些更好的方法,设计良好的实体类,能让我们减少很多代码的编写.同时,对于系统中用到的一些其他数据,也可以用实体类来处理.不一定要数据库中有才行.

下面是一个我设计的实体类的demo 分享一下:

学生实体类:

   1: using System;
<!--CRLF-->
   2: using System.Collections.Generic;
<!--CRLF-->
   3: using System.Linq;
<!--CRLF-->
   4: using System.Text;
<!--CRLF-->
   5: using System.Data ;
<!--CRLF-->
   6: 
<!--CRLF-->
   7: 
<!--CRLF-->
   8: namespace entity
<!--CRLF-->
   9: {
<!--CRLF-->
  10:     /// 
<!--CRLF-->
  11:     /// 学生实体类
<!--CRLF-->
  12:     /// 
<!--CRLF-->
  13:     public  class Student
<!--CRLF-->
  14:     {
<!--CRLF-->
  15:          private string _Name;
<!--CRLF-->
  16:          private string _Sex;
<!--CRLF-->
  17:          private string _StudentID;
<!--CRLF-->
  18:          private DateTime _Birthday;
<!--CRLF-->
  19:         /// 
<!--CRLF-->
  20:         /// 空构造方法
<!--CRLF-->
  21:         /// 
<!--CRLF-->
  22:          public Student()
<!--CRLF-->
  23:          {
<!--CRLF-->
  24:          }
<!--CRLF-->
  25:         /// 
<!--CRLF-->
  26:         /// 带参数构造方法,用来给实体类辅助,方便了赋值语句
<!--CRLF-->
  27:         /// 
<!--CRLF-->
  28:         /// 姓名
<!--CRLF-->
  29:         /// 性别
<!--CRLF-->
  30:         /// 学号
<!--CRLF-->
  31:         /// 生日
<!--CRLF-->
  32:          public Student(string name, string sex, string studentID, DateTime birthday)
<!--CRLF-->
  33:          {
<!--CRLF-->
  34:              this._Name = name;
<!--CRLF-->
  35:              this._Sex = sex;
<!--CRLF-->
  36:              this._StudentID = studentID;
<!--CRLF-->
  37:              this._Birthday = birthday;
<!--CRLF-->
  38:          }
<!--CRLF-->
  39:         /// 
<!--CRLF-->
  40:         /// 将数据库查询得到的弱类型集合,转换成强类型的实体类
<!--CRLF-->
  41:         /// 
<!--CRLF-->
  42:         /// 记录集
<!--CRLF-->
  43:         /// 
<!--CRLF-->
  44:          public Student Switch(DataTable dt)
<!--CRLF-->
  45:          {
<!--CRLF-->
  46:              Student stu = new Student();
<!--CRLF-->
  47:              //将数据库查询出来的字段,转换成实体类
<!--CRLF-->
  48:              stu.StudentID = dt.Rows[0]["StudentID"].ToString() ;
<!--CRLF-->
  49:              stu.Sex = dt.Rows[0]["Sex"].ToString() ;
<!--CRLF-->
  50:              stu.Name = dt.Rows[0]["Name"].ToString();
<!--CRLF-->
  51:              stu.Birthday =Convert .ToDateTime ( dt.Rows[0]["Birthday"]);
<!--CRLF-->
  52: 
<!--CRLF-->
  53:              return stu;
<!--CRLF-->
  54:          }
<!--CRLF-->
  55:          /// 
<!--CRLF-->
  56:          /// 姓名
<!--CRLF-->
  57:          /// 
<!--CRLF-->
  58:          public string Name
<!--CRLF-->
  59:          {
<!--CRLF-->
  60:              get { return _Name; }
<!--CRLF-->
  61:              set 
<!--CRLF-->
  62:              { 
<!--CRLF-->
  63:                  //(加工1)转换数据为字符串
<!--CRLF-->
  64:                  _Name = value.ToString ();          
<!--CRLF-->
  65:              }
<!--CRLF-->
  66:          }
<!--CRLF-->
  67:          /// 
<!--CRLF-->
  68:          /// 性别
<!--CRLF-->
  69:          /// 
<!--CRLF-->
  70:          public string Sex
<!--CRLF-->
  71:          {
<!--CRLF-->
  72:              //(加工2)在实体类中通过设置对象的默认值,防止没有赋值造成错误
<!--CRLF-->
  73:              get 
<!--CRLF-->
  74:              {
<!--CRLF-->
  75:                  //如果没有对sex赋值,则默认为男
<!--CRLF-->
  76:                  return _Sex != null ? _Sex : "男";
<!--CRLF-->
  77:              }
<!--CRLF-->
  78:              set { _Sex = value; }
<!--CRLF-->
  79:          }
<!--CRLF-->
  80:          /// 
<!--CRLF-->
  81:          /// 学号
<!--CRLF-->
  82:          /// 
<!--CRLF-->
  83:          public string StudentID
<!--CRLF-->
  84:          {     
<!--CRLF-->
  85:              get { return _StudentID; }
<!--CRLF-->
  86:              //(加工3)通过set方法来控制输入学号大小
<!--CRLF-->
  87:              set
<!--CRLF-->
  88:              {
<!--CRLF-->
  89:                  if (value.Length > 10)
<!--CRLF-->
  90:                  {
<!--CRLF-->
  91:                      throw new Exception("学号不能超过10位数!");
<!--CRLF-->
  92:                  }
<!--CRLF-->
  93:                  else
<!--CRLF-->
  94:                  {
<!--CRLF-->
  95:                      _StudentID = value;
<!--CRLF-->
  96:                  }
<!--CRLF-->
  97:                  _StudentID = value; 
<!--CRLF-->
  98:              }
<!--CRLF-->
  99:          }
<!--CRLF-->
 100:          /// 
<!--CRLF-->
 101:          /// 生日  
<!--CRLF-->
 102:          ///  (加工4)下面的示例是自动实现的属性中的 set 访问器.
<!--CRLF-->
 103:          /// 一种简单的方式
<!--CRLF-->
 104:          /// 
<!--CRLF-->
 105:          public DateTime Birthday { get; set; }
<!--CRLF-->
 106:     }
<!--CRLF-->
 107: }
<!--CRLF-->

其他类的调用:

   1: private void button1_Click(object sender, EventArgs e)
<!--CRLF-->
   2:         {
<!--CRLF-->
   3: 
<!--CRLF-->
   4:             string strName = "张三";
<!--CRLF-->
   5:             string strID = "123";
<!--CRLF-->
   6:             string strSex = "男";
<!--CRLF-->
   7:             DateTime dtmBir = Convert.ToDateTime("2000-02-02");
<!--CRLF-->
   8: 
<!--CRLF-->
   9:             //客户端调用实体类的构造函数,赋值比较方便
<!--CRLF-->
  10:             Student stu = new Student(strName, strSex, strID, dtmBir);
<!--CRLF-->
  11: 
<!--CRLF-->
  12:             //直接可以将datatable转换成实体类
<!--CRLF-->
  13:             DataTable dt = new DataTable();
<!--CRLF-->
  14: 
<!--CRLF-->
  15:             Student stuDt = new Student();
<!--CRLF-->
  16:             stuDt = stuDt.Switch(dt);
<!--CRLF-->
  17:         }
<!--CRLF-->

分享到:
评论

相关推荐

    asp.net知识库

    动态调用对象的属性和方法——性能和灵活性兼备的方法 消除由try/catch语句带来的warning 微软的应试题完整版(附答案) 一个时间转换的问题,顺便谈谈搜索技巧 .net中的正则表达式使用高级技巧 (一) C#静态成员和...

    亮剑.NET深入体验与实战精要3

    14.1.2 趣味理解:三层架构与养猪 496 14.2 为什么要用三层架构 497 14.3 三层架构项目开发示例 500 14.3.1 数据库设计 500 14.3.2 创建整体解决方案 501 14.3.3 业务实体Model的实现 502 14.3.4 数据访问层的实现 ...

    双鱼林安卓Android代码生成器 v2.0.zip

    真正面向对象设计:系统的整体设计,提供通过使用面向对象的方法,设计所需系统中的基础对象(类),并根据专业级的“三层架构模板”生成专业级的界面和源代码,同时设计系统和数据库:采用“数据映射”建立基础对象...

    Spring面试题

    在典型的面向对象开发方式中,可能要将日志记录语句放在所有方法和 Java 类中才能实现日志功能。在 AOP 方式中,可以反过来将日志服务模块化,并以声明的方式将它们应用到需要日志的组件上。当然,优势就是 Java 类...

    亮剑.NET深入体验与实战精要2

    14.1.2 趣味理解:三层架构与养猪 496 14.2 为什么要用三层架构 497 14.3 三层架构项目开发示例 500 14.3.1 数据库设计 500 14.3.2 创建整体解决方案 501 14.3.3 业务实体Model的实现 502 14.3.4 数据访问层的实现 ...

    超级有影响力霸气的Java面试题大全文档

    面向对象计算始于这个基本概念,即现实世界可以被描绘成一系列完全自治、封装的对象,这些对象通过一个受保护的接口访问其他对象。 4. 多态性:  多态性是指允许不同类的对象对同一消息作出响应。多态性包括参数化...

    代码生成器Mgicode生成器JAVA代码生成器

    软件是用来对世界进行描述的一种方式,最初我们采用过程的编程,后来与世界的描述不相符,所以就出现了面向对象,而现在面向对象并不能很好地解析如抽象类,Service类等。要解释这些东西,最好的方式是通过关系来...

    java 面试题 总结

    1、面向对象的特征有哪些方面 1.抽象: 抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面。抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节。抽象包括...

    java面试宝典

    1、面向对象的特征有哪些方面? 8 2、作用域public,private,protected,以及不写时的区别? 8 3、String 是最基本的数据类型吗? 8 4、float 型float f=3.4是否正确? 8 5、语句float f=1.3;编译能否通过? 8 6、short ...

    千方百计笔试题大全

    1、面向对象的特征有哪些方面? 8 2、作用域public,private,protected,以及不写时的区别? 8 3、String 是最基本的数据类型吗? 8 4、float 型float f=3.4是否正确? 8 5、语句float f=1.3;编译能否通过? 8 6、short ...

    JAVA上百实例源码以及开源项目

    在有状态SessionBean中,用累加器,以对话状态存储起来,创建EJB对象,并将当前的计数器初始化,调用每一个EJB对象的count()方法,保证Bean正常被激活和钝化,EJB对象是用完毕,从内存中清除…… Java Socket 聊天...

    JAVA上百实例源码以及开源项目源代码

    在有状态SessionBean中,用累加器,以对话状态存储起来,创建EJB对象,并将当前的计数器初始化,调用每一个EJB对象的count()方法,保证Bean正常被激活和钝化,EJB对象是用完毕,从内存中清除…… Java Socket 聊天...

Global site tag (gtag.js) - Google Analytics