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