標籤:
前言:學習過程中,不要因為有遺留的問題而感到慚愧,在之後項目中,只要用心,就能解決遺留的問題。
謹以此文,記錄我重新對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.
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。
機房合作---商務邏輯在哪裡?