UML有沒有用
本文是參與這個討論:UML 還有用嗎?。我反對該回答,但回覆中不利於寫很長很完整的邏輯,所以我把完整邏輯建在這個地方。
首先,該答主最初是持“UML是一種語言,這種語言表達能力沒有其他語言強,所以它落伍了,不好用了。”這個觀點的。但在我質疑後,他補充了很多內容,以證明:“程式語言也可以表述UML能表述的內容。”
我對後一個討論沒有興趣,因為如果你提出一種程式語言,也表述UML表述的內容,那恰恰證明了“UML還有用”。如果該答主要表達:“這不是我的意思”,那我這個討論的邏輯鏈不針對他,我的討論僅侷限於“為什麼UML是一種很有用的建模語言,而且一般程式語言不能取代它”。
UML到底要表達什麼?我們用一個例子來討論。
比如,我們要提煉Linux driver,bus,device的關係,其實這個很簡單,我簡單畫出來就是這樣的:

這是這三個東西關係的核心,driver和device都註冊給某個bus,如果他們可以匹配,則兩者建立關聯。
我不是為了爭吵,但該答主確實給了一個好例子,它把這個模型抽象成這樣的程式碼了:

其實這個已經算不上是程式碼了,幾乎是上面那個圖的翻版表達了。但它仍帶入了很多時候作為架構師不想帶入的資訊。我用前面的UML建模,我想強調的是driver和bus有一個1對多的關聯,這個關聯到底是通過一個數組表示呢?還是通過一個連結串列表示呢?我並不在意。我把這個目標留給了下一層開發者,他可以做出他的選擇,我在意的是概念的關聯:每個driver,都可以和一種bus關聯,driver和device之間,是1-1關聯,僅此而已,我沒有其他意思。所以你在程式碼中定義bus這個class中有一個driver陣列,這不是我的意思,你後面的match函式,也不是我的意思。那不是我的架構限制,只是一種實現。這個實現是可以換的。
你還可以爭辯說:“其實我定義一個數據就是表示一種一對多關係,不一定是個陣列”,啊,那就對了,你現在開始嘗試做UML已經做了的事情了,然後你說UML有沒有用呢?
我無意和該答主爭意氣的長短,只是想通過這個問題說明:架構是怎麼“以少為多”的。我們提煉一個獨立的邏輯出來其實很困難,經常挖出蘿蔔帶出泥。這是很多架構師向工程師表達概念的時候最困難的地方,我們框架程式碼都寫出來的,為了讓它能跑,我們必然會加上帶來邊界效應的選擇,這樣工程師又誤解了。UML,DFD ,STP這樣的方法,給了我們一個最核心的表達機會,我們要加其他約束,可以以這個為基礎一點點加,這樣我們才能保證我們的意思可以有效傳達。而那些希望把模型直接變成程式碼的努力,基本上是緣木求魚的。