2018-06-24

IFC的物件導向架構

在開始閱讀本文之前,
您應該已經對於 IFC的作用IFC的優缺點有一定的了解,
更進一步,如果您了解
一、物件導向 (Object-oriented)
二、繼承 (Inheritance)
三、多型 (Polymorphism)
四、抽象 (Abstraction)
這些概念的話,會對閱讀本文有所幫助,
如果不懂也沒關係,我會盡量簡單的在本文中介紹其原理。

一、物件導向 (Object-oriented)
IFC本身是採用物件導向架構,
而物件導向是一種「以真實世界的狀態」來描述資料的方式,
物件導向最基本的組成概念有三個:
1. 物件 (Object):
或稱為實體(Instance),基本概念就是一個實際上存在的東西,例如一台車牌是ABC-1234的Tesla Model X,或一本名為哈利波特第一集的書本都可以視為一個物件。
2. 類別 (Class):
基本概念就是一個物件的分類名稱,例如汽車、書本,都可以視為一個類別。
3. 屬性 (Properties):
基本概念就是一個物件的資料,例如「車牌」是「ABC-1234」,這裡的「車牌」就是一個屬性,而「ABC-1234」就是這個屬性的值。

當然,套用到AEC產業常見的狀況,
類別可能是「柱」,物件可能是的「混凝土柱」,
屬性可能有「名稱」為「C14」、「材質」為「混凝土」、「強度」為「5000psi」

套用一個最簡單的卡氏座標點的IFC資料行來看:
#43516 = IFCCARTESIANPOINT((7820.2955167228, 610.415423053157,514.28509535737));
其中類別就是IFCCARTESIANPOINT,物件代碼是#43516
屬性是 (x,y,z)(7820.2955167228, 610.415423053157,514.28509535737)
以上便是最基本的物件導向應用於IFC之架構。

二、繼承 (Inheritance)
類別之間有繼承關係,這個常會用「父」與「子」的關係來說明,
簡單來說,「子類別」會具有「父類別」的所有屬性,
但「子類別」通常會比「父類別」更具體一些,
例如「車」的子類別可能有「汽車」、「機車」、「腳踏車」,
在IFC裡面,地址的定義描述如下:
ENTITY IfcAddress
ABSTRACT SUPERTYPE OF(ONEOF(IfcPostalAddress,IfcTelecomAddress))
Purpose : OPTIONAL IfcAddressTypeEnum;
Description : OPTIONAL IfcText;
UserDefinedPurpose : OPTIONAL IfcLabel;
END_ENTITY;

從上述定義可以發現,地址類別又分成兩種子類別,
一種是「郵件地址」另一種是「通訊地址」,
另外其他的欄位是非必要欄位,在這裡先不解釋。

「郵件地址」的定義描述為:
ENTITY IfcPostalAddress
SUBTYPE OF (IfcAddress );
InternalLocation : OPTIONAL IfcLabel;
AddressLines : OPTIONAL LIST [1:?] OF IfcLabel;
PostalBox : OPTIONAL IfcLabel;
Town : OPTIONAL IfcLabel;
Region : OPTIONAL IfcLabel;
PostalCode : OPTIONAL IfcLabel;
Country : OPTIONAL IfcLabel;
END_ENTITY;

「通訊地址」的定義描述為:
ENTITY IfcTelecomAddress
SUBTYPE OF (IfcAddress );
TelephoneNumbers : OPTIONAL LIST [1:?] OF IfcLabel;
FacsimileNumbers : OPTIONAL LIST [1:?] OF IfcLabel;
PagerNumber : OPTIONAL IfcLabel;
ElectronicMailAddresses : OPTIONAL LIST [1:?] OF IfcLabel;
WWWHomePageURL : OPTIONAL IfcLabel;
END_ENTITY;

從這邊可以發現,兩種是完全不同的描述方法,
但都可以讓視為一個人的聯絡方式,
且都有幫你完整的考量各種情境,
例如Pager(呼叫器)可能在某些地區還是主要的聯繫方式,
這也是採用國際通用格式的一種好處。

三、多型 (Polymorphism)
簡單來說,就是可以用「父類別」來代替「子類別」進行定義描述,
而在實際產生物件的時候,再給予實際的類別即可。

聽起來有點複雜,我們用IfcOrganization(組職)來看,
ENTITY IfcOrganization;
Id : OPTIONAL IfcIdentifier;
Name : IfcLabel;
Description : OPTIONAL IfcText;
Roles : OPTIONAL LIST [1:?] OF IfcActorRole;
Addresses : OPTIONAL LIST [1:?] OF IfcAddress;
END_ENTITY;

在組職中,其中有一個欄位是地址,
這個欄位的定義是 IfcAddress
但實際在建置該物件時,
該屬性可以填入IfcPostalAddress 或 IfcTelecomAddress
這就是最簡單的「多型」的概念。

四、抽象 (Abstraction)
抽象其實就是一個「不會有實體的父類別」,
例如剛剛的IfcAddress定義裡有一個關鍵字「ABSTRACT」,
即為抽象類別,該類別不會有實體物件,
只會被拿來當作一個代稱,
常見的範例有「車」、「狗」、「貓」、「人」等,
不會有一個實體的東西叫做「車」,至少會是個「汽車」,
但你可以稱一台「汽車」為「車」。

了解上述四個定義,就可以看懂IFC的基本物件定義,
詳細的IFC定義可以直接從官方網站取得。

沒有留言:

張貼留言