蠶繭表示法

蠶繭表示法

蠶繭表示法是用於軟體設計領域的一種易理解易書寫的數據結構表示方法,蠶繭喻意一個多層次的複雜對象,然後像抽絲剝繭一樣層層剝開這個對象的內部結構,常用於數據建模,接口描述,代碼注釋等。

基本介紹

  • 中文名:蠶繭表示法
  • 外文名:Cocoon Notation
概念,對象,字典,數組,基本類型描述,

概念

一種易理解易書寫的數據結構表示方法,像抽絲剝繭一樣層層剝開一個多層次的像蠶繭一樣的複雜對象,常用於數據建模,接口描述,代碼注釋等。
下面將以實例的方式描述表示規則,並且給出了Javascript和C++兩種實現供參考。

對象

也稱為結構體(structure)或類(class).
一個對象Customer,有兩個欄位(或稱屬性)id和name,則可以表示為
Customer: {id, name}
左側是類型名(type name),一般用大寫字母開頭。右側是類型描述,使用花括弧描述對象類型,形式為{field1, field2, ...}, 括弧內是各屬性名,以小寫字母開頭。
Javascript中該對象像這樣:
var customer = {id: 100, name: "john"};
而C++中會這樣定義結構:
struct Customer {    int id;    string name;};
對象中可包含複雜類型的屬性,屬性名中使用前綴"%"標明結構體或字典,用前綴"@"標明數組,如:
Customer: {id, name, %address, @orders}Address: {country, city}Order: {id, total, @lines=[OrderLine]}OrderLine: {itemId, qty, price}
Customer對象的屬性address是一個結構體,用前綴"%"標明;屬性orders是一個數組,用前綴"@"標明。 這裡屬性address和orders沒有定義類型名,這意味著類型名與屬性名同名,即屬性address的類型為Address, 而orders的類型為Orders。 因為類型Orders未定義,但定義了其單數形式Order類型,這隱含著Orders是Order的數組。 如果寫完整則應像這樣描述:
Customer: {id, name, %address=Address, @orders=[Order]}
將Order放在中括弧中,即表示屬性orders是Order類型的數組。 Order類型的屬性lines描述為
@lines=[OrderLine]
表示它是OrderLine的數組。
屬性可以預設,還可指定預設值,如:
Address: {country?=CN, city?}
這表示屬性country可以沒有,如果沒有的話則當作值為"CN"。

字典

它是一個集合,其中每一項是一個鍵值對(key-value pair)。也稱哈希表(hash table)或映射表(map)。
使用花括弧描述字典,形式為{key => value},其中value可以是基本類型或複雜類型。 字典類型的命名應使用複數形式,或以"List", "Map"結尾,如:
Customers: { id => name }
上面定義表示,Customers是一個字典類型,每一項中主鍵表示id欄位,而值表示name欄位(基本類型)。
在Javascript中的字典類型像這樣:
var customers = {100: "john", 101: "bella"};
注意:雖然與對象類型形式上一樣,但含義完全不同。它是對象的集合,名稱也是複數形式。
在C++中一般這樣定義:
typedef map<int, string> Customers;
字典中每項的值也可以是一個對象,表示為:
Customers: {id=>Customer}Customer: {id, name}
或可以合併為:
Customers: { id=> {id, name} }
在Javascript中使用:
var customers = {    100: {id: 100, name: "john"},    101: {id: 101, name: "bella"}};
在C++中可以這樣定義類型:
struct Customer {    int id;    string name;};typedef map<int, Customer> Customers;

數組

又稱順序表或列表。
使用中括弧描述數組,形式為[ element ]。命名時應使用複數形式,或以"List", "Arr"結尾。
要表示一個簡單的列表IdList,它的每個元素是一個id,可以表示為
IdList: [id]
Customers是Customer的數組,可以表示為:
Customers: [Customer]Customer: {id, name}
或合併為:
Customers: [ {id, name} ]
在Javascript中數組類型的變數:
var customers = [ {id: 100, name: "john"}, {id: 101, name: "bella"} ]
在C++中類型常定義為:
struct Customer {    int id;    string name;};typedef vector<Customer> Customers;
如果定義了Customer, 而沒有定義複數形式Customers, 則默認Customers是它的數組;反之,如果定義了複數形式Customers/CustomerList/CustomerMap/CustomerArr, 則Customer可以不定義,默認它是前者集合中的值元素。
有時可以用數組替代對象類型,比如Customer有兩個元素,第一個是id, 第二個是name, 則可以表示為:
Customer: [id, name]
用數組定義對象時,形式為[ field1, field2, ... ], 它至少應有兩個欄位。
在Javascript中的例子:
var customer1 = [100, "john"];var customer2 = [101, "bella"];
在C++中一般不這樣設計,非要用的話也可以用Variant之類的通用類型:
typedef Vector<Variant> Customer; // [id, name]Customer customer1 = {Variant(100), Variant("john")};

基本類型描述

一個複雜類型最終應分解到它所有的屬性,要么是基本類型,要么是已分解到基本類型的複雜類型。
在定義屬性時,應通過屬性名暗示類型,或通過後綴標識符標明。規則如下:
  • 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: {id, name, age&, score#, balance@, specialPrice, createTm, isNew}
簡明地定義了Customer各屬性的基本類型,在使用C++定義類型時,可能是這樣:
class Money {};struct Customer{    int id;    string name;    int age;    double score;    Money balance;    Money specialPrice;    time_t createTm;    bool isNew;};

相關詞條

熱門詞條

聯絡我們