Quantcast
Channel: 軟體設計與分析 | Kenmingの鮮思維
Viewing all 31 articles
Browse latest View live

[案例研討] 雲端與安卓系統分析與實作-以豪小子App為例-06

$
0
0

*** 自本篇後續所有的文章內容,作者為賴信仁 (Ringle Lai),並已經由授權延續本案例研討系列。***

 

七、 雲運算技術總覽

7.1. 雲運算的歷史與分類
自從互聯網(Internet)開始進入電腦的世界以來,電腦技術的進展,以超越人類能夠想像的速度超高速發展中。

中國人有句話說:「積沙成塔,聚少成多」,用這句話來形容近來的電腦運算能力的進展,是再適合也不過的了。

在網路環境還不發達的年代中,所有的電腦都是獨立的個體,各自有各自的運算能力,彼此沒有辦法互相溝通,因此,要進行大量的運算,就必須要架構出「超級電腦」來進行超大量的運算;

當網路環境越來越成熟時,區域網路利用「乙太網」(ethernet)進行溝通,因此,在區域網路的環境中,可以架構出「叢集式運算」(Computer Cluster)的環境,讓多個Server可以透過互享資源的方式,將運算能力以倍計成長;

但「叢集式運算」的環境,對於很多的系統管理人員來說,卻是一個惡夢的開始,系統管理人員必須耗費相當多的心力來架構出「叢集式運算」的環境,而硬體及軟體成本也因為要架構出這樣的環境而大幅飆升,原先只是想要取代大型主機,卻發現要耗費的心力其實比維護大型主機更多!

基於這樣的一個背景,有些人開始思考是否有更簡單的方法來架構出一套具備叢集式運算能力,但在管理上更簡單、成本上更節省的方式。

「網格運算」(Grid Comupting)就是在這樣的背景上應運而生。

由於網際網路的傳輸能力大幅提升,無論在速度或是可靠性上,網際網路的能力都逼近了區域網路,因此,是否能夠運用網際網路的特性來進行分散式的運算,就成了計算機科學中的「顯學」。

網格運算主要是將整體的網際網路視為一個「有機體」,在這個有機體中,所有加入「網格」的個人電腦都視作是該有機體的「細胞」,每個「細胞」可以提供他多餘的運算能力,當有一個「運算任務」發出後,各個節點分散了整體的運算任務,讓整個的「網格」可以發揮最大的能力來進行運算。

「網格運算」可以說是分散式運算中的一個極致運用,但是網格運算在管理上仍然是一個很大的問題,由於參與網格是一個「自由」且「自發性」的行為,因此,同一個運算任務究竟需要多少的時間可能都沒辦法事先預測,也因此,是否有更適當的方式能夠同時兼顧「分散式運算」與「集中式管理」?

「雲運算」似乎是達成上述目標的其中一個「聖杯」。

何謂雲運算呢?根據美國國家標準技術研究所(National Institute of Standards and Technology, NIST)的定義,雲運算是:
「Cloud Computing is a model for enabling ubiquitous, convenient, on-demand network access to a shared pool of configurable computing resources (e.g., networks, servers, storage, applications, and services) that can be rapidly provisioned and released with minimal management effort or service provider interaction. This cloud model is composed of five essential characteristics, three service models, and four deployment models.」(ref: The NIST Definition of Cloud Computing; NIST Special Publication 800-145; Peter Mell & Timothy Grance)

雲運算是一個具備普及性、便利性及隨選式網絡的模型,其可以存取共用的可配置的電腦資源庫(如網絡,伺服器,存儲,應用程式和服務);使用者可以運用最少的管理成本快速地與服務供應商互動。

雲運算模式是由五個關鍵特性、三種服務模型以及四種部署模型所構成。

    雲運算的五個關鍵特性分別是:
  • On-demand self-service(隨選式自助服務):使用者可以按照自己的需要挑選適合自己的相關服務(如網路的存儲或是使用Server的時間…等);
  • Broad network access(廣泛的網路存取):所有的存取都必須透過網路,並且提供多種的平台(如手提式裝置、個人電腦或是工作站)來進行存取;
  • Resource pooling(資源池):雲端提供者(Cloud Provider)提供資源池讓所有的使用者可以透過「多租戶」(multi-tenant)的方式進行資源的存取;
  • Rapid elasticity(快速且彈性的擴充能力):雲端提供者應該可以讓使用者快速且彈性的擴充其所需的服務;
  • Measured service(可供測量的服務):雲端提供者所提供的服務應該是可供測量的,以讓使用者可以確實地知曉要使用哪些特定的服務。
    三種服務模型則為:
  • Software as a Service (SaaS)(軟體服務提供者):雲端提供者提供軟體服務給一般的使用者,使用者可以透過多種的平台(如Web瀏覽器、手持式裝置或是API)存取雲端提供者的軟體服務;
  • Platform as a Service (PaaS)(平台服務提供者):雲端提供者提供軟體運作的平台,讓軟體服務提供者可以在該平台上部署他們的程式;
  • Infrastructure as a Service (IaaS)(基礎建設服務提供者):雲端提供者提供所有的硬體環境,包括網路架構、儲存環境以及運算環境,所有的平台服務可以架構在該基礎環境中。
    最後,雲運算的服務模型可以使用四種部署方式:
  • Private cloud(私有雲):由單一組織或單位所擁有的雲端基礎建設;
  • Community cloud(社群雲):由特定的族群所擁有的雲端基礎建設;
  • Public cloud(公有雲):提供給大眾存取的雲端基礎建設;
  • Hybrid cloud(混和雲):混合了2到3種的雲端基礎建設。

根據NIST所做的規劃,一個典型的雲運算可以利用下圖來作為一個代表性的模型(Ref: NIST Cloud Computing Reference Architecture, Fang Liu, Jin Tong, Jian Mao, Robert Bohn, John Messina, Lee Badger & Dawn Leaf, 2011, p.10, Figure 1):

圖 1、雲運算參考概念模型
(點擊圖片鏈接看原圖)圖 1、雲運算參考概念模型

根據上圖,可以看出參與雲運算的主要可以分成五種不同的角色,分別是:
雲提供者(Cloud Provider)、雲經紀商(Cloud Broker)、雲載體提供者(Cloud Carrier)、雲審核者(Cloud Auditor)、及雲消費者(Cloud Consumer)。

上圖即為這五種不同角色的人針對整體的雲運算所應該提供的服務。

以本案例而言,我們將只討論雲提供者與雲消費者之間的行為與服務,所以我們的重點將會放在上圖的右上角的方塊與中間那一大塊方塊中。

至於雲運算的四種部署方式,待案例研討後半部實作時再細部討論,接下來,讓我們把重點放在雲服務上。

 
7.2. 雲運算的歷史與分類
雲運算必須要配合雲服務才能夠提供給雲消費者確實的感受,而一個完整的雲運算環境,應該是由前述的三種服務模型結合後,才有可能提供適當的雲服務(Ref: NIST Cloud Computing Standards Roadmap, Michael Hogan, Fang Liu, Annie Sokol & Jin Tong, 2011, p.21, Figure 4):

圖 2、雲運算環境的範例
(點擊圖片鏈接看原圖)圖 2、雲運算環境的範例

也因此,提供雲服務的相關團隊,應該要能夠確實地瞭解自己團隊的優、缺點,並且在整體的雲運算環境中,找到適合自己團隊的定位,並且在不同的環節中,找到適當的協力廠商協同合作,才有可能提供使用者最佳的雲服務的體驗。

提供雲服務的團隊,應該要能夠清楚說明自己的雲服務的層次以及所使用的雲運算的方式,而針對雲服務,也應該要能夠有相關的文件來說明自己的雲服務。

我們可以用下圖來更清楚地說明雲服務的層級與預期的服務型態 (Ref: CLOUD COMPUTING - Principles and Paradigms, Rajkumar Buyya, James Broberg & Andrzej Goscinski, 2011, p.14):

圖 3、雲服務的層級分類
(點擊圖片鏈接看原圖)圖 3、雲服務的層級分類

透過上圖可以更清楚地瞭解,這三種不同的服務層級的定義以及提供的服務的型態。

NIST針對要更瞭解雲運算的開發人員準備了一個範例:

圖 4、雲服務的範例
(點擊圖片鏈接看原圖)圖 4、雲服務的範例

從這張圖中其實可以看出,不同的雲服務會有不同的Consumer利用不同的平台來參與。通常來說,PasS跟IaaS的Consumer大多會是開發人員;而SaaS則是面對廣大的消費族群。

也因此,對於開發人員來說,確實了解自己的優勢與缺點,找出適合的雲服務領域來發揮,是刻不容緩的事。


淺論 Excel VBA 的 MVC 框架

$
0
0

撰寫即時性的看盤資料分析,最簡單與方便的莫過於利用 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 的結構關係


其中,「Form」與「Class Module」比較容易釐清責任-「Form」提供視覺化 (visually)的表單操作;而「Class Module」在 VBA 環境被簡化為資料結構,例如「cls加權」類別有「成交價」、「開盤價」、「最高/最低價」、「成交量/預估量」...等屬性。(當然也可以包括該類別的操作方法,如「calc振幅()」、「get預估量()」等。)

最關鍵也最容易混淆的就是「Excel 物件」與「Module」這兩類型物件的責任區分了。

先直接給建議的解答:工作單/工作表 的事件處理 (Event-Handle),交給「Excel 物件」;控制/運算 邏輯,交給「模組 (Module)」。

基於「事件處理 (event-handle)」的考量,有關於該工作單或工作表 (Workbook/Worksheet)的事件 (Event)處理,建議就是寫在「Excel 物件」內的「ThisWorkbook」與「工作表」物件內。這倒也容易解釋:「Excel 物件」因有擔負「UI 的呈現 (present)」的責任,而 UI 元件 (如儲存格)很容易因有各類的操作而會觸發不同種類的事件。這些事件若有值得被捕捉 (capture)而需要處理,則落實在該事件的「Event Handler」內。

而至於不同工作表、甚或不同工作單 (每個工作單視為個別的檔案)的控制與運算邏輯,則應該是實現 (realize)在「模組 (Module)」內的程式碼。所以當工作表/工作單 捕捉到事件 (event)之後,即會委派 (delegate)給「Module」來實作。

