泛型引发的思考——眼与手的距离

实习经验交流会的感悟


刚才听师哥师姐的实习经验交流总结,感触最深的是我们不能把知识当知识学。交流中师哥师姐提到了很多关于多线程的优点,主要是提高效率,充分利用资源。操作系统中我们也接触到过多线程,线程池等,意思上也可以理解,单线程不适合需求的发展,CPU等的利用率太低等。但是也只是对已经存在的东西,计算机已经使用了多进程多线程,那我现在了解了就好了,从来没有想过要和自己写程序的时候结合起来,也就是从来没想过这个东西我也可以用。


其实,好多东西我们都听说过,等遇到的时候,模模糊糊有个印象,但是具体是什么,怎么使用或者在实践中主动想起来这些知识并应用,这种情况是很少的。这就是眼与手的距离。师哥也是自己亲自经历设计单线程并深受其害(一晚上程序都没运行完,效率太低)后才想到利用多线程,查查线程池。并不是说我们把所有东西都学会,遇到都实践一遍,并不是这个意思,大概有个了解,使用的时候再查也是很好的方法,但关键时根本就想不到使用它怎么办? 这就是老师经常说的知识网了。很多时候我们把知识当成知识来学 ,知道了,考试考过了就万事大吉了,并没有把它纳入我们大脑的知识网中,没有有意识的联系一下已有的知识,什么时候可能会用到,用这个知识会给我们带来多大的好处等。


扯了这么多还没有说到我本来的目的。我本来想写一篇关于泛型的博客,因为我最近做机房个人重构,遇到了问题也请教了同学并简单使用了泛型,想总结一下。但是刚才看了一个师哥的关于泛型的博客,我就不想写了,因为他写的太好了,无论是逻辑,内容等我认为对泛型的诠释已经很棒了。我是写不出他那样的,不过看他的博客使我对泛型有了更清晰的认识。那篇博客叫泛型,主要说了三件事:参数类型抽象,强类型支持,泛型参数约束。但是还是要说说我对泛型的理解,毕竟是一篇写泛型的博客。

泛型

之前对泛型的理解


之前视频中接触过泛型,也看过好多同学的博客,感觉理解了,泛型很简单,但是在需要泛型的时候不知道要用它,当然也不知道怎么用。这就是眼与手的距离啊。
之前的理解:
(1)泛型list和集合list()很相像,泛型是类型固定集合,例如list
(2) 看了好多博客感觉泛型就是里面的参数不是具体的类型是抽象的比如类

现在对泛型的理解及应用


目前的理解:

(1)泛型的参数类型是抽象的,list中的T是抽象的,可以是int,也可是string,也可以是自己定义的一个实体
(2)泛型中的参数起到约束的作用
比如,list( Of Entity.UserInfo),把datatable转成这个泛型就是在datatable里找和Entity.UserInfo里的属性相同的字段,把它传到list中,其他的字段就不能进行转换,从而保证了数据的安全。

泛型在机房重构中的应用

没有使用泛型之前,D层直接把datatable传给IDAL再传给Factory进而传给B层。
登录 没有用泛型的D层

Public Class LoginDAL : Implements IDAL.ILoginUser
    Private SqlFavor As New SqlHelper.SqlFavor
    '判断用户名是否存在
    Public Function SelectUser(ByVal user As Entity.UserInfo) As DataTable Implements IDAL.ILoginUser.SelectUser
        Dim sql As String  '储存查询语句
        Dim table As DataTable
        '声明并实例化参数数组
        Dim paras As SqlParameter() = {New SqlParameter("@userID", user.userID), New SqlParameter("@passWord", user.passWord)}
        '数组 

        'sql = "select * from Users where ID = @userID and PassWord = @passWord"
        sql = "select * from [User] where UserID = @userID"
        '调用SQLHelper中的ExecSelect方法来查询,并获取返回值
        table = SqlFavor.ExecSelect(sql, CommandType.Text, paras)

        Return table

    End Function

End Class


查询学生余额 用了泛型的D层

Imports IDAL
Imports System.Configuration
Imports System.Data.SqlClient
Public Class CheckStuBalanceDAL : Implements IDAL.ICheckStuBalance

    Private SqlFavor As New SqlHelper.SqlFavor

    Public Function SelectCardID(ByVal card As Entity.CardInfo) As List(Of Entity.StudentAndCardInfo) Implements IDAL.ICheckStuBalance.SelectCardID
        Dim sql As String
        Dim table As DataTable
        Dim paras As SqlParameter() = {New SqlParameter("@cardID", card.cardID)}

        sql = "select * from Student,Card where Student.CardID = Card.CardID and CardID = @cardID"
        table = SqlFavor.ExecSelect(sql, CommandType.Text, paras)

        '将table转成泛型
        Dim myList As List(Of Entity.StudentAndCardInfo)
        If table.Rows.Count > 0 Then
            myList = Entity.DataToList.ConvertToList(Of Entity.StudentAndCardInfo)(table)
            Return myList
        Else
            Return Nothing
        End If
    End Function

End Class


查询学生余额,返回的时候既有实体StudentInfo 也有也有CardInfo的信息,那泛型中写那个实体呢?
答:在实体层中重新建一个新的实体,用到了StudentInfo和CardInfo中的那些属性就把这些属性写到新的实体中。

疑问:


既然传Datatable也可以使程序运行,为什么还非得用泛型呢?

答:(1)降低耦合性。首先得弄清楚我们为什么使用实体层。因为一,使用实体可以一次性传入和返回多个值,二,各层都调用实体就行了,没有必要知道实体的内部,所以实体的修改也不影响个层。但是,如果传datatable,B层就需要知道password是datatable中的第几行第几列的字段(打个比方);如果数据修改,D层,B层甚至U层都得修改。
(2)我们也可以把datatable里查出来的东西一个个的传给实体,然后各层的返回值就可以设为实体了。但是这样做就太麻烦了,如果从数据库查出好多字段一个一个传给实体工作量太大。而泛型就可以把datatable里的这些字段打包,整体的在各层见传输,而且泛型的参数是实体的话,也很好的实现了解耦。在U层,可以把datagrid的数据源绑定为泛型,比如dtgridStuBalance.DataSource = myList 也可以点出来实体的属性,非常方便。

总结


学习视频或看书的过程中有意识想想这些知识什么时候使用,不要学的太死。眼与手要协调,不要眼高手低,多实践。不要再逗留,快点动手。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 24
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 24
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值