機房合作---商務邏輯在哪裡?

來源:互聯網
上載者:User

標籤:

   前言:學習過程中,不要因為有遺留的問題而感到慚愧,在之後項目中,只要用心,就能解決遺留的問題。

 

   謹以此文,記錄我重新對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        '調用“建立使用者”的Factory 方法        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.





著作權聲明:本文為博主原創文章,未經博主允許不得轉載。

機房合作---商務邏輯在哪裡?

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.