码迷,mamicode.com
首页 > 其他好文 > 详细

机房合作---业务逻辑在哪里?

时间:2015-07-26 22:40:17      阅读:261      评论:0      收藏:0      [点我收藏+]

标签:

   前言:学习过程中,不要因为有遗留的问题而感到惭愧,在之后项目中,只要用心,就能解决遗留的问题。

 

   谨以此文,记录我重新对UI、外观、BLL层中是否该有逻辑判断的一个思考推理过程。

   验收机房重构的时候,我的UI层、外观层、BLL层代码是这样子写的:(以登录这条线为例)

   先看BLL层:

Public Class LoginManager
    '检查用户名是否存在
    Public Function IsUserExists(ByVal user As Entity.UserInfo) As Boolean
        Dim factory As New Factory.Loginfactory()
        Dim Iuser As IDAL.IuserInfo
        '调用“创建用户”的工厂方法
        Iuser = factory.CreateUserInfo()
        Dim table As DataTable
        Dim flag As Boolean
        table = Iuser.QueryUser(user)
        If table.Rows.Count = 0 Then
            flag = False
        Else
            flag = True
        End If
        Return flag
    End Function

    '检查密码是否正确
    Public Function isPWDright(ByVal user As Entity.UserInfo) As DataTable
        Dim factory As New Factory.Loginfactory()
        Dim Iuser As IDAL.IuserInfo
        Dim table As DataTable '中间变量,用于存储D层查询到的数据
        Iuser = factory.CreateUserInfo
        table = Iuser.QueryUser(user)
        Return table
    End Function

    '向worklog表中插入记录
    Public Function InsertWorkLog(ByVal user As Entity.UserInfo) As Integer
        Dim factory As New Factory.WorkLogFactory
        Dim Iworklog As IDAL.IWorkLog
        Dim m As Integer
        Iworklog = factory.CreateWorkLog()
        m = Iworklog.InsertWorkLog(user)
        Return m
    End Function
End Class

    除了每个方法里的一些零零散散的if else判断,总体上来看,逻辑判断层被“架空”了,我的业务逻辑究竟在哪里呢?

 

    接着看外观:

Public Class LoginFacade
    '用于检查用户是否存在
    Public Function CheckUser(ByVal user As Entity.UserInfo) As Boolean
        '定义一个B层判断用户ID是否存在的对象
Dim IsUserExists As New BLL.LoginManager() 
        Dim flag As Boolean
        flag = IsUserExists.IsUserExists(user)
        If flag = True Then
            Return True
        Else
            Return False
        End If
    End Function
    '用于检查密码是否正确
    Public Function CheckPwd(ByVal User As Entity.UserInfo) As DataTable
        Dim isPWD As New BLL.LoginManager()
        Dim table As DataTable
        table = isPWD.isPWDright(User)
        Return table
    End Function
End Class

    LoginFacade这个类中的两个方法,用现在的眼光再次审视,就是在B层的外面又“糊了一层”,无任何意义,难怪当时师傅说我,现在自己在看确实乱七八糟。

 

    最后看UI层:

