類圖是怎樣煉成的?
類圖可以用來展示類的結(jié)構(gòu)和與其他類的關(guān)系,是一個(gè)重要的結(jié)構(gòu)建模的工具。
01
學(xué)過UML的人對(duì)類圖想必都不陌生,作為結(jié)構(gòu)建模的核心工具,類圖充當(dāng)著溝通現(xiàn)實(shí)世界與概念世界的橋梁。沒有學(xué)過UML的同學(xué)也不必?fù)?dān)心,在開始正文之前,我會(huì)先簡要介紹一下UML和類圖的基本概念。
什么是UML?
通俗地講,UML就是統(tǒng)一建模語言(Unified Modeling Language)。如果說咱們平時(shí)用的漢字是幫助日常溝通的,那么UML就是幫助我們將現(xiàn)實(shí)抽象化,對(duì)其中的結(jié)構(gòu)和行為進(jìn)行建模。
舉個(gè)簡單的例子:你是一個(gè)人,現(xiàn)在,你對(duì)另一個(gè)人說話。在這個(gè)過程中,你使用了一種名為交流的功能。而交流,是需要你的喉嚨、鼻腔、舌頭、口腔和嘴唇共同完成的,我們可以把它們統(tǒng)稱為發(fā)聲器官,而喉嚨這些小的部件就是發(fā)聲器官的結(jié)構(gòu)。
功能是由結(jié)構(gòu)驅(qū)動(dòng)的,而功能在UML中屬于行為建模,由用例圖承擔(dān)。產(chǎn)品經(jīng)理所熟知的用例模板其實(shí)是用例圖的補(bǔ)充說明,當(dāng)然這一塊不在本篇文章的討論范圍之列。我們要討論的,是承擔(dān)結(jié)構(gòu)建模的工具——類圖。
上圖是一張典型的類圖,由三部分組成(由上自下):類名、屬性、方法。
如果你是程序員出身,大概對(duì)這些很熟悉了——string是字符串,integer是整數(shù),void為空,這些都代表屬性的數(shù)據(jù)類型。至于“+”和“-”,則代表著公有和私有的區(qū)別。
如果你不是程序員,也不用擔(dān)心,暫且拋開數(shù)據(jù)類型和底下的方法,只保留類名和屬性就好。
你可以忽略前面的加號(hào),也可以把它當(dāng)成一種慣例接受,這都不影響你對(duì)類圖本身的使用。
其實(shí)類圖本身很簡單,它本身只是把類具象化的一種工具。關(guān)鍵是要明白它為什么存在?有什么意義?要怎么用?
要解決這些問題,首先就得明白什么是類。
通俗地講,類就是現(xiàn)實(shí)世界的事物在概念世界的映射。
在理解這句話之前,我們需要明白一個(gè)隱秘的常識(shí),即所有思維層面的活動(dòng)都依賴于概念進(jìn)行,我們不是在對(duì)實(shí)物思考著;而只是通過把它抽象化成概念,用概念在抽象世界中運(yùn)行著。
當(dāng)我們思考人的時(shí)候,我們是把人作為一種概念,存儲(chǔ)在自己的腦海里。我說你是一個(gè)人,但人本身在現(xiàn)實(shí)世界是沒有對(duì)應(yīng)物的,你是人,他也是人,但你不是他,我無法用他來指涉你。
因?yàn)閷?shí)體本身的制約,我們不得不把你和他抽象為一種共同的存在,用這種存在來指涉擁有共同特征的存在。這種存在就是類,而類本身就是一種概念。
拿人來說,人就是你、我、他在概念世界中的映射。換句話說,人就是類。
要知道,我們本來是沒有辦法思考實(shí)物的,因?yàn)閷?shí)物就在那兒,我們不可能把它變成我們腦海中的物質(zhì)材料,像廚子一樣做出一道思維大餐。
可是通過類,我們突然可以分析真實(shí)世界了,只要我們將它們抽象化,映射在概念世界就好。
如果我們了解到這一點(diǎn),就該知道,我們無論要解決何種問題,首先要做的事,就是把問題抽象化、概念化。
當(dāng)然,當(dāng)我們將實(shí)物抽象化以后,就該用一種可視化的方式將其呈現(xiàn)出來,一來為了與共事者交流,二來我們也可以更輕松地進(jìn)行邏輯推導(dǎo)——類圖就是一種很好的可視化方式。
如上面所講,簡化版類圖包含兩點(diǎn):類名和屬性。
之所以有類名,是為了方便人們稱呼它,使這個(gè)類從虛無中顯現(xiàn)出來。我們無法稱呼一個(gè)沒有名字的存在,更無法去思考它。
畢竟,最虛無縹緲的東西,老子都要強(qiáng)曰道之后,我們才能去探究它。
而光有了名字還不夠,不同的兩件事物,完全可以有相同的名字。譬如你可以叫張三,我也可以叫張三,但我們倆其實(shí)是完全獨(dú)立的存在。
概念也是如此,單單把“人”提取出來,而不給它任何定義,那么我們?cè)趺茨苤馈叭恕焙汀皠?dòng)物”這兩個(gè)類的區(qū)別是什么?而屬性,就是給類下定義的方式。
人這個(gè)類,有名字,有年齡,還有性別,職業(yè),婚姻關(guān)系,住址……
而動(dòng)物,則有物種,有年齡,有性別,有棲息地……
通過這些屬性,人與動(dòng)物得以區(qū)別。
可是,如果你仔細(xì)品味一下的話,會(huì)發(fā)現(xiàn)人和動(dòng)物的屬性有重合的地方。諸如年齡、性別什么的,人和動(dòng)物都有啊。
為什么呢?
這就涉及到類與類之間的關(guān)系:繼承。
類與類之間是有簡單和復(fù)雜的區(qū)分的,而復(fù)雜的類往往繼承自簡單的類。譬如你是你父親的兒子,你比他懂得更多,但你也仍然繼承了他的一些特點(diǎn)。
而人和動(dòng)物,都繼承了來自簡單類——生物的基本屬性。
人與動(dòng)物,在繼承自生物這塊的屬性上,大同小異,而真正使他們做出區(qū)分的,是獨(dú)屬于其本身的那部分屬性。譬如人的婚姻關(guān)系,動(dòng)物的棲息地。婚姻關(guān)系是社會(huì)形態(tài)下出現(xiàn)的新型關(guān)系,動(dòng)物是無法演化出來的。同樣,動(dòng)物的棲息地屬于族群概念,與人的住所(涉及所有權(quán)問題)又有天壤之別。
試想一下,倘若棲息地轉(zhuǎn)化成住所,那么動(dòng)物的概念就不再適應(yīng),而必須演變成一種新的類:家養(yǎng)寵物。正是通過屬性的不同,類本身的區(qū)別才能進(jìn)行精準(zhǔn)的回答。
有的讀者看到這里可能會(huì)疑惑,我知道了類,對(duì)我有什么用呢?
這個(gè)問題的回答本來在開頭就應(yīng)該闡明,但考慮到有的同學(xué)并不了解類是什么,因此放到第一部分的結(jié)尾來解答。
理由有三:
- 類是一種抽象建模的思維方式,它充當(dāng)現(xiàn)實(shí)世界和概念世界的接口;使用這種方式,能讓我們?cè)谑澜缬^的層面上革新我們的方法論。
- 類屬性對(duì)于構(gòu)建產(chǎn)品的信息結(jié)構(gòu)有重要作用;一個(gè)產(chǎn)品呈現(xiàn)何種信息,取決于產(chǎn)品制作者對(duì)于類屬性的識(shí)別和定義。
- 類的識(shí)別決定著后端的數(shù)據(jù)用幾張表儲(chǔ)存,類屬性則決定著表上按照何種方式進(jìn)行索引,或能否可以索引到,數(shù)據(jù)庫的建設(shè)關(guān)系產(chǎn)品穩(wěn)定性以及后續(xù)的數(shù)據(jù)分析;如果產(chǎn)品制作者在一開始對(duì)類的定義模糊,那么后端在不清楚業(yè)務(wù)邏輯的情況下所采取的存儲(chǔ)方式往往會(huì)不如人意。
如果看到這里你覺得有必要進(jìn)行類的學(xué)習(xí),那么可以繼續(xù)看下去,第二部分我會(huì)著重分析一下如何進(jìn)行類的定義。
02
這一部分主要談?lì)惖亩x。
其實(shí)在定義之前還有一個(gè)步驟,即類的識(shí)別。但在多數(shù)的場景下,識(shí)別是一件自然而然的事情。譬如你看到一個(gè)發(fā)光以照明的存在,會(huì)把它識(shí)別為燈;看到四輪驅(qū)動(dòng)的存在,會(huì)把它識(shí)別成車。
這些都已經(jīng)是我們的經(jīng)驗(yàn)所內(nèi)化的近乎反射的能力,唯一需要注意的,或許只是類的粗細(xì)層級(jí)。譬如你識(shí)別出照明物是燈,但燈也可能是白熾燈、LED燈等等。后者繼承自前者,但又具有自身的特性,這時(shí)候就需要你結(jié)合自身的業(yè)務(wù)場景進(jìn)行合理區(qū)分。
如果燈是商品,那么識(shí)別到白熾燈這一層級(jí)是有必要的。如果燈只是作為場景中的輔助道具,譬如“你回到家,打開燈”;在這個(gè)場景中,燈只是為了照亮屋子的輔助道具,就沒有必要區(qū)分是白熾燈還是LED燈。
如果你把后者識(shí)別到白熾燈的級(jí)別,那么后端就不得不存儲(chǔ)多余的一列以區(qū)分它與其他燈的區(qū)別,從而造成了信息冗余和資源浪費(fèi)。
因此在識(shí)別類的過程中,要記住兩點(diǎn):
- 確定類之間的繼承關(guān)系;
- 圍繞業(yè)務(wù)場景確定使用哪個(gè)類,兩者為前后順序。
識(shí)別完類之后,就涉及類的定義了。
類的定義通過定義類屬性表現(xiàn)出來,運(yùn)用最典型的例子就是游戲中的人物屬性。
(圖一)
(圖二)
- 圖一是射擊類游戲的人物屬性面板,該人物屬性包括角色類型、生命值、防御力和戰(zhàn)斗力;
- 圖二是RPG類游戲的人物屬性面板,該人物屬性包括角色名稱、等級(jí)、生命、內(nèi)力、基礎(chǔ)屬性、詳細(xì)屬性和戰(zhàn)斗力。
同樣是對(duì)于人物的類定義,可是兩者的屬性定義卻截然不同:在射擊類游戲中作為原子單位的防御力;在RPG中就要分為物防和法防,并且后者還多出了內(nèi)力、物攻、法攻等其他屬性。
如果你已經(jīng)弄懂了類的繼承,可能會(huì)說,它們各自在簡單類——人物的基礎(chǔ)上發(fā)展出了新的類,圖一是槍械師類,圖二是弓箭手類。
當(dāng)然有道理,可是值得思考的是:為什么圖一沒有發(fā)展出槍械親和力、開槍速度這樣的屬性呢?為什么僅僅有一個(gè)戰(zhàn)斗力屬性呢?
一個(gè)重要的原因在于:屬性本身也是有粗細(xì)的。
粗屬性可以分解為細(xì)屬性,細(xì)屬性也可以分解為粗屬性。屬性的粗細(xì)與否,跟產(chǎn)品的核心路徑有關(guān)。譬如上面的射擊類游戲,玩法本身不依靠屬性加成、削弱,所以識(shí)別到戰(zhàn)斗力屬性即可;而RPG游戲,則更依靠屬性間的配比,所以識(shí)別更細(xì)致一點(diǎn)。
但這并不意味著在進(jìn)行屬性識(shí)別時(shí),一開始就要從粗的來。MECE原則告訴我們,要從不同角度窮盡可能性。如果一上面就識(shí)別粗的層面,很有可能漏掉很多細(xì)節(jié)。
因此,最好的方式,是一開始將所有細(xì)的屬性全部識(shí)別出來,再結(jié)合產(chǎn)品邏輯進(jìn)行整合。這樣做雖然更累,但也會(huì)使你對(duì)類本身進(jìn)行更深入的思考。
上面我們談到MECE法則,該法則的第一要點(diǎn)就是從不同角度。意思是,我們?cè)谶M(jìn)行頭腦風(fēng)暴時(shí),依靠窮舉法,最后總結(jié)歸納;但一味地窮舉并不能很好包含所有可能性。
有時(shí)候往往只是一個(gè)方向上的多重反復(fù)。因此在進(jìn)行窮舉之前,必須要先想好一共有哪些角度可以進(jìn)行思考。
類也是一樣,我們必須思考定義類的屬性,本身都有哪些類別,其依靠何種方式而對(duì)定義類有所貢獻(xiàn)。
總體而言,類和屬性都可以有兩種分法:
- 類:實(shí)體類、抽象類;
- 屬性:指涉自我、與其他元素交互。
所謂實(shí)體類和抽象類,差別在于它們?cè)诂F(xiàn)實(shí)世界有無對(duì)照物。
譬如水,水本身在概念世界中是一個(gè)抽象化的概念,但它在現(xiàn)實(shí)中有具體的實(shí)指——一種可以喝的、看得見、摸得著的存在。因此,水是實(shí)體類。
而如知識(shí),本身是看不見摸不著的,它沒有實(shí)物的依存;只能通過概念世界產(chǎn)生,并且只能在概念世界運(yùn)行。因此知識(shí)是抽象類。
區(qū)分實(shí)體類和抽象類的重要意義在于:確定屬性窮舉的基本維度。
實(shí)體類的基本維度是時(shí)間和空間。
水,從時(shí)間角度思考,可以確定其流速;從空間角度思考,可以確定其體積。
抽象類的基本維度是聚合。
知識(shí)本身是虛無縹緲的,但它有類型,可以分為語文知識(shí)、數(shù)學(xué)知識(shí)、物理知識(shí);抽象類不是識(shí)別出來的,而是聚合出來的。
它是你遇到實(shí)類之后,根據(jù)業(yè)務(wù)需要,抽象出來的統(tǒng)籌概念。就像知識(shí)一樣,如果你的產(chǎn)品中有一個(gè)模塊,需要放語文、數(shù)學(xué)等各科內(nèi)容,那么這時(shí)候你就需要抽象化出知識(shí)的概念作為內(nèi)容的統(tǒng)稱。
不妨這樣理解,抽象類是一群實(shí)體類的最大公約數(shù),它建立在先識(shí)別并定義好實(shí)體類之上。
接下來看屬性。
所謂指涉自我,其實(shí)就是事物本身蘊(yùn)含的,不需要借助其他元素呈現(xiàn)出來的狀態(tài)。
桌子的屬性,可以是面積、新舊程度、占地空間、材質(zhì),這些都是它本身自帶的。
但是諸如品牌,是桌子與生產(chǎn)商交互的結(jié)果;諸如承重力,是它與放置其上的事物交互的結(jié)果。沒有其他元素的參與,桌子本身無法實(shí)現(xiàn)屬性的生成。因此,像品牌、承重力這些,則屬于與其他元素交互。
實(shí)際上,現(xiàn)實(shí)中的絕大部分事物,指涉自身的屬性很少,絕大部分的屬性都是在和其他元素交互中產(chǎn)生的。
拿人來說,身高、體重、姓名、年齡是指涉自身的屬性,但社會(huì)關(guān)系、工作狀態(tài)這些,卻都要借助其他元素生成。
交互屬性是屬性中最難把握的一塊,因?yàn)樗鼪]有固定的痕跡,所生成的屬性取決于交互的對(duì)象。就像氧氣一樣,遇到氫氣,可以變成水;在吸熱反應(yīng)下,可以變成臭氧。
因此,涉及交互屬性時(shí),著重點(diǎn)是要根據(jù)業(yè)務(wù)需求,找到所交互的對(duì)象。
還是拿商品舉例子,如果桌子是一件商品,那么它的交互對(duì)象只需要限定在買賣雙方:從賣家的角度考慮,需要為桌子指定價(jià)格,指明庫存量;從買家的角度講,需要知道桌子的品牌、大小、承重力。
當(dāng)然,買家角度的屬性還包括了指涉自身的屬性,但從更廣延的角度考慮,我們是可以用關(guān)系鏈的視角去看待以上的問題。
另外,也許你已看出了,指涉自身的屬性一般都屬于實(shí)體類的視角:時(shí)間和空間。而交互屬性則有點(diǎn)抽象類的意味。
實(shí)際上,這兩類四種視角,本身既有重疊,又有不同。關(guān)鍵是要結(jié)合業(yè)務(wù),確定類別,再依據(jù)自身與交互確定方向。
類圖本身當(dāng)然還有討論的空間,以上也只是一家之言。限于筆力和經(jīng)驗(yàn),本篇文章到此就告一段落了。
希望有經(jīng)驗(yàn)的伙伴能分享自己的經(jīng)驗(yàn),對(duì)文章中的謬誤之處也請(qǐng)不吝批評(píng)。
感謝閱讀。
#專欄作家#
善寶橘,微信公眾號(hào):善寶橘,人人都是產(chǎn)品經(jīng)理專欄作家。一個(gè)崇尚終身學(xué)習(xí)的互聯(lián)網(wǎng)斜杠青年,擅長學(xué)界理論與業(yè)界實(shí)踐結(jié)合,專注新媒體、游戲領(lǐng)域的運(yùn)營策劃。當(dāng)然,偶爾會(huì)寫點(diǎn)互聯(lián)網(wǎng)時(shí)事評(píng)論。
本文原創(chuàng)發(fā)布于人人都是產(chǎn)品經(jīng)理。未經(jīng)許可,禁止轉(zhuǎn)載。
題圖來自 Unsplash,基于CC0協(xié)議。
翻了翻作者的文章 ,只有這一篇寫UML的,而且寫的很好,好在獨(dú)到。也易理解,而不是bd上搜出來千篇一律的。
加油啊,再寫個(gè)用例圖的。
中間關(guān)于實(shí)體和概念之間的關(guān)系寫得很生動(dòng)。和一篇很精彩的叫做《意識(shí)上傳中》的科幻小說中應(yīng)用到的觀點(diǎn)非常一致。
所以,最后桌子的品牌這個(gè)屬性,是放在桌子這個(gè)類里面,還是另起一個(gè)品牌類?
奇怪,這么好的文章為什么沒人評(píng)論啊。
寫的很好,就是感覺作者偷懶了,沒寫完,缺少后面的 類與類之間關(guān)系的詳盡說明 和 具體如何畫類圖。。。
看到這篇文章想到了從前做開發(fā)的影子 QAQ