AV无码人妻波多野结,中文字幕无线码免费人妻,中国女人高潮HD,亚洲av无码久久流水呻蜜桃久色

綜合百科

代碼怎么編寫(代碼編程教學入門)

網(wǎng)友 2023-08-06 08:06:42

一、什么是好代碼

拋開性能、并發(fā)、一致性等技術因素,好的業(yè)務代碼應當如一篇顯淺易懂的業(yè)務敘實文章,滿足以下幾個基本條件:

  • 詞要達意:最基礎的變量、函數(shù)、類的命名,是否名達其意。
  • 結構清晰:類的關系結構,函數(shù)的調(diào)用結構,是否如文章的章節(jié)、段落劃分層次分明和邏輯清晰。
  • 緊扣主題:包、類、函數(shù)是否內(nèi)聚,是否破壞了單一和開閉原則。

因此,好代碼如同好文章,它應該是飽含業(yè)務語義(詞要達意)、具有自明性和可讀性(結構清晰),能夠顯性化表達業(yè)務意圖(緊扣主題),讓人賞心悅目。

二、從最基本做起

2.1 命名

好的代碼,從好的命名開始,做到名副其實。

變量命名

變量名是名詞,要正確和清晰地描述業(yè)務語義,如果一個變量需要通過注釋補充說明,那可能就是沒取好變量名。

變量命名的關鍵點:

1、詞要達意:避免無業(yè)務語義的命名,如:list、val、a…;

2、語境范圍:避免小范圍詞套大范圍數(shù)據(jù),反之亦然,不使用過于寬泛的名詞。

3、名詞復數(shù):統(tǒng)一風格,加s或List尾綴,變量名建議使用s尾綴,函數(shù)名建議使用List尾綴。

4、后置限定詞:限定詞是對前面變量名的修飾,可以描述名詞的作用范圍屬性,例如:

  • 請求入?yún)ⅲ簒xxQuery/xxxRequest
  • 返回結果:xxxResponse/xxxResult
  • 傳參數(shù)據(jù):xxxDTO/xxxVO/xxxInfo
  • 運算結果:xxxTotal(總和)/xxxMax(最大值)/xxxAverage(平均值)

Bad case:

Good case:

函數(shù)命名

函數(shù)命名要體現(xiàn)做什么,而不是怎么做,要清楚表達出操作意圖業(yè)務語義。

