聊聊關於 UML 輔導個案的二三事

** 本文同步發表於 FB社群-軟體設計鮮思維 **

UML System Sequence Diagram

前兩個星期有位上過前一期「軟體架構師」課程的學員,他在某大金融單位擔任技術職PM,特地利用週末時間到我家附近,請教我關於他利用 UML 所繪製的設計圖問題。相當認真,所以我很願意陪他一同討論軟體相關議題,順道一同在肯德基吃午餐。總共花了約兩個來小時吧,該學員還要去參加他的讀書會,真是有夠認真啊,不過起碼有討論出一個比較具代表性的使用案例其實現的主要程序描述。

畫出來是否正確或合理與否是一回事,至少他肯利用 UML 表現出他的設計思維就很值得肯定,這才有機會可以指指點點與討論的。

他只畫了使用案例圖與某一結構設計的類別圖,因爲有公司機密問題,這裏就不方便貼出他的原稿。我只就他的設計給予一些建議與修正,並利用他在 Mac 所使用的 UML 工具繪製出來。

淺論 Excel VBA 的 MVC 框架

撰寫即時性的看盤資料分析,最簡單與方便的莫過於利用 Excel 了。工作表 (Worksheet)內的儲存格 (Cell)既可以當成如 DDE or RTD 的資料源,又能做計算邏輯與資料的呈現。而若牽涉到較複雜,如多個儲存格甚或多個工作表、多個工作簿 (Workbook)之間的資料處理,則可利用 Excel 內建的 VBE (Visual Basic Editor)程式開發編輯器來撰寫一般開發人員所認知的「巨集 (Macro)」程式。

VBE 編輯器會為每一個 Excel 檔案配置一個 VBA 專案 (VBAProject),每一個 VBAProject 可以有四種不同類型的資料夾 (Folder)-「Excel 物件」、「模組 (Module)」、「表單 (Form)」、「物件類別模組 (Class Module)」。其中「Excel 物件」資料夾是預設其內並預設了四個「This Workbook」、「工作表1」、「工作表2」、「工作表3」物件。
Excel VBA Project 組成

這裡帶出一個問題:VBA 程式碼該寫在這四種類型的哪一個資料夾 (或應該稱為哪一種類型的模組)?

或直接把其中最常見的問題更白話:不同工作表之間的資料篩選、處理與搬移等,VBA 程式碼的控制 (Control)與運算邏輯部分,該寫在「Excel 物件」還是「模組 (Module)」?

為了一次性解決 Excel VBA 程式碼結構議題,個人花了兩天的時間思考,先從這四種類型的物件 (可以把這四種資料夾想成四大物件類型)運用物件導向分析思維 (object-oriented analysis thinking)的「責任分派樣式 (responsibility assign pattern)」,先釐清這四大類物件的主要責任。

我這裡先利用 UML 類別圖 (class diagram),來表達出「VBAProject」與這四種類型的物件結構關係。
Excel VBA Project 的結構關係

閱讀全文 »

關於庫存管理以 “Boundle(綑)” 為單位的結構設計

上星期參觀「東和鋼鐵」的煉鋼生產過程,收穫頗多。 除了感受到現場工作人員需要忍受酷熱危險的工作環境,而仍是那麼地辛勤工作,不禁敬佩與慚愧,應要能更珍惜自身的工作;另外一個收獲就是,總算看到了我們對「東鋼」設計企業物件類別圖時,一些概念術語中,關於到 "物 (Item)" 的實體呈現。

像在現場上我們就看到以 "捆 (Boundle)" 為單位的鋼材。 可能像長條形的凹型鋼是以三根為一捆,在入庫/出庫(出貨) 時就是以一捆一捆為單位來管理。 在庫存管理時,每一捆都會給一個序號 (serial number),但一根一根的鋼材並不需要為其作追蹤管理,所以並不需要給予編號;若某一捆的某一根鋼材有瑕疵,就是換掉再綁入該捆即可;每一捆的鋼材規格可能會不一樣,可能有 "凹型鋼"、"馬蹄鋼"、"T型鋼" (想像的規格) 等。

所以當時看到已綁成捆的鋼材,我問 Ringle 說 "捆 (Boundle)" 應該是屬於 "特定項目 (Specific Item)" 吧? Ringle 說沒錯,而且在類別設計時,並不需設計一個 "鋼材" 的 特定項目 類別。 所以有趣的一個問題是,當看到一捆有三根鋼材,若共有三捆時要入庫,在庫存管理系統內,會有幾個物件? 答案可不是 3x3=9 個 instances (個體),而是只有三個 instances,而所屬類別就是 "Boundle"。

"Boundle" 的規格 (Specification)資訊紀錄在哪裡呢? 此時自然會有一種 "產品 (Product)" 類型的類別被挖掘出來。 在庫存系統中,會有個 "成品" 的類別被設計出來,並紀錄著各種鋼材等項目的規格資訊。

每一次的出庫、入庫都需要記錄相關的資訊,所以會設計 "入庫"、"出庫" 兩種類別。 而這類型的物件就是所謂以交易為核心 "Transcation Pattern (交易樣式)" 中的交易物件。

再來,若要查詢現在庫存的數量,該找誰問呢? 此時就會有個 "庫存 (Inventory)" 的類別來擔負 "查詢庫存數量" 的責任。 有意思的是,"庫存" 類別在古早以人工來紀錄的時代以來,就是等同於 "帳冊" 的角色,而這在我的認知算是在電腦系統內 "Log" 類型 這樣的一種角色。 不過 Ringle 倒是很肯定的告訴我,是 "Log" 沒錯,而在 "Transaction Pattern" 中,這仍是屬於 "Specific Item" 的類型。

基本上,一個以鋼材物料的庫存系統主要組成結構元素的輪廓就慢慢浮現出來了,先略過 "人 (Role)", "地 (Place)" 的類別設計,一個基本的 UML 概念類別圖 (Conceptual Class Diagram)如下圖:

庫存系統的概念類別圖
圖、庫存系統的概念類別圖

閱讀全文 »

軟體思維顧問

專職軟體輔導與教育訓練的獨立顧問。輔導企業資訊單位如何有效組織系統開發與維護;輔導開發人員達成有效的專業分工。傳授如何把軟體作軟 (Keeping Software Soft)的技能,得以提昇系統的彈性/延展,並進而創造系統的再利用價值。

Personal