C,m2 C, ...,mCn ; ∗ AC =a1 C,a2 C, ...,am C ;
∗ INVC = Vmi=1PACi , trong đó PACi là biểu thức logic vị từ biểu diễn ràng buộc trên thuộc tính ai
C.
– lớp dẫn xuất D = hND,MD,ADi được kế thừa trực tiếp từ lớp C;
∗ MD =mD1,mD2, ...,mDp ; ∗ AD =a1 D,a2 D, ...,aDq ; ∗ INVD = Vqi=1Pi AD, trong đó Pi
AD là biểu thức logic vị từ biểu diễn cho các ràng buộc trên thuộc tính ai
D.
– Đặt MC,D ={mCij,D} và | MC,D |=k (0≤k ≤min (n,p))
– Đặt AC,D ={aCij,D} và | AC,D |=h (0≤h ≤min (m,q))
– Điều kiện ban đầu để thực hiện phép toán này là các tập hợp MC,D =∅ và AC,D =∅.
• Mơ hình tiến hóa M0 chỉ bao gồm một lớp E như sau:
– lớp E = hNE,ME,AEi. ∗ ME =MC ∪MD
∗ AE =AC ∪AD
∗ INVE = Vm+qi=1 Pi
AE, trong đó Pi
AE biểu thức logic vị từ biểu diễn ràng buộc trên thuộc tính aEi , và:
PAEi = PAi C nếu aAi E ∈AC Pi AD nếu ai AE ∈AD
• Biểu diễn bằng UML: mơ hình khởi đầu và mơ hình tiến hóa của phép tốn Folding được minh họa như trong Hình 3.5. Giả sử rằng lớp C
có 2 thuộc tính a1,a2 và 2 phương thức m1,m2; lớp D có 2 thuộc tính
a3,a4 và 2 phương thức m3,m4, lớp D được kế thừa trực tiếp từ lớp
C, tuy nhiên, lớp C không thể hiện rõ được vai trị hữu dụng của nó trong quan hệ kế thừa (ví dụ như lớp C là lớp trừu tượng chỉ có duy nhất một lớp con D). Phép tốn Folding hợp nhất thuộc tính và hành vi hai lớp này thành một lớp duy nhất E với các luật xây dựng các ràng buộc bất biến được đặc tả như trong mơ hình tiến hóa.
3.4.4.2 Phép tốn: Abstraction
• Tên gọi: Abstraction
• Tình huống áp dụng:
– Thành phần: lớp C bao gồm danh sách dài các thuộc tính và phương thức, điều này gây khó khăn cho các hoạt động sử dụng lại;
– Mục đích: tạo lập một quan hệ phân cấp mới trong mơ hình; – Thực thi: tạo lập một lớp cơ sở mới E có hành vi trừu tượng hóa
hơn so với lớp ban đầu, sau đó xác định lớp C0 là các thành phần còn lại của lớp C sau khi đã trích lọc các thuộc tính và phương thức sang lớp E, kiến tạo mối quan hệ kế thừa trực tiếp giữa lớp cơ sở E và lớp dẫn xuất C0.
• Mơ hình khởi đầu M bao gồm một lớp C: – lớp C = hNC,MC,ACi; ∗ MC = {m1 C,m2 C, ...,mCp,mCp+1, ...,mn C} (1 ≤ p ≤ n). Giả sử rằng MC1 ={mC1,mC2, ...,mCp} và MC2 ={mCp+1,mCp+2, ...,mCn} ∗ AC ={aC1,aC2, ...,aCq,aCq+1...,aCm} (1≤q ≤m). Giả sử rằng A1 C ={a1 C,a2 C, ...,aCq }vàA2 C ={aCq+1,aCq+2, ...,am C} ∗ INVC = Vmi=1Pi AC, trong đó Pi
AC là ràng buộc trên thuộc tính
Hình 3.6: Phép tốn tái cấu trúc Abstraction
• Mơ hình tiến hóaM0 gồm hai lớp E và C0: khơng mất tính tổng qt, giả sử rằng tất cả các thuộc tính và phương thức được đưa lên lớp E, được sắp thứ tự tương ứng từ 1 đến p, và từ 1 đến k.
Lớp cơ sở E là cha của lớp C0 và được xây dựng như sau: – lớp E = hNE,ME,AEi, trong đó: ∗ ME =M1 C ={m1 C,m2 C, ...,mCp} ∗ AE =A1C ={aC1,aC2, ...,aCq}
∗ INVE = Vqi=1PAEi , ở đây PAEi ≡PAi1
C
là ràng buộc trên thuộc tính ai E. – lớp C0 = hNC0,MC0,AC0i, trong đó: ∗ MC0 =MC2 ={mCp+1, ...,mCn} ∗ AC0 =A2 C ={aCq+1, ...,am C} ∗ INVC0 = Vmi=1−qPAi C0, sao cho PAi C0 = PAi+q2 C là ràng buộc trên thuộc tính ai C0
• Biểu diễn bằng UML: Mơ hình khởi đầu và mơ hình tiến hóa cho phép tốn Abstraction được minh họa như trong Hình 3.6. Giả sử rằng lớp
C bao gồm 4 thuộc tính a1,a2,a3,a4 và 4 phương thức m1,m2,m3,m4. Phép tốn Abstraction trích lọc các thuộc tính a1,a2 và phương thức
m1,m2 từ lớp C vào lớp cơ sở E, lớpC0 là phần còn lại của lớp C sau khi trích lọc, bao gồm 2 thuộc tính a3,a4 và 2 phương thức m3,m4. Cuối cùng, xây dựng mối quan hệ kế thừa giữa lớp E và lớp C0.
E a1: type 1 a2: type 2 a3: type 3 a4: type 4 + m1(): type 1′ + m2(): type 2′ + m3(): type 3′ + m4(): type 4′ C a1: type 1 a2: type 2 a3: type 3 + m1(): type 1′ + m2(): type 2′ + m3(): type 3′ D a1: type 1 a2: type 2 a4: type 4 + m1(): type 1′ + m2(): type 2′ + m4(): type 4′
Hình 3.7: Phép tốn tái cấu trúc Composition
3.4.4.3 Phép tốn: Composition
• Tên gọi: Composition
• Tình huống áp dụng:
– Thành phần: hai lớp C và D khơng có mối quan hệ kế thừa với nhau;
– Mục đích: nhóm gộp các hành vi để loại bỏ quan hệ đa thừa kế trong mơ hình;
– Thực thi: xây dựng lớp E nhóm gộp các thuộc tính cũng như hành vi của cả 2 lớp C và D.
• Mơ hình khởi đầu M bao gồm hai lớp C và D.
– lớp C = hNC,MC,ACi bao gồm các đặc tính như sau:
∗ MC =mC1,mC2, ...,mCn
∗ AC =aC1,aC2, ...,aCm
∗ INVC = Vmi=1PAi
C, trong đó PAi
C biểu diễn ràng buộc trên thuộc tính aCi
– lớp D = hND,MD,ADi được xác định như sau:
∗ AD =a1
D,a2
D, ...,aDq
∗ INVD = Vqi=1Pi
AD, trong đó Pi
AD biểu diễn ràng buộc trên thuộc tính aDi
– MC,D ={mC,Dij } và | MC,D |=k(0≤k ≤min (n,p))
– AC,D ={aCij,D} và | AC,D |=h (0≤h ≤min (m,q))
– MC,D 6=∅ – AC,D 6=∅
• Mơ hình tiến hóa M0 chỉ gồm một lớp E duy nhất. – lớp E = hNE,ME,AEi được xác định như sau:
∗ ME ={mEi :mEi ∈ MC,D} ∪(MC \ MC,D)∪(MD \ MC,D) ∗ AE ={aEi :aEi ∈ AC,D} ∪(AC \ AC,D)∪(AD \ AC,D)
∗ INVE = Vmi=1+q−hPAEi , trong đó PAEi biểu diễn ràng buộc trên thuộc tính ai E, và: PAi E = PACi ∨PAj D nếu aAEi ∈ AC,D Pi AC nếu ai AE ∈(AC \ AC,D) PADi nếu aAEi ∈(AD \ AC,D)
• Biểu diễn bằng UML: mơ hình khởi đầu và mơ hình tiến hóa cho phép tốn Composition được minh họa như trong Hình 3.7. Giả sử rằng lớp
C có 3 thuộc tính a1,a2,a3 và 3 phương thức m1,m2,m3; lớp D có các thuộc tính a1,a2,a4 và các phương thức m1,m2,m4; chú ý rằng, a1,a2
là cặp thuộc tính có thể kết hợp được (Định nghĩa 3.10) và m1,m2 là cặp phương thức tương đương về ngữ nghĩa (Định nghĩa 3.9); các lớp
C D khơng có mối quan hệ kế thừa với nhau. Phép tốnComposition
tạo lập ra lớp E bằng cách nhóm gộp các thuộc tính và phương thức của cả 2 lớp C và D sao cho khơng cịn có sự trùng lặp của các thuộc tính có thể kết hợp và các phương thức tương đương về mặt ngữ nghĩa.
3.4.4.4 Phép tốn: Factoring
• Tên gọi: Factoring
Hình 3.8: Phép tốn tái cấu trúc Factoring
– Thành phần: 2 lớp C và D khơng có mối quan hệ kế thừa với nhau nhưng có một chung một số thuộc tính có thể kết hợp và phương thức tương đương về ngữ nghĩa;
– Mục đích: loại bỏ các thuộc tính và phương thức giống nhau; – Thực thi: xây dựng một lớp mới E bằng cách trích lọc các thuộc
tính có thể kết hợp và các phương thức tương đương về mặt ngữ nghĩa từ các lớpC và D, các lớp C0 và D0 tương ứng là phần còn lại của các lớp C và D sau khi trích chọn các thuộc tính và các phương thức. Các lớp C0 và D0 có mối quan hệ kế thừa trực tiếp từ lớp E.
• Mơ hình khởi đầu M gồm hai lớp C và D.
– lớp C = hNC,MC,ACi; ∗ MC =mC1,mC2, ...,mCn ∗ AC =a1 C,a2 C, ...,am C
∗ INVC = Vmi=1PACi , trong đó PACi biểu diễn ràng buộc trên thuộc tính ai C – lớp D = hND,MD,ADi; ∗ MD =m1 D,m2 D, ...,mDp ∗ AD =aD1,aD2, ...,aDq ∗ INVD = Vqi=1Pi AD, trong đó Pi
AD biểu diễn ràng buộc trên thuộc tính aDi
– MC,D ={mC,Dij } và | MC,D |=k (k ≤n∧k ≤p)
– AC,D ={aCij,D} và | AC,D |=h (h ≤m∧h ≤q) – MC,D 6=∅ và AC,D 6=∅.
• Mơ hình tiến hóa M0 bao gồm ba lớp E,C0 và D0. – lớp C0 = hNC0,MC0,AC0i được xác định như sau:
∗ MC0 ={mCi 0 :mCi 0 ∈(MC \ MC,D)} ∗ AC0 ={ai C0 :ai C0 ∈(AC \ AC,D)} ∗ INVC0 = V(mi=1−h)PAi C0, PAi
C0 biểu diễn ràng buộc trên thuộc tính ai
C0
– lớp D0 = hND0,MD0,AD0i được xác định như sau: ∗ MD0 ={mDi 0 :mDi 0 ∈(MD \ MC,D)} ∗ AD0 ={ai D0 :ai D0 ∈(AD \ AC,D)} ∗ INVD0 = V(qi=1−h)PAi D0, PAi
D0 biểu diễn ràng buộc trên thuộc tính ai
D0
– lớp E = hNE,ME,AEi được xác định như sau: ∗ ME ={mEi :mEi ∈ MC,D} ∗ AE ={ai E :ai E ∈ AC,D} ∗ INVE = Vhi=1Pi AE, trong đó Pi
AE biểu diễn ràng buộc trên thuộc tính ai E, và: Pi AE =Pi AC ∨PADj với ai AE ∈ AC,D
• Biểu diễn bằng UML: mơ hình khởi đầu và mơ hình tiến hóa của phép tốn Factoring được minh họa như trong Hình 3.8. Giả sử lớp C có các thuộc tínha1,a2,a3 và các phương thức m1,m2,m3; lớp D chứa các thuộc tính a1,a2,a4 và các phương thức m1,m2,m4; chú ý rằng, a1,a2
là các thuộc tính trong các lớp ban đầu có thể kết hợp m1,m2 là các phương thức trong các lớp ban đầu tương đương về ngữ nghĩa; C và
D khơng có mối quan hệ kế thừa với nhau. Phép toán Factoring tạo lập lớp E bằng cách trích lọc các cặp phương thức (m1,m2) và thuộc tính (a1,a2) từ các lớp trên. Các lớp C0 và D0 tương ứng là phần còn lại của các lớp C và D sau khi trích lọc, các lớp C0 và D0 đều là các lớp dẫn xuất trực tiếp của lớp E.
Hình 3.9: Phép tốn tái cấu trúc Unfolding
3.4.4.5 Phép tốn: Unfolding
• Tên gọi: Unfolding
• Tình huống áp dụng:
– Thành phần: lớp C với một danh sách dài các phương thức, các phương thức này không tham chiếu một cách đồng bộ đến các thuộc tính của nó;
– Mục đích: tối ưu hóa khả năng thực thi của mã nguồn;
– Thực thi: nhóm các phương thức và các thuộc tính mà nó tham chiếu thành các lớp con bắt nguồn từ lớp C, các thuộc tính sẽ được phân chia thành các tập hợp rời rạc. Tạo mối quan hệ kế thừa từ phần còn lại của lớp C tới các lớp con vừa được tạo ra. • Mơ hình khởi đầu M chỉ gồm một lớp C.
– lớp C = hNC,MC,ACi; ∗ MC ={m1 C,mC2, ...,mCn} ∗ AC ={aC1,aC2, ...,aCp,aCp+1, ...,aCp+q,aCp+q+1, ...,aCp+q+m}. Giả sử A1C ={aC1,aC2, ...,aCp}, A2C ={aCp+1,aCp+2, ...,aCp+q} and A3 C ={aCp+q+1,aCp+q+2, ...,aCp+q+m}
∗ INVC =Vp+qi=1+mPACi , trong đó PACi biểu diễn ràng buộc trên thuộc tính ai
C
∗ đoạn mã nguồn S1, S2 thuộc về phương thức m1
C tham chiếu đến các thuộc tính aC1, ...,aCp và aCp+1, ...,aCp+q, một cách tương ứng;
∗ phương thức m1
C chỉ được tạo thành từ đoạn mã S1 và S2; ∗ ở đây chúng ta chỉ thực hiện với phương thức m1
C, các phương thức khác (nếu có xảy ra) sẽ được thực hiện một cách tương tự.
• Mơ hình tiến hóa M0 bao gồm ba lớp E,C0 và D0.
– lớp C0 = hNC0,MC0,AC0i được định nghĩa như sau:
∗ MC0 ={mCi 0 :mCi 0 được tạo thành từ đoạn mã S1} ∗ AC0 =A1 C ={ai C : 0≤i ≤p} ∗ INVC0 = Vpi=1PAi C0, trong đó PAi C0 = PACi , là ràng buộc trên thuộc tính ai C0
– lớp D0 = hND0,MD0,AD0i được xác định như sau:
∗ MD0 ={mi D0 :mi
D0 được tạo thành từ đoạn mã S2} ∗ AD0 =A2C ={aCi : (p+ 1)≤i ≤q} ∗ INVD0 =Vp+qi=p+1Pi AD0, trong đó Pi AD0 =Pi AC, là ràng buộc trên thuộc tính aDi 0
– lớp E = hNE,ME,AEi được xác định như sau:
∗ ME ={mCi :mCi ∈(MC \mC1)} ∗ AE =A3
C ={ai C :ai
C ∈(AC \(AC0 ∪AD0))}
∗ INVE =Vp+qi=p+q+1+m PAEi , trong đóPAEi =PACi , là ràng buộc trên thuộc tính ai
E, và:
– các lớp C0 và D0 có mối quan hệ kế thừa trực tiếp từ lớp E và
AC0∩AD0 =∅.
• Biểu diễn bằng UML: mơ hình khởi đầu và mơ hình tiến hóa của phép tốn Unfolding được minh họa như trong Hình 3.9. Giả sử rằng lớp C
với phương thức m1 được tạo thành từ 2 đoạn mã S1 và S2; S1 tham chiếu đến a1 và S2 tham chiếu đếna2. Unfolding chia phương thức m1
thức m10 và thuộc tính a1, lớp D0 được thành lập từ phương thức m20 và thuộc tính a2; lớp E là phần còn lại của lớp C sau khi bị trích lọc phương thức m1 và các thuộc tính a1,a2. Các lớp C0 và D0 được kế thừa trực tiếp từ lớp E.
Chú ý rằng, trong mơ hình ban đầu phương thức m1 có kiểu trả về là 10 tuy nhiên, các phương thức m10 và m20 có các kiểu trả về tương ứng là 50 và 60. Đương nhiên, sẽ phải tồn tại mối quan hệ giữa kiểu của các biến a1 và a2 với kiểu của các phương thức m10 và m20 nhưng luận án không thể chỉ rõ một cách tường minh mối quan hệ này. Việc lựa chọn kiểu cho các phương thứcm10 và m20 sẽ phải tùy thuộc vào quyết định của các nhà phát triển phần mềm.
3.4.5 Chứng minh tính đúng đắn của các luật tái cấu trúc
Tiểu mục4.3.2.1đã trình bày các khái niệm của các phần tử của biểu đồ lớp trong UML một cách hình thức. Trong đó, chúng tơi đặc biệt quan tâm đến một số khái niệm quan trọng là bất biến của lớp (class invariants) và bất biến của mơ hình(model invariants). Hơn thế nữa, Định nghĩa3.12cũng giới thiệu về khái niệm bảo toàn bất biến trong tái cấu trúc (Preservation