淺談WEB前后端分離


重審業務邏輯

用過MVC的童鞋都知道業務邏輯(Bussiness Logic),但是大多對這概念又是模棱兩可,業務邏輯從來都是這樣難以理解,談論前后端分離之前這個概念非常有必要探討一下!

  在簡單的CRUD的系統中,基本上都是對數據進行增刪改查操作,並沒有多少業務邏輯可言;但像銀行系統對金融數據的操作就顯得不那么簡單了,以轉賬為例:A給B轉帳轉100元,簡易代碼如下:

if(A.balance - 100 >= 0){ A.balance -100; B.balance +100; }else{ //返回異常信息 }

  這串代碼已經不僅僅是對數據的增刪改查了,它包含了一些業務規則,比如A的余額如果少於100,這個代碼會返回異常信息提示"余額不足",類似於這種,一組和特定領域業務相關而又不可拆分的代碼,可以看作業務邏輯的實現。所以轉賬是作為一部個不可拆分的整體提供給用戶的,也就是說Business層是不可能給你提供一個"A.余額+x"這種接口的,如果你想轉賬,請用轉賬方法,方法里面怎么對數據操作,你無需關心,你也沒法關心。

=====
這里注意強調一下:頁面/渲染邏輯和業務邏輯的區別,頁面通常需要多個數據用來展示,比如網上銀行界面即顯示用戶名、余額和轉賬記錄等,這些信息的組合稱作頁面/渲染/展示邏輯,並不等於業務邏輯,業務邏輯只應提供基本的業務數據而不應該和頁面邏輯摻和起來,就拿這個例子來講,頁面的這些數據,service層會提供三個接口來支持頁面數據的產出,但並不會給你拼到一塊給你,拼接不同的業務信息組合成一個View Object只能是脫離於service之外的層處理,在此特地分清頁面邏輯和業務邏輯的關系

前后端定義

既然是談前后端分離,就必須,必須,必須先划出前后端的定義,要不然談來談去,最后大家敢情不是說的一塊事。其實前后端的概念真是一人一個看法,有人覺得和瀏覽器相關的技術這幫就屬於前端,牽扯到了java代碼的就屬於后端;也有人覺得前段不僅包括瀏覽器技術棧線,還包括后台像jsp等模板技術相關技術也屬於前端,后端純粹是service那塊的技術。在這里我說下我的看法。

  不同人對前后端的定義的不同是因為看待角度的不同,有人以工作職責分,有人以技術棧分;這里我覺得應該以業務邏輯為分割線去分!(明白為啥我一上來先說業務邏輯了吧·—·)

  為什么我會以業務邏輯去分割前后端的定義,這么說吧,一個系統的展現形式可能會有很多種:Web、Web Service、桌面客戶端等,他們無一例外都是和用戶直接打交道的,像網上銀行的Web網頁、手機APP,他們采用不同的技術和交互實現了與系統的交互,而整個系統有一部分是不隨展現形式而變的——業務邏輯代碼,也就說轉賬這個業務無論是在Web還是App中,對數據的操作邏輯是不變的,所以我們很自然的就會形成一個分隔:

  最基本的一部分是專注與實現業務邏輯代碼的實現,是不隨展現形式而改變的;另一部分是用來給用戶展現的,可能隨着技術潮流改變而改變(說不定過一段時間就出VR版的網銀了,哈哈);我稱前者為后端,后者為前端。也就是說所有針對業務邏輯去實現的部分是后端,用來展現數據和用戶交互的部分屬於前端

=====
對應到傳統的MVC上來,service層就是后端,而service依賴dao層,dao層也屬於后端,而Controller既不屬於前端也不屬於后端,他只是作為Server對外提供的一層HTTP訪問方式的接口,是后端的門口;而Browser的技術棧線全都屬於前端,這里前端並僅不限於browser,任何用於實現特定顯示方式的部分都屬於前端:比如我為了更好的將數據拼接成組合渲染邏輯對象,可以再加一層nodejs作為中間層,當然這也是划為前端。如下圖:

圖1

前后端分離

何為前后端分離?前后端本來不就分離么?這要從尷尬的jsp講起。分工精細化從來都是蛋糕做大的原則,多個領域工程師最好在不需要接觸其他領域知識的情況下合作,才可能使效率越來越高,維護也會變得簡單。jsp的模板技術融合了html和java代碼,使得傳統MVC開發中的前后端在這里如膠似漆,前端做好頁面,后端轉成模板,發現問題再找前端,前端又看不懂java代碼...前后端分離的目的就是將這尷尬局面打破。

  什么是前后端分離?前后端分離說白了就是把前端和后端分成兩個工程,由不同的團隊負責開發,這樣從工程和職責的角度上都有分開,這樣,后端偏向於提供單純的API接口,前端就是調用API接口進行展示和業務調用。

  這樣不僅將頁面渲染和業務邏輯從server剝離開來,將頁面渲染放給前端,甚至放給瀏覽器;將業務邏輯放給后台專心搞業務,降低了他們之間的耦合性,而且從職責上進行了分明,更適合大項目和大團隊管理和開發。

解決方案

我也提不出什么解決方案,比較有名的屬淘寶UED的中途島項目,我談談我大概的實現方案。

  首先Server端是RESTful風格的,簡單的只提供API的訪問接口;Browser端進行對HTML的展示,配合ajax異步請求和Angular、React等前端成熟框架進行頁面渲染;但browser自己勢單力薄,所以要多出一層處理數據的nodejs(不限死nodejs),用來處理頁面邏輯數據、session、渲染初始頁面等工作,所以大致的原理圖如圖1所示。

總結

  前后端分離可能並不適用於所有情況。軟件開發嘛,都知道沒有最好,只有最合適,能用比較合適的手段去實現軟件的目標,也算功德圓滿了。

我記得我們班里有次活動,有兩個小伙子被挑出來做游戲,每個人原地轉10圈,再轉暈之后,面前有兩台電腦,導師開口出題,要求一分鍾用java敲出一個菱形圖案,其中一個馬上大腦急速轉動,分析規律,屏幕上只見他熟練的for循環語句敲的飛快,雖然有些許卡住,但是就在他敲得起興的同時,另一位采用system.out.print()的方式,快速的敲了個菱形圖案出來,不過被老師制止:"必須用for循環!",這句話對我就觸動挺深,做軟件究竟是為了水平的提高,還是真正的實現需求?


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM