《分析模式》漫談07-怎樣把一張圖從不嚴謹改到嚴謹

DDD領域驅動設計批評文集

做強化自測題獲得“軟件方法建模師”稱號

《軟件方法》各章合集


下圖是《分析模式》原書第2章的圖2.10,里面有一些錯誤和考慮不周的地方:

圖片

2004中譯本和2020中譯本的翻譯如下:?

圖片

圖片

基本上都是照搬,沒有改過來。

Fowler網站上提供了該圖的UML版本:

圖片

但從圖上看,除了多重性和角色顛倒的錯誤得到修正——而且也沒修正到位,角色應該靠近Party Type而不是放中間。

其他錯誤沒有改過來,只是把這個圖的表示法改成了UML。

我們下面先來看一下,圖2.10有哪些問題,以及應該怎么改。

我把有問題的地方編了號,如下:

圖片

(1)

約束應該加在Accountability上,而不是加在Accountability Type上。

一般來說,**Type(**類型)這樣的類,它的對象個數很少,而且值很穩定。很少需要在上面加不變式之類的約束。

就像一個類是“人”,一個類是“性別”,約束加在哪里?一般是加在“人”上面。

人的屬性值會變,年齡增加,個子變高,體重變重,結婚有配偶……

他的屬性值之間可能會存在約束。例如,如果年齡不到20歲,是不能有配偶的。或者說,如果說你年齡是20歲以下又有配偶,那就違反了約束。

如果在“性別”上搞一個不變式,“性別”除了“名稱”,還有什么屬性?讓“性別”知道“人”然后把“性別”所關聯的“人”(一個很大的集合)拉進來?那為什么不干脆放在“人”上面呢?

圖2.10就是如此。約束加在Accountability Type上,但第1行就定義了一個x,說是self.Accountability,這不又繞回去了嘛,干嗎不把約束加在Accountability上面呢?

(2)

假設我們咬緊牙關,堅持己見,一定要把約束加在Accountability Type上,但self.Accountability的Accountability在哪里呢?圖上沒有。

(3)

