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

来源:互联网 发布:数据库2002错误 编辑:程序博客网 时间:2024/05/05 00:53

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

 

   谨以此文,记录我重新对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 FunctionEnd 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 FunctionEnd 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.





1 0
原创粉丝点击