概念
一種易理解易書寫的數據結構表示方法,像抽絲剝繭一樣層層剝開一個多層次的像蠶繭一樣的複雜對象,常用於數據建模,接口描述,代碼注釋等。
下面將以實例的方式描述表示規則,並且給出了Javascript和C++兩種實現供參考。
對象
也稱為結構體(structure)或類(class).
一個對象Customer,有兩個欄位(或稱屬性)id和name,則可以表示為
左側是類型名(type name),一般用大寫字母開頭。右側是類型描述,使用花括弧描述對象類型,形式為{field1, field2, ...}, 括弧內是各屬性名,以小寫字母開頭。
Javascript中該對象像這樣:
而C++中會這樣定義結構:
對象中可包含複雜類型的屬性,屬性名中使用前綴"%"標明結構體或字典,用前綴"@"標明數組,如:
Customer對象的屬性address是一個結構體,用前綴"%"標明;屬性orders是一個數組,用前綴"@"標明。 這裡屬性address和orders沒有定義類型名,這意味著類型名與屬性名同名,即屬性address的類型為Address, 而orders的類型為Orders。 因為類型Orders未定義,但定義了其單數形式Order類型,這隱含著Orders是Order的數組。 如果寫完整則應像這樣描述:
將Order放在中括弧中,即表示屬性orders是Order類型的數組。 Order類型的屬性lines描述為
表示它是OrderLine的數組。
屬性可以預設,還可指定預設值,如:
這表示屬性country可以沒有,如果沒有的話則當作值為"CN"。
字典
它是一個集合,其中每一項是一個鍵值對(key-value pair)。也稱哈希表(hash table)或映射表(map)。
使用花括弧描述字典,形式為{key => value},其中value可以是基本類型或複雜類型。 字典類型的命名應使用複數形式,或以"List", "Map"結尾,如:
上面定義表示,Customers是一個字典類型,每一項中主鍵表示id欄位,而值表示name欄位(基本類型)。
在Javascript中的字典類型像這樣:
注意:雖然與對象類型形式上一樣,但含義完全不同。它是對象的集合,名稱也是複數形式。
在C++中一般這樣定義:
字典中每項的值也可以是一個對象,表示為:
或可以合併為:
在Javascript中使用:
在C++中可以這樣定義類型:
數組
又稱順序表或列表。
使用中括弧描述數組,形式為[ element ]。命名時應使用複數形式,或以"List", "Arr"結尾。
要表示一個簡單的列表IdList,它的每個元素是一個id,可以表示為
Customers是Customer的數組,可以表示為:
或合併為:
在Javascript中數組類型的變數:
在C++中類型常定義為:
如果定義了Customer, 而沒有定義複數形式Customers, 則默認Customers是它的數組;反之,如果定義了複數形式Customers/CustomerList/CustomerMap/CustomerArr, 則Customer可以不定義,默認它是前者集合中的值元素。
有時可以用數組替代對象類型,比如Customer有兩個元素,第一個是id, 第二個是name, 則可以表示為:
用數組定義對象時,形式為[ field1, field2, ... ], 它至少應有兩個欄位。
在Javascript中的例子:
在C++中一般不這樣設計,非要用的話也可以用Variant之類的通用類型:
基本類型描述
一個複雜類型最終應分解到它所有的屬性,要么是基本類型,要么是已分解到基本類型的複雜類型。
在定義屬性時,應通過屬性名暗示類型,或通過後綴標識符標明。規則如下:
•Integer: 後綴標識符為"&", 或以"Id", "Cnt"等結尾, 如 customerId, age&
•Double: 後綴標識符為"#", 如 avgValue#
•Currency: 後綴標識符為"@", 或以"Price", "Total", "Qty", "Amount"結尾, 如 unitPrice, price2@。
•Datetime/Date/Time: 分別以"Tm"/"Dt"/"Time"結尾,如 tm 可表示日期時間如"2010-1-1 9:00",comeDt 只表示日期如"2010-1-1",而 comeTime只表示時間如"9:00"
•Boolean/TinyInt(1-byte): 以Flag結尾, 或以is開頭.
•String: 未顯示指明的一般都作為字元串類型。
在根據設計實現時,應將上述類型對應到所用程式語言所支持的實際類型。
例如以下定義:
簡明地定義了Customer各屬性的基本類型,在使用C++定義類型時,可能是這樣: