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


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

     

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

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

       先看BLL层:

    Public Class LoginManager
        '检查username是否存在
        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
    
        '检查password是否正确
        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
        '用于检查password是否正确
        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
            '先推断username是否为空以及password是否为空
            If txtUserID.Text = "" Then
                MessageBox.Show("请输入username!", "提醒", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
                txtUserID.Text = ""
                txtUserID.Focus()
                Exit Sub     '退出当前的程序
            ElseIf txtPassword.Text = "" Then
                MessageBox.Show("请输入password!", "提醒", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
                txtPassword.Text = ""
                txtPassword.Focus()
                Exit Sub
            End If
            '******************************************************
            '定义一个外观层的对象
            '对于password的验证比username的验证要麻烦一些
            Dim FacadeLogin As New Facade.LoginFacade
            Dim user As New Entity.UserInfo
            '验证username是否正确
            user.UserName = txtUserID.Text
            user.Password = txtPassword.Text
            Dim strResult1 As Boolean   '推断username是否正确是用布尔值来推断
            strResult1 = FacadeLogin.CheckUser(user)
            If strResult1 = False Then
                MsgBox("不存在用户,请又一次输入!", vbExclamation + vbOKOnly, "提醒")
                txtUserID.Text = ""
                txtPassword.Text = ""
                txtUserID.Select()
                txtUserID.Focus()
                Exit Sub
            End If
    
            '验证password是否正确
            Dim table As DataTable  '推断password是否正确使用返回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 设置全局变量,本来用来在“改动password”处使用
                Me.Hide()
               
                frmMain.Show()    '登录成功之后显示主窗口
            Else
                MsgBox("password错误,请又一次输入!

    ", 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.





  • 相关阅读:
    hdu 1395 2^x(mod n) = 1(C++)(欧拉定理 分解素因数)
    6. 数论准备知识
    hdu 2973 YAPTCHA(C++)(威尔逊定理)
    牛客小白月赛12——B.华华教月月做数学
    牛客小白月赛12——A.华华听月月唱歌
    5. 卡特兰数(Catalan)公式、证明、代码、典例.
    4.质数判定和质数筛法(埃拉托色尼筛选法,线性筛法/欧拉筛法)
    3.牛顿迭代法求解方程的根
    Codeforces刷题
    刷题计划
  • 原文地址:https://www.cnblogs.com/tlnshuju/p/6729062.html
Copyright © 2020-2023  润新知