這樣也就能導出關於 Excel 的「MVC (Model-View-Control」框架了。

View → 「表單 (Form)」、「Excel 物件」。
Control → 「模組 (Module)」。
Model → 「物件類別模組」。

由於 Excel VBA 並不如 C#/VB.NET 這類 OOP (object-oriented programming)來得嚴謹,且為了便利性,所以在上述的 MVC 框架上,責任會有些重疊,封裝 (encapsulate)也沒太過講究。

所以,「Excel 物件」如不考量跨工作單 (多個檔案)與連結外部資料源,且工作表本身即為 UI (沒有另外設計表單),則控制與運算邏輯可以簡化實現在其內的「ThisWorkbook」物件內。

而「模組 (Module)」的角色其實相當多元化。它既是 UI (這裡泛指「Excel 物件]內的工作表/工作單,以及「表單 (Form)」)的「Form Controller」),也可以是邏輯運算處理的「Functional Controller」,甚而還擔負了邏輯運算 (business logic)與連結外部資料源的資料處理。

所以若為了讓其責任更為明確,則「Module」還可以再區分為「FormServlet」、「FuncControl」、「Model」與「DAO (Data Access Object」等模組物件了。不過若非企業層級或產品的系統開發,倒也不致於如此需要講究,同時也可能造成程式碼分散的維護性議題,以及喪失了 Excel VBA 的簡易開發性了。(事實上,若為產品或企業層級系統的開發,也不至於會使用 VBA 來開發的。)

將 Excel VBA 程式碼規劃了基本的 MVC 框架,最主要當然就是可以讓這四大類型的物件責任更為明確,造成的效果就是降低「耦合性 (coupling)」,讓程式碼更具彈性度 (flexibility)。

※ References
 o Code Module And Code Names
 o Getting Started with VBA in Excel 2010
 o Excel Object Model Overview

Excel VBA-關於儲存格變動性的設計議題

$
0
0

問題:當工作表內有多組被參照的儲存格需撰寫 VBA 程式作處理運算,但不希望因被參照儲存格的位置 (座標)變動後,而頻繁修改程式碼。

描述:參考下圖,當有一組表格內的儲存格,例如「加權指數」,有包括「成交價」、「最高價」、「最低價」、「成交量」... 等屬性 (property)。若撰寫 VBA 程式時,係以「絕對座標」參考值 (例如「成交價」座標現為 "B4")來處理,則當上述任一屬性座標更動時 (或新增屬性而移動原來屬性位置),程式碼必須修正調整。這也說明了若以單一儲存格的「絕對座標」作為撰寫程式的參考值,不會是好的寫作方式。
Excel 儲存格

解決方案:利用 Excel Range 物件,標定一組儲存格作為參考表格,再以「相對座標」來取得所參考的儲存格。


說明:

再以上圖為例,利用 Range 物件,將相關的一組儲存格標定為「加權指數」表格。

Set 加權Rng = Worksheets("即時報價").Range("A2:B11")

「加權指數」表格即為「Range」物件,如要取得該表格內的「成交價」,可以利用 "Find" 函數,以該屬性當為參數搜尋,取得所在位置後,再利用 "Offset" 函數取得相鄰的儲存格位置。參考下列程式碼片段:

Dim Price,O,H,L As Single
With 加權Rng
   Price = .Find(What:="成交價").Offset(0, 1).Value
   O = .Find(What:="開盤").Offset(0, 1).Value
   H = .Find(What:="最高價").Offset(0, 1).Value
   L = .Find(What:="最低價").Offset(0, 1).Value
End With

這樣撰寫的好處就是只需要標定第一次的 Range 物件的座標範圍,爾後被標定範圍內的儲存格位置無論怎麼調整,只要透過儲存格的標題關鍵字搜尋,即可找到實際需處理的相鄰儲存格。

[好書分享] Clean Code~無瑕的程式碼

$
0
0
無瑕的程式碼:敏捷軟體開發技巧守則 無瑕的程式碼:敏捷軟體開發技巧守則 (中譯本)
Clean Code: A Handbook of Agile Software Craftsmanship
-----------------------------------
作者:Robert C.Martin
譯者:戴于晉、博碩文化
出版社:博碩
ISBN:9789862017050
Amazon 評鑑:四顆半星

內容簡介
本書的原文書名為《Clean Code: A Handbook of Agile Software Craftsmanship》,根據作者的說法,《無瑕的程式碼》為Jolt得獎著作《敏捷軟體開發:原則、樣式及實務》的前傳。

在台灣另一本銷售極佳的書籍《重構─改善既有程式的設計》,根據亞馬遜Amazon網站的統計,購買該書原文版《Refactoring: Improving the Design of Existing Code》,又同時購買的其他書籍第一名,正是《Clean Code: A Handbook of Agile Software Craftsmanship》這一本書。

.第一章
作者開宗明義說明什麼是 Clean Code,他詢問了包含C++發明人 Bjarne Stroustrup、Eclipse 策略教父 Dave Thomas、極限程式設計大師 Ron Jeffries、維基與極限程式設計發明人,Ward Cunningham 等等的大師,從他們的眼光來描述什麼是 Clean Code,最後才說到作者本人認為的 Clean Code 應該長成什麼樣子,有什麼好處,以及學習撰寫Clean Code的基本原則。

最早知道這本書大約是前年 Ringle 已購買的原版書籍,並發現他常在課堂教授的空檔就津津有味地細讀該書,我想會吸引他如此認真閱讀絕對非同小可。不過當時我拿來略翻一下,有太多生活化的白話字彙 (如同極致軟體系列,但卻又更厚上太多),要翻查這些生字太吃力了些,故而放棄閱讀原文。沒想到國內出版社今年有相中該書,將之翻成中譯本,而且許多專業字彙還保留了原文的對應 (我很習慣軟體的原文字彙),讓我得以在兩個星期內就看完本書,而且到第10章以前 (約一半),可是逐字細讀。第10章以後,總感覺有些雜燴,有些是其他作者的論文,有些是原作者早期的文章,有許多主題已經是偏向程式開發領域的技術性議題,用來解釋「Clean Code」,我是覺得反而沒必要細讀,大略知道本意即可。

當時 Ringle 告訴我 Clean Code 的原則就是:每一個函式 (function, or method),不超過10行,最好是5行以內。天啊,這讓我很難以想像,我知道函式不能肥大,也不要有一堆的 if-then-else or switch 之類的判斷式,但如何縮短為只有10行以內的寫作,我也很難理解。不過細讀本書內容之後,總算能瞭解要如何作,當然,你更應該體會為何要這麼作。

簡而言之,程式寫作是一門「craftsmanship」,我還蠻喜歡中譯本將之翻為「工藝典範」。它既要精確,卻也期望將程式寫作昇華為具有美感的作品。我覺得,稍具有良心與審美觀的程式設計師,絕對不是只有滿足於「可以執行程式」。寫出來程式往往只是起點而已,持續不斷地精煉 (也就是重構),讓程式整潔,軟體才有可能具彈性與維護性。往往程式設計師只滿足於讓程式「順利運作」的狀態,有經驗豐富 (還有良心)的程式設計師,知道那其實是一種專業上的自殺行為。

所以,事實上,寫程式就如同寫散文一般,程式寫得艱澀冗長讓人無法理解,就代表散文寫作能力不佳。程式設計大師不認為他們在寫程式,而是在說故事。大師利用所選定的程式語言機制,來幫助建造更豐富更具表達力的語言,讓這個語言可以用來說故事。而簡短的函式,有意義的命名,以及漂亮的結構,則都有助於描述故事。


當然,要能寫好整潔的程式不是一蹴可幾的,那可是長期性的一種目標與方向。最重要的應該是意願與職志,然後再來才是學習與鍛鍊應有的觀念與技巧。所以這也是為什麼與其說程式設計是門科學,不如說程式設計是一門技藝更為貼切。為了要寫整潔的程式碼,你必須先寫下糟糕的程式,然後去整理它! 對於程式碼,就是要義無反顧的重構它,讓品質可以改善再提昇至另一個層次。程式如果看待只是一種製造,那麼當重做時就代表著額外的花費;但當看待為設計,則重做代表的就是創造出價值

喔,從本書我還學到了唯一最有效度量「程式品質」的單位-WTF (請自行查 Google)。當 WTF 值越高,程式品質越差,沒有任何例外!

專案管理人員應該要重視這個指標的,絕對沒有其它指標比它更實用有效的。>_< 所以,到底甚麼是 Clean Code? 為了這個詞彙,作者 Martin 還特別訪問了諸多軟體大師,請他們寫下對 Clean Code 的定義。我比較喜歡 Grady Booch (UML 三巨頭之一) 的解釋: 「Clean Code 是簡單又直接明瞭的,讀來就像一篇優美的散文。Clean Code 絕不會掩蓋設計者的意圖,反而充滿著俐落的抽象概念,以及直接了當的程式控制敘述。」 其實每一個人應該也會有對 Clean Code 自己的一番解釋。對我而言,Clean Code 就是: 「簡潔有序,層次分明的程式碼。」

ASP.NET MVC 框架學習心得註記

$
0
0

這幾天利用撰寫一個 Web.NET 小專案的機會,打算使用 ASP.NET MVC 5,藉此順便學習下 Web MVC 的框架技術。

花了快兩天的時間研讀一些文章,總算對 ASP.NET MVC 框架有了全貌的認識;先註記下基本的心得:

  • ASP.NET 源自於 Java Struts MVC,本質完全沒變。
  • ASP.NET MVC 僅是位於系統 3層(3-tier)架構的 Presentation 層,完全沒有涵蓋系統的控制 (Control)與邏輯 (Logic, or Model)層。
    {P.S. 關於這個觀念,個人已在課堂上論述許久;後續再撰寫該篇專文討論。}
  • ASP.NET 的 MVC 中的 Model,係指 Data Model,也就是屬於資料傳遞類型的物件 (DTO, Data Transfer Object),並未涉及到邏輯運算。
  • 微軟的企圖心,利用 EF (Entity Framework) O-R (Object-Relation) Mapping 技術,實現 Model (Data Model)與資料庫的無縫式對應,讓開發人員對於撈取資料庫的程序更是簡化不少。
  • ASP.NET Model 透過 EF 直接對應資料庫,本質上就是 Client/Server 架構;好像重回到 10 年來前 Windows Form 的 4GL,雖然實作變得更簡單 (不需自行控制 Web 表單的狀態與資料庫連結問題),但會導致系統本質上的混亂-沒有確實隔離問題領域 (problem domain) 的功能控制 (functional control)與業務邏輯 (business logic)層。
  • ASP.NET MVC 的頁面 (Page)係以所謂的 Razor 語法 (把它想成 PHP 就好了),以 "@" 為語法的頭尾標記,來實現 UI 邏輯控制的部位。
  • 至於 Web Page 的呈現,則係利用最為普遍的開源專案-Bootstrap,綜合了 HTML/CSS/Javascript 框架技術,來呈現 Web Page 的動態呈現與彈性 Layout 控制 (有些意外,微軟竟然也採用了開源專案)。

關於 PTT Soft_Job 對於 OOP 的一些回應

$
0
0

沒想到 PTT 的 Soft_Job 看版有人在聊 OOP 的觀念,忍不住作了一些回應。

  1. 早期把物件化的分析/設計思維歸為 OOA/OOD (Object-Oriented Analysis/Design);實現物件化思維的程式語言則稱之為 OOP (OO Programming)。
  2. 實現 OO 思維主要有兩個機制:介面 (interface)、多型 (polymorphism)。包括 .NET/Java 等主流語言,早已支持 OOP,甚至連 php/python 等原來屬於 script-based 的程式語言,也朝向 OO 化的實現機制。
  3. 從 OOP 的角度來看到物件化的設計思維是不妥的;原因在於絕大數開發人員並不知道 Why OO Thinking!其實採用 OO 設計化思維是必然會增加開發成本的。因為它並非為了解決某一局部的邏輯性問題,而是考量全局,從系統整體來看待「變動 (Change)」的議題,進而提出如何擁抱改變 (embrace changing)的解決方案。
  4. 再則從實作上,OO 化的特徵是分散式的 (因為基於類別 (class)的責任分派 (responsibility assign)原則)。所以為了實現 OOP 的分散式架構,程式碼必然大量分散於各類別內,如此會造成實作與偵錯的難度;因而一個必要的配套措施:TDD (Test Driven Development),測試先行是一定要養成的好習慣。
  5. 越是大型變動頻繁、高度維護,或者期待包裝為產品,增加其再利用性價值的系統,採以 OO 的設計/實現 (當然,前提要有這樣實在技能的軟體架構師/Developer)才能感受到其好處:每一次只改變一點點;每一次的變動可以侷限在可控制的變動範圍內。
  6. OO 的特徵是將 程序/資料 封裝至某一類別內,其實在抽象層次,程序稱之為「行為 (behavior)」、資料稱之為「屬性 (attribute)」,兩者均為物件必然會有的特徵 (features),是非常自然不致分離的。但因現實仍沒有一種有效的機制能把物件的狀態 (state)儲存起來,所以實作技術上是把物件與資料分離,資料儲存於資料庫系統內、待執行期間 (run-time)才透過如 OR Mapping (如 .NET ER Framework、Java Hibernate 等),將物件與資料合而為一。
  7. 實業界很有趣的一個現象:重視 MIS (Management Infomation System)系統的公司,幾採以資料導向的開發模式;重視 Web 框架如網路行銷公司,大都採以程序導向的開發模式。至於所謂的 OO 化,實現的程度其實還蠻微小的。
  8. 順待提下重構 (refactor)的觀念:重構是屬於事後 (Coding 後)的設計,一般與事前 (Coding 前,如典型的 SA/SD)設計可能存在著 3:7 或 4:6 (事前:事後)的比重。而且往往寫完程式才是另一段故事的開始:持續重構 (continous refactoring)。
  9. 重構的要件:不會影響到已經上線系統的所有功能。 衡量重構的指標:每一個 method 不會超過 10 行、最長不得超過 20 行。
  10. 如今重視 Web 相關技術、快速實現商業創意的年代,其實已少人有人談及 OO 更遑論具體實踐了。西元2000年以前,包括 UML 三大師 (Booch、Rumbaugh、Jacobson)、Martin Fowler (重構一書即為他的著作)、Kent Beck (XP/Agile 的始祖)、Bob (Clean Code 作者)均為支持物件思維的軟體大家。國外除了這些大師外,實現 OO 的專家其實也不多,一般是會落在如開發底層框架 (如 .NET Framework)的關鍵架構師。
  11. ※ 引述《flyfoxy (飛狐)》之銘言:
    : OOP不只是從GUI的角度出發,我以OpenCV這個第三方lib做為例子
    : 我個人從OpenCV1.0開始使用到現在
    : 他去年有了3.0beta版
    : 我看到他從最早1.0版幾乎是c code,沒有使用class/namespace..etc
    : 好在只是DLL function呼叫,c code 其實也還好,
    : 如果有去trace過JM1.6版的c code,那真的令人暈頭轉向
    : 又沒有UML的圖,function這個call那個,回傳值全部用
    : pointer,到了另外一個地方又是另一個pointer名稱
    : 但它是原先那個pointer傳過來的,這真的是純c code的痛苦。
    : OpenCV2.0版開始他就更有結構化,使用class/namespace進行封裝
    : 也建立了線上document分類分好
    : 想要找特徵學習還是影像處理,一目瞭然。
    : OOP絕對有他的缺點,比如看一個class發現他可能繼承於別人
    : 然後就要再去看上層的class,有見樹不見林的感覺。
    : 但如果document做的好,有類似Start UML的圖表,其實架構是很清楚的。
    : 或者說過多的繼承會導致class十分龐大臃腫
    : 或者說資料和程序難以分開 導致十分難trace
    : 我也曾經在如何抽離介面和演算法之間徬徨
    : 但其實這些問題不是不能克服的
    : 微軟的Doc/View模式某種程度上就已經幫了你一點忙
    : 甚至其實是coding習慣的問題,因為一開始架構就沒有寫清楚
    : 或是時間不夠流程和資料就混成一堆,程式能動就好,
    : 或是因為後續的需求變更使得class間的耦合性變得更複雜
    : 所以當你程式越寫越大,你就越早面臨「重構」這件事情
    : 上述的問題透過「重構」其實都可以得到解決,
    : 只是大家應該都沒時間「重構」,
    : 或者說因為「重構」不會讓你薪水變多,只是事情變多,
    : 但我覺得應該要推廣一個觀念
    : 如果一個軟體想要「永續經營」,「重構」這件事情是必要的
    : 除非你寫了一隻程式,以後都不會去改動它,
    : 都沒有維護/增加功能的問題。
    : ※ 引述《csfgsj (Lazy bone)》之銘言:
    : : From護法兄
    : : 有些人愛用oop,或許真的有一些理由
    : : 從Gui的角度來出發,也許真的是一個蠻契合的Paradigm
    : : 但一個Paradigm適用範圍畢竟有限
    : : 出了這個範圍,若還是要硬套,那就是自找麻煩
    : : 就我的觀點來看,OOP裡的確有不少討厭、自找麻煩的東西存在
    : : 什麼是理工學生的思維模式?以及
    : : 十數載在學校的學習,是在作什麼?
    : : 能不能用幾個簡單的字來詮釋它?
    : : 我的理解就這四個字:
    : : 定性、定量
    : : 即對世間的事物,學習培養對其定性或定量之能力
    : : 什麼物理、化學、數學等理工學科都一樣,都是在作這樣的事,沒有例外
    : : 而且能否對事物作定性定量,也就成了評量對事務是否瞭解的普世標準
    : : 漸漸地,它成為所有理工學生的思維基礎
    : : 處理陌生事物前,要先對它作有效的定性定量
    : : 這樣的作法也就理所當然,成為標準程序
    : : 反過來說,一個遲遲無法定性定量的事物
    : : 就會成為理工科學生的困擾,甚至惡夢
    : : 尤其是在無法逃脫非要處理它的情況下
    : : 幾乎所有的軟體,都是由許多不同的軟體元件疊加起來的
    : : 一個軟體工程師很可能只作其中的一部分
    : : 其它的部分不是現成的,就是別人作的
    : : 有很大的一部分,工程師的工作只是在整合這些元件
    : : 我的問題是
    : : 工程師在整合這些元件之前,能對它們作有效的定性定量嗎?
    : : 不管是C++還是JAVA以及其他的OOP程式語言
    : : 都有所謂Class的語法,並且大量的被使用
    : : Class就是資料加程序的集合體
    : : 有人說這是個好東西
    : : 以我的觀點,它確是個萬惡之源
    : : 資料是資料,程序是程序
    : : 兩者是性質完全不相同的東西
    : : 當你刻意將兩個性質完全不相同的東西併在一起成為一個東西之後
    : : 其結果就是
    : : 你創造了一個無法被有效定性定量的東西
    : : 大量的無法定性定量的東西被創造出來,並且存在於程式之中
    : : 程式會呈現什麼景象?亞馬遜叢林
    : : 在亞馬遜叢林,一切都變的隱誨,似明未明
    : : 基於本能,人在這時候往往採取保守小心的策略
    : : 以免不小心,那邊冒出一隻大蟒蛇,把你一口吃掉
    : : 隱誨、保守小心,也就是侷限的開始,愚化的淺勢開端
    : : 由其是經驗不夠的時候,很容易就此走不出來
    : : 因此
    : : "工程師的缺德行為:叫朋友去學C++"
    : : → bibo9901: 不同意, 並不是把 data 和 function 分開就看得清楚 02/28 20:58
    : : → bibo9901: linus 指的 "substandard programmer" 應該就是這種吧 02/28 21:03
    : : → rodion: 是否搞錯OOP的正確用法? OOP不代表任何東西都要用OOP 02/28 21:23
    : : → lachtchlee: 笑話一則 02/28 21:41
    : : → csfgsj: rodion觀念正確,但很多人不是 02/28 21:50
    : : → csfgsj: 給lachtchlee:大家一起哈哈笑吧! 02/28 21:51
    : : 推 typepeter: 只想問閣下成就如何...XD 我認識Googler也沒像你這樣說 02/28 23:02
    : : → typepeter: 看似說了什麼 卻全篇心得文 未有實際上作法 02/28 23:04
    : : → typepeter: 你說堆DomainKnowledge, so? 除了聽起來很酷,然後? 02/28 23:05
    : : → typepeter: 好像是發功程式就會出現一樣 有無具體作法? 02/28 23:06
    : : → typepeter: 所謂D.K.要如何精鍊 如何判斷要不要用框架 有無具體? 02/28 23:09
    : : 推 iceonly: 平平都是寫code,工作環境不同也有不同的心得,也許他的 03/01 01:20
    : : → iceonly: 業務是個與OO無緣的世界,那也沒啥好批評的;反對OO的論點 03/01 01:23
    : : → iceonly: 也很多,原PO說的也是常見的一種 03/01 01:24
    : : 推 iceonly: 只是OO/DP/各種framework都只是為了降低維護成本的一種工 03/01 01:40
    : : → iceonly: 具而已,不用那些或許達的到但是用了會簡單很多 03/01 01:41
    : : → iceonly: 某種功能在短時間內純手刻就能實作/新增是很厲害沒錯,但 03/01 01:42
    : : → iceonly: 使用上述工具就能在同樣時間內達到同樣效果時帶給老闆的 03/01 01:43
    : : → iceonly: 效益是一樣的話那好像也還好 03/01 01:44
    : : → iceonly: 感覺像是練過心算的在嘲笑用計算機的人一樣 03/01 01:46
    : : → anguso: 我認識的 Googler 似乎都懶得對這種文回應... 03/01 06:02
    : : → y3k: 我不相信沒有OOP能有效率地完成什麼大型專案 有些script工程 03/01 12:46
    : : → y3k: 師喜歡批評OOP 但是我覺得那是因為他們用不到....

[系統分析] 從 GUI 畫面分析使用者的操作目的 (Use Cases) –以 Twitter 為例

$
0
0

這是上一期「系統分析設計與實作」課程的一位美女學員-Isis 的案例作品。她對 Use Case (使用案例)用於系統需求分析情有獨鍾,而且相當積極的學習與詢問問題。

不過可能待在業界許久,一開始對 Use Case 這類講究目標導向的分析方法並不容易理解,總是不自覺就鑽入到細節,或是聯想到實作面議題。所以就不容易抓到 Use Case 的分析主軸-界定參與者 (actor)使用系統的操作目的,以及實現該目的的操作程序。

我使用了幾種方法,包括如何從企業流程的分析找出使用案例,或要求綜覽閱讀 Use Case 的經典名著「Writting Effective Use Case」(再針對她提問的問題回應),甚至乾脆從某一個實際的專業問題領域 (problem domain)著手,但效果仍不彰。

畢竟大部分軟體人員少對所謂的「抽象 (abstraction)」技能下功夫。抽象是需要經由思考、閱讀、觀察等長期日積月累才得以鍛鍊而成的。

所以換一種較具象的方法,從現實各網站的使用者操作畫面中,完成下列的系統分析工作:

  • 界定系統範圍 (system boundary),並給予系統命名。
  • 規劃功能模組 (functional module),這是邏輯性的功能分類。
  • 從每一張畫面表單,透過所提供的資訊,以及要求使用者輸入的資料欄位中,藉以分析其背後的操作目的,也就是使用案例。

我先給她系統規模較小的 Twitter 案例,要她完成上述三項重點工作,而先不用撰寫使用案例陳述 (use case description)。雖然使用案例陳述才是實現系統功能的主要程序,但可以先等系統功能的界定有了初步釐清與共識後再來描述相對的實現步驟,這對使用 Use Case 分析的 SA 而言,比較能有循序的分析節奏,才不致亂了套。

耶!!這方法還真對 IS 的性向,不到兩天就完成了我看了也覺得很有創意的分析。經由她的首肯,我就把她的案例作品分享上來。

圖、範例-從Twitter畫面操作找出 Use Cases

圖、範例-從Twitter畫面操作找出 Use Cases


IS 會針對每一張表單畫面,只要有提供資訊或輸入欄位的地方,先用紅筆標上編號,然後再據以分析,來找出使用者操作該表單畫面背後所隱含的操作目的 (也就是 Use Case)。

圖、範例-從Twitter畫面操作找出 Use Cases

圖、範例-從Twitter畫面操作找出 Use Cases

圖、範例-從Twitter畫面操作找出 Use Cases

圖、範例-從Twitter畫面操作找出 Use Cases

把操作畫面標註上編號並在旁列出可能是 Use Case 的候選名單後,再整理成一張表格,整理出主要的功能模組所對應的使用案例 (use case)。

圖、範例-從Twitter畫面操作找出 Use Cases

圖、範例-從Twitter畫面操作找出 Use Cases

最後可以透過 UML 工具完成初步的使用案例模型的規劃。

圖、範例-從Twitter畫面操作找出 Use Cases

圖、範例-從Twitter畫面操作找出 Use Cases

從 GUI 的操作畫面來找出使用者的操作目的 (Use Case),藉此以作化繁為簡 (從繁雜的欄位細節界定系統功能)的需求分析整理,這未嘗不是一種好方法!

透過這樣先從大量各網站的 UI 畫面,藉以分析並整理 Use Case,慢慢地對所謂的「抽象」有了感覺與相當體會後,就不需要時刻透過這樣具象的畫面來分析;甚而可以反過來,從各類資訊 (使用者訪談、業務流程等)就可以抓到系統功能,然後再據此設計使用者的表單畫面操作。系統功能 (Use Case)與表單的畫面操作,其實可以形成很好的互補,兩者沒有絕對先後的開發次序 (甚而可以平行開發),但可以相互印證。

如果系統分析師 (SA)可以從繁雜的表單畫面操作跳離出來,如此就不需再汲汲去窮究探討包括欄位與商務邏輯的細節,這些細節初期本來就不容易釐清楚。但要掌握相關這些細節背後的操作目的,卻是相對容易許多。這就是 Use Case 的價值所在-由使用者的操作目的來包容 (其實這也就是封裝 (encapsulation)的應用)相對細節 (欄位/邏輯)的變動性;這也是符合 CMMI 其一標的所要求的-作好需求的變動管理。

Design for Interface 的生活案例-沖煮咖啡的介面設計

$
0
0

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

GoF Design Pattern 一書開宗明義即提及:Design for Interface!

軟體的介面設計很重要的一個精神就是:不要重新造輪子!!
如果引用某些 3rd party library/framework 的功能,要懂得利用介面與主系統隔閡掉,如此才能造成 PnP (Plug & Play)的效果。

舉個生活的範例。88度C 的主要服務是銷售糕點與咖啡,其中咖啡服務 (需求分析)需要系統有個結構元素-咖啡機 (結構設計)來實現。

咖啡機的目的是沖煮咖啡 (Interface 規格),而購置某品牌的考量可能有:1.成本低 2.穩定/快速 3.好喝

如果購買的 A牌咖啡可能故障或沒達成上述需求,那麼就直接抽換掉,可能送修或改購置另一品牌的咖啡機即可 (但前提是不應影響到主系統的服務)。

咖啡機故障/效能不佳等因素,88度C 這個系統的設計/開發人員不可能也沒必要把咖啡機打開去維修或更改電路/零件吧?

現實生活上應用這類介面規範的案例非常多,主機板透過 PCI Express (介面)可插入各品牌顯示卡即是一例。(主機板設計人員不用考量顯卡的實作)

但回歸軟體資訊系統,不懂得介面設計,直接侵入 (hack)到 3rd party library/framework,想要把輪子改得更好甚或重新造輪子。這樣不僅耗工做沒啥意義的事情,且造成主系統與這些 3rd party 的嚴重耦合 (coupling),導致不容易/無法抽換,因而造成主系統的主要服務更為僵化難以應變的後果!

圖、範例-從Twitter畫面操作找出 Use Cases

圖、範例-沖煮咖啡的介面設計


開源免費下載-完整設計模式 (design patterns) 程式碼(C#.NET)/UML Model 檔

$
0
0

關於爾後我們 HSDc. 軟體設計顧問所開設的課程,除了教材內容尚無開放以外,其它包括完整可執行的程式碼、UML Model 檔,均以開源方式 (open source)免費供下載。

所有開源文件的釋出 (release),均可以透過加入 FB社團-軟體設計鮮思維 獲取最新的訊息。而所有的程式碼/UML Model,我們則是一律統一放置於 GitHub,當然在 README 文件上我們會附上基本的操作說明。

以後這些開源文件,尤其是案例程式碼,我們均會不定期持續版本更新。讀者可以透過 Git 工具隨時作同步更新。

目前提供了兩份開源文件:

另外補充關於上述設計模式 (Design Patterns)案例的說明。

在 C#.NET 程式碼部分 (Java/Spring 版本後續會另行公布),包含了完整 23 個設計模式範例;而關於 UML Model,則還增加了以周遭生活案例的塑模 (modeling),讓每一個設計模式的目的更容易理解。

關於 C#.NET 程式碼的結構部分,主要分為兩個專案 (project):一為 Web MVC by ASP.NET;另一為 Control by POCO (plain-old CLR objects)。

關於本案例的設計模式物件分層結構,可以參考下圖:

圖、圖、設計模式的物件分層結構

圖、設計模式的物件分層結構


ASP.NET Web MVC 完全沒有涉及到資料存取與業務邏輯處理的責任,單純就僅是作為展示 (presentation)操作之用。在我們所提供的案例解決方案,反而 UI 並非重點,所以讀者甚至可以自行實作 Console 或 Windows Form 呈現,完全不會影響到核心的設計模式物件模型。

以所謂的 Enterprise MVC (Model-View-Control)而言,整個 ASP.NET Web MVC 套件 (package)均屬於「View」的角色。

Control 專案分為三大部分:Domain Control, DTO (Data Transfer Object), Design Pattern Object Model。

Domain Control 擔任 Facade (封裝)角色,它封裝了關於資料存取 (data access)、業務邏輯處理 (business logic)的部分。以 Enterprise MVC 而言,它是屬於「Control」的角色。

關於跨 Tier 間的資料傳遞,所有案例均以資料傳遞物件 (DTO, Data Transfer Object)來當為物件之間的參數/回傳值之用。它是屬於 Enterprise MVC 的「Model」角色。(其實現實的專案開發上,DTO 應該是獨立成一個專案,不過在這裡我們是把它簡化成為 Control 專案內的 Package。)

而業務邏輯處理部分,則才是真正設計模式所要解決的問題領域 (problem domain)的設計解決方案 (solution)。案例內的每一個設計模式,均採以「問題-解決方案 (Problem-Solution)」的模型,提供 UML 類別圖/物件合作循序圖 (class/sequence diagram)的圖解,以及具體程式碼的執行,來驗證該問題的解決方案。

簡而言之,本案例所有程式碼的結構設計規劃,均可以讓 Web UI 與 資料/業務處理的邏輯分開個別維護 (透過 Domain Control 隔閡),效果有以下幾點:

  • UI 與 資料/邏輯處理可以分為兩個團隊平行協同開發。
  • UI 回歸至最單純的責任-展示操作。而不應擔負資料存取與邏輯處理。
  • 可以個別視業務邏輯的複雜度與應變程度來決定某一個 Domain Control 物件的行為 (method)是否要委派 (delegate)給可能藉由某一設計模式所揭露的物件模型來處理。
  • 程式碼 (尤指設計模式的物件模型)的重構 (refactoring)不會影響已上線的功能。

簡單聊聊軟體設計的 SRP (Single Responsibility Principle) 原則

$
0
0

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

SRP, Single Responsibility Principle (單一責任原則)

這是上星期課堂中,當我解釋 Multi-tier MVC 分層結構時,聽到學員告訴我的。

哈,這是我第二次遇到學員有告訴我這個術語,看來都蠻熟悉 Martin 在 "Agile Software Development, Principles, Patterns, and Practices" 一書內所提到的幾個軟體設計原則。

不過當我問他們工作上是否至少有把 UI 與 Logic/Data Acess 層分離? 沒有!還是全都攪在一起,沒有人講究上述分層的 "基本責任分派"。

沒有「知行合一」,確實實踐並從實務中體會與調整作法,那麼,學會 "背" 這些術語是沒啥用處的!

其實也只有一個字需要真正了解:責任 (responsibility)。

o Web UI (view & ui controller) / Standalone UI:Presentation (只負責傳送與回傳已運算資訊)。

o Domain Controller:負責控制流程 (control flow)。

o DAO (data access object)/ Adapter:負責連結資料庫/外部系統。

o Entity (或稱 business) Object:負責處理邏輯運算。

確實理解 "responsibility" 這個術語可不是用背的,而是身體力行,從過程當中去體會該術語的「真諦」。

從原點出發,一個詞彙可通一堆觀念。如當確實做好單一類別的責任分派時,所得到的效果就是「高內聚力 (high cohesion)」—責任明確。

案例研討-關於客戶單位維修作業流程的系統分析

$
0
0

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

這是月初的授課—「系統需求分析與整理」,其中一位上課學員拿他們的實際案例提供參考的。

先來瞧瞧這張看似很複雜的作業流程圖,主要是要描述當客戶單位提出報修需求時,維修單位的報價與維修的相關作業活動。

圖、原稿—客戶維修報價作業流程

圖、原稿—客戶維修報價作業流程

這是一張典型 SA 所繪製的業務流程 (business process)圖,是否使用 UML 語法來表示,那並不重要。最主要的問題是,大多單位往往都認為這類業務流程的表達,必須要描述得很「精確」,才可以轉移到實作的階段。所以為了要能取得「精確」的結果,就需要不斷地開會與確認 (還含時常爭執各據的論點),秏上個把個月才能有產出,然後再轉移到實作階段。

但是無論再如何精細,我發現到有一個相當有趣的現象,在這類環境下的 Programmer,往往都還是覺得不夠精細。

越是想表達得精確,Programmer 越會嫌不夠精確!

這就是典型的瀑布式 (waterfall)系統分析。這類所謂「精確」的業務流程圖,耗費太多在需求分析的時間,且由於描述了太多細節,反而讓實作寫碼不容易抓到適切的焦點,因而導致 Programmer 不知道如何寫出較具「彈性」可包容變動細節的程式碼,當然相對日久也就會把不精確的細節當成是一種無法 Coding 的藉口。

所以,上述如此好像「鉅細靡遺」的設計圖,主要的問題在哪裡? 其實簡單的說,它早已違背了軟體設計至高無上的原則—封裝 (encapsulation)。

  • 把資料細節呈現出來 (資料導向的思維)。
  • 設計圖內描述了企業邏輯 (business logic)。
  • 過早把資訊系統角色帶入。


先前針對上圖幾個問題,個人以前就發表過:「大業務流程塑模的MSS三層次原則」。簡而言之,設計圖要能:

  • 讓設計表現簡潔易讀並易於調整修正。
  • 具有層次感,每一個層級適時表現出焦點。

好的設計與呈現,是要能包容會變化的「細節」。不是一開始就要做精,而是懂得如何掌握可以獨立持續開發與實作的目標框架,以此為主軸,逐漸地往精確度收斂,卻又可以包容「善變的細節—欄位資訊與業務邏輯」。

這裡仍是以個人所發表的「MSS (Multiple/Single Process, System Functions」塑模三層次,就從多個作業流程的表達—利用火箭圖,以及單一作業流程的活動 (activity)這兩個層次,並以 UML 語法來重整原稿。至於系統功能的使用案例圖 (use case diagram),先略過未提。如何從單一作業流程的活動圖,以此為引導轉為資訊系統的使用案例模型,可以參考個人另一篇文:「從企業流程(活動)圖找出資訊系統的使用案例」。

第一層:火箭圖

原稿的作業流程看似很複雜? 但過濾掉資料與業務邏輯後,其實作業活動相當單純,也只有三類的作業流程而已:報修、報價、維修 作業流程。

圖、重整後的活箭圖—客戶維修報價作業流程 Overview

圖、重整後的活箭圖—客戶維修報價作業流程 Overview

從上述火箭圖主要是要表達有幾個作業流程、它們之間的主要輸入—輸出的關係為何。還有更重要的是,突顯出各自作業流程所要達成的目標 (goal)與價值 (value)為何。

第二層:活動圖

每一個作業流程,當然有各自細部的作業活動,這時就是利用「封裝」的觀念,把相對各自流程的活動表達在下一個相對細部的層級。下列三張為利用 UML 活動圖 (activity diagram)所繪製而成。

圖、重整—報修作業流程活動圖

圖、重整—報修作業流程活動圖

圖、重整—報價作業流程活動圖

圖、重整—報價作業流程活動圖

圖、重整—維修作業流程活動圖

圖、重整—維修作業流程活動圖

每一個作業流程的內部活動有各自要表達的操作目的,彼此之間只透過起點 (entry point)與終點 (end point)的事件啟始與產出 (artifacts)來關聯,但每一個作業流程的活動均有著各自的獨立與單一性 (atomic),所以才得以各自維護與延展功能活動,焦點也相對明確許多。

一直重複提醒的問題,活動圖當然是以「活動 (activity)」為主體,而表單資料則是被「封裝」在各自的活動細節內部。同理,業務邏輯當然也是與資料同時被「封裝」在各自所屬的活動內部。不要再把資料當成活動主體,那是導致業務流程圖紊亂的元兇!

再則一個重點再次的提醒,作業流程圖的活動係以「人本」的角度來看來人工作業的流程,此時最好也不要「資訊系統」這個角色放進來。因為,「系統」這個字眼其實沒有想像得簡單,SA 往往都是把「功能模組」看待為單一系統,因而導致流程活動內有好幾個所謂的「系統」參與,這樣錯誤的解讀當然會造成未來實作的謬誤。

簡而言之,SA 不要也不應該自作主張把「系統」加入作業流程活動內;單純一些,僅以「人本」的角度來表達作業活動,不用管是否這些活動是否未來需要資訊系統的參與,如此反而可以讓活動圖很單純。

總之,系統的定義,應是團隊基於「架構 (architecture)」整體性的考量來決定出來的。當決定了系統的開發/維護範圍 (boundary)後,SA 即可以以此作為界限,來找出該系統應實現 (realize)的系統功能(system functions)了。如此第三個層級—資訊系統所提供的功能表達,如利用使用案例模型 (use case model),就更能進一步清晰明確地表達出來;利用這個層級所分析出的系統功能,更易於橋接到實作寫碼的階段,反之也相對易於調整與維護。

[個案研討] FTP Server 是否可為企業系統的外部系統?

$
0
0

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

月初在內湖某大電視購物/網購平台總部的資訊單位授課。喔,先誇讚下,約有50來位的學員,上課過程大都蠻踴於提問且活潑,可說上得挺順暢愉快。

其中在談及使用案例模型 (use case model)的需求架構分析時,關於外部系統的定義,個人特別強調會是透過介面 (interface)的整合,如透過 web service or message service 等),而不會是透過資料庫的整合方式。

然後其中有位學員就問了,如果連結外部系統是透過 FTP,也就是開發中的系統這邊為 FTP Client,然後以批次定時處理的方式,傳送到外部單位的 FTP Server,對方也是採用批次自動處理的作法,把接收下來的檔案作解析處理。

這樣 FTP Server 是否是開發中系統的外部參與者 (actor)?我倒是沒想到現在會有這樣的作法,最初的直覺當然不會是。

不過課程休息時,再仔細想想,回歸到所謂外部系統整合的定義,是否有透過介面來連結? 事實上,FTP 的 Client/Server 是有的 (當然就是透過 FTP 協定),且兩邊系統之間並未透過手動操作,而確實是系統對外部系統之間有達成自動化的整合 (雖然是透過批次處理的方式)。

為何會有這麼「low」的作法?其實這與實作技術沒有太大關係,而是因為當要與外部單位的系統作整合時,外部單位總會有「安全性」的考量,不一定願意釋放出可讓系統直接呼叫的介面。

不過我在作需求架構的分析利用使用案例模型表達時,還是不會把 FTP Server 視為是外部參與者。參考下圖1,開發中系統為「電子商務系統」,那麼與之連結的「外部系統」應該要是同一個「層級」。

也就是當我們開發的系統是某一業務領域 (business domain),那麼外部系統也應該是對等於同一業務層級。所以,「電子商務系統」與「物流管理系統」才是同一個層級,但 FTP Server 卻不是,它應該被視為是「物流管理系統」底層的元件 (component)。

圖1、網購平台使用案例模型

圖1、網購平台使用案例模型

但是當從需求分析轉移到實作階段時,因為必然會談及到實作的議題,包括連結的協定與資料格式等。所以呼叫的標的系統此時就應以實際所連結的標的來稱之,如 FTP Server。

參考下圖2,PlaceOrderControl 是 Domain Controller 類型,它接收了「處理訂購」的要求。實作人員設計了 DAO (Data Access Object)物件,它負責把訂購交易的資訊儲存到資料庫 (如 Oracle);Adapter 物件則是負責把物流資訊,可能整理成 XML 格式,然後再寫入至指定的檔案位置,並透過 FTP 協定傳送檔案至遠端的 FTP Server 上。

圖2、PlaceOrder 實作循序圖 (sequence diagram)

圖2、PlaceOrder 實作循序圖 (sequence diagram)

上圖2 循序圖是會透過實作的手法來調整設計的。很可能 Adapter 物件並沒有透過 FTP 協定傳送至 Ftp Server,而是僅僅只寫入至 Local 端的檔案系統;而 FTP 傳遞則是在另外一個時間點,藉由另行撰寫如「SendFiles script」來批次傳送資料。若是這樣的情境,那應該是會被視為另一個個案的分析了。 (啟動的參與者為 Scheduler 系統,Use Case 為「傳遞物流資訊」。)

論述軟體三大基礎觀念-封裝、一般/特殊化 (繼承)、介面/多型

$
0
0

這是看到 PTT Soft_Job 版區一位網友的貼文:[請益] 我這樣解釋OOP對嗎?。原來我已在「FB-軟體設計鮮思維社群」針對此貼文已寫一篇文論述,在此邊我也把回文作個備存,然後再加上一些些心得分享。

剛入門所謂 OO → 連帶等同所謂「物件導向」觀念實作與設計觀念時,幾乎各類 OOP 入門書籍均會談論到此三大術語:封裝 (encapsulation)、繼承 (inheritence)、介面 (interface)/多型 (polymorphism)。看似簡單的術語,卻可能連多數鑽研多年實作的程式開發人員,還不容易真正體會這些觀念的意涵與作用。

即使入這軟體開發行業多年,仍會發現到,軟體大師們的著作,從最早期的 GoF 四人幫「設計模式 (Design Pattern)」,至近幾年「重構 (refactoring)」、「Clean Code」等著作,幾乎都是含繞在上述三大觀念的解釋與實踐。所以也就是說,這三大觀念可以說是要窮究一輩子的研究、思考與實踐力行的,它沒有絕對的標準答案,但也不見得好像很虛妄抓不到。每一段時期的經歷與學習,就可能會對其有著不同的想法與心得體會。

以現在個人入行軟體開發這行業約莫10來年,主要專職於軟體顧問輔導與教學,就以現階段綜合學習、觀察、反思與經驗等,來對這三大術語發表純文字的論述。可能又等 5~10 年後,當又有不同的體認時,再來對比現在的論述,作心得的補充或修正了。 :)


花了三個多小時撰寫這篇 PO 在 PTT soft_job 版,關於 OOP 的三個主要觀念:封裝, 繼承, 介面/多型。

這裡特別提醒下,程序語言用書很喜歡用「繼承」這字眼來解釋 OOP,其實那很容易誤導,常會用 父母生子 這種觀念看待。適切的用語用 "擴展 (extend)" 較適合。UML 稱之為 一般化/特殊化更是合理。

封裝 (encapsulation)

其實封裝本來就是人們面對複雜度的一種本能,針對某一問題點的廣度與深度之間找到適切的焦點。鄧小平就曾說過:「不管黑貓或白貓,能抓到老鼠的就是好貓」。其實這就是把系統當作黑箱 (black-box)的封裝概念了。 :)

