Xây dựng các luật tái cấu trúc

Một phần của tài liệu (LUẬN ÁN TIẾN SĨ) Một số phương pháp kiểm chứng tái cấu trúc phần mềm Luận án TS. Máy tính 624801 (Trang 56 - 67)

3.4 Phương pháp bảo toàn bất biến trong tái cấu trúc biểu đồ lớp

3.4.4 Xây dựng các luật tái cấu trúc

Trong khuôn khổ nghiên cứu của Chương3, luận án tập trung giải quyết bài toán bảo tồn bất biến của các lớp trong tiến trình tái cấu trúc (vấn đề bảo tồn hành vi sẽ được trình bày trong Chương 4). Do đó, trong chương này luận án giả định rằng tất cả các phép toán tái cấu trúc đều đáp ứng các yêu cầu về bảo tồn hành vi, nói cách khác tiền và hậu điều kiện của các phương thức đều được bảo tồn sau tiến trình tái cấu trúc của Chương 3.

Như đã trình bày, các phép tái cấu trúc phức hợp được xây dựng từ sự kết hợp một cách có thứ tự các phép tái cấu trúc nguyên thủy. Hơn nữa, việc chứng minh các phép tái cấu trúc nguyên thủy bảo toàn về mặt ngữ nghĩa đã được thực hiện bởi Slavisa Markovic trong luận án tiến sĩ của chính tác giả [40]. Bởi vậy, bất kỳ phép toán tái cấu trúc nguyên thủy nào được sử dụng trong luận án này đều coi sự chứng minh nhất quán về mặt ngữ nghĩa là điều tầm thường. Ngồi ra, chúng tơi cũng giả định một số yêu cầu sau trong quá trình thực hiện tái cấu trúc trên biểu đồ lớp của UML:

– Các phương thức trong các lớp khác nhau nhưng lại có chức năng giống nhau thì sẽ có tên trùng nhau (nếu các phương thức có các chức năng giống nhau nhưng tên khác nhau thì sẽ áp dụng phép tái cấu trúc nguyên thủy RenameMethod để chúng trở nên trùng nhau);

– Các thuộc tính trong các lớp khác nhau mà có cùng ngữ nghĩa thì sẽ có tên giống nhau (nếu các thuộc tính có ngữ nghĩa giống nhau nhưng tên khác nhau thì sẽ áp dụng phép tái cấu trúc nguyên thủy

RenameAttribute để chúng trở nên giống nhau).

Tái cấu trúc được biết đến là một công việc phức hợp bao gồm trong nó nhiều tác vụ khác nhau. Tái cấu trúc thực hiện trên biểu đồ lớp được phân loại thành các hoạt động cơ bản sau: thêm (addition)/loại bỏ (removal)/di

chuyển (move) các đặc trưng của mơ hình (thuộc tính (attributes), phương thức (methods) hay các liên kết trong quan hệ kết tập (associations)), tổng quát hóa (generalization) và chuyên biệt hóa (specialization) [64]. Trong khn khổ chương này, luận án chỉ quan tâm đến các hoạt động tái cấu trúc liên quan đến biểu đồ lớp, cụ thể là Folding, Abstraction, Composition, Factoring và Unfolding. Mục tiêu của chương này là đề xuất phương pháp

bảo toàn bất biến của lớp. Để đạt mục tiêu này, luận án sẽ đề xuất các luật tái cấu trúc (refactoring rules), chính là các cơng thức tốn học xác định các ràng buộc bất biến của mơ hình tái cấu trúc từ các ràng buộc bất biến của mơ hình ban đầu. Tính đúng đắn của các luật tái cấu trúc này áp dụng trong tiến trình tái cấu trúc sẽ được chứng minh trong tiểu mục tiếp theo.

3.4.4.1 Phép tốn: Folding

• Tên gọi: Folding

• Tình huống áp dụng:

– Thành phần: 2 lớp C và D có mối quan hệ kế thừa trực tiếp; – Mục đích: giảm mức độ phân cấp trong mơ hình;

– Thực thi: kết hợp 2 lớp C và D để thành lớp mới E, lớp này chứa đựng hành vi và thuộc tính của cả hai lớp ban đầu.

• Mơ hình khởi đầu M bao gồm hai lớp C và D như sau: – lớp cơ sở C = hNC,MC,ACi;

Hình 3.5: Phép tốn tái cấu trúc Folding∗ MC =m1 ∗ MC =m1 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 tố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.

­ a1: type 1  ­ a2: type 2  ­ a3: type 3  ­ a4: type 4  + m1(): type 1′  + m2(): type 2′  + m3(): type 3′  + m4(): type 4′  ­ a1: type 1  ­ a2: type 2  ­ a3: type 3  + m1(): type 1′  + m2(): type 2′  + m3(): type 3′  ­ 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 toá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 tố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

Một phần của tài liệu (LUẬN ÁN TIẾN SĨ) Một số phương pháp kiểm chứng tái cấu trúc phần mềm Luận án TS. Máy tính 624801 (Trang 56 - 67)

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

(132 trang)