Giao diện và hợp đồng

Một phần của tài liệu Xây dựng ngôn ngữ mẫu cho lập trình dựa trên thành phần (Trang 26)

Dấu hiệu đặc trưng cho một thành phần là giao diện của nó dùng để mô tả các dịch vụ nào nó cung cấp và những dịch vụ nào nó đòi hỏi từ môi trường. Hợp đồng là sự đặc tả giao diện của nó [6]. Từ những nội dung đã trình bày trong những phần trước, chúng ta đưa ra định nghĩa hình thức của hai khái niệm này trong lập trình dựa trên thành phần như sau:

Định nghĩa 2 (Giao diện):

Một giao diện là một cặp I = (Ip, Ir) , ở đây Ip = <Fdp, Mdp>, và Ir = <Fdr, Mdr>. Ip được gọi là giao diện cung cấp của I, và Ir được gọi là giao diện đòi hỏi của I; Fdp, Fdr là tập các thuộc tính và Mdp, Mdr là tập các phương thức.

Định nghĩa 3 (Hợp đồng):

Một hợp đồng là một bộ I Init MSpec Inv Inv Pro, , , p, r, . Ở đây:

I (Ip,Ir) là một giao diện. Cho MdMdrMdp, FdFdrFdp

Init là một sự khởi tạo, gán mỗi biến trong Fd và mỗi biến cục bộ với một giá trị cùng kiểu.

Mspec là sự đặc tả phương thức, kết hợp mỗi phương thức op in out( , )

trong MdMdrMdp với một thiết kế ,FP.

Invp và Invr là các hợp đồng bất biến trên các thuộc tính cung cấp và các thuộc tính đòi hỏi trong hợp đồng. Invp trình bày một tính chất không đổi của giá trị các biến trong sự khai báo thuộc tính Fdp, là có thể thỏa mãn bất cứ lúc nào khi mà nó được truy cập từ các thành phần khác. Vì thế, Invp được đặc biệt thỏa mãn bởi Init. Invr trình bày tính chất đòi hỏi về giá trị của các biến trong Fdr khi chúng được cung cấp.

Pro là một giao thức, nó là một tập con của tập

{ ?, !|m m mFdp} { ?, !| m m mFdr}. Chỉ có các hành vi tương ứng trên

{ ?, !|m m mFdp} và trên { ?, !|m m mFdr} thuộc về Pro là được phép.

Hợp đồng của một thành phần trình bày những gì thành phần trông đợi từ môi trường của nó và những gì nó có thể cung cấp cho môi trường. Các biến trong Fd là chỉ đọc đối với các hợp đồng khác. Invp trong một hợp đồng đưa ra tính chất các biến của hợp đồng là thứ mà nó cung cấp cho môi trường, và vì vậy phải được đảm bảo bởi bất kỳ phương thức nào của hợp đồng.

Chúng ta xem xét một giao thức liên quan như thế nào với sự đặc tả các dịch vụ. Có thể thấy với một phương thức m, kí hiệu ?m!m là sự yêu cầu (cho giá trị của tham số) và sự kết thúc (lấy kết quả dịch vụ) của m. Khi ấy, hiển nhiên mỗi ?m sẽ tương ứng với chính xác một !m, và ngược lại, mỗi !m sẽ tương ứng với chính xác một hành động yêu cầu ?m. Với một phương thức m, nó có thể cho phép vài tiến trình sử dụng m tại cùng thời điểm (như vài sự sao chép của m

thể là vài sự kiện khác của ?m giữa chúng. Số cực đại các yêu cầu ?m với không có sự kết thúc tương ứng tại một thời điểm là mức độ song song mà m có thể đề nghị và được miêu tả rõ ràng trong giao thức. Một cách thông thường, bất kỳ phương thức m không thể được sử dụng song song với chính nó và với các phương thức khác trong thành phần. Trong trường hợp này, giao thức có thể được đặc tả như một biểu thức thông thường {? ! |m m mMd}. Khi mọi phương thứcc m có thể sử dụng song song với chính nó và song song với các phương thức khác, giao thức được miêu tả bởi biểu thức ||m Md {? ! }m m , ở đây || biểu thị sự đưa vào toán tử kết hợp song song.

Định nghĩa 4 (Làm mịn hợp đồng):

Hợp đồng Ctr1 (Ip1,Ir1),MSpec Init Inv1, 1, p1,Invr1,Pro1 là được làm mịn bởi hợp đồng Ctr2  (Ip2,Ir2),MSpec Init Inv2, 2, p2,Invr2,Pro2, ký hiệu là CtrCtr2 nếu:

Fdp1Fdp2, Fdr2 Fdr1

1 1

2| 1|

p p

Fd Fd

InitInit . Ở đây với hàm f và tập A,

|A

f ký hiệu cho giới hạn của f trên A.

Mdp1Mdp2 và Mdr2 Mdr1.

Với mọi phương thức op được khai báo trong Mdp1 ta có

1( ) 2( )

MSpec op ô MSpec op và Invp2 Invp1.

Với mọi phương thức op được khai báo trong Mdr2 ta có

2( ) 1( )

MSpec op ô MSpec op và Invr1Invr2.

 1 1 1 { ?, !|| } 2 { ?, !|| } p p m m m Fd m m m Fd Pro  Pro 2 {| ?, !| 2} 1 {| ?, !| 2} r r m m m Fd m m m Fd Pro   Pro

Chúng ta giải thích định nghĩa này như sau: Ctr2 cung cấp mọi dịch vụ mà

Ctr1 thực hiện, thậm chí tốt hơn, và có thể cung cấp nhiều hơn, và Ctr2 cần ít các dịch vụ hơn Ctr1. Điều kiện Inv2  Inv1 nói lên tính chất của các biến được bảo toàn bởi Ctr1 là cũng bảo toàn bởi Ctr2. Tóm lại, hợp đồng Ctr2 cung cấp các dịch vụ nhiều, tốt hơn và cần ít hơn các dịch vụ từ môi trường của nó so với hợp đồng Ctr1. Do đó, chúng ta có thể sử dụng Ctr2 để thay thế Ctr1 mà không mất bất cứ dịch vụ nào.

Các hợp đồng có thể được kết hợp bằng nhiều cách để hình thành nên một hợp đồng mới, tuy nhiên khó khăn là sự tính toán giao thức của hợp đồng kết hợp. Một cách đơn giản nhất để kết hợp hai hợp đồng là đặt chúng cùng nhau nếu chúng có các tập các thuộc tính và tập các phương thức là phân biệt.

Định nghĩa 5 (Kết hợp các hợp đồng):

Cho Ctri  (Ipi,Iri),MSpec Init Invi, i, pi,Inv Prori, i, i = 1, 2 là các hợp đồng có các tập rời nhau của các thuộc tính và các phương thức (yêu cầu và cung cấp). Sự hợp nhất Ctr1 và Ctr2 là một hợp đồng: 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 ( , ), , , , , ( || ) p p r r p p r r Ctr Ctr

I I I I MSpec MSpec Init Init Inv Inv

Inv Inv Pro Pro Pro Pro

 

     

   

Vấn đề cần được quan tâm trong định nghĩa này là giao thức cho sự kết hợp hợp đồng được định nghĩa như thế nào. Khi đặt các hợp đồng cùng nhau, do chúng được giả sử là độc lập, tất cả các phương thức và các đặc điểm của chúng có thể được sử dụng song song. Kết hợp song song Pro1|| Pro2 miêu tả chính xác tình trạng đó. Tuy nhiên, hợp đồng hợp nhất cũng cho phép các phương thức trong một thành phần cá thể được sử dụng theo cách thông thường của chúng.

Cách khác để kết hợp các hợp đồng là kết nối các phương thức yêu cầu của một hợp đồng tới các phương thức cung cấp của một hợp đồng khác.

Cho Ctri  (Ipi,Iri),Mspec Init Invi, i, pi,Inv Prori, i, i = 1, 2 là các hợp đồng có sự tương hợp giữa các tập hợp những thuộc tính cung cấp và các phương thức, như là f (Fdp1Fdp2)dẫn đến Init f1( )Init2( )fop(Mdp1Mdp2)(Mdr1Mdr2) dẫn đến MSpec op1( )MSpec op2( ) . Giả sử rằng Ir1Ip2 , Invp2Invr1 và

1( ) 2( )

Mspec op ô Mspec op cho mọi opMdr1. Sự ghép nối đầy đủ của Ctr1 vào Ctr2, ký hiệu là Ctr1 >> Ctr2 được định nghĩa là:

1 1 1 2 1 2 2 1 2 1 2 1 2 2 ( , ), | , | , , , p r p p r Md Fd p p r Ctr Ctr

I I I Mspec Mspec Init Init Inv Inv Inv Pro

 

   â  

Ở đây Pro được định nghĩa ở dưới , và (InitInit2)( )x được định nghĩa là: 1( ) 2( )

Init xInit x nếu xdom Init( 1)dom Init( 2)

1( )

Init x nếu xdom Init( 1) \dom Init( 2)

2( )

Init x nếu xdom Init( 2)dom Init( 1)

Chúng ta sẽ xem xét một giao thức Pro được tính toán như thế nào từ Proi, với i = 1, 2 cho hợp đồng Ctr1 >> Ctr2 .

 Thứ nhất, hợp đồng kết hợp Ctr1 >> Ctr2 sẽ cũng cho phép các phương pháp trong một thành phần cá thể được sử dụng theo cách thông thường của chúng. Vì thế, Pro1 Pro2 sẽ được chứa trong Pro.

 Các phương thức m từ Ctr2 là không được đòi hỏi bởi Ctr1 có thể được sử dụng song song với các phương thức trong Ctr1. Vì thế Pro sẽ chứa

1|| ( 2 {! , ? | p2 \ }

Pro Prom m mMd Md.

 Với câu hỏi một phương thức m trong Mdp2Mdr1được sử dụng với một phương thức trong Mdp1 như thế nào thì câu trả lời phụ thuộc vào mức độ thống nhất của m. Sự tính toán cho trạng thái này là phức tạp, và được để mở ở đây.

Vì thế, chúng ta định nghĩa:

1 2 1|| ( 2 {! ,? | p2\ r1})

ProProProPro Prom m mMd Md

Khi Ctr1 >> Ctr2 được xác định, chúng ta nói rằng Ctr1 là có thể nối lại với

Ctr2. Lưu ý rằng khi kết nối hai hợp đồng theo cách này, thành phần kết quả có thể không được dùng để thay thế Ctr1. Nguyên nhân là nó có thể đòi hỏi vài thứ từ môi trường mà Ctr1 không có.

Một phần của tài liệu Xây dựng ngôn ngữ mẫu cho lập trình dựa trên thành phần (Trang 26)

Tải bản đầy đủ (PDF)

(57 trang)