設計模式 (DP, Design Pattern)內的「Facade」,即為強調封裝某一主體 (context)內部繁雜的細節。

例如,兩大平台的 Web MVC (Model/View/Control)是一種因應 Web 端的技術解決方案,實際上 Controller 僅為 UI 端的控制邏輯,卻不適合擔任資料存取(data access)與邏輯運算(business logic)的工作。所以在大型系統的開發上,一般會設計中間層的「領域物件 (domain controller)」,將上述兩大類的工作 (資料存取/邏輯運算)由其當窗口 (entry-poing),再視工作性質,委派 (delegate)給專司其職的成員物件 (如 DAO/Utility, Business Object ...等)。

此時「Domain Controller」就是一種系統的「Facade」物件,封裝了資料存取與邏輯運算的細節,UI 端 (Web/Standalone Form/Mobile App/外部系統)不需要知道如何處理,只要能取得所需要的結果即可。

不僅程式寫碼,在 UML 的使用案例 (use case)需求分析技術中,就擅用了封裝的技巧 (系統功能(主題)->程序/工作事項->細節(資料欄位/計算邏輯)),先抓大的操作目的,再來包容善變的細節。

在軟體工程來說,這比較能造成「低耦合 (low coupling)」的效果。

繼承 (inheritance)=> 原意其實為「擴展 (extend)」較恰當

UML 是以「一般化-特殊化 (generalization-specialization」稱之更為適切。

特殊化類別「擴展(extend)」一般化類別有兩種用意:
a). 覆蓋 (override)預設的行為 (UML 稱 operation, OOP 稱 method)。
b). 擴展原來所沒有提供的行為。

舉個簡單的例子。「保險」有一預設的行為:計算保費(),但因為不同類型的保險,它們的計算保費()邏輯實作均不一樣。「意外險」、「疾病險」、「壽險」均為「保險」的特殊化類別,因為有著不同的實作方式,所以由各自的特殊化類別 (OOP 較喜愛稱為 sub-class)來分開個別實作。

這樣有什麼好處?財務人員可以用「一視同仁」的角度 (保險),藉由共同的操作目的 (計算保費() )來操作所有的特殊化類別 (意外/疾病/壽險),但執行時 (run-time)卻是由個別的特殊化類別負責實現。這樣自然就形成後述所提「多型 (polymorphism)」的效果了。

未來要再擴展不同保險的類型,只要再新增特殊化類別即可 (當然要負責該實作邏輯),用戶端 (Client)因為沒有直接耦合,自然無需作過多的修改,也不致讓程式碼越形冗長
擁腫了。

P.S. 上述僅是領域概念 (domain concept)的解釋,當轉至軟體的設計實作階段,會再更講究精緻些,諸如分析保險的各種行為,而抽離出一群群 (group)的特殊化類別出來 (如狀態群、業務邏輯群)。

