2019年1月5日 星期六

HL7 FHIR 核心觀念 - 物件導向

講了一堆Data Type,也牽扯到Resource,好像有點混雜。其實說穿了一句話就是物件導向(Object-Oriented)。
所謂「天下萬物」,是的,在我們眼中所有東西都是物件(Object)。
物件為了方便歸類,所以,有了類別(Class)來規範物件應該要有哪些”特徵”,才屬於同一類。
既然是歸類,就會發生粗分與細分。用專業一點的用語則是一般化(Generalization)與特殊化(Specialization)。
你,我,都是物件,都是屬於人這個類別。但是,就目前情境來說,我是老師,您是學生。所以,老師類別是(is-a)人類別,學生類別是(is-a)人類別。老師與學生類別還可以再細分,如果有需要的話。人類別也可以再往上粗分,例如動物類別。所以,往上歸類就是Generalization,往下細分就是Specialization。這樣的關係,我們稱之為繼承(Inheritance)。
再舉一個例子,交通工具<--汽車。交通工具<--機車。汽車與機車分別繼承了交通工具,但是,汽車有門,機車沒有門。是的,門也是物件。所以說,汽車有(has-a)門。有點要注意,有些汽車是四個門,有些卻有兩個門。(這塊要看,四個門的車與兩個門的車還有哪些差異,若很多,那要再細分物件,若只差門的數量,那是限制式)
從英文的角度,類別喜歡用首字大寫方式表達。物件則是小寫。
===========
畢竟這不是物件導向的教材,先談到這。主要是要引出is-a與has-a的觀念。
HL7 FHIR中,所有提到的東西都是類別,我們產生出來的xml或json才是物件。
Data Type與Resource之間的關係是has-a,其他則是is-a的關係。
已命名化的Resource,就是最底層之類別。他們繼承(is-a)了DomainResource。
而DomainResource繼承了Resource。Resource是最頂層物件。(就物件導向程式語言來說,就是Object)。
可以大膽的說,不是走這條繼承路線的,都不被稱之為Resource。
Primitive Types是最底層類別,他們繼承了Element,自身不帶特徵。
部分Primitive Types則是繼承了其他Types,自身也不帶特徵。
例如:
code, markdown id繼承了string。
unsignedInt, positiveInt繼承了integer。
url, canonical uuid oid繼承了uri。
(注意,這邊用小寫,違反了前面提到的類別習慣首字大寫)
其他的Types也是底層類別,他們繼承了Element,自身還有帶特徵。
部分Types則是繼承了其他Types,帶特徵。
例如:
Duration, MoneyQuantity, SimpleQuantity繼承了Quantity
還有一個ElementDefinition繼承了BackboneElement,然後在繼承於Element。

帶特徵的就是has-a關係,每一特徵都代表著是一種類別。
==========
有這個概念後,Resource與Data Type都是類別,都會有自己的Content Structure,應該就不奇怪了。然後,各自有各自的繼承體系。