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.2 Mơ hình hóa biểu đồ lớp trong UML
Định nghĩa 3.1 (Biểu đồ lớp trong UML (Mơ hình - Model)). Một biểu đồ lớp được biểu diễn bởi một bộ - 2 CD = hΣC,ΣAi, trong đó ΣC là tập hợp các lớp và ΣA là tập hợp các kết hợp giữa các lớp.
Hình 3.4 mơ tả một phần hệ thống rút tiền tự động ATM (Automated
Teller Machine) đơn giản, minh họa cho khái niệm Mơ hình. Ở đây:
ΣC = {Customer, Transaction, Account, SavingAccount, CheckingAccount,
WithDrawl, Transfer} và
ΣA = {Tập hợp các liên kết giữa các lớp trong mơ hình}.
Định nghĩa 3.2 (Lớp (Class)). Một lớp C ∈ ΣC được biểu diễn bởi bộ - 3 C =hNC,MC,ACi, trong đó NC là tên của lớp, MC là tập hợp các phương thức và AC là tập hợp các thuộc tính.
• Lớp Account trong Hình 3.4 có: – tên lớp: Account;
– tập các thuộc tính của lớp: AAccount ={type, owner, minBalance}; – tập các phương thức của lớp: MAccount ={checkBalance()}.
Định nghĩa 3.3 (Phương thức của lớp (Method of a class)). Một phương thức mCi ∈MC được biểu diễn bởi bộ - 3 mCi =NMCi ,PMCi ,RMCi , trong đó Ni
MC là tên của phương thức, Pi
MC là danh sách tham số và Ri
MC là kiểu của phương thức.
Customer customID: String customName: String customAddress: String +owner() z SavingAccount +caculateInterest() period: String accID: String +balance: Real interestRate: real Transaction type: TRANSACTIONTYE date: DATE transID: int +update() CheckingAccount accNumber: String +balance: Real Withdrawl +withdrawl() amount: Real Transfer amount: Real accountNumber: String Account type: ACCOUNTTYPE owner: String +minBalance: Real +checkBalance() invariants: balance > =minBalance preconditions: amount > 0 balance amount >= minBalance postconditions: balance = balance amount
Hình 3.4: Một phần mơ hình hệ thống ATM đơn giản
Định nghĩa 3.4 (Thuộc tính của lớp (Attribute of a class)). Một thuộc tính aCi ∈AC được biểu diễn bởi bộ - 3 aCi =NACi ,TACi ,PACi , trong đó NACi là tên của thuộc tính, Ti
Ai là kiểu của thuộc tính và Pi
AC là biểu thức logic vị từ biểu diễn cho các ràng buộc bất biến trên thuộc tính này.
Trong Hình 3.4, giá trị của thuộc tính balance thuộc vào lớp con Che- ckingAccount phải lớn hơn hoặc bằng giá trị của thuộc tính minBalance
của lớp chaAccount. Đây chính là biểu thức lơ gic vị từ biểu diễn cho ràng
buộc bất biến trên thuộc tính balance.
Định nghĩa 3.5 (Bất biến của lớp (Class invariants)). Bất biến của lớp C , ký hiệu là INVC, được xác định bởi sự kết hợp của các biểu thức logic vị từ biểu diễn cho ràng buộc trên các thuộc tính của lớp.
Giả sử, PACi biểu thức logic vị từ biểu diễn ràng buộc trên thuộc tính ai
C ∈ AC (trong trường hợp thuộc tính ai
C khơng có ràng buộc, giá trị của biểu thức Pi
AC sẽ được gán là đúng (true)) và ký hiệu | AC |= n (lực lượng của tập hợp AC). Khi đó, bất biến của lớp C được mơ tả bởi cơng thức sau
đây:
INVC =Vni=1Pi AC
LớpCheckingAccounttrong Hình3.4 bao gồm hai thuộc tínhaccNum- ber và balance. Trong đó, thuộc tính accNumber phải thỏa mãn điều kiện khác null và thuộc tính balance thuộc vào phải lớn hơn hoặc bằng giá trị của thuộc tính minBalance của lớp cha Account. Khi đó bất biến của lớp CheckingAccount được xác định như sau:
INVChecckingAccount ={accNumber 6=null} ∧ {balance >=minBalance}
Định nghĩa 3.6 (Bất biến của mơ hình (Model invariants)). Bất biến F
của mơ hình M được định nghĩa bởi sự kết hợp của tất cả các bất biến của các lớp có trong mơ hình.
Giả sử mơ hình M bao gồm hai lớp C và D , bất biến của mơ hình M
được biểu diễn bởi cơng thức F = INVC ∧INVD, trong đó INVC và INVD tương ứng là bất biến của các lớp C và D .
Định nghĩa 3.7 (Quan hệ Kết hợp trong biểu đồ lớp của UML). Một kết hợp as ∈ΣA được biểu diễn bởi bộ - 3 as =hNas,Eas1,Eas2i, trong đó Nas là tên của kết hợp, Eas1,Eas2 là mấu kết hợp 1 và mấu kết hợp 2.
Định nghĩa 3.8 (Mấu của Kết hợp (Association End)). Một mấu kết hợp EASi được biểu diễn bởi bộ - 2 EASi =hNCL,MULTii, trong đó i ∈ [1,2] và NCL,MULTi tương ứng là tên của lớp tham gia vào quan hệ kết hợp và lực lượng của mấu kết hợp.
Định nghĩa 3.9 (Sự tương đương về ngữ nghĩa của hai phương thức (Se- mantic equivalent between two methods)). Cho cặp phương thức mCi và mDj , trong đó mi
C ∈MC và mDj ∈MD. Khi đó, mi
C và mDj được gọi là tương đương về mặt ngữ nghĩa và biểu thị bởi biểu thức Mi
C ∼=Mj D khi: NMi C ≡NMj
D // hai phương thức có cùng tên Pi
MC ≡PMDj //trùng số lượng, tên, kiểu và thứ tự của danh sách tham số Ri ≡Rj //hai phương thức có cùng kiểu trả về
Khi đó MC ∪MD được phân chia thành các lớp tương ứng và biểu diễn bởi công thức MC,D ={mCij,D}, trong đó:
mi C,mDj ∈mC,Dij ⇔ mi C ∈MC mDj ∈MD Mi C ∼=Mj D
Ký hiệu phương thứcmCi trong tậpMC và không thuộc bất kỳ tậpmC,Dij
nào bằng biểu thức MC \ MC,D.
Định nghĩa 3.10(Cặp thuộc tính có thể kết hợp (Composable Attributes)).
Cho cặp thuộc tính aCi và aDj , trong đó aCi ∈AC và aDj ∈AD. aCi và aDj được gọi là có thể kết hợp và biểu thị bởi cơng thức Ai
C ∼=Aj D khi: NADi ≡NAj
D //hai thuộc tính có cùng tên Ti
AD ≡TAj
D //hai thuộc tính có cùng kiểu
Ở đây Pi
AC và PAj
D có thể tương đương hoặc khơng tương đương.
Khi đó AC ∪AD được phân chia thành các lớp có thể kết hợp và biểu thị bởi AC,D ={aCij,D}, trong đó: ai C,aDj ∈aCij,D ⇔ ai C ∈AC aDj ∈AD Ai C ∼=Aj D Ký hiệu ai
C trong tập hợp AC nhưng không thuộc về bất kỳ tập hợp
AijC,D nào bởi biểu thức AC \ AC,D.
Trong các Chương3và Chương 4luận án định nghĩa một cách hình thức khái niệm tái cấu trúc. Tuy nhiên, các khái niệm này không hề bị trùng lặp
bởi lý do, các tiến trình tái cấu trúc được đề cập trong hai chương là khác nhau. Cụ thể, Chương 3 tái cấu trúc được thực hiện thơng qua các phép tốn liên quan đến biểu đồ lớp còn Chương 4tái cấu trúc lại được thực hiện bằng cách áp dụng mẫu thiết kế. Luận án định nghĩa về tiến trình tái cấu
Định nghĩa 3.11 (Tiến trình tái cấu trúc (Refactoring Process)). Một tiến trình tái cấu trúc R được biểu diễn bởi cơng thức:
R :M7−−−−−→ MOPname 0
trong đó M và M0 tương ứng là các mơ hình ban đầu và mơ hình sau tái cấu trúc, OPname là tên của phép toán tái cấu trúc được áp dụng.
Chú ý rằng, trong chương này luận án chỉ đề cập đến các phép toán tái cấu trúc trên biểu đồ lớp (Folding, Abstraction, Composition, Factoring và Unfolding) có liên quan đến quan hệ phân cấp trong kế thừa. Và như đã đề cập, mục tiêu nghiên cứu của chương này là sự bảo toàn các bất biến sau tiến trình tái cấu trúc. Bởi vậy, luận án cũng định nghĩa sự bảo tồn bất biến trên mơ hình tái cấu trúc như sau:
Định nghĩa 3.12 (Bảo tồn bất biến trên mơ hình tái cấu trúc (Invariant Preservation of Refactored Model)). Mơ hình tái cấu trúc M0 được gọi là bảo tồn các bất biến của mơ hình M sau tiến trình tái cấu trúc nếu với mỗi phép tốn tái cấu trúc được thực thi, mơ hình M0 thỏa mãn các bất biến của mơ hình M và cơng thức bất biến F0 của mơ hình M0 khi hạn chế trên mơ hình M bằng chính cơng thức bất biến F của mơ hình M.
Một cách hình thức hóa, cho R :M7−−−−−→ MOPname 0 là tiến tình tái cấu trúc, mơ hình tái cấu trúc M0 được gọi là bảo toàn bất biến của mơ hình ban đầu
M nếu: F ⇒ F0 F0|M=F (3.1)
Trong đó, F và F0 tương ứng là các biểu thức logic vị từ biểu diễn bất biến của các mơ hình M và mơ hình M0. OPname là phép tốn tái cấu trúc được áp dụng. Trong trường hợp này, nếu F ⇒ F0 thì miền giá trị của F0 rộng hơn miền giá trị của F và F0|M= F đủ để đảm bảo rằng mơ hình sau tái cấu trúc bảo tồn các bất biến của mơ hình ban đầu.
3.4.3 Khn mẫu biễu diễn các phép tốn tái cấu trúc
Trước khi trình bày chi tiết từng phép tốn tái cấu trúc áp dụng đối với biểu đồ lớp, luận án mô tả chi tiết khuôn mẫu (template) của từng phép
toán. Cụ thể, mỗi phép tốn được mơ tả bởi năm thành phần: (1) Tên, (2) Tình huống áp dụng, (3) Mơ hình khởi đầu, (4) Mơ hình tiến hóa và
(5) Biểu diễn bằng ký pháp UML, cấu trúc này được minh họa như trong
Bảng 3.1.
Bảng 3.1: Khn mẫu biểu diễn phép tốn tái cấu trúc
Định danh Diễn giải
Tên Tên của phép tốn tái cấu trúc
Tình huống áp dụng Tình huống phổ biến nên áp dụng phép tốn tái cấu trúc Mơ hình khởi đầu Thơng tin về mơ hình trước tái cấu trúc
Mơ hình tiến hóa Thơng tin về mơ hình sau khi thực hiện tái cấu trúc Biểu diễn bằng UML Minh họa phép toán bằng các ký pháp của UML
Việc mô tả khuôn mẫu của các phép tốn tái cấu trúc giúp người phát triển hệ thống có một cái nhìn chi tiết và chính xác về q trình tái cấu trúc cũng như đưa ra những gợi ý ban đầu về khả năng áp dụng các phép toán tái cấu trúc vào trong những ngữ cảnh đặc biệt.
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 toà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 qt hóa (generalization) và chun 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 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