介面 (interface)/多型 (polymorphism)

介面 (對岸翻譯為接口)是一種隔離的設計應用,讓 Provider 不直接與眾多甚而Unknown Client 耦合,僅透過標準的介面制定規格 (spec.)溝通。

介面的應用在生活面比比皆是。「IPowerSupply」介面制定「供電(電流,伏特)」的規格,Provider (台電)提供符合該規格的服務,讓各類 Client (家電用品,電腦,遊戲機)只要能符合標準規格即能取得該服務 (供應電力);至於若如筆電並不符合市電規格 (110V,20A),所以需要經由調變器 (adapter)來作轉型的工作。

軟體設計實務上,一般就會建議 DAO (Data Access Object)最好為其定義存取的操作介面,將規格與實作隔離。如此爾後若實作內容(或實作技術)變動,並不致影響到 Client 端的運作。

多型上述已有提及,就是一種「一視同仁」的態度,來操作一般化的行為,但實作仍由各種特殊化類別來負責。而廣義的多型設計,其實就不只限於所謂的「繼承體系 (再強調一次,繼承這字眼不好,很容易誤導。一般化/特殊化這比較適切)」,它同時也涵蓋了介面的應用,也就是一般化類型可以是具體 (concrete)/抽象 (abstract)類別,甚或完全沒有實作的介面 (interface)。

