2024年10月26日 星期六

FHIR SDK(DotNet)- FHIR Type Framework - Base

上一篇已經提到這個東西,搞定這個應該就成功一半。只是很遺憾的告訴各位,真的要完成,要等Complex Type搞定之後,才能夠真正完成架構。因為那個該死的Element。

再把這張仔細端詳,Root Class叫做Base。跟所有物件導向程式語言一樣,都會有一個Root Class,在C#就是Object。先撇開子類別Resource這一支,那是另外一個故事。
Base很單純就是一個抽象類別。哈~別被騙了,他是整體架構的靈魂,什麼方法或屬性是所有繼承之下的類別會共用呢?別忘了,兩大分支Primitive Type與Complex Type。Complex Type的屬性的資料型態有可能是另一個Complex Type,也有可能就是Primitive Type。而Primitive Type原則上應該是沒有欄位,他只會有個最終Value,但是,他的父類別中,有個Element,也就讓他有了欄位。更糟糕的是,其中一個欄位的屬性,居然是Extension,也就是說,Primitive Type其實有Complex Type屬性。這就是設計的關鍵所在。



什麼是繼承者共同擁有的呢?回答這個問題之前,應該先說FHIR就是衍生自HL7 v3,他就是原生的XML,然後定義了JSON是怎麼一回事,RDF是怎麼一回事。

就採JSON概念吧,其實說穿了就是Key-Value結構。Key的部份,很容易理解,就是Element Name(Tag Name),只要注意這個Key是不可重複。啊~不可重複?FHIR不是一堆重複嗎?觀念糾正,Element Name沒有重複(這句話到這邊還算正確,之後就不是了,之後要說FHIR Path不重複),而是Value的部份重複。

這個Value非常有趣,他可能是單純Value,也有可能是物件,也有可能是陣列。應該要用什麼來表達呢?其實這塊DotNet Framework已經幫我們解決了。有興趣深入研究者就參考這兒吧。https://learn.microsoft.com/zh-tw/dotnet/api/system.text.json.nodes?view=net-8.0

以下是Base Class的程式內容


其中_Properties就是用來存放任何FHIR中的類別,而_ElementProperties是為了那萬惡的Eelement,讓整個Base的通用性高一點。其他的函數很容易理解。

注意,GetPropertyValues為什麼是給_ElementProperties呢?因為他的繼承者就是Element,只有當Element的而非Null時,這個_ElementProperties才有意義。
Element的繼承者是DataType從這之下又是另一個故事。






沒有留言:

張貼留言