函數(shù)命名的關鍵點:

  • 動名詞搭配,動詞表達操作意圖,名詞表達業(yè)務語義。
  • 正反操作使用對仗詞,例如:
    • add/remove
    • open/close
    • begin/end
    • insert/delete
    • first/last
    • min/max

    Bad Case:

    Good Case:

    類命名

    類是面向?qū)ο笾凶钪匾母拍睿且唤M關聯(lián)數(shù)據(jù)的相關操作的封裝,通??梢园杨惙譃閮煞N:

    • 實體類:承載業(yè)務的核心數(shù)據(jù)和業(yè)務邏輯,命名要充分體現(xiàn)業(yè)務語義,比如Order/Buyer/Item。
    • 輔助類:協(xié)調(diào)實體類完成業(yè)務邏輯,命名通常加后綴體現(xiàn)出其功能性,比如OrderQueryService/OrderRepository。

    函數(shù)命名的關鍵點:

  • 輔助類盡量避免用 Helper/Util 之類的后綴,因為其含義過于籠統(tǒng),容易破壞單一職責原則。
  • 針對某個實體的輔助操作過多,或單個操作很復雜,可通過 “實體 + 操作類型 + 功能后綴”來命名,同時符合職責單一和接口隔離的原則,比如OrderService:
    • OrderCreateService:訂單創(chuàng)建服務。
    • OrderUpdateService:訂單更新服務。
    • OrderQueryService:訂單查詢服務。

    包命名

    包(package)是一組強關聯(lián)(內(nèi)聚)的類的集合,起分類收納和命名空間的作用。

    • 包名應該要反映一組類在更高抽象層次上的聯(lián)系,比如類Apple、Orange都是水果,可以收納進fruit包內(nèi)。
    • 包的命名要大小適中,不能太具體,也不能太抽象。比如包名叫Apple,太具體導致類Orange放不進去,又比如包名叫food,太抽象導致其他非水果也被放進來了。

    實際工程中,常見的分類維度主要是兩種,按功能性或業(yè)務域分類。

    • 功能性分類:metaq、mapper、service、dao等。
    • 業(yè)務域分類:user、item、order、promotion等。

    同一層級的包,要嚴格保持分類維度的一致性,要么先按業(yè)務域分類,再按功能性分類;要么就先按功能性分類,再按業(yè)務域分類。

    2.2 函數(shù)設計原則

    有時候,優(yōu)雅的實現(xiàn)僅僅是一個函數(shù),不是一個類,不是一個框架,只是一個函數(shù)。 —— John Carmack

    a. 函數(shù)要短小、專一

    • 短?。?/strong>一個函數(shù)不超過50行代碼,大量的setXXX()除外。
    • 專一:一個函數(shù)只做一件事情,符合單一職責原則。

    b. 函數(shù)抽象層次保持一致

    遵循金字塔原則,把函數(shù)層層遞進的調(diào)用,理解成結論先行,自上而下的表達過程

    同層函數(shù)是對上一層的支撐,同層間要符合MECE法則,應描述和處理同一邏輯范疇的事情,高層抽象和底層細節(jié)不能雜糅在一起,否則會變得凌亂和難以理解。

    MECE是(Mutually Exclusive Collectively Exhaustive)的縮寫,指的是“相互獨立,完全窮盡”的分類原則。通過MECE方法對問題進行分類,能做到清晰準確,從而容易找到答案。

    2.3 模塊分層原則

    a. 模塊分層

    • client:外部可見層(暴露服務聲明)
    • service:業(yè)務邏輯層,對client層的實現(xiàn),協(xié)調(diào)domain和infrastructure一起完成業(yè)務邏輯。
    • domain:領域?qū)?,對應DDD中的領域知識。
    • infrastructure:基礎設施層,數(shù)據(jù)庫訪問、消息、外部調(diào)用等。
    • start:應用啟動層,主要是項目啟動時的靜態(tài)配置。

    b. 模塊內(nèi)包分層

    分包的建議:

    • 如果有多個一級域,建議:一級按業(yè)務分包,二級按功能分包,三級可按子領域分包。
    • 如果僅一個一級域,建議:一級按功能分包,二級按子領域分包。

    例如:

    三、耦合與內(nèi)聚

    軟件設計的目標是高內(nèi)聚、低耦合。如果代碼是高耦合和低內(nèi)聚的,就會出現(xiàn)修改一個邏輯,多處代碼要修改,可能影響到多個業(yè)務鏈路,增加了出bug的業(yè)務風險,同時擴大了測試回歸的范圍,導致研發(fā)成本增加。

    耦合和內(nèi)聚,是我們常掛在嘴邊的話,但是大家經(jīng)常說不太清楚,講不太明白,很難衡量:

    • 什么樣的叫高內(nèi)聚,什么樣的叫低耦合?
    • 高內(nèi)聚要高到什么程度,低耦合要低到什么程度?

    3.1 耦合的類型

    耦合是描述模塊(系統(tǒng)/模塊/類/函數(shù))之間相互聯(lián)系(控制/調(diào)用/數(shù)據(jù)傳遞)緊密程度的一種度量。

    • 緊耦合:模塊之間聯(lián)系越緊密,耦合性就越強,模塊的獨立性則越差。
    • 松耦合:模塊之間聯(lián)系越松散,單個模塊解決問題的目的越明確,模塊的獨立性越強。

    a. 非直接耦合

    如果兩個模塊之間沒有直接關系,它們之間的聯(lián)系完全是通過主模塊控制調(diào)用來實現(xiàn)的,這就是非直接耦合,這種耦合的模塊獨立性最強。

    b. 數(shù)據(jù)耦合

    如果一個模塊訪問另一個模塊時,彼此之間是通過數(shù)據(jù)參數(shù)(不是控制參數(shù)、公共數(shù)據(jù)結構或外部變量)來交換輸入、輸出信息的,則稱這種耦合為數(shù)據(jù)耦合,它是較好的耦合形式。

    C. 印記(引用)耦合

    當模塊之間使用復合數(shù)據(jù)結構進行通信時,就會發(fā)生印記耦合。

    復合數(shù)據(jù)結構可以是數(shù)組、類、結構體、聯(lián)合體等的引用,通過復合數(shù)據(jù)結構在模塊之間傳遞的參數(shù),可能會或不會被接收模塊完全使用。

    印記耦合優(yōu)點:把模塊A的引用一把傳遞給模塊B,模塊B只需要接受少量參數(shù),接口說明簡單。

    印記耦合缺點:

      • 不必要的參數(shù):模塊B可能只使用了模塊A中部分的數(shù)據(jù)。
      • 模塊B捆綁了模塊A:任何需要用到模塊B的地方,都需要先獲取到模塊A,無法脫離模塊A單獨使用。
      • 修改可能互相影響:修改模塊A或模塊B,可能導致對方也需要跟著修改,不符合開閉原則。

    印記耦合優(yōu)化:增加入?yún)?shù)類型,進傳入模塊需要的必要數(shù)據(jù),如下:

    d. 控制耦合

    如果一個模塊通過傳送開關、標志等控制信息,明顯地控制選擇另一模塊的功能,就是控制耦合。

    • 數(shù)據(jù)耦合和控制耦合的主要區(qū)別:在數(shù)據(jù)耦合中,模塊之間的依賴關系非常小,而在控制耦合中,模塊之間的依賴關系很高。在數(shù)據(jù)耦合中,模塊之間通過傳遞數(shù)據(jù)進行通信,而在控制耦合中,模塊之間通過傳遞模塊的控制信息進行通信。
    • 控制耦合優(yōu)化:把控制的邏輯放在模塊A之中,或增加模塊C封裝控制邏輯,不然模塊B只做某一件獨立的事情。

    e. 外部耦合

    外部耦合,是指多個模塊同時依賴同一個外部因素(IO設備/文件/協(xié)議/DB等),如上圖所示:

    外部耦合與與外部設備的通信有關,而不是與公共數(shù)據(jù)或數(shù)據(jù)流有關。

    一個模塊對外部數(shù)據(jù)或通信協(xié)議所做的任何更改都會影響其他模塊,可以通過增加中間模塊隔離外部變化來降低耦合度,如下:

    f. 共用耦合

    共用耦合是指不同的模塊共享全局數(shù)據(jù)的信息(全局數(shù)據(jù)結構、共享的通信區(qū)、內(nèi)存的公共覆蓋區(qū))。

    共用耦合的問題:

  • 較難控制各個模塊對公共數(shù)據(jù)的存取,容易影響模塊的可靠性和適應性。
  • 使軟件的可維護性變差,若一個模塊修改了共用數(shù)據(jù),則會影響相關模塊。
  • 降低了軟件的可理解性,不容易清楚知道哪些數(shù)據(jù)被哪些模塊所共享,排錯困難。
  • g. 內(nèi)容耦合

    內(nèi)容耦合在低級語言(匯編)中出現(xiàn),高級語言從設計上已避免出現(xiàn)內(nèi)容耦合。

    如果發(fā)生下列情形,兩個模塊之間就發(fā)生了內(nèi)容耦合:

  • 一個模塊直接訪問另一個模塊的內(nèi)部數(shù)據(jù)。
  • 一個模塊不通過正常入口而直接轉入到另一個模塊的內(nèi)部。
  • 兩個模塊有一部分代碼重疊(該部分代碼具有一定的獨立功能)。
  • 一個模塊有多個入口。
  • 3.2 內(nèi)聚的類型

    內(nèi)聚,是描述一個模塊內(nèi)各元素彼此結合的緊密程度,是從功能角度來度量模塊內(nèi)的聯(lián)系。

    • 低內(nèi)聚:模塊內(nèi)的元素的職責相關性低,通常也意味著模塊與外部是緊耦合的。
    • 高內(nèi)聚:模塊內(nèi)的元素的職責相關性強,通常也意味著模塊與外部是松耦合的。

    通常,解決了耦合的問題,就解決了內(nèi)聚的問題,反之亦然。

    a. 偶然性內(nèi)聚

    偶然內(nèi)聚,一個模塊內(nèi)的各元素之間沒有任何聯(lián)系,僅是恰好放在同一個模塊內(nèi),業(yè)務的“Util/Helper”類有大量例子。

    • 問題的原因:通常是模塊名起的過于抽象,導致不同職責的元素都可以放進去,從而引起了低內(nèi)聚。
    • 問題的解法:將抽象的模塊拆解成多個更小的具體模塊,例如RetailTradeHelper可以拆為OrderAmountHelper/OrderPaymentParamHelper。

    b. 邏輯性內(nèi)聚

    邏輯內(nèi)聚,把幾種相關的功能組合在一起,由調(diào)用方傳入的參數(shù)來確定具體執(zhí)行哪一種功能。

    邏輯內(nèi)聚是一種“低內(nèi)聚”,某程度上對應了“控制耦合”,它把內(nèi)部的邏輯處理暴露給了接口之外,當內(nèi)部邏輯發(fā)生變更時,原本無辜的調(diào)用方也會受牽連改動。

    c. 時間性內(nèi)聚

    時間內(nèi)聚,指一個模塊內(nèi)的組件除了在同一時間都會被執(zhí)行外,相互之間沒有任何關聯(lián)。

    d. 過程性內(nèi)聚

    過程內(nèi)聚,指一個模塊內(nèi)的組件以特定次序被執(zhí)行,但相互之間沒有數(shù)據(jù)傳遞。

    e. 通信性內(nèi)聚

    通信內(nèi)聚,指一個模塊內(nèi)的組件以特定次序被執(zhí)行,且相互之間傳遞和操作相同的數(shù)據(jù)。

    f. 順序性內(nèi)聚

    順序內(nèi)聚,指一個模塊內(nèi)的元素以特定次序被執(zhí)行,且上一步的輸出被下一元素所依賴。

    g. 功能性內(nèi)聚

    功能內(nèi)聚,指一個模塊內(nèi)所有組件屬于一個整體,完成同一個不可切分的功能,彼此缺一不可。

    四、設計原則

    設計原則,是指導我們?nèi)绾卧O計出低耦合、高內(nèi)聚的代碼,讓代碼能夠更好的應對變化,從而降本提效。

    設計原則的關鍵,是從使用方的角度看提供方的設計,一句話概括就是:請不要要我知道太多,你可以改,但請不要影響我。

    4.1 單一職責原則(SRP)

    定義:一個函數(shù)/類只能因為一個理由被修改。

    單一職責原則,是所有原則中看起來最容易理解的,但是真正做到并不簡單。因為遵循這一原則最關鍵是職責的劃分。

    職責的劃分至少要回答兩個基本問題:

    • 什么是你,什么是我?
    • 什么事情歸你管,什么事情歸我管?

    且不說寫代碼,工作中我們也會出現(xiàn)人人不管或相爭的重疊地帶,劃分清楚職責看起容易,實際很難。

    4.2 開閉原則(OCP)

    定義:對擴展開放,對修改關閉(不修改代碼就可以增加新功能)。

    要理解開閉原則,關鍵是要理解定義中隱含著的兩個主語,“使用方”和“提供方”,即:

    提供方可以修改,增加新的功能特性,但是使用方不需要被修改,即可享用新的功能特征。

    開閉原則廣泛的理解,可以指導類、模塊、系統(tǒng)的設計,滿足該原則的核心設計方法是:通過協(xié)議(接口)交互。

    4.3 里氏替換原則(LSP)

    定義:所有引用父類的地方,必須能透明的使用它的子類對象,指導類繼承的設計。

    面向?qū)ο蟮睦^承特性,一方面,子類可以擁有父類的屬性和方法,提高了代碼的復用性;另一方面,繼承是有入侵性的,父類對子類有約束,子類必須擁有父類全部的屬性和方法,修改父類會影響子類,增加了耦合性。

    里氏替換原則是對繼承進行了約束,體現(xiàn)在以下方面:

    • 子類可以實現(xiàn)父類的抽象方法,但不能重寫(覆蓋)父類的非抽象方法。
    • 子類可以增加父類所沒有的屬性和方法。
    • 子類重寫父類方法時,輸入?yún)?shù)類型要和父類的一致,或更寬松(參數(shù)類型的父類)。
    • 子類重寫父類方法時,返回值類型要和父類的一致,或更嚴謹(返回類型的子類)。

    4.4 依賴倒置原則(DIP)

    定義:高層模塊不應該依賴低層模塊,兩者都應該依賴其抽象;抽象不應該依賴細節(jié),細節(jié)應該依賴抽象,目的是降低層與層之間的耦合。

    從倒置來看,該原則可以有更泛化的理解:

    • 依賴實體的倒置:高層不依賴底層模塊,抽象不依賴細節(jié),例如模塊分層規(guī)范中的domain不依賴infrastructure的實現(xiàn)。
    • 依賴控制的倒置:依賴具體對象的創(chuàng)建控制,從程序內(nèi)部交給外部,例如Spring的Ioc容器。

    舉個購物車的例子:

    • 商業(yè)能力基座:主要包含購物車的業(yè)務流程實現(xiàn)、外域服務定義(非實現(xiàn))、商業(yè)定制能力(擴展點),打包后需滿足一套代碼多處部署的要求。
    • 域服務能力實例:針對不同運行環(huán)境,提供適配環(huán)境的域服務實現(xiàn),商業(yè)基座反向依賴域服務實例,使得基座與環(huán)境無關。

    4.5 接口隔離原則(ISP)

    定義:客戶端不應該被強迫去依賴它并不需要的接口。

    理解接口隔離原則,需要拿單一職責的原則做對比。細品一下,如果一個接口滿足了單一職責,是否就也就滿足接口隔離原則?

    • 單一職責原則,解決了接口內(nèi)聚的問題。
    • 接口隔離原則,認為某些場景下需要存在非內(nèi)聚接口(多職責),但是又不希望客戶端知道整個類,客戶端只要知道具有內(nèi)聚接口的抽象父類即可。

    簡單來講,接口隔離原則解決的問題是,當某些類本身或面向使用方不滿足職責單一原則時,客戶端不應該直接使用它們,而是通過增加接口類,通過它隱藏客戶端不需要感知到的部分。

    五、編程范式

    5.1 編程范式

    編程范式,本質(zhì)是一種思維方式,而和具體語言沒關系。

    用C語言可以寫出面向?qū)ο蟮某绦?,用Java語言可以寫出面向過程的程序。而不爭的現(xiàn)實是,我們大部分人是在用java寫面向過程的代碼。

    例如下面代碼,它是如何用面向過程語言實現(xiàn)封裝、繼承、多態(tài)的?

    備注:以上代碼來自開源libevent庫

    a. 結構化(面向過程)編程

    最早使用機器和匯編語言編程,是編排好一堆命令讓機器逐條執(zhí)行,為了控制一些跳躍的流程(如if/for/continue/break),就會用到類似goto的語句,讓程序直接跳轉到希望執(zhí)行的指令位置,這樣程序員就擁有了直接轉移程序控制權的能力。goto的無條件轉移,使得程序的控制流難于追蹤,程序難以修改和維護。

    后來大家出了一套流程結構化的定律:任何程序都可以用順序、選擇、循環(huán)三種基本控制結構來表示。

    • 順序:代碼是至上往下順序執(zhí)行的。
    • 選擇:if-else/switch選擇執(zhí)行。
    • 循環(huán):for/while控制循環(huán)執(zhí)行。

    因此,結構化編程的本質(zhì),是對程序控制權的直接轉移進行了規(guī)范和限制。

    b. 面向?qū)ο缶幊?br />

    結構化編程思維,比較靠近機器運行的思維,當程序越來越復雜的時候,大家發(fā)現(xiàn)簡單靠結構化思維編程,很難構建起一個龐大的應用。而在編碼過程中,大家不知不覺的把一些數(shù)據(jù)和邏輯封裝了起來,形成一個個可復用的組件。慢慢大家出了一套符合人類理解客觀世界的編程范式:利用事物的信息建模概念,如實體、關系、屬性等,同時運用封裝、繼承、多態(tài)等機制來構造模擬現(xiàn)實系統(tǒng)的方法。

    • 封裝:核心是對實體建模,把客觀世界的屬性和行為,封裝成類的數(shù)據(jù)和方法,同時通過控制訪問權限(private/protect/public),對外隱藏細節(jié)。
    • 繼承:在封裝的基礎上,可以定義子類,從而使子類獲得父類的屬性和行為,這也符合人類從抽象到具象的認知思維。
    • 多態(tài):繼承使得子類獲得父類的行為,總有兒子不聽爸爸話的時候,當子類重寫了父類行為時,多態(tài)使得父類引用執(zhí)行方法時,實際執(zhí)行的是子類的行為。

    封裝、繼承、多態(tài)是面向?qū)ο蟮娜筇卣?,三者的關系是層層遞進的,而多態(tài)實際是規(guī)范了程序控制權的間接轉移,在面向?qū)ο缶幊讨?,大家是通過函數(shù)指針來解耦不同組件的函數(shù)實現(xiàn),這種方式需要工程師嚴格遵守約定初始化函數(shù)指針,是非常脆弱的。

    因此,面向?qū)ο缶幊痰谋举|(zhì),是規(guī)范了數(shù)據(jù)和行為的封裝,同時限制了程序控制權的間接轉移。

    c. 函數(shù)式編程

    函數(shù)式思維,是一種數(shù)學思維,把一個問題分解為一系列函數(shù)。函數(shù)式編程有多種定義,但是從根本上來看,它的核心是“純函數(shù)”和“引用透明”:

    • 純函數(shù):無副作用,同樣的輸入永遠得到同樣的輸出。
    • 引用透明:任意函數(shù)直接用它的計算結果替代,而不影響任何調(diào)用它的程序。

    若要做到以上兩點,就需要對賦值進行限制,即變量一旦初始化就不可以再修改。

    因此,函數(shù)式編程的本質(zhì),是規(guī)范了函數(shù)(一等公民/高階函數(shù)/聲明式/閉包等),同時限制了賦值行為。

    d. 編程范式

    編程范式的本質(zhì),更多是告訴我們不能做什么,并且通過規(guī)范來約束我們的行為。

    • 結構化編程:限制對程序的控制權做直接轉移,請按照控制結構規(guī)范來。
    • 面向?qū)ο缶幊蹋合拗茖Τ绦蚩刂茩嗟拈g接轉移,請按照封裝、繼承、多態(tài)的規(guī)范來。
    • 函數(shù)式編程:限制了賦值行為,請按照函數(shù)的規(guī)范來。

    靈魂拷問一下:

    • 為什么面向?qū)ο缶幊檀笫芡瞥纾?
    • 為什么多數(shù)人在用面向?qū)ο笳Z言寫面向過程代碼?
    • 為什么函數(shù)式編程束之高閣,很難產(chǎn)業(yè)化大規(guī)模使用?

    我當前表淺的理解是:

    • 面向過程符合人類的直線直覺思維,不需要太多深度思考,可以快語直言。
    • 面向?qū)ο笮枰浞至私饪陀^主體信息,才能從中思考和提煉出要素(實體)、關系(方法)和目標(職責),要求有系統(tǒng)性的抽象思維
    • 函數(shù)式編程基于數(shù)學,缺少合適的抽象機制,純函數(shù)式編程很難滿足企業(yè)級應用要求的嚴格和復雜的業(yè)務需求。

    三種編程范式?jīng)]有好壞之分,核心是思維方式的區(qū)別,針對不同的問題和場景,如何選擇適當?shù)姆绞絹硭伎己徒鉀Q問題,才是我們理解它們的關鍵。

    5.2 應用范式

    a. 表模式

    表模式關注的數(shù)據(jù)庫的表,它先考慮數(shù)據(jù)庫表需要管理,然后添加對數(shù)據(jù)增刪改查的操作。封裝是面向?qū)ο蟮年P鍵特征之一,把數(shù)據(jù)和操作數(shù)據(jù)的行為綁定在一起,擁有一個標識符(類)來表示它兩的集合,而表模式允許你把數(shù)據(jù)和行為放在一起,但是它沒有一個標識符來標出它所代表的主體。

    這種模式在PC時代很盛行,例如VB和.net等桌面應用開發(fā)框架上,但是在JAVA服務應用中也被我發(fā)現(xiàn)了,如下:

    b. 事務腳本模式

    腳本,是指表演戲劇、拍攝電影等所依據(jù)的底本又或者書稿的底本。腳本可以說是故事的發(fā)展大綱,用以確定故事的發(fā)展方向。

    事務腳本模式,關注點是事務的流程和步驟,是對事務流程和步驟的編排,是一種面向過程的組織和表達形式。

    按照事務腳本模式編程,可以不需要任何面向?qū)ο蟮脑O計,其中任何邏輯都可以通過if/else/while等流程控制元素來表達。

    事務腳本模式的優(yōu)點是,門檻低容易上手,也符合人的直線直覺思維;它的缺點是,當業(yè)務邏輯復雜是,事務方法會快速膨脹,因為業(yè)務屬性不明確和缺乏抽象,不好復用和擴展。該模式在服務端應用中很常見,從MVC時代開始,一般通過controller組織事務流程,常見的分層結構如下:

    c. 領域設計模式

    領域設計模式,是通過分析和發(fā)掘業(yè)務領域的概念,從中提煉和設計出具有數(shù)據(jù)和行為的對象模型(類),并建立模型之間的關系。

    領域設計模式,需要建立一個完整的由對象模型組成的層,來對目標業(yè)務領域建模。業(yè)務是經(jīng)常變化的,通常有會通過分層的模式,讓領域模型和系統(tǒng)其他部分保持最小的依賴。

    至此,你會發(fā)現(xiàn)領域設計是DDD的底層思想,是面向?qū)ο蟮膶嵺`,更多請查閱“對象建模”和“領域驅(qū)動設計(DDD)”相關的材料和數(shù)據(jù),這里不做展開。

    d. 應用范式

    不同的應用范式,是隨著軟件復雜度逐步提升演進出來的,不同模式面對和解決不同復雜度的問題,相互之間沒有好壞之分。當問題比較簡單時,使用事務腳本模式足夠應付,反倒使用領域設計就過度設計,增加了不必要的復雜度,適得其反。

    六、代碼的道與術

    任何一個學科的學習,都要從基本概念、基本原理、基本方法入手,才能把握住問題的實質(zhì)。

    所謂,招式套路可以千變?nèi)f化,扎實深厚的內(nèi)功卻始終如一。內(nèi)功是基礎和本源的東西,例如耦合和內(nèi)聚,我們都知道低耦合高內(nèi)聚好,但如何衡量代碼的耦合和內(nèi)聚?再如編程范式,我們都在使用面向?qū)ο笳Z言,為什么看到的大多數(shù)是面向過程的代碼?究其根本,是我們?nèi)菀缀鲆暬A和本源的東西,比如更關注設計模式,更關注架構設計,但上層的設計理念大多數(shù)是來自基礎和本源的思想指引。

    套用道家的一句話:道以明向,法以立本,術以立策,器以成事。

    從代碼的角度來看:

    • 道:是好代碼,無以名狀,無以表述,只能假想形式表達,仁者見仁智者見智。
    • 法:是編程范式,是規(guī)章制度,是規(guī)范約束,使其在道的合理范圍之內(nèi),保住基線。
    • 術:是設計原則,執(zhí)行層面的方法論。
    • 器:是spring/mos-boot,有形的工具,保障的是執(zhí)行和效率。

    從代碼的角度來看它們的關系:

    • 以法固道:理念需要通過法制來規(guī)范和約束,才能得到貫徹、落實和鞏固。
    • 以器載道:善于創(chuàng)造和使用工具,用工具承載理念,可以事半功倍。
    • 以道馭術:基本理念和具體操作要統(tǒng)一,即知行合一。

    關于如何寫好代碼,描述如有不當之處,請大家?guī)兔χ刚?。最后,用一句話與大家共勉:萬丈高樓平地起,勿在浮沙筑高臺。

    七、參考材料

    參考書籍:

    • 《重構》
    • 《代碼整潔之道》
    • 《架構整潔之道》
    • 《易讀代碼的藝術》
    • 《代碼精進之路》
    • 《編程的邏輯-如何用面向?qū)ο蠓椒▽崿F(xiàn)復雜業(yè)務需求》
    • 《企業(yè)應用架構模式》
    • 《麥肯錫教我的協(xié)作武器》

    參考文章:

    《control-coupling》

    《sequential-cohesion》

    其他文章

  • 阜新銀行存款安全嗎 阜新銀行安全嗎
  • 錳酸鋰上市龍頭 錳酸鋰股票的簡要分析
  • 海南礦業(yè)為什么不漲 海南礦業(yè)股票為什么不漲
  • 中華保險是大公司嗎 中華保險公司規(guī)模怎么樣
  • 590002分過紅嗎 中郵核心增長股票基金有分過紅嗎
  • 商貸轉公積金麻煩嗎 商轉公的流程有哪些呢
  • 完全不懂基金怎么入門 基金入門的方法
  • 豬肉行業(yè)龍頭股一覽表 豬肉行業(yè)股票的簡要分析
  • 人民幣的單位換算 人民幣有什么單位
  • 央企有哪些 央企的主要內(nèi)容
  • 2022年冬奧會獎牌榜排名(冬奧最新金牌榜數(shù)據(jù)統(tǒng)計)
  • 父親節(jié)是什么時候(父親節(jié)的起源)
  • 韓國女團成員顏值排名前十(韓國女團偶像顏值top)
  • 海賊王惡魔果實排名大全圖鑒(公認的三系最強惡魔果實)
  • 奔馳c260l新車報價2023款(奔馳C級購車手冊)
  • 馬化騰一家四口圖片(馬化騰的老婆是誰)
  • 黃油游戲推薦單機(可以玩的18款禁用游戲手游)
  • 奧特曼圖片大全(56位奧特曼照片大全欣賞)
  • 華為P8max評測(P系列首款6.8英寸P8max手機圖片)
  • 黔ICP備19002813號