觀察設計模式所揭露諸多的物件模型,大致會分隔為上下兩層。上層的一般化往往都會視現在已知/未來變動的權衡,而定義為抽象類別或介面,再由後續的特殊化類別來擴展(extend)或實現 (realize),Client 端永遠只與上層的一般化類型溝通,不直接與特殊化類別耦合,而這就是一種因應變動性的設計考量。

總歸上述 2,3 點,其目的就是讓「各類型的物件責任更明確,所擔負的行為更單一 (atomic)」。這在軟體工程來說,即是「高內聚性 (high cohesion)」的展現。


以上這些觀念確實為所謂物件導向分析/設計/實作 (OOA/OOD/OOP)基本功夫。主要目的是「Design for Change」,卻非是全然針對實作面「寫出來」就好的議題。

這裡就要能著實體會,OOP 所展現的程式碼特質是強調「分散」,而非「集中」,也就是讓主要類型的物件有明確的責任 (responsibility, knowing/doing)。

試想想,原來可能只是把「計算訂購總額()」的邏輯全給寫在同一支程式碼 (集中),但物件導向的作法卻很可能會把每一種的計算訂購邏輯 (如考量 bonus/coupon/special discount),從原來可能用 switch-case/if-then-else 的寫法抽離至多個 sub-class上,造成分散的效果。

一支程式碼 (single-class)被拆解為多支程式碼 (multiple-class),這對一般軟體開發人員 (尤其是入行沒多久較在乎能否寫出來的新手)而言,心態上是不容易接受的,更何況會覺得這樣更難 Debug?!

所以這類分散式特質的程式,比較會應用於大型善變化的系統,例如電子商務平台、ERP、MIS,而產品設計的態度更是需要。所取得的回饋是讓系統較有度的維護性、彈性與延展性。其實個人更寧願說:「創造系統高度的再利用價值」,這比較實在。

當然,分散式系統必須伴隨兩種配套:撰寫單元測試程式 (unit-test code),以及持續重構 (re-factoring)的態度。

分散式系統不會是一開始就能保障設計得很精確、一開始就是分散,那是一種持續重整的過程與態度。但在重整/重構的過程中,如何確保已上線的功能不會被影響?當然在每一次的修改前/後,都要跑過單元測試,那才有可能去調整修改程式碼的。

** 可以至 FB 「軟體設計鮮思維」社群內的檔案區,下載關於「物件導向基礎觀念」的簡報,同時也有提供 C#.NET/Java 程式碼的範例。另外也有其它關於軟體設計相關的案例 (C#.NET/Java 與 UML Model)可以下載參考。

實作 Enterprise MVC 巨觀結構的 POC-觀念篇

$
0
0

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

關於 POC (Proof of Concepts)的說明,可參考:「淺論架構的 POC (Proof of Concepts)」。

關於系統結構設計 (system structure design),個人把它分為兩個構面來看:巨觀與微觀 (Macro/Micro View)

巨觀結構設計是基於現實系統的分散議題-展示層 (如 Web UI)、永續儲存機制 (如 關聯資料庫),所提出核心業務邏輯應不相依於特定實體元件與實作連結技術的解決方案。這裡推出最實用具應變與可重構的實體分層框架-Enterprise MVC (Model-View-Control)模式 (並非是廠商針對 Web 端提出的 Web MVC 技術),讓系統主結構 (業務邏輯/資料存取)有效隔離展示層與永續儲存機制的直接耦合 (coupling)。

