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

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

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

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

时间: 2024-12-28 21:08:05

机房合作---业务逻辑在哪里?的相关文章

机房合作感受

机房合作是在提高班第一个合作的项目,现在,正在进行,感觉进行了好久!实际也确实挺久的了! 6月22号左右开启的机房,那时候,专业课要开始考试了,由于我们的考试科目都不多,所以,不想拖着,就开始合作了!米老师问谁当组长,丽杰说小美,就那样我就当了组长.三个人也兴致高昂的开始了合作. 合作开始了,三个人坐在一起,讨论需求,讨论数据库,统一大家的所有意见后,组长就开始写文档了.因为有考试,我就陆陆续续的写文档,完成了可行性研究报告.项目开发计划.需求.概要设计等,中间也以考试为由,几天都没有碰文档.5

你的业务逻辑层是否是被架空了?(一)

问题 1. "你的业务逻辑层为什么要按照数据库的表来建立.一旦数据库的表更改了岂不是业务逻辑层也要更改么."当大师傅问我这个问题的时候,我才反应过来我的业务逻辑层理解的有问题,当时我是把业务逻辑都放到了U层,导致U层很累赘. 2.当沾沾自喜以为给U层解负担的时候,惊奇的发现,B层还是被架空了.(这个问题是出于B层依然是按照数据库表来建立的.) 所以,我才重新开始反思 ,业务逻辑层的到底是应该怎么建立,为什么第一次发现这个问题了,还出现业务逻辑层架空的问题. 原因分析 什么是业务逻辑层?

[机房合作]-数据库设计

前言: 最近刚刚开始了机房合作,自己在其中主要参与了D层的设计,而且在文档设计的阶段主要参与了数据库设计.之前在机房重构的时候对于数据库设计没有按照文档来进行驱动,所以这次在写文档的时候我很认真,所以遇到了很多细节的问题,比如对于视图,存储过程在数据库设计的哪一个部分加入,以及对数据库的外部模式进行了深入的了解! 内容: 数据库的设计的周期,分为了规划,需求分析,概要设计,逻辑设计,物理设计,实现,运行维护.我将数据库的设计分为了前期准备,中期设计,后期实现维护. 周期划分 前期准备 中期设计

【机房合作】重新认识外观模式

机房收费系统合作版,是我们第三次与机房收费系统相遇的时刻.在个人重构的时候,我们就开始了"七层架构"之旅,其中外观模式是单独作为一层来开发的. 那个时候,也不理解外观是起到怎样一个作用,大话上的解释表面上容易理解,看完后自己也觉得很有道理.但在系统程序中,自己是只要经过BLL逻辑层的一个方法,就需要再经过一次外观,从而"解除耦合",避免了UI层与BLL层之间直接传递数据. 那个时候,在敲代码的时候就有一种感觉:每次写完B层逻辑,又要在F层重新写一次,这就是在解耦和吗

【机房合作】状态模式与上机

在机房收费系统中,有几个业务逻辑是比较复杂的,比如说上机.下机.记得我在做第一版VB收费系统的时候,还特别地将上下机拿出来画了一个完整的流程图,要不这样做的话,最后的结果一定是懵了,也不想再继续写代码了. 在进行设计模式的学习之前,我们很有必要将上机这一业务逻辑完整的梳理一遍. 一.上机业务逻辑 1.判断卡号是否存在 2.判断卡号是否使用 3.判断卡号余额是否充足 4.判断卡号是否正在上机 5.执行上机,添加上机记录 这样一罗列,很明显,执行上机这一业务操作需要先经过四次判断.之前我们都是通过一

倒不出的那种美妙--机房合作总结

经过一个多月的努力和共同开发,我们小组的机房合作也终于完成了,由于这次是合作的组长所以要做好的不仅仅是系统的那些逻辑,更多的是学会使用一些工具去将自己的思路和相应的逻辑表述出来. 一.EA图 之前使用EA画过类图.用例等一些常用的图,但是这次合作要将九种图对应到每个类型的文档中.这就要求我们必须很熟练地使用EA工具,尤其是做组长的.这里主要介绍创建类型和MoreTools的使用. 1.创建类型: 2.More  tools(工具箱) 我们画这些图一方面是为了表述我们的需求和逻辑思路,另一方面也为

减少存储过程封装业务逻辑-web开发与传统软件开发的思维模式不同

本篇文章讨论并不是:不要使用存储过程,因为有些事情还是要存储过程来完成,不可能不用.而是关于:"业务逻辑是不是要封装在存储过程中实现,这样子php.java等就是调用存储过程". 业务逻辑,通俗说就是:比如要取数据的操作,取出会员编号为x的数据,原来我们一般是封装成函数,或者直接编写sql语句查询.现在是交给数据库的存储过程去完成. +------------------------------------------------------------ 写这篇文章的缘由 +-----

github分页插件的业务逻辑

github分页插件查询的业务逻辑: controller层: query封装前端传来的数据 Service层: 1.构建一个PageBounds:当前页(page).查询多少条(pageSize).排序 2.调用dao的查询方法:查询条件,分页参数对象:返回一个PageList或者List 3.service接收到dao的查询结果(结果集.分页对象paginator) 返回的数据: 根据EsasyUI,必须返回rows 和 total,rows为dao曾返回的结果列表,total为分页对象中的

javascript要不要用来处理业务逻辑

这个问题,我现在才明白该怎样描述这个已经困惑了我很久的问题,在公司做的项目中,js对于数据验证起到了很大的作用,但是这使得整个项目的业务逻辑变得零散,甚至混乱 现在公司里的项目就是这样的.现在再想想,公司项目中的service层为什么写的那么简单,为什么action很多时候做了service层做的事情 如果用纯java去做处理业务逻辑,去做数据验证,也是可以的,spring框架中也有,但是现在我还不能熟练的掌握,我还需要更多的练习 我现在的想法是,javascript,甚至很好用的jquery,