即使圖上有Accountability,還有另一個問題:Accountability Type的self.Accountability是一個集合,不能直接.commissioner,得加類似->forAll(a|a.commissioner……

2020中譯本把原文以復數形式表示的詞都加了一個后綴“集合”,這個做法好不好另外討論,不過如果這樣做的話,下面這個地方也要加一個“集合”:

圖片

(4)

多重性和角色顛倒的問題:type、all types放在Party一側,supertype和subtypes的多重性顛倒。

(5)

多了一個冗余關聯all types,意思是Party所屬的Party Type以及其上的所有supertype組成的Party Type集合。

在圖上是用自然語言表達的,現在可以用OCL的閉包(Closure)運算來表達并刪除冗余關聯。

求閉包是關系代數常見試題,下圖是2021年的一道軟考題:

圖片

OCL有closure運算:

圖片

考慮以上的問題之后,我們修正的類圖如下:

圖片

修改的要點:

(1)加上了“當責(Accountability)”。

(2)把約束放在“當責”上。

(3)多重性和角色位置的調整。

(4)刪除冗余all types關聯

(5)約束的意思是:

對“當責”的“委托方”(當事者)的“類型”(當事者類型)做求超類型的閉包運算,就得到了原書圖上的冗余all types“當事者類型”集合,然后,該集合中有元素也在“當責”的“類型”(當責類型)的“委托方”(當事者類型)集合中,也就是說,這兩個集合交集不為空。

對“責任方”也如此操作,就得到了圖中的約束。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/36228.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/36228.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/36228.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【02-02】SpringMVC基于注解的應用

一、請求處理 1、常用注解 RequestMapping 作用:用來匹配客戶端發送的請求(用來處理URL映射,將請求映射到處理方法中),可以在類或者方法上使用。 用在類上,可以將請求模塊化,避免請求方法中的…

【Java Web】三大域對象

目錄 一、域對象概述 二、三大域對象 三、域對象使用相關API 一、域對象概述 一些可用于存儲數據和傳遞數據的對象被稱為域對象,根據傳遞數據范圍的不同,我們稱之為不同的域,不同的域對象代表不同的域,共享數據的范圍也不同。 二、…

【小紅書標題打造】規則+底層邏輯解析|輔助工具|爆款必備

前言 大家好,我是一名自媒體工具人,今天不是教大家去自己寫標題(現在這個時代自己寫真沒必要)而是教大家了解爆款標題的相關知識以及辨別。后面會附贈 安裝此文規則生成標題的輸出工具。在這個工具發展龐大的時代,如果…

【知識圖譜系列】一步步指導:安裝與配置JDK和Neo4j的完美搭配

本文將提供詳細的步驟,介紹如何下載、安裝和配置Java開發工具包(JDK)以及流行的圖形數據庫Neo4j。將從選擇合適的JDK版本開始,然后是下載和配置環境變量,接著以同樣的方式處理Neo4j。最后,會通過一些檢查步…

Windows應急響應靶機 - Web3

一、靶機介紹 應急響應靶機訓練-Web3 前景需要:小苕在省護值守中,在靈機一動情況下把設備停掉了,甲方問:為什么要停設備?小苕說:我第六感告訴我,這機器可能被黑了。 這是他的服務器&#xff…

【CSS in Depth 2 精譯】1.6 本章小結

1.6 本章小結 瀏覽器遵循層疊規則來確定哪些樣式在哪些元素上生效;選擇器優先級由選擇器中的 id 數、class 類的個數以及標簽名的個數來共同確定。優先級更高的聲明將覆蓋較低聲明;當某些屬性沒有層疊值時,它們會從父元素繼承一個樣式值。這…

YouCompleteMe插件安裝方法簡述

一、前言 YouCompleteMe是VIM中進行C/C 開發的重要工具,可以極大提升linux下C/C開發效率。 YCM需要高版本的gcc (8.0以上版本,支持C17) 和 vim(8.0以上,支持python3.6以上) 二、編譯gcc_8.3 1. 獲取源碼 wget https:…

Shopee API接口——獲取商家店鋪商品列表

一、引言 在跨境電商領域,Shopee作為東南亞地區領先的電商平臺,為眾多商家提供了廣闊的市場和豐富的銷售機會。本文將詳細介紹如何通過Shopee API獲取商家店鋪商品列表,并探討其應用場景。 二、核心功能介紹 Shopee API獲取商家店鋪商品列…

HarmonyOS NEXT Developer Beta1中的Kit

從HarmonyOS NEXT Developer Preview1(API 11)版本開始,HarmonyOS SDK以Kit維度提供豐富、完備的開放能力,涵蓋應用框架、系統、媒體、圖形、應用服務、AI六大領域,例如: 應用框架相關Kit開放能力&#xff…

轉行大數據開發:知識、能力及學習路線詳解

引言 隨著數據量的爆炸性增長,大數據開發已經成為IT行業中的熱門職業。對于希望轉行進入大數據開發領域的專業人士來說,了解需要掌握的知識和技能,并制定清晰的學習路線至關重要。本文將詳細解析轉行大數據開發所需的知識體系、能力要求及學…

Studying-代碼隨想錄訓練營day21| 669.修建二叉搜索樹、108.將有序數組轉換為二叉搜索樹、538.把二叉搜索樹轉換為累加樹、二叉樹總結

第21天,二叉樹最后一篇,沖💪 目錄 669.修建二叉搜索樹 108.將有序數組轉換為二叉搜索樹 538.把二叉搜索樹轉換為累加樹 二叉樹總結 669.修建二叉搜索樹 文檔講解:代碼隨想錄修建二叉搜索樹 視頻講解:手撕修建二叉…

【PySide6】Repeater 子控件分析

文章目錄 前言分析 前言 修改 Column 控件下使用 Repeater 生成的子控件,但是沒有 id 無法操作,使用 children 層層遞歸分析 分析 QML 代碼 // https://doc.qt.io/qt-6/qml-qtquick-column.htmlColumn {id: columnspacing: 2// 定義模型property var …

代碼隨想錄算法訓練營刷題復習10:二叉樹、二叉搜索樹復習2

二叉樹、二叉搜索樹 力扣題復習 110. 平衡二叉樹257. 二叉樹的所有路徑404. 左葉子之和513. 找樹左下角的值112.路徑之和113.路經總和ii450. 刪除二叉搜索樹中的節點701. 二叉搜索樹中的插入操作 110. 平衡二叉樹 左右子樹高度差要小于1 ->遞歸調用(need新的函…

API-元素尺寸與位置

學習目標: 掌握元素尺寸與位置 學習內容: 元素尺寸與位置仿京東固定導航欄案例實現bilibili點擊小滑塊移動效果 元素尺寸與位置: 使用場景: 前面案例滾動多少距離,都是我們自己算的,最好是頁面滾動到某個…

[leetcode]圓圈中最后剩下的數字/ 破冰游戲

. - 力扣(LeetCode) class Solution {int f(int num, int target) {if (num 1) {return 0;}int x f(num - 1, target);return (target x) % num;} public:int iceBreakingGame(int num, int target) {return f(num, target);} };

程序猿大戰Python——Python與MySQL交互一

pymysql模塊的安裝 目標:了解如何安裝pymysql模塊? 當要使用Python和MySQL數據庫進行交互,需要借助一個第三方模塊:pymysql。 在使用pymysql模塊前,先進行安裝: pip install pymysql 有時使用pip instal…

從零開始做題:有手就行

1 題目 2 解題 ARPHCR工具破解 得到flag DASCTF{2b3767763885a019b65bbfe9d1136c3b}

數據結構與算法筆記:高級篇 - 向量空間:如何實現一個簡單的音樂推薦系統?

概述 很多人喜都喜愛聽歌,以前我們用 MP3 聽歌,現在直接通過音樂 App 在線就能聽歌。而且,各種音樂 App 的功能越來越強大,不僅可以自己選歌聽,還可以根據你聽歌的喜好,給你推薦你可能會喜好的音樂&#x…

【WEB前端2024】3D智體編程:喬布斯3D紀念館-第49課-機器人自動跳舞

【WEB前端2024】3D智體編程:喬布斯3D紀念館-第49課-機器人自動跳舞 使用dtns.network德塔世界(開源的智體世界引擎),策劃和設計《喬布斯超大型的開源3D紀念館》的系列教程。dtns.network是一款主要由JavaScript編寫的智體世界引擎…

DevExpress Office File API教程 - 如何使用AI服務增強Word文檔可訪問性和語言支持?

DevExpress Office File API是一個專為C#, VB.NET 和 ASP.NET等開發人員提供的非可視化.NET庫。有了這個庫,不用安裝Microsoft Office,就可以完全自動處理Excel、Word等文檔。開發人員使用一個非常易于操作的API就可以生成XLS, XLSx, DOC, DOCx, RTF, CS…