微觀結構設計則是傳統物件導向所談及從領域概念模型 (domain conceptual model),導出到軟體物件與資料模型 (class/data model)。這裡使用的分析設計技能包括了運用 Peter Coad 的「交易模式 (Transaction Pattern)」與 GoF 四人幫的「設計模式 (Design Patterns)」。有別於古典OO 一開始就要求較完整的設計 (太過理想化),現今系統開發則更為務實-運用重構 (re-factoring)的技巧,持續逐漸地重整系統,效果即是簡潔易維護的程式碼 (clean code)。而伴隨著重構的一項必要機制與紀律就必然要求一開始就要撰寫單元測試程式碼 (unit test code)。

上述兩個構面是互補的。軟體主結構一開始就不會實作於特定的UI/資料庫端,以最純淨的 POCO/POJO (plain-old CLR/Java Object)物件來實作,如此才有機會得以實施後續的重構,而重構則取決於某一功能的複雜度與價值來評估,進而創造出系統整體的再利用價值。

本文著重於巨觀結構分層界定與實踐,藉以驗證巨觀結構 POC 的可行性。觀念說明利用 UML 設計圖表現巨觀分層結構;實作則各以 C#.NET 與 Java/Spring 實現一個極小的案例來貫穿整個系統的分層結構元素。

C#.NET 採以 ASP.NET Web MVC 與 E-F (Entity Framework)實作;Java/Spring 則採以 Spring Web MVC 與 傳統 JDBC (也可改 Hibernate Framework)實作。兩者會再佐以 UML 循序圖 (sequence diagram),來輔助解讀案例執行時物件之間的互動合作關係。

巨觀分層結構基本責任界定

把主要分層結構當成元件 (component)看待,以界定各元件主要的責任 (responsibility)。

Enterprise MVC 主要元件責任界定

展示層 (Presentation tier)

主要負責收集 (例如從表單)資料與展現所處理後的資訊 (information)。展示層千萬不要擔任問題領域 (problem domain)的控制邏輯 (control logic),以及資料存取 (data access)/業務邏輯 (business logic)的工作,那會是導致系統僵化難以維護的主因。

中間層 (Middleware tier)

接收來自展示層的資料處理要求 (request),以及回傳 (response)所處理後的資訊。中間層主要擔負問題領域的控制邏輯,以及資料存取/邏輯運算等核心領域議題,所以也可稱為「業務層 (business tier)」。

資料來源層 (Data Source tier)

資料來源層可能是永續儲存機制 (如關聯資料庫),或者為需要取得支援服務的外部系統。與展示層一樣的問題是,千萬不要撰寫業務邏輯於關聯資料庫內 (典型利用 stored-procedure),因為會被該特定資料庫給綁架,且因採程序導向所撰寫的業務邏輯會導致程序碼相當冗長難以閱讀維護,均是系統僵化的主因之一。

資料模型 (Data Model)

資料模型即為廠商所定義 Web MVC 框架中的「Model」,它是作為 展示層與中間層 各類物件之間所傳遞的資料型態 (參數、回傳值)。 資料模型的實作可為「資料傳遞傳遞物件 (DTO, Data Transfer Object)」,也就是以物件型態來組織資料 (只有 getter/setter 方法);也可以是 JSON 這類簡單的 XML 結構。DTO 較適用於系統內部物件之間的資料傳遞;JSON 則適用於異質系統之間 (如透過 HTTP)所傳遞的資料型態。

注意的是,Data Model 不強調共用,每一個系統功能有自己所屬的資料傳遞的自訂型態。再則它不存在與資料庫表格一對一的對應,只要能滿足表單所需的資料收集或展示的局部欄位資訊即可,未來在中間層就是會透過 O-R Mapping 機制 (如 E.F or Hibernate 框架)作資料模型與資料庫表格之間的轉換 (transform)。

巨觀分層結構內部主要元素

Enterprise MVC 分層結構主要元素

展示層 (Presentation tier)

展示層可以是不同類型的 UI 結構元素。諸如 Windows Form/Java Swing 這類 Standalone 的表單物件;Web 端的 ASP.NET Form/Java Spring JSF (Java Server Face) Page,或為 ASP.NET MVC/Java Spring MVC 強調 View 與 UI Control 分離的設計;或是 Web Service 提供 API 供外部系統/Mobile App 等的連結。

展示層比較像是系統的門面,或可比喻為高樓大廈建築的「室內設計/裝潢」這一構面。也正因為系統會提供各類不同門面 (不同 UI 類型的呈現)的展示,所以更是不應將系統的核心邏輯撰寫於此。

中間層 (Middleware tier)

這裡依據 Ivar Jacobson 在「Object Advantage」一書所揭露的三種分析類別來界定位於中間層各類物件的基本責任:

  • 控制 (control)類別:
    實現問題領域所分析的系統功能 (system function),如源自於使用案例 (Use Case),所對應的領域控制類別 (domain control class)。控制類別負責實現某一系統功能及步驟程序,並可以直覺對應至類別名稱與方法 (系統功能→控制類別名稱;步驟→方法)。

    領域控制類別對於實作技術人員較常稱之為「服務層 (service-tier)」,主要差別在於系統功能分析的精緻度,是以單一操作目的來界定 (使用案例即採此方法),或以功能模組/模組樹方式來分析。

    領域控制類別強烈要求以 POCO/POJO (Plain-old CLR/Java Object)來實作,如此才不會被特定相關於 UI/資料庫連結/工具 等技術框架 "綁架"。它可說是建構系統的主幹,並且是系統分層中擔任「Facade」封裝物件的角色:封裝資料存取/邏輯運算,以及負責處理領域控制邏輯。

    一個必須同時要求的原則:撰寫控制類別程式碼就必須同時為其撰寫單元測試程式碼 (unit test code)。

    撰寫單元測試程式碼,未來才有機會得以對程式碼作重構 (refactoring),如此系統才能具延展性並隨時保持功能的正確性。

  • 邊界 (boundary)類別:
    主要擔任連接至外部 (資料庫/外部系統)的工作。例如 資料存取物件 (DAO, Data Access Object)實作連接至資料庫的具體連線細節,以達成將資料模型與資料庫表格間資料狀態的一致性;Adapter 物件則擔任連接外部系統的工作,並需要依循連線外部所規範的通訊協定與呼叫規格。

    邊界型物件的變動性很高,會因實作內容改變而改變,所以這類型物件只負責擔任連接與傳遞、轉型等工作,而不把業務邏輯實作在此類型的物件上。

    每一個負責實現系統功能的控制類型物件,均有各自的邊界類型物件,彼此盡量不要共用這些邊界物件,這是實作技術人員最常犯的問題,把資料存取實作成共用的儲庫 (repository),如此很難抽換。

    若多個控制類型物件想共用存取方法,那麼就為其設計共用的資料存取的介面 (interface),而不要直接連結至具體的 DAO 類型物件。

  • 實體 (entity)類別:
    實體物件又稱為企業物件 (business object),它其實才是傳統物件導向所談及源自問題領域所分析而來的物件模型。前述所提的「微觀結構設計」,即是談此這種類型物件的分析設計議題。

    實體物件是系統的核心根源,它與位於如關聯資料庫內的表格均是採以相同的手法來分析出領域模型 (domain model),但是兩者差別主要在有無更進一步分析物件的行為,讓每一種類型的實體物件行為更明確、責任更為單一,這才是傳統物件所期望的美好境界。

    但實務上,實體物件反而不一定需要存在,它可以根據系統功能行為的複雜度來決定是否需要顆粒度更精緻 (fine grained)的實體物件來處理;反之業務邏輯並不複雜,其實可以先實現於控制類型的物件,而後若當處理與判斷邏輯越形複雜時,再施以重構的手段,並衍生設計出責任更單一的實體類型物件,以更能順應業務邏輯的變動。

    GoF 四人幫的設計模式 (design pattern),其中關於 行為 (behavior)與結構 (structure)兩大類型所揭露的物件設計模式,即是針對實體物件這塊範疇作所謂更精確的「微觀結構」設計。另前述所提的「交易模式 (transaction pattern)」則可以對領域物件先作初步的分類 (人、事/時、地、物),然後再各自去延展關聯。

Enterprise MVC 的 POC,即是根據上述分層結構設計圖,採以各平台的實作技術來驗證。

後續的文章 (分兩篇),會針對 C#.NET 與 Java/Spring 各撰寫一個極小的案例,但有確實實作上述分層結構的每一種類的元素來藉此作為驗證的 POC。

「軟體需求分析與塑模」– 企業需求源自於企業價值

$
0
0

本文收錄於 我的電子書「軟體需求分析與塑模 – 第一章、需求分析概觀」。

企業需求要能提供價值 (value),如此才得以讓企業有獲利行為而能永續經營。

「價值」的呈現取決於在創新、成本、效率等因子的調和。這些因子經常是由內部工作者 (internal-worker)、產品、系統、軟體與流程 (process)等所提供並滿足其需求。最終目的當然在於讓企業創造「利潤 (profit)」。

例如,「仁心慈善醫院」是一家企業 (business),其中最主要的核心價值係提供 「醫療」的服務 (service)。為了提供「醫療」這個主要服務,企業內部必然會有多個內部工作者的協同合作,包括「醫師」、「護士」、「藥劑師」、「行政人員」… 等;涵蓋的作業流程可能有「掛號」、「看診」、「住出院」、「領藥」… 等;且為了增進處理效率與節省人力,會導入由 產品/軟硬體 所組成的資訊系統 (information system),成為工作者的協力夥伴。

除了文字陳述紀錄外,可以藉由視覺化的圖形塑模 (visualization diagram modeling),更容易表達焦點。

例如,我們可以使用 UML「使用案例圖 (use case diagram)」表達企業所提供的主要服務 (企業層級的系統功能),以及使用「業務流程圖 (business process diagram)」表達實現 (realize) 企業系統功能的主要組成元素 (內部工作者、資訊系統、主要作業流程)。

圖例、表達企業提供的主要服務

圖例、表達實現企業需求內部的主要組成元素

關於 UML (unified modeling language) 的基本介紹,以及應用在企業與資訊系統需求面的分析 Know-how,參閱後述的章節內容。


「軟體需求分析與塑模」- 什麼是系統功能

$
0
0

本文收錄於 我的電子書「軟體需求分析與塑模 – 第一章、需求分析概觀」。