Private Sub cmdOK_Click(sender As Object, e As EventArgs) Handles cmdOK.Click
        '先判断用户名是否为空以及密码是否为空
        If txtUserID.Text = "" Then
            MessageBox.Show("请输入用户名!", "提醒", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
            txtUserID.Text = ""
            txtUserID.Focus()
            Exit Sub     '退出当前的程序
        ElseIf txtPassword.Text = "" Then
            MessageBox.Show("请输入密码!", "提醒", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
            txtPassword.Text = ""
            txtPassword.Focus()
            Exit Sub
        End If
        '******************************************************
        '定义一个外观层的对象
        '对于密码的验证比用户名的验证要麻烦一些
        Dim FacadeLogin As New Facade.LoginFacade
        Dim user As New Entity.UserInfo
        '验证用户名是否正确
        user.UserName = txtUserID.Text
        user.Password = txtPassword.Text
        Dim strResult1 As Boolean   '判断用户名是否正确是用布尔值来判断
        strResult1 = FacadeLogin.CheckUser(user)
        If strResult1 = False Then
            MsgBox("不存在用户,请重新输入!", vbExclamation + vbOKOnly, "提醒")
            txtUserID.Text = ""
            txtPassword.Text = ""
            txtUserID.Select()
            txtUserID.Focus()
            Exit Sub
        End If

        '验证密码是否正确
        Dim table As DataTable  '判断密码是否正确使用返回datatable判断
        table = FacadeLogin.CheckPwd(user)
        If Trim(txtPassword.Text) = Trim(table.Rows(0).Item(2)) Then
            'MsgBox("登录成功!")
            Charge.Entity.Holder.Holder = txtUserID.Text
            'Entity.Model.UserName = txtUserID.Text 设置全局变量,本来用来在“修改密码”处使用
            Me.Hide()
           
            frmMain.Show()    '登录成功之后显示主窗体
        Else
            MsgBox("密码错误,请重新输入!", vbExclamation + vbOKOnly, "提醒")
            txtPassword.Focus()
            Exit Sub
        End If

        '写入到工作记录中

        Dim WorkUser As New Entity.UserInfo
        WorkUser.UserID = txtUserID.Text
        Dim m As Integer

        Dim WorkLogUI As New BLL.LoginManager
        m = WorkLogUI.InsertWorkLog(WorkUser)

    End Sub

    一个用来显示数据与输入数据的表层类却被我写满了代码,写满了逻辑……

    原来BLL层的逻辑代码都在这里啊,还好现在的合作,我有了新的认识。

 

    重构时BLL层遇到的问题:  

    重构时候的BLL层是按照“功能”来划分,会出现的问题就是有些方法需要重复使用,使得代码会冗余。例如,判断卡号是否存在这个方法需要在注册、充值、退卡以及一切对于卡进行查询的操作中使用,这样做的代价就是每次都需要去写这样子的一个方法。

 

    合作时候BLL层思路:

    Firstly:

技术分享

    这次因为是我负责来写B层代码,想要解决这个问题,起初我的见解就是BLL层按照“数据表”来划分,将每张表所需要涉及的方法全部写出来,然后在外观层按照功能分类并且对B层方法进行整合,可是,这样子业务逻辑却被写到了Fa?ade层,(这样子做的好处就是实现了代码的简洁,但是对于Fa?ade层却加入了逻辑,还需要继续改进。)

 

    Then:

技术分享

           如果要把业务逻辑纯粹的写到BLL层,我想在BLL层按照表划分的基础上,再按照功能来划分,这样做的结果就是没有解决重构过程中BLL层代码冗余的问题,反而让代码更加冗余了……(事后分析,这样做的原理实际上就是写了两个BLL层,代码还不够精简,但是基本上满足将逻辑封装在B层。)

 

    Finally:

    怎么办呢?

    思路回到最初的构思上,最初的想法有什么问题?

    我的BLL层代码难道按照“功能”来划分就很冗余吗?答案其实是否定的。

    如图所示:

技术分享

    拿登录为例,这样做的意义在与对写好的BLL层的方法进行再次的封装,但是与上一种的方法区别在于:1、代码相对精简;2、逻辑理解更加清晰,在画时序图的时候也更加直观;3、将一些公共方法提到CommonBLL类中,很像VB学习过程中使用模块来封装方法的效果,使得整体更加符合面向对象的思想。

    开始经历合作,把重构过程中的问题慢慢解决掉,等到我带徒弟再走这条路的时候,我就会站在更高的眼光去看待他们所写的东西以及他们的思路了。

    That is all.





版权声明:本文为博主原创文章,未经博主允许不得转载。

机房合作---业务逻辑在哪里?

标签:

原文地址:http://blog.csdn.net/zzh920625/article/details/47072423

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!