Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 青青草在视线频久久,精品国产系列在线观看,成人欧美视频

          整合營銷服務(wù)商

          電腦端+手機(jī)端+微信端=數(shù)據(jù)同步管理

          免費(fèi)咨詢熱線:

          領(lǐng)域驅(qū)動設(shè)計(jì)(DDD),用了一個(gè)禮拜時(shí)間給大家整理干

          領(lǐng)域驅(qū)動設(shè)計(jì)(DDD),用了一個(gè)禮拜時(shí)間給大家整理干貨

          們?yōu)槭裁葱枰I(lǐng)域驅(qū)動設(shè)計(jì)

          在說什么是領(lǐng)域驅(qū)動設(shè)計(jì)之前,我覺得需要先說一下我們?yōu)槭裁葱枰I(lǐng)域驅(qū)動,我個(gè)人認(rèn)為領(lǐng)域驅(qū)動設(shè)計(jì)對于研發(fā)來說改進(jìn)點(diǎn)主要有下面三個(gè):

          1. 從大泥球風(fēng)格中解脫出來,控制代碼復(fù)雜度
          2. 回歸面向?qū)ο缶幊瘫举|(zhì),而不是面向過程編程
          3. 專注于業(yè)務(wù),實(shí)現(xiàn)不同業(yè)務(wù)領(lǐng)域解偶

          什么是領(lǐng)域驅(qū)動設(shè)計(jì)

          領(lǐng)域驅(qū)動設(shè)計(jì)(DDD)是一種軟件設(shè)計(jì)思路,領(lǐng)域指的是業(yè)務(wù)領(lǐng)域,比如銀行業(yè)務(wù)領(lǐng)域,醫(yī)藥銷售領(lǐng)域;不同于傳統(tǒng)以數(shù)據(jù)表為中心的建模方式,它以業(yè)務(wù)領(lǐng)域?yàn)橹行膩斫#艽偈刮覀円哉_的方式使用面向?qū)ο螅枬M的領(lǐng)域?qū)ο蟆?/p>

          在進(jìn)行領(lǐng)域建模和開發(fā)時(shí)我們主要需要關(guān)注以下幾點(diǎn):

          1. 和領(lǐng)域?qū)<乙黄饦?gòu)建一套通用語言,團(tuán)隊(duì)成員使用通用業(yè)務(wù)語言進(jìn)行交流;
          2. 關(guān)注領(lǐng)域的戰(zhàn)略設(shè)計(jì),DDD的戰(zhàn)略設(shè)計(jì)從更高層次抽象系統(tǒng),劃分出不同的系統(tǒng)和業(yè)務(wù)關(guān)注點(diǎn),戰(zhàn)略設(shè)計(jì)包含:領(lǐng)域/子域劃分、通用語言的構(gòu)建、限界上下文定義以及架構(gòu)風(fēng)格選擇等;
          3. 實(shí)現(xiàn)DDD的戰(zhàn)術(shù)設(shè)計(jì),戰(zhàn)術(shù)設(shè)計(jì)主要包含:領(lǐng)域?qū)ο螅▽?shí)體、值對象、聚合)、模塊、領(lǐng)域服務(wù)、工廠等;

          下面的思維導(dǎo)圖是領(lǐng)域驅(qū)動設(shè)計(jì)需要掌握的一些點(diǎn):

          Tips:

          1.領(lǐng)域驅(qū)動設(shè)計(jì)是2004年Eric Evans在《領(lǐng)域驅(qū)動設(shè)計(jì):軟件核心復(fù)雜性應(yīng)對之道》這本書中提到的,DDD的出現(xiàn)是為了應(yīng)對復(fù)雜業(yè)務(wù)場景下軟件越來越復(fù)雜問題;也就是說通過DDD可以將軟件的復(fù)雜度控制在合理的范圍內(nèi)。

          2.領(lǐng)域驅(qū)動設(shè)計(jì)主要解決的是業(yè)務(wù)復(fù)雜度問題(避免大泥球風(fēng)格:大泥球風(fēng)格就是沒有任何清楚的結(jié)構(gòu),例如隨意共享的數(shù)據(jù),隨意全局化的數(shù)據(jù)結(jié)構(gòu)。這樣風(fēng)格的系統(tǒng)可維護(hù)性(maintainability)和可擴(kuò)展性(extensibility)都很差,最終導(dǎo)致整個(gè)系統(tǒng)難以改動,維護(hù)不下去),如果業(yè)務(wù)不復(fù)雜,則不需要使用DDD方式來處理(推薦用三層架構(gòu))。

          領(lǐng)域驅(qū)動設(shè)計(jì)的優(yōu)缺點(diǎn)

          領(lǐng)域驅(qū)動設(shè)計(jì)的優(yōu)缺點(diǎn)很明顯,我這邊整理了幾個(gè)優(yōu)缺點(diǎn),供參考。

          優(yōu)點(diǎn):

          1. 由領(lǐng)域?qū)<疫M(jìn)行領(lǐng)域模型設(shè)計(jì),通過業(yè)務(wù)驅(qū)動開發(fā)而不是數(shù)據(jù)庫設(shè)計(jì)來驅(qū)動項(xiàng)目開發(fā),業(yè)務(wù)邏輯更加清晰;
          2. 再次強(qiáng)調(diào)了面向?qū)ο缶幊痰闹匾裕瑴p少面向過程編程(提高內(nèi)聚性、降低上下文之間耦合);
          3. 對單元測試(自測)比較友好;

          缺點(diǎn):

          1. 需要有對DDD比較精通的人員進(jìn)行領(lǐng)域的建模,如果建模不當(dāng),后續(xù)會比較麻煩;
          2. 對開發(fā)人員要求比較高,開發(fā)人員需要理解DDD才能進(jìn)行開發(fā);
          3. DDD本身概念性的東西比較多,有些概念不好理解,需要長時(shí)間的歷練才能很好的掌握DDD;

          如何進(jìn)行領(lǐng)域建模

          按照實(shí)現(xiàn)領(lǐng)域驅(qū)動設(shè)計(jì)一書中描述的DDD步驟主要有4步:

          1. 根據(jù)業(yè)務(wù)需求劃分出初步的領(lǐng)域和限界上下文,以及上下文之間的關(guān)系;
          2. 進(jìn)一步分析每個(gè)上下文內(nèi)部,識別出哪些是實(shí)體,哪些是值對象;對實(shí)體、值對象進(jìn)行關(guān)聯(lián)和聚合,劃分出聚合的范疇和聚合根;
          3. 為聚合根設(shè)計(jì)倉儲,并思考實(shí)體或值對象的創(chuàng)建方式;
          4. 在工程中實(shí)踐領(lǐng)域模型,并在實(shí)踐中檢驗(yàn)?zāi)P偷暮侠硇裕雇颇P椭胁蛔愕牡胤讲⒅貥?gòu)。

          劃分領(lǐng)域和限界上下文

          提煉問題域

          軟件開發(fā)實(shí)際作用就是為客戶解決問題或者軟件升級變革,所以在領(lǐng)域中我們劃分了問題空間和解空間兩個(gè)緯度空間,用于描述客戶的問題(需求)和如何解決問題(解決方案)。

          問題的來源:

          1. 客戶痛點(diǎn)需求:比如電腦藍(lán)屏、文檔忘記保存等。
          2. 行業(yè)變革:移動支付、網(wǎng)購等。

          問題域劃分

          首先我們需要對問題域進(jìn)行拆分,拆分的理念就是由大化小,逐個(gè)擊破。拆分完畢問題空間,我們需要做到逐一擊破,為每一個(gè)問題形成一套落地解決方案。一個(gè)問題對應(yīng)一個(gè)答案,解空間與問題空間基本上應(yīng)該是一一對應(yīng)的。

          構(gòu)建限界上下文

          我們給出的解方案是一個(gè)個(gè)限界上下文,一個(gè)限界上下文負(fù)責(zé)應(yīng)對其對應(yīng)的問題進(jìn)行解決,承載了該問題中的業(yè)務(wù)知識及規(guī)則。限界上下文是解決某一類問題的單一功能模塊,例如訂單限界上下文,處理開單、通知訂單狀態(tài)等一切與訂單關(guān)聯(lián)的功能。

          隨著問題的劃分,將領(lǐng)域拆分成了不同的子域,每個(gè)子域有其獨(dú)有的業(yè)務(wù)知識,而這些知識需要靠一門統(tǒng)一語言來描述。而不同限界上下文間的統(tǒng)一語言是相互獨(dú)立的。可能在不同的限界上下文有同樣的名詞,但同樣的名詞在不同的限界上下文中可能表示的不是同一事物,即使是同一事物可能其在不同上下文中的關(guān)注點(diǎn)也不一致。

          限界上下文之間的映射關(guān)系:

          • 合作關(guān)系(Partnership):兩個(gè)上下文緊密合作的關(guān)系,一榮俱榮,一損俱損。
          • 共享內(nèi)核(Shared Kernel):兩個(gè)上下文依賴部分共享的模型。
          • 客戶方-供應(yīng)方開發(fā)(Customer-Supplier Development):上下文之間有組織的上下游依賴。
          • 遵奉者(Conformist):下游上下文只能盲目依賴上游上下文。
          • 防腐層(Anticorruption Layer):一個(gè)上下文通過一些適配和轉(zhuǎn)換與另一個(gè)上下文交互。
          • 開放主機(jī)服務(wù)(Open Host Service):定義一種協(xié)議來讓其他上下文來對本上下文進(jìn)行訪問。
          • 發(fā)布語言(Published Language):通常與OHS一起使用,用于定義開放主機(jī)的協(xié)議。
          • 大泥球(Big Ball of Mud):混雜在一起的上下文關(guān)系,邊界不清晰。
          • 另謀他路(SeparateWay):兩個(gè)完全沒有任何聯(lián)系的上下文。

          子域類型

          核心域

          核心域是一款軟件的所能獲得的競爭優(yōu)勢的根本所在。所以在核心的建模和開發(fā)主要投入大量的時(shí)間和人力。

          通用域

          通用域是許多大型軟件系統(tǒng)都有的子域。通用域例如像電子郵件和短信發(fā)送、OSS、MQ等。

          支撐域

          系統(tǒng)中的其他域被稱為支撐域。支撐域的主要作用就是有助于支撐核心域的業(yè)務(wù)。比如:用戶的注冊等。

          分析模型(從領(lǐng)域建模角度分析需求)

          DDD分析建模主要有兩種方法可以使用:用例分析法、四色建模法、事件風(fēng)暴、領(lǐng)域驅(qū)動建模。

          用例分析法

          通過對需求進(jìn)行分析構(gòu)建出用例圖如下所示(舉例子不一定正確):

          四色建模法

          這里列一下標(biāo)準(zhǔn)的四色建模法(https://www.infoq.cn/article/xh-four-color-modeling/),其實(shí)還是需要多聯(lián)系才行。

          時(shí)標(biāo)型(Moment-Interval)對象:具有可追溯性的記錄運(yùn)營或管理數(shù)據(jù)的時(shí)刻或時(shí)段對象,用紅色表示 -> 操作

          PPT(Party/Place/Thing)對象:代表參與到流程中的參與方/地點(diǎn)/物,用綠色表示 -> 名詞

          角色(Role)對象:在時(shí)標(biāo)型對象與 PPT 對象(通常是參與方)之間參與的角色,用黃色表示 -> 操作角色

          描述(Description)對象:對 PPT 對象的一種補(bǔ)充描述,用藍(lán)色表示 -> 表述備注

          領(lǐng)域建模并不是沒有方法,而是選擇太多,有用例法、四色建模、領(lǐng)域驅(qū)動建模、事件風(fēng)暴等,人有一個(gè)特點(diǎn)是喜歡找最簡單、最易用的方法,每個(gè)方法都有自己的特點(diǎn),并沒有好壞優(yōu)劣之分,只有適不適合。聽到一個(gè)方法就去嘗試,嘗試到一半就放棄,一種種方法嘗試,最終就會迷失在方法選擇上。

          識別模型(主要構(gòu)成)


          構(gòu)造模型(找到聚合根)


          細(xì)化模型(反復(fù)優(yōu)化)

          對于DDD而言領(lǐng)域建模完成后,我們就需要對照模型進(jìn)行開發(fā),在開發(fā)之間我們需要知道領(lǐng)域戰(zhàn)略設(shè)計(jì)中的幾種架構(gòu)風(fēng)格。

          1. 名詞做類、動詞為方法,生成漸層次模型
          2. 將漸層次模型歸納劃分,做更抽象的

          DDD四層架構(gòu)

          DDD四層架構(gòu)是一個(gè)松散分層架構(gòu)(任意上層可以調(diào)用下層,但是下層不能調(diào)用上層),DDD四層架構(gòu)的含義如下:

          1. 用戶接口層:用戶界面層,或者表現(xiàn)層,負(fù)責(zé)向用戶顯示解釋用戶命令(類似于傳統(tǒng)三層架構(gòu)中的Controller層);
          2. 應(yīng)用層:定義軟件要完成的任務(wù),并且指揮協(xié)調(diào)領(lǐng)域?qū)ο筮M(jìn)行不同的操作。該層不包含業(yè)務(wù)領(lǐng)域知識。這層和傳統(tǒng)三層架構(gòu)中不同點(diǎn)在于MVC中所有的業(yè)務(wù)邏輯都在Service層,但是DDD四層結(jié)構(gòu)中將業(yè)務(wù)邏輯下層到領(lǐng)域?qū)樱瑧?yīng)用層只負(fù)責(zé)定義方法,然后調(diào)用領(lǐng)域?qū)舆M(jìn)行處理。應(yīng)用服務(wù)可以用于控制持久化事務(wù)和安全認(rèn)證等。應(yīng)用服務(wù)本身并不處理業(yè)務(wù)邏輯,但它確卻是領(lǐng)域模型的直接客戶。
          3. 領(lǐng)域?qū)樱侯I(lǐng)域?qū)邮窍到y(tǒng)的核心,負(fù)責(zé)表達(dá)業(yè)務(wù)概念,業(yè)務(wù)狀態(tài)信息以及業(yè)務(wù)規(guī)則。即包含了該領(lǐng)域(問題域)所有復(fù)雜的業(yè)務(wù)知識抽象和規(guī)則定義。該層主要精力要放在領(lǐng)域?qū)ο蠓治錾希梢詮膶?shí)體,值對象,聚合(聚合根),領(lǐng)域服務(wù),領(lǐng)域事件,倉儲,工廠等方面入手。
          4. 基礎(chǔ)設(shè)施層:該層主要有兩方面內(nèi)容,一是為領(lǐng)域模型提供持久化機(jī)制,當(dāng)軟件需要持久化能力時(shí)候才需要進(jìn)行規(guī)劃;一是對其他層提供通用的技術(shù)支持能力,如消息通信,通用工具,配置等的實(shí)現(xiàn);

          如下是DDD四層架構(gòu)圖:

          依賴倒置原則(DIP)

          依賴倒置原則:我們要依賴不變或穩(wěn)定的元素(類、模塊或?qū)樱橄蟛粦?yīng)該依賴于細(xì)節(jié),細(xì)節(jié)應(yīng)該依賴于抽象。依賴倒置原則可以改進(jìn)分層架構(gòu),即底層服務(wù)應(yīng)該依賴于高層組件所提供的接口。

          ?采用了依賴注入方式后,其實(shí)可以發(fā)現(xiàn)事實(shí)上已經(jīng)沒有分層概念了。無論高層還是底層,實(shí)際只依賴于抽象,整個(gè)分層好像被推平了,這就引入下一個(gè)架構(gòu)六邊形架構(gòu)。

          六邊形架構(gòu)

          六邊形架構(gòu)是Alistair Cockburn在2005年提出的,在這種架構(gòu)中,不同的客戶通過“平等”的方式與系統(tǒng)交互。在《實(shí)現(xiàn)領(lǐng)域驅(qū)動設(shè)計(jì)》一書中,作者將六邊形架構(gòu)應(yīng)用到領(lǐng)域驅(qū)動設(shè)計(jì)的實(shí)現(xiàn),六邊形的內(nèi)部代表了application和domain層。外部代表應(yīng)用的驅(qū)動邏輯、基礎(chǔ)設(shè)施或其他應(yīng)用。內(nèi)部通過端口和外部系統(tǒng)通信,端口代表了一定協(xié)議,以API呈現(xiàn)。個(gè)人理解其實(shí)就是變成內(nèi)層、適配層&外部資源,內(nèi)層是應(yīng)用層和領(lǐng)域?qū)樱贿m配層是之前的接口層和基礎(chǔ)設(shè)施層;外部資源就是對外接口、緩存、MQ、數(shù)據(jù)庫等等。六邊形架構(gòu)圖如下所示:

          ?下面是對六邊型架構(gòu)的一個(gè)落地實(shí)踐示例:

          ?

          四層架構(gòu)、DIP、六邊形架構(gòu)可以參考:

          https://www.jianshu.com/p/c405aa19a049

          http://it.hzqiuxm.com/ddd%E9%A2%86%E5%9F%9F%E9%A9%B1%E5%8A%A8%E6%88%98%E7%95%A5%E7%AF%87%EF%BC%884%EF%BC%89/#DDD-2

          CQRS

          在DDD設(shè)計(jì)思路中,DDD 通過領(lǐng)域?qū)ο笾g的交互實(shí)現(xiàn)業(yè)務(wù)邏輯與流程,并通過分層的方式將業(yè)務(wù)邏輯剝離出來,單獨(dú)進(jìn)行維護(hù),從而控制業(yè)務(wù)本身的復(fù)雜度。但是作為一個(gè)業(yè)務(wù)系統(tǒng),查詢的相關(guān)功能也是不可或缺的。在實(shí)現(xiàn)各式各樣的查詢功能時(shí),往往會發(fā)現(xiàn)很難用領(lǐng)域模型來實(shí)現(xiàn)。假設(shè)在用戶需要一個(gè)訂單相關(guān)信息的查詢功能,展現(xiàn)的是查詢結(jié)果的列表。列表中的數(shù)據(jù)來自于訂單、商品、品類、送貨地址等多個(gè)領(lǐng)域?qū)ο笾械哪硯讉€(gè)字段。這樣的場景如果還是通過領(lǐng)域?qū)ο髞矸庋b就顯的很麻煩,其次與領(lǐng)域知識也沒有太緊密的關(guān)系。所以命令查詢職責(zé)分離的設(shè)計(jì)架構(gòu)(CQRS)是可以很好的解決上述的問題。

          CQRS將系統(tǒng)分為兩類操作:命令(command)、查詢(Query)。命令則是對會引起數(shù)據(jù)發(fā)生變化操作的總稱,即我們常說的新增,更新,刪除這些操作,都是命令。而查詢則和字面意思一樣,即不會對數(shù)據(jù)產(chǎn)生變化的操作,只是按照某些條件查找數(shù)據(jù)。CQRS 的核心思想是將這兩類不同的操作進(jìn)行分離,然后在兩個(gè)獨(dú)立的服務(wù)中實(shí)現(xiàn)。這種獨(dú)立服務(wù)可以是兩個(gè)不同的應(yīng)用或者同一個(gè)應(yīng)用中不同的包進(jìn)行隔離。同時(shí)理論上命令和查詢的數(shù)據(jù)源也是不同的(實(shí)現(xiàn)讀寫分離)。

          當(dāng)然讀寫分離模式,肯定會遇到事務(wù)的問題,事務(wù)問題主要的包含兩種情況:

          1. 當(dāng) command 端完成數(shù)據(jù)更新后,需要通過事件的形式通知 query 端系統(tǒng),這就存在著一定的時(shí)間差,如果你的業(yè)務(wù)對于數(shù)據(jù)完整的實(shí)時(shí)性非常高,那么可能 CQRS 不一定適合你。
          2. 其次一個(gè) command 觸發(fā)的事件在 query 端可能需要更新數(shù)個(gè)數(shù)據(jù)模型,而這也是有可能失敗的。一旦更新失敗那么數(shù)據(jù)就會長時(shí)間的處于不一致狀態(tài),需要外部的介入。

          所以從事務(wù)的角度來看 CQRS,你需要面對的是問題從根本來說是個(gè)最終一致性的問題。對于團(tuán)隊(duì)處理這種最終一致性問題需要有對應(yīng)的方案。

          CQRS架構(gòu)如下所示:

          ?領(lǐng)域?qū)ο?/h1>

          了解了戰(zhàn)略設(shè)計(jì)后,我們主要做具體的實(shí)施,具體實(shí)施時(shí)我們需要了解實(shí)體、值對象和聚合這幾個(gè)領(lǐng)域?qū)ο蟆?/p>

          實(shí)體&值對象

          我們先看一下他們的定義:

          實(shí)體:許多對象不是由它們的屬性來定義,而是通過一系列的連續(xù)性(continuity)和標(biāo)識(identity)來從根本上定義的。只要一個(gè)對象在生命周期中能夠保持連續(xù)性,并且獨(dú)立于它的屬性(即使這些屬性對系統(tǒng)用戶非常重要),那它就是一個(gè)實(shí)體。

          值對象:當(dāng)你只關(guān)心某個(gè)對象的屬性時(shí),該對象便可作為一個(gè)值對象。為其添加有意義的屬性,并賦予它相應(yīng)的行為。我們需要將值對象看成不變對象,不要給它任何身份標(biāo)識,還應(yīng)該盡量避免像實(shí)體對象一樣的復(fù)雜性。

          對于實(shí)體Entity,實(shí)體核心是用唯一的標(biāo)識符來定義,而不是通過屬性來定義。即即使屬性完全相同也可能是兩個(gè)不同的對象。同時(shí)實(shí)體本身有狀態(tài)的,實(shí)體又演進(jìn)的生命周期,實(shí)體本身會體現(xiàn)出相關(guān)的業(yè)務(wù)行為,業(yè)務(wù)行為會實(shí)體屬性或狀態(tài)造成影響和改變。

          如果從值對象本身無狀態(tài),不可變,并且不分配具體的標(biāo)識層面來看。那么值對象可以僅僅理解為實(shí)際的Entity對象的一個(gè)屬性結(jié)合而已。該值對象附屬在一個(gè)實(shí)際的實(shí)體對象上面。值對象本身不存在一個(gè)獨(dú)立的生命周期,也一般不會產(chǎn)生獨(dú)立的行為。

          對于實(shí)體和值對象詳細(xì)說明可以參考:https://www.jianshu.com/p/da51d16dbdc4

          聚合&聚合根

          聚合是業(yè)務(wù)和邏輯緊密關(guān)聯(lián)的實(shí)體和值對象組合而成,聚合是數(shù)據(jù)修改和持久化的基本單元,一個(gè)聚合對應(yīng)一個(gè)數(shù)據(jù)的持久化;同時(shí)將選擇一個(gè)實(shí)體作為每個(gè)聚合的根,并僅允許外部對象持有對聚合根的引用。作為一個(gè)整體來定義聚合的屬性和不變量,并把其執(zhí)行責(zé)任賦予聚合根或指定的框架機(jī)制。

          https://www.cnblogs.com/laozhang-is-phi/p/9916785.html

          最小化集成

          在所有的DDD項(xiàng)目中,通常存在多個(gè)限界上下文,這意味著我們需要找到合適的方法對這些上下文進(jìn)行集成。當(dāng)模型概念從上游上下文流入下游上下文中時(shí), 盡量使用值對象來表示這些概念。這樣的好處是可以達(dá)到最小化集成,即可以最小化下游模型中用于管理職責(zé)的屬性數(shù)目。使用不變的值對象使得我們做更少的職責(zé)假設(shè)。

          貧血模型&充血模型

          貧血模型:指使用的領(lǐng)域?qū)ο笾兄挥衧etter和getter方法(POJO),所有的業(yè)務(wù)邏輯都不包含在領(lǐng)域?qū)ο笾卸欠旁跇I(yè)務(wù)邏輯層。貧血模型中領(lǐng)域?qū)ο笾挥袑傩詻]有豐富的操作,使用時(shí)需要單獨(dú)的Dao層配合使用,風(fēng)格比較面向過程。

          充血模型:將大多數(shù)業(yè)務(wù)邏輯和持久化放在領(lǐng)域?qū)ο笾校瑯I(yè)務(wù)邏輯只是完成對業(yè)務(wù)邏輯的封裝、事務(wù)和權(quán)限等的處理。充血模型更加傾向于面向?qū)ο蟮脑O(shè)計(jì)風(fēng)格(可以參考:https://www.jianshu.com/p/fae3da337ebc)。

          模塊&領(lǐng)域服務(wù)&工廠

          模塊(Module)是DDD中明確提到的一種控制限界上下文的手段,在我們的工程中,一般盡量用一個(gè)模塊來表示一個(gè)領(lǐng)域的限界上下文。一般的工程中包的組織方式為{com.公司名.組織架構(gòu).業(yè)務(wù).上下文.*},這樣的組織結(jié)構(gòu)能夠明確的將一個(gè)上下文限定在包的內(nèi)部。
          領(lǐng)域服務(wù):領(lǐng)域中的服務(wù)表示一個(gè)無狀態(tài)的操作,它用于實(shí)現(xiàn)特定于某個(gè)領(lǐng)域的任務(wù)。
          工廠:在DDD中有可能存在復(fù)雜對象的創(chuàng)建,如果使用對象本身進(jìn)行創(chuàng)建有可能會破壞單一責(zé)任原則,所以需要工廠進(jìn)行對象創(chuàng)建。

          TML 或超文本標(biāo)記語言 允許 Web 用戶使用元素、標(biāo)簽和屬性創(chuàng)建和構(gòu)造部分、段落和鏈接。然而,值得注意的是,HTML 不能被視為一種編程語言,因?yàn)樗荒軇?chuàng)建動態(tài)功能。

          HTML有很多用例,即:

          1. 網(wǎng)頁開發(fā)。開發(fā)人員使用 HTML 代碼來設(shè)計(jì)瀏覽器如何顯示網(wǎng)頁元素,例如文本、超鏈接和媒體文件。
          2. 互聯(lián)網(wǎng)導(dǎo)航。由于 HTML 被大量用于嵌入超鏈接,因此用戶可以輕松地在相關(guān)頁面和網(wǎng)站之間導(dǎo)航和插入鏈接。
          3. 網(wǎng)絡(luò)文檔。HTML 使組織和格式化文檔成為可能,類似于 Microsoft Word。
          4. 還值得注意的是,HTML 現(xiàn)在被視為官方 Web 標(biāo)準(zhǔn)。萬維網(wǎng)聯(lián)盟 (W3C)維護(hù)和開發(fā) HTML 規(guī)范,同時(shí)提供定期更新。

          本文將介紹 HTML 的基礎(chǔ)知識,包括它的工作原理、優(yōu)缺點(diǎn)以及它與 CSS 和 JavaScript 的關(guān)系。

          什么是 HTML?

          HTML(代表超文本標(biāo)記語言)是構(gòu)成大多數(shù)網(wǎng)頁和在線應(yīng)用程序的計(jì)算機(jī)語言。超文本是用于引用其他文本片段的文本,而標(biāo)記語言是告訴 Web 服務(wù)器文檔的樣式和結(jié)構(gòu)的一系列標(biāo)記。

          HTML 是如何工作的

          在國內(nèi)的網(wǎng)站上找了一圈,這應(yīng)該是介紹歷史最細(xì)致的,長按保存手機(jī)里翻譯

          html文件

          平均每個(gè)網(wǎng)站包含幾個(gè)不同的信息 HTML 頁面。例如,主頁、關(guān)于頁面和聯(lián)系頁面都將具有單獨(dú)的 HTML 文件。

          HTML 文檔是以 .html 或 .htm 擴(kuò)展名結(jié)尾的文件。Web 瀏覽器讀取 HTML 文件并呈現(xiàn)其內(nèi)容,以便互聯(lián)網(wǎng)用戶可以查看它。

          html元素的三個(gè)部分

          所有 HTML 頁面都有一系列 HTML 元素,由一組標(biāo)簽和屬性組成。HTML 元素是網(wǎng)頁的構(gòu)建塊。標(biāo)簽告訴 Web 瀏覽器元素在哪里開始和結(jié)束,而屬性描述元素的特征。

          元素的三個(gè)主要部分是:

          • 開始標(biāo)簽 - 用于說明元素開始生效的位置。標(biāo)簽用左尖括號和右尖括號包裹。例如,使用開始標(biāo)簽 <p> 創(chuàng)建一個(gè)段落。
          • 內(nèi)容——這是其他用戶看到的輸出。
          • 結(jié)束標(biāo)簽 - 與開始標(biāo)簽相同,但在元素名稱前有一個(gè)正斜杠。例如,</p> 結(jié)束一個(gè)段落。

          這三個(gè)部分的組合將創(chuàng)建一個(gè) HTML 元素:

          <p>這是在HTML中添加段落的方法。</p>

          HTML 元素的另一個(gè)關(guān)鍵部分是它的屬性,它有兩個(gè)部分——名稱和屬性值。名稱標(biāo)識用戶想要添加的附加信息,并且屬性值給出進(jìn)一步的說明。

          例如,添加紫色和 font-family verdana 的樣式元素將如下所示:

          < p style="color:purple;font-family:verdana" >這是在HTML中添加段落的方法。< /p >

          另一個(gè)屬性,HTML 類,對于開發(fā)和編程來說是最重要的。class 屬性添加了可以作用于具有相同類值的不同元素的樣式信息。 例如,我們將對標(biāo)題 <h1> 和段落 <p> 使用相同的樣式。樣式包括背景顏色、文本顏色、邊框、邊距和填充,在 .important 類下。要在 <h1> 和 <p> 之間實(shí)現(xiàn)相同的樣式,請?jiān)诿總€(gè)開始標(biāo)記后添加 class=”important”:

          <html>
          <head>
          <style>
          .important {
            background-color: blue;
            color: white;
            border: 2px solid black;
            margin: 2px;
            padding: 2px;
          }
          </style>
          </head>
          <body>
          <h1 class="important">This is a heading</h1>
          <p class="important">This is a paragraph.</p>
          </body>
          </html>

          大多數(shù)元素都有一個(gè)開始標(biāo)簽和一個(gè)結(jié)束標(biāo)簽,但有些元素不需要結(jié)束標(biāo)簽即可工作,例如空元素。這些元素不使用結(jié)束標(biāo)簽,因?yàn)樗鼈儧]有內(nèi)容:

          < img src="/" alt="圖像" >

          這個(gè)圖像標(biāo)簽有兩個(gè)屬性——一個(gè)src屬性,圖像路徑,和一個(gè)alt屬性,描述性文本。但是,它沒有內(nèi)容,也沒有結(jié)束標(biāo)簽。

          最后,每個(gè) HTML 文檔都必須以 <!DOCTYPE> 聲明開頭,以告知 Web 瀏覽器文檔類型。使用 HTML5,doctype HTML public 聲明將是:

          < !DOCTYPE html >

          最常用的 HTML 標(biāo)簽和 HTML 元素

          目前,有 142 個(gè) HTML 標(biāo)簽可以用于創(chuàng)建各種元素。盡管現(xiàn)代瀏覽器不再支持其中一些標(biāo)簽,但學(xué)習(xí)所有可用的不同元素仍然是有益的。

          第二節(jié)將討論最常用的 HTML 標(biāo)簽和兩個(gè)主要元素——塊級元素和內(nèi)聯(lián)元素。

          塊級元素

          塊級元素占據(jù)頁面的整個(gè)寬度。它總是在文檔中開始一個(gè)新行。例如,標(biāo)題元素將位于與段落元素不同的行中。

          每個(gè) HTML 頁面都使用這三個(gè)標(biāo)簽:

          • <html>標(biāo)簽是定義整個(gè) HTML 文檔的根元素。
          • <head> 標(biāo)簽保存頁面標(biāo)題和字符集等元信息。
          • <body>標(biāo)簽包含了頁面上出現(xiàn)的所有內(nèi)容。
          <html>
            <head>
              <!-- META INFORMATION -->  
            </head>
            <body>
              <!-- PAGE CONTENT -->
            </body>
          </html>

          其他流行的塊級標(biāo)簽包括:

          • 標(biāo)題標(biāo)簽 - 這些范圍從 <h1> 到 <h6>,其中標(biāo)題 h1 的大小最大,當(dāng)它們向上移動到 h6 時(shí)變得越來越小。
          • 段落標(biāo)簽——全部使用 <p> 標(biāo)簽括起來。
          • 列表標(biāo)簽——有不同的變體。<ol> 標(biāo)簽用于有序列表,<ul> 用于無序列表。然后,使用 <li> 標(biāo)記將各個(gè)列表項(xiàng)括起來。

          內(nèi)聯(lián)元素

          內(nèi)聯(lián)元素格式化塊級元素的內(nèi)部內(nèi)容,例如添加鏈接和強(qiáng)調(diào)的字符串。內(nèi)聯(lián)元素最常用于在不破壞內(nèi)容流的情況下格式化文本。

          例如,一個(gè) <strong> 標(biāo)簽會以粗體呈現(xiàn)一個(gè)元素,而 <em> 標(biāo)簽會以斜體顯示它。超鏈接也是使用 <a> 標(biāo)記和 href 屬性來指示鏈接目標(biāo)的內(nèi)聯(lián)元素:

          <a href="https://www.icodingdeu.com/" >點(diǎn)我!</a> 

          HTML 演變——HTML 和 HTML5 有什么區(qū)別?

          HTML 的第一個(gè)版本由 18 個(gè)標(biāo)簽組成。從那時(shí)起,每個(gè)新版本都帶有添加到標(biāo)記中的新標(biāo)簽和屬性。迄今為止,該語言最重大的升級是 2014 年引入的 HTML5。

          HTML 和 HTML5的主要區(qū)別在于HTML5 支持新類型的表單控件。HTML5 還引入了幾個(gè)語義標(biāo)簽,可以清楚地描述內(nèi)容,例如 <article>、<header> 和 <footer>。

          HTML 的優(yōu)點(diǎn)和缺點(diǎn)

          就像任何其他計(jì)算機(jī)語言一樣,HTML 有其優(yōu)點(diǎn)和局限性。以下是 HTML 的優(yōu)缺點(diǎn):

          優(yōu)點(diǎn):

          • 初學(xué)者友好: HTML 具有干凈且一致的標(biāo)記,以及較淺的學(xué)習(xí)曲線。
          • 支持領(lǐng)域廣:該語言被廣泛使用,擁有大量資源和龐大的社區(qū)。
          • 無障礙:它是開源的并且完全免費(fèi)。HTML 在所有 Web 瀏覽器中本機(jī)運(yùn)行。
          • 靈活的:HTML很容易與PHPNode.js等后端語言集成。

          就像任何其他計(jì)算機(jī)語言一樣,HTML 有其優(yōu)點(diǎn)和局限性。以下是 HTML 的優(yōu)缺點(diǎn):

          缺點(diǎn):

          • 靜止的 該語言主要用于靜態(tài)網(wǎng)頁。對于動態(tài)功能,您可能需要使用 JavaScript 或 PHP 等后端語言。
          • 單獨(dú)的 HTML 頁面 用戶必須為 HTML 創(chuàng)建單獨(dú)的網(wǎng)頁,即使元素相同。
          • 瀏覽器兼容性 一些瀏覽器采用新特性的速度很慢。有時(shí)較舊的瀏覽器并不總是呈現(xiàn)較新的標(biāo)簽。

          HTML、CSS 和 Javascript 是如何相關(guān)的

          HTML 用于添加文本元素并創(chuàng)建內(nèi)容結(jié)構(gòu)。然而,僅僅建立一個(gè)專業(yè)的和完全響應(yīng)的網(wǎng)站是不夠的。因此,HTML 需要借助層級樣式表 (CSS)和JavaScript來創(chuàng)建絕大多數(shù)網(wǎng)站內(nèi)容。

          • CSS 負(fù)責(zé)樣式,例如背景、顏色、布局、間距和動畫。
          • JavaScript 添加了動態(tài)功能,例如滑塊、彈出窗口和照片庫。這三種語言是前端開發(fā)的基礎(chǔ)。

          結(jié)論

          HTML 是 Internet 上的主要標(biāo)記語言。每個(gè) HTML 頁面都有一系列創(chuàng)建網(wǎng)頁或應(yīng)用程序內(nèi)容結(jié)構(gòu)的元素。

          HTML 是一種對初學(xué)者友好的語言,有很多支持,主要用于靜態(tài)網(wǎng)站頁面。HTML 與用于樣式的 CSS 和用于功能的 JavaScript 一起使用效果最好。

          我們還向您展示了一些在線教學(xué)課程,它們將有助于提高您的 HTML 知識或提供對 HTML 的基本理解。

          如果您有任何其他喜歡的資源來學(xué)習(xí) HTML,請?jiān)谠u論部分告訴我們。

          <html>
          	<head> 
          		標(biāo)題 ---此處放置標(biāo)題、導(dǎo)航、登錄等內(nèi)容
          		<!此處放置標(biāo)題、導(dǎo)航、登錄等內(nèi)容--->
          	</head>
          	<body> 
          		<!此處放置頁面主要內(nèi)容--->
          		<! :空格
          		<: 小于號
          		>: 大于號
          		": 引號--->
          		<p>第一段 世界大勢,合久必分,分久必合。</p>
          		<hr/> <!表示單行橫線顯示--->
          		<br/> <!表示換行--->
          		<h1> hello world, html is easy</h1>
          		<h2> hello world, html is easy</h2>
          		<h3> hello world, html is easy</h3>
          		<h4> hello world, html is easy</h4>
          		<h5> hello world, html is easy</h5>
          		<h6> hello world, html is easy</h6>
          		<p>普通字體</p>
          		<b>粗體</b> <i>斜體</i> <del>本文字已被刪除,請忽略</del>
          		
          		<p> hello     world</p>  <!段落標(biāo)記--->
          		<a href="http://www.baidu.com" target="_self"> 點(diǎn)擊進(jìn)入百度</a>
          		<br/>
          		<img src="http://mysite.com/mypic.png" alt="網(wǎng)站作者照片">
          		<h3> 普通無邊框表格:</h3>
          		<table>
          		<tr>
          			<td>row 1 cell 1</td> <td>row 1 cell 2</td> <td>row 1 cell 3</td>
          		</tr>
          		<tr>
          			<td>row 2 cell 1</td> <td>row 2 cell 2</td> <td>row 2 cell 3</td>
          		</tr>
          		</table>
          		
          		<h3>帶表頭,有邊框,有跨列單元:</h3>
          		<table border="1">
          		<tr>
          			<th>head1</th> <th>head2</th> <th>head3</th>
          		</tr>
          		<tr>
          			<td>row 1 cell 1</td> <td>row 1 cell 2</td> <td>row 1 cell 3</td>
          		</tr>
          		<tr>
          			<td>row 2 cell 1</td> <td>row 2 cell 2</td> <td>row 2 cell 3</td>
          		</tr>
          		</table>
          		
          		<h3>三種列表的表達(dá)方式:</h3>
          		<table cellpadding="2" cellspacing="2">
          		<tr>
          			<td>
          				<ul><li>python</li> <li>c++</li> <li>java</li> <li>golang</li></ul>
          			</td>
          			<td>
          				<ol><li>python</li> <li>c++</li> <li>java</li> <li>golang</li></ol>
          			</td>
          		</tr>
          		</table>
          		<dl>
          			<dt>CPU</dt><dd>處理器</dd>
          			<dt>MEM</dt><dd>內(nèi)存</dd>
          		</dl>
          		
          		<body bgcolor="#FF0000">
          		<body bgcolor="RGB(255,0,0)">
          		<body bgcolor="RED">
          		
          		<p>視頻</p>
          		<object
          			classid="clsid:d27sfsfstqwetsasasdfsdfs"
          			codebase="http://fpdownload.macromedia.com/pub/shckwave/cabs/flash/swflash.cab">
          			<embed src="flashfile.swf" width="300" height="200"></embed>
          		</object>
          		<br/>
          		
          		<p>音頻</p>
          		<audio controls="crontrols">
          			<source src="sample_song.mp3" type="audio/mp3" />
          		</audio>
          		
          		<br/>
          		<p>視頻</p>
          		<video controls="controls"/>
          			<source src="sample_video.mp4" type="video/mp4">
          		</video>
          		
          	    <p>html表單---文本輸入</p>
          		<table>
          			<tr>
          				<td>用戶名:</td>
          				<td><input type="text" name="name"></td>
          				<td>密碼:</td>
          				<td><input type="password" name="pass"></td>
          			</tr>
          			<tr>
          			<tdcolspan="4"> <textarea name="comment" rows="5" cols="60"> </textarea></td>
          			</tr>
          		</table>
          		
          		<table>
          			<tr>
          				<td>性別:</td>
          				<td>用戶名:</td>
          				<td>男性<input type="radio" checked='checked' name="sex" value="male" /></td>
          				<td>女性<input type="radio" checked='checked' value="female" /></td>
          			</tr>
          			<tr>
          			<tdcolspan="4"> <textarea name="comment" rows="5" cols="60"> </textarea></td>
          			</tr>
          		</table>
          		
          	</body>
          
          </html>
          


          主站蜘蛛池模板: 午夜影视日本亚洲欧洲精品一区| 麻豆AV天堂一区二区香蕉| 国产一区中文字幕在线观看| 人成精品视频三区二区一区| 一区二区三区视频在线观看| 国产伦精品一区二区三区视频金莲| 日韩精品一区二区三区毛片| a级午夜毛片免费一区二区| 亚洲变态另类一区二区三区| 久久国产一区二区三区| 国产在线观看一区二区三区精品 | 亚洲.国产.欧美一区二区三区| 中文字幕精品无码一区二区| 在线观看国产一区亚洲bd| 精品无码成人片一区二区98| 久久一区二区三区精品| 中文字幕日韩人妻不卡一区| 夜夜精品无码一区二区三区| 在线日韩麻豆一区| 国产伦精品一区二区三区免.费| 97精品国产一区二区三区| 老熟妇仑乱一区二区视頻| 久久一区二区精品综合| 精品一区二区三区在线视频| 在线观看免费视频一区| 国产一区二区三区高清在线观看| 精品乱码一区内射人妻无码| 精品久久久中文字幕一区| eeuss鲁片一区二区三区| 在线精品一区二区三区电影| 蜜臀AV无码一区二区三区| 在线|一区二区三区| 日韩高清一区二区| 无码毛片一区二区三区视频免费播放| 国产视频福利一区| 国产精品主播一区二区| 中文字幕乱码一区二区免费| 久久精品免费一区二区三区| 精品一区二区三区在线成人| 在线精品亚洲一区二区| 在线观看国产一区二区三区|