系統 (system) 是由一組互動 (interacting) 或獨立的元件 (component) 所組成的整合體 (integrated whole)。

系統功能 (system functions),即為某一整合體所提供給外界 (參與者或外部系統)的一連串服務 (services)。

把企業 (business) 當成一個整合體,並藉以分析該整合體所提供的功能需求,以及組成該整合體的組成元素。這樣以企業為標的的分析塑模方式,稱為「企業塑模 (business modeling)」。

把資訊系統 (information system) 當成一個整合體,並藉以分析該整合體所提供的系統功能,以及組合該整合體的結構元素。這樣以資訊系統為標的的分析塑模方式,稱為「資訊系統塑模 (information system modeling)」。

把企業或資訊系統當為一個整合體,便可以採用相同的手法,如利用 UML (Unified Modeling Language) 語法,來分析系統需求。

「企業」與「資訊系統」兩者的關係即為,「資訊系統」為組成「企業」內部結構的其中之一的元素 (element)。而當把焦點轉移至資訊系統,探究其中所提供的系統需求 (系統功能)時,則再將「資訊系統」這個結構元素放大,並從「外」的需求分析,與「內」的結構設計來看待資訊系統的分析、設計,乃至於實作了。

參考上節範例,「診療服務」為企業的系統需求,如果企業架構師規劃了三個資訊系統 (組成元素) 的支援,參考如下圖,架構師可以利用 UML 使用案例圖表 (use case diagram) 規劃每一個資訊系統各有其需實現的系統功能,以及資訊系統之間的關係是透過介面 (interface)的連接達成所謂的「SOA (service-oriented architecture)」架構。

圖例、表達資訊系統的系統功能

至於資訊系統是如何實現系統功能,又如何連接其它外部系統,那就是所謂的系統 (這裡就是指資訊系統了) 結構設計與實作的議題了。

「軟體需求分析與塑模」- 流程與活動

$
0
0

本文收錄於 我的電子書「軟體需求分析與塑模 – 第一章、需求分析概觀」。

實現企業層級系統功能的主要組成元素是「人」,也就是多個不同角色的內部工作者 (internal worker) 在不同的時間點合作接續以完成所屬職掌的工作。

當為了履行一個企業需求,可能需一連串的活動 (activities) 循序接力達成。當然活動的執行需要有特定的參與人員,也就是會有多種不同角色 (role) 或組織 (organization) 參與。這一連串的活動即構成作業流程 (business process)。

Jacobson 為企業流程 (business process) 作了一個簡單的定義:

Put simply, a business process is the set of internal activities performed to serve a customer.
Object Advantage》, Ivar Jacobson, 1994
(簡單地說,企業流程就是要能夠服務客戶的一連串企業內部的活動)

而關於「活動 (activity)」的定義 (from Wiki):

Activity is a major task that must take place in order to fulfill an operation contract.
(活動是一個必須履行的主要工作,為以滿足一個操作上的契約。)

參考下圖範例係利用 UML 活動圖 (activity diagram) 繪製傳統人工「訂購-出貨」作業流程。從該案例可以得知,這一連串從訂購到出貨的活動,會有多個不同組織部門的工作人員參與。當完成這一連串活動後,即滿足主要的企業需求-「訂購商品」。

圖例、傳統人工訂購-出貨作業流程

「軟體需求分析與塑模」- 物件合作

$
0
0

本文收錄於 我的電子書「軟體需求分析與塑模 – 第一章、需求分析概觀」。

實現 (realize) 軟體資訊系統功能,從物件導向 (object-oriented) 的觀點來看待時,系統內部的主要組成元素是「物件」,也可以稱為「個體 (instance)」。可以想像軟體系統內部就是由擔任各種不同職掌的類型物件,為實現某一特定功能,在動態期間 (run-time) 的互動合作來協力完成。

關於物件如何分類 (classify),這就是所謂物件導向結構設計的議題。分類作得好,讓系統具有低耦合 (low coupling) 、高內聚 (high-cohesion)的特性,如此系統的應變更具彈性、延展性,並得以提昇再利用性的高度價值。

參考下圖範例,是利用 UML 循序圖 (sequence diagram) 表達實現「餐飲管理系統」其中「點餐」系統功能的物件合作 (object collaboration) 情形。程式開發人員應該可以很容易對應至程式碼的類別 (class) 與方法 (method) 的實作。

圖例、實現「點餐」系統功能的物件合作循序圖

軟體結構設計是屬於系統的內部結構設計議題,而需求分析則是站在系統外部的觀點來看待系統所提供的服務 (系統功能),這是完全不同的兩種構面,不能混為一談。一般在需求分析階段,是會把系統當成「黑箱 (black blox)」來看待,只專注在外界 (人或外部系統) 如何與系統的溝通互動,至於系統內部如何組織分類與實作,那就會由結構與程式設計師來負責的。

「軟體需求分析與塑模」- 需求分析人員的職掌

$
0
0

本文收錄於 我的電子書「軟體需求分析與塑模 – 第一章、需求分析概觀」。

針對「需求」作描述、紀錄與分析的人員統稱為「需求分析師 (requirement analyst, RA)」。

而以「企業」或「資訊系統」作為分析的標的來區分,需求分析人員的角色 (role) 可分為兩種:企業分析師 (business analyst, BA) 與資訊系統分析師 (information system analyst, 簡稱 SA)。

BA 涵蓋的分析範疇較 SA 來得廣,自然需較有整體性的架構觀;但相對細節,如對某一資訊系統的畫面操作或單一業務規則 (business rule),則無法來得比 SA 精細。

一般而言,BA 涵蓋的範疇有:

  • 企業策略的規劃。
  • 業務流程的制定與再造 (BPR, Business Process Re-engineering)。
  • 企業的塑模 (business modeling)。
  • 多個資訊系統之間的訊息交換與整合。

而對於資訊系統分析師 SA,一般較僅以單一資訊系統為分析的範疇:

  • 紀錄與描述未來某些活動 (activities) 會由資訊系統實現的作業流程。
  • 界定系統功能與非系統功能需求 (functional and non-functional requirements)。
  • 表單畫面的操作程序。
  • 表單需要的欄位資訊與業務規則的整理。

對於資訊系統的技術議題,SA 係從系統外觀 (把系統當黑箱) 看待系統所提供的服務 (系統功能),以及實現該功能的操作程序、業務邏輯與所需欄位資訊等。所以 SA 一般不會涉及到結構性的設計議題,諸如資料庫的資料模型 (data model) 設計,那是由 SD (System Designer) 所負責;以及程式寫碼的實作議題,那是由 Programmer 負責。

再則 BA/SA 一般並不需具備某一領域 (domain) 的相關知識,那應是由領域專家 (domain expert) 所負責。但BA/SA 需能具備與領域專家溝通的技能,例如了解該領域所常使用的詞彙術語與其意涵。

另 BA/SA 合作的對象除了領域專家外,當然會包括各類開發人員,諸如專案經理 (Project Manager)、SD (System Designer)、Programmer (程式設計師) …等。

而訪談的對象也包括了客戶單位的利益關係人 (stakeholder)、操作人員 (operator) …等。

簡而言之,BA/SA 最大的挑戰在於如何與各類不同角色的人員達成順暢的溝通,並進而引導發掘出其潛在甚或模糊的需求,且得以條理分明地讓開發人員理解而轉成實作的程式。

「軟體需求分析與塑模」- UML 應用於需求分析的技術

$
0
0

本文收錄於 我的電子書「軟體需求分析與塑模 – 第一章、需求分析概觀」。

UML (Unified Modeling Language) 係由 OMG (Object Management Group) 所制定的一種以圖形作為軟體塑模 (modeling) 的標準。UML 2.X 規格總共制定了 14 種涵蓋軟體包括結構面與行為面的設計圖,其中適用於需求分析的設計圖主要有兩種:

  • 活動圖 (activity diagram):描述單一作業的業務流程。
  • 使用案例模型 (use case model):紀錄與描述系統功能。包含使用案例圖 (use case diagram) 與使用案例敘述 (use case description) 。

UML 活動圖比較適合描述單一作業流程內部的活動。所謂的「單一」業務流程係指在該流程內諸多活動的協力合作,以完成某一特定的企業目標 (specific business goal)。例如「請購流程」,它的目的在於:決定優先順位的供應商;而至於「採購流程」,它的目的在於:採購高品質的物料。

這些各有不同目的的作業流程,彼此之間可能會有某些關聯存在。例如上述的 「請購流程」,它會產出一請購確認的資訊,然後再將其傳入至「採購流程」。

利用活動圖並不適合描述有多個作業流程之間的關係,因為它揭露了作業流程內部的活動。描述過多的細節反而會失去多個作業流程之間關係表達的焦點。

適合描述多個作業流程的關聯的設計圖,可以利用UML for Erikson-Penker 企業擴充模型 (uml business extension model) 。下圖即為一個電子化採購系統關於「請購」與「採購」的「火箭圖」[註1]。

[註一] 因為 Erikson-Penker 語法內關於作業流程的圖示呈現的是一種 IPO (Input-Process-Output) 類似火箭的圖樣,所以簡稱為「火箭圖」。

圖例、請採購業務流程擴充模型圖 (多個作業流程的塑模)

圖例、請採購業務流程擴充模型圖 (多個作業流程的塑模)

圖例、請購作業流程活動圖 (單一作業流程的塑模)

圖例、請購作業流程活動圖 (單一作業流程的塑模)

至於資訊系統的系統功能分析,則以使用案例圖 (use case diagram)來作為塑模的表達。它很容易可以界定出系統開發/維護範圍、外界 (使用者/外部系統)與系統的關係。

圖例、電子化採購系統使用案例圖 (系統功能的塑模)

圖例、電子化採購系統使用案例圖 (系統功能的塑模)

另外也會使用系統循序圖 (system sequence diagram),表達參與者 (actor,一般指使用系統的人/角色,以及支援服務的外部系統。) 與系統之間的互動訊息 (message)。

系統循序圖是一種系統功能「實現 (realization)」的表達。如下圖 描述的是「Web ATM」系統其中「轉帳」系統功能的實現。系統分析師可以用此來表達參與者與系統/外部系統之間的訊息傳遞的互動關係。

圖例、實現「轉帳」系統功能的系統循序圖 (描述系統功能實現的塑模)

圖例、實現「轉帳」系統功能的系統循序圖 (描述系統功能實現的塑模)
Viewing all 31 articles
Browse latest View live