系統介面定義

系統介面定義

一套系統最重要的部分,除了產品本身,最重要的部分在我認定,就是系統與系統之間的介面,這個介面的定義其實很廣泛,可以分為下面幾個類型:

  • 人與系統
    • User Interface:人與系統間最常見的就是的使用者的操作介面,簡單的說就是 UI
    • Output File:輸出的文檔其實泛指很多,比較常見的就是 Text File、Excel、Word...等
  • 系統與系統:
    • API:Application Programming Interface,又稱為應用程式編程介面,一般會用這種 API 作為溝通的介面大多會比較偏向是
      • 較為舊型的系統:一般目前的主流已經偏向是 Web Service、RestFul、MQTT...這類的通訊方法
      • 標準系統:像是Excel、Word這類偏向是標準外購的系統
      • Database:數據庫是透由驅動 API 讓你調用
    • Database:很多系統都是透過 DB 來進行資料交換、這類的交換方式是最常見,但是交互速度偏慢,比較常看到會是像設備的上位機系統與中控系統間通訊方式就是透過 DB
    • File:File 也是常見的一種類型,但是缺點是這類的交易只能侷限在本機端,離開本機端之後,因為有安全性的限制,所以為了要解決這問題會變成很麻煩
    • TCP:這種通訊方式在10年前是非常大量的在使用,他是所有通訊模式最底層的通訊方式,幾乎目前你可以看到網路通訊的底層技術都還是使用 TCP/IP 的方式,但是它有很多致命的缺點,像是它會有信息空中碰撞的問題;漏封包的問題、SEQ的問題,因此後來有了握手方式、Data Collection Model 0/1/2...等的方法,來解決 TCP 所遇到的問題
    • WSDL / SOAP:這是比較近期的解決方法,它的優點是保證呼叫,也保證回應,但是它的缺點是效能上的問題,以及傳輸字數的限制。
    • Restful:這也是比較近期的解決方法,且比 WSDL / SOAP 更為新的技術,重點是它也更加輕量化,效能上也會更好
    • MQ / MQTT:這是目前比較主流的方式,且可以達到主動推播的方式,讓信息主動推到 Client 端,一般常見的有 MSMQ (Microsoft Message Queue)、Active MQ、Rabbit MQ、Zero MQ、MQTT 還有 IBM MQ...等。尤其是面對到設備的產能問題時,建議最好採用 MQ / MQTT 最為交互的解決方案,效能會遠高於 WSDL / SOAP / Restful 這類的通訊方式。
  • 程序與程序
    • 程序與程序是指程序內部的通訊方式,例如 Class這類的,這類的通訊方式大多會有像 DTO 物件、JSON、XML、Message Queue 或是像 interface class。
    • 建議不要直接用宣告調用的方式進行類與類之間的通訊,尤其是物件與物件之間的通訊方式,物件與物件之間應該要保持低耦合高內聚。

一般我們對到系統間通訊那怕是 File、TCP、Web Service ... 等,都應該要明確的定義每個接口通訊的格式。我們在系統分析之前,在做需求調研階段,應該就會整理出會有哪一些的接口,並且會產出一份接口清單出來,如圖1. 系統接口清單定義表

圖1. 系統接口清單定義表

因此我們在分析階段的時候,第一個要做的事情就是這一份規格,務必要先將這份規格先展開,請這份規格展開之後,必須要發送到所有系統負責人的手上,且須親自與系統負責人解釋清楚,接口定義一定是最重要的,且有時候往往會導致系統能否順利結案的關鍵,所以好好的分析這份規格勢必是在前期最為重要的事情,因此我們需要針對每個要傳送的欄位都比需要有一個明確的定義,如圖2. 系統接口內容定義規格表

圖2. 系統接口內容定義規格表 -1

從圖二中我們可以看到我們會先定義這個接口的編號、輸送方式、接口說明、啟動時間,並且針對內部細項也需要逐一地去陳列清楚包含資料意義、資料字串長度、資料類型、資料說明...等,都必須要有清楚的說明。

圖3. 這是一種類型的接口資料定義,其實定義方式也是大同小異,主要也是針對要傳遞的內容去定義清楚,且包含了 Request 與 Response 都必須要明確的定義清楚。

圖3. 系統接口內容定義規格表 -2

最後是一個圖3 的資料範例,這是一個 Json 的資料格式範例,當然它可以是 Json 一樣的它也可以是 XML 主要還是看在定義時,雙方的認定

Request

{
"MESSAGE_ID":"machine.running.notice.process",
"REQ_ID":"REQ_20170321123313213",
"SITE":"TCI01",
"FACTORY":"503",
"LINE_ID":"TCI01-S0503",
"OPERATIO":"TCI01-S0503-01",
"STATION":"1",
"RESOURCE":"50301",
"SEND_TIME":"2018/06/07 21:18:23",
"STATUS":"1"
}

Response

{
"RESULT": "1",
"REQ_ID":"REQ_20170321123313213",
"MESSAGE": ""
}