Chương 3 Ngôn ngữ mẫu đặc tả thành phần
3.2 Đặc tả giao diện
Để đặc tả một thành phần, chúng ta bắt đầu từ phần này với định nghĩa giao diện. Sau đó chúng ta chỉ ra một số giới hạn của các giao diện có thể hợp thành như thế nào, từ đó định nghĩa giao diện kế thừa.
3.2.1 Giao diện sơ cấp
Một giao diện sơ cấp I là một tập các đặc tính, ở đây một đặc tính có thể hoặc là một thuộc tính x: T hoặc một phương thức op(in:U,out:V), ở đây in là các
tham số giá trị và out là các tham số kết quả. Vì thế một giao diện được gọi là
một cặp I:<A, M>, ở đây A biểu thị tập các thuộc tính, và M là tập các phương thức của giao diện I. Chúng ta giả sử rằng tên thuộc tính và tên phương thức là khác nhau, và ta gọi Atrr(I) và Meth(I) lần lượt là tập thuộc tính và tập phương
thức của I. Với một họ các giao diện I, chúng ta sử dụng Meth(I) để biểu thị tập các phương thức của tất cả các giao diện trong I. Một giao diện sơ cấp có thể
được đặc tả theo định dạng dưới đây:
Một phương thức op(in:U,out:V) M lấy in của kiểu U như là các tham số đầu vào của nó, và out của kiểu V như là các tham số đầu ra của nó. Chúng ta
giả sử rằng khơng có biến nào trong in hoặc out xuất hiện trong tập A.
Ví dụ: giao diện từ thành phần GIS sẽ thiết lập kết nối với khách hàng, trường hợp một khách hàng có thể nhập một yêu cầu để tìm địa điểm hiện tại của một bưu kiện qua IlocalizeParecel. Sự đặc tả của giao diện này như sau:
Interface CustomerService {
Attribute: P: Set(Pname); // tập các tên bưu kiện
S: Set(Cname); // tập các tên khách hàng
owns: Cname x Pname; // ownns(s,p): khách hàng s sở hữu p loc: Pname → Position; // trả về địa điểm của p
Method: LocalizeParcel((Pname pId, Cname sId), Position location);
DispatchParcel((Pname pId, Cname sId))
}
3.2.2 Kết hợp và thừa kế giao diện
Trường hợp thơng thường là chỉ có một giao diện yêu cầu được đặc tả trong sự đặc tả một thành phần, nhưng khi có một số thành phần, mỗi thành phần cung cấp một phần các thao tác trong giao diện yêu cầu. Khi đó chúng ta cần đặt các thành phần này cùng nhau để cung cấp một giao diện đơn phù hợp với giao diện yêu cầu. Hai giao diện I:<A1, M1> và J:<A2, M2> là có thể kết hợp nếu những
điều kiện sau đạt được:
1. Bất kỳ tên thuộc tính dùng chung phải được trang bị cùng kiểu trong hai giao diện, ví dụ nếu x : T1 A1 và x : T2 A2 thì T1 = T2.
2. Nếu I và J dùng chung một phương thức, thì chúng phải có cùng ngun
mẫu đối với phương thức đó, và hơn nữa chúng phải có cùng tập thuộc tính, ví dụ nếu op in U out V( i: i, i: )i Mi , với i = 1, 2 thì A1 = A2,
1 2, 1 2
in in out out , U1U V2, 1V2.
Định nghĩa 1 (Kết hợp các giao diện): Cho {Ik:A Mk, k |k K} là một họ xác định của các giao diện có thể kết hợp. Sự kết hợp của chúng âk K Ik được định nghĩa là , k K k df k k k K k K I A M â
Lý do cần thừa kế giao diện là bởi một thành phần có thể chỉ cung cấp một phần các dịch vụ cần dùng cho một thành phần khác hoặc vài thao tác được cung cấp là không thực sự phù hợp cho nhu cầu. Chúng ta vẫn có thể sử dụng như một thành phần bằng cách viết lại một số thao tác hoặc mở rộng nó với vài thao tác và các thuộc tính khác. Các dịch vụ được cung cấp mới này có thể được nhận ra bởi các thành phần khác, hoặc có thể được lập trình sử dụng các thao tác kế
thừa, hoặc viết lại một vài thao tác kế thừa. Nếu một thành phần nhận ra giao diện kế thừa được yêu cầu trong thiết kế giao diện mở rộng, thành phần đó khơng được thay đổi mặc dù những thao tác cung cấp của nó có thể được sử dụng trong thiết kế cho những thao tác bổ sung hoặc cho các thao tác kế thừa được ghi đè. Vì thế, mục đích trên hết của thừa kế là sử dụng lại (reuse) và mở rộng (extension) hoặc tiến hóa (evolution).
Ta xét trường hợp đơn giản, khi một giao diện được thừa hưởng từ một giao diện khác. Cho J:<A1, M1> là một giao diện, giả sử rằng A2 là một tập các thuộc tính và M2 là tập các phương thức, nếu khơng có thuộc tính của A1 xuất hiện
trong A2, và khơng có phương thức trong M1 trùng với phương thức khác trong M2. Khi đó ký hiệu: I extends J with <A2,M2> để miêu tả một giao diện <A, M> có các tập thuộc tính và phương thức được định nghĩa bởi:
1 2, 1 2
df df
A AA M M M .
Trong trường hợp tổng quát, đa kế thừa được ký hiệu theo mẫu: I extends {Ik | k K} with <A, M>, điều này định nghĩa một giao diện I extends âk K Ik with
<A, M>. Ở đây {Ik | k K} là tập các giao diện có thể kết hợp được.