Lập mô hình với Java: Một cuốn sách bài tập về UML, Phần 2 Logic điều kiện trong các sơ đồ tuần tự Granville Miller, Tác giả, TogetherSoft Tóm tắt: Ông xem xét vai trò của logic điều kiện trong việc lập sơ đồ tuần tự và thảo luận về lý do tại sao bạn có thể chọn đưa vào hay loại ra các điều kiện và các vòng lặp từ một sơ đồ. Granville cũng mô tả hai dạng sơ đồ tuần tự sơ đồ chung (generic) và sơ đồ cá thể (instance) và giải thích các ứng dụng tương ứng của chúng trong chu kỳ phát triển. Như tôi đã giải thích trong loạt bài chuyên mục nhập môn, việc lập sơ đồ tuần tự được sử dụng để mô tả hành vi bên trong của một hệ thống theo thời gian. Vì hành vi hệ thống là kết quả của các đối tượng gửi thông điệp cho nhau, các sơ đồ tuần tự vẽ ra đường đi của các thông điệp đó khi chúng chuyển từ đối tượng này đến đối tượng khác. Sau cùng, các sơ đồ tuần tự là các bản đồ tương tác. Trong bài viết trước, chúng ta đã tạo ra một bản đồ khá đơn giản, mặc dù chúng ta đã mô tả khá nhiều tương tác. Lần này, chúng ta sẽ đào sâu hơn một chút, bằng việc xem xét hai dạng sơ đồ tuần tự do UML định nghĩa. Hai dạng đó là sơ đồ chung và sơ đồ cá thể. Hãy bắt đầu bằng việc xem xét ứng dụng thích hợp của từng dạng. Hai kiểu sơ đồ tuần tự Các sơ đồ tuần tự được sử dụng để mô tả hai kiểu tương tác khác nhau giữa các đối tượng. Một kiểu tương tác là phải tương tác (must interaction), trong đó đối tượng A phải gửi một thông điệp cụ thể đến đối tượng B. Kiểu tương tác kia là có thể tương tác (may interaction), trong đó đối tượng A có thể (nhưng không buộc phải) gửi một thông điệp cụ thể đến đối tượng B. Hai dạng sơ đồ tuần tự mô tả hai kiểu tương tác khác nhau ấy. Dạng chung mô tả các tương tác phải làm và dạng cá thể mô tả các tương tác có thể làm. Dạng chung của sơ đồ tuần tự mô tả tương tác của các lớp như là kết quả của một kích thích tố ban đầu. Dạng chung cung cấp tư liệu cho toàn bộ các tương tác mà có thể bắt nguồn từ kích thích tố ban đầu. Cả điều kiện thành công lẫn điều kiện thất bại là một phần của kiểu sơ đồ này, cũng như các vòng lặp, các điều kiện, và các rẽ nhánh. Một sơ đồ tuần tự chung chỉ chứa tên lớp trong mỗi hộp dọc theo trục ngang, như thấy trong Hình 1. Ý tưởng ở đây là đối tượng đằng sau tương tác là ẩn danh và bất kỳ đối tượng nào của lớp đó có thể tham gia vào tương tác. Do đó, tất cả các tuyến đường phải được mô hình hoá tường minh. Trong một sơ đồ tuần tự chung, đối tượng A phải gửi một trong các thông điệp trong mô hình cho đối tượng B. Hình 1. Một sơ đồ tuần tự chung Dạng thứ hai sơ đồ tuần tự là dạng cá thể. Một sơ đồ tuần tự cá thể mô tả một sự trao đổi thông điệp đơn lẻ khả dĩ giữa hai cá thể. Một sơ đồ như vậy sẽ chứa một tên biến và kiểu lớp của nó trong hộp dọc theo trục ngang, như Hình 2. Dạng này không bao gồm các vòng lặp, các điều kiện, hoặc rẽ nhánh có trong dạng chung. Trong luồng điều khiển thực tế trong hệ thống, một số xác nhận nhất định thực hiện trong quá trình tương tác có thể có kết quả sai. Nếu một xác nhận là sai, bất kỳ thông điệp nào trong sơ đồ tuần tự cá thể đều vô giá trị và kịch bản sẽ không xảy ra. Sơ đồ tuần tự cá thể mô tả một kịch bản đơn lẻ mà có thể xảy ra hoặc không. Hình 2. Một sơ đồ tuần tự cá thể Các sơ đồ tuần tự cá thể là tốt nhất để lập mô hình các kịch bản riêng lẻ trong các giai đoạn phân tích của vòng đời phát triển phần mềm. Một sơ đồ tuần tự chung có thể mô hình hoá toàn bộ ca sử dụng bao gồm nhiều kịch bản. Các kiểu hành động khác chẳng hạn như mô hình hóa giao thức được sử dụng giữa các hệ thống con hoặc khung công tác với các quần thể của chúng có thể sử dụng một trong hai dạng, tùy thuộc vào các thành phần nằm ở đâu trong vòng đời phát triển phần mềm. Dạng chung thì gần với mã lệnh thực tế sẽ được sinh ra trong sản phẩm cuối hơn dạng cá thể. Đừng bỏ lỡ phần còn lại của loạt bài "Một cuốn sách bài tập về UML" Phần 1: "Giới thiệu về các sơ đồ tuần tự" (05.2001) Phần 3: "Logic giao diện người dùng trong việc lập mô hình ca sử dụng" (06.2001) Phần 4: "Vai trò của tác nhân" (06.2002) Chúng ta đã làm việc với dạng chung trong mục trước, và sẽ tiếp tục khám phá dạng đó ở đây. Lần này, chúng ta sẽ khám phá vai trò của logic điều kiện trong một sơ đồ tuần tự chung, bằng cách này mở rộng kiến thức của bạn về ký pháp UML. Logic điều kiện trong việc lập sơ đồ tuần tự Các sơ đồ tuần tự chung sử dụng logic điều kiện, có thể hữu ích cho việc mô tả luồng sự kiện trong suốt quá trình của một tương tác. Bạn sẽ sử dụng các mức độ chi tiết khác nhau khi lập sơ đồ, tùy thuộc vào bạn đang ở đâu trong vòng đời phát triển phần mềm. Khi phân tích, bạn có thể đồng ý gác lại các chi tiết khỏi các biểu thức điều kiện của bạn, nhưng ngược lại khi thiết kế bạn có thể phải đi tiếp đến mức đưa vào các đoạn mã sẽ sử dụng trong sản phẩm cuối. Dù bạn đang ở giai đoạn nào trong chu kỳ phát triển, sự tương ứng tự nhiên giữa các sơ đồ tuần tự và một ngôn ngữ hướng đối tượng như ngôn ngữ Java trở nên rõ ràng khi nói đến vẽ sơ đồ các biểu thức điều kiện. Ví dụ, hãy xem xét một ứng dụng ngân hàng cho phép các nhân viên thu ngân nhận tiền gửi vào. Như đã xác định rõ, ngoài nhiều thứ khác, rằng hệ thống phải ngăn chặn việc để nhân viên thu ngân ghi có một khoản âm vào một tài khoản, điều mà sẽ dẫn đến khấu trừ từ tài khoản đó. Do đó hệ thống phải có một cơ chế để kiểm tra rằng bất kỳ khoản nào đã được gõ nhập là số dương. Liệt kê 1 cho thấy biểu thức điều kiện đảm bảo tiền gửi vào là số dương. Liệt kê 1. Một phương thức với một biểu thức điều kiện \** This is a method in a Teller class **\ public void receiveDeposit(Account account, BigDecimal deposit) throws ImproperDepositException { // Check to ensure the deposit is positive (deposit.compareTo(new BigDecimal(0.0)) > 0) { account.credit(deposit); } else { throw new ImproperDepositException(); } } Trong giai đoạn phân tích bạn không phải quá quan tâm đến các chi tiết này, nên sơ đồ của bạn chỉ cần thể hiện rằng khoản tiền gửi vào là dương. Trong một sơ đồ tuần tự chung, một điều kiện xuất hiện như là một sự bảo vệ với tên thông điệp ở phía trên mũi tên gọi nằm ngang (horizontal call arrow). Các điều kiện bảo vệ được bao bọc trong cặp dấu ngoặc vuông phía bên trái tên thông báo, như Hình 3. Hình 3. Một điều kiện được thêm vào trong khi phân tích Mối quan hệ giữa phương thức ở trên và sơ đồ tuần tự trở nên còn rõ ràng hơn trong Hình 4, ở đây chúng ta thấy một sơ đồ rõ ràng hơn, sao cho bạn có thể sử dụng trong giai đoạn thiết kế. Chắc chắn là toàn bộ phương thức này không được minh họa: mệnh đề else bị thiếu. Tuy nhiên, ngữ nghĩa của các mũi tên thông điệp trong sơ đồ bắt buộc rằng thông điệp đó có thể được gửi chỉ khi nào điều kiện này là có hiệu lực. Hình 4. Một điều kiện rõ ràng hơn Mệnh đề else sẽ được mô hình hoá bằng cách thêm một mũi tên gọi nữa vào giữa lớp Teller (Thu ngân) và ImproperDepositException. Đối với cuộc gọi này sẽ có một điều kiện, trái ngược với điều kiện của if; trong trường hợp này, đó là khoản gửi vào phải ít hơn hoặc bằng 0. Có lẽ bạn muốn tự mình thử mô hình hoá việc này chăng? Vẽ sơ đồ một vòng lặp for Như ví dụ trên cho thấy, các sơ đồ tuần tự chung và trong thực tế tất cả các sơ đồ UML ánh xạ chặt chẽ với cú pháp ngôn ngữ Java. Kết quả là, hầu hết các nhà phát triển Java có một sự hiểu biết trực giác các sơ đồ này, và có thể học cách sử dụng chúng khá nhanh. Để khám phá tiếp sự tương ứng giữa các sơ đồ tuần tự chung và ngôn ngữ Java, chúng ta sẽ vẽ sơ đồ vòng lặp for như thể hiện trong Liệt kê 2. Liệt kê 2. Một vòng lặp FOR for ( int i =0; i < 4; i++) { squareRoom.examineCorner(i); } Trong các sơ đồ tuần tự, phép lặp được ký hiệu bằng một dấu hoa thị (*) trước tên thông điệp trên mũi tên ngang. Nếu số lần lặp đã biết và cố định ít khi xảy ra số đó xuất hiện trong dấu ngoặc vuông tiếp sau dấu hoa thị. Do phần lớn các vòng lặp for làm việc với logic phức tạp mà không cho phép số lần lặp được xác định một cách tĩnh, bạn sẽ không thường xuyên sử dụng ký pháp kiểu dấu ngoặc này. Sơ đồ tuần tự cho vòng lặp for trên đây thể hiện trong Hình 5. Hình 5. Một sơ đồ tuần tự cho vòng lặp FOR Vẽ sơ đồ một vòng lặp while Vòng lặp while là một thí dụ hoàn hảo để xem xét kỹ hơn, vì nó kết hợp một vòng lặp với một điều kiện. Chúng ta sẽ vẽ sơ đồ vòng lặp while như thể hiện trong Liệt kê 3. Listing 3. A while loop while ( value.notFound() ) { value = database.search( key ); } Sơ đồ của chúng ta cho vòng lặp while chứa cả một điều kiện lẫn một dấu hoa thị, chỉ báo phép lặp, nhưng như bạn có thể thấy, chưa có số lần lặp. Một vòng lặp while sẽ hiếm khi gồm cả số lần lặp nếu nó không phải là một vòng lặp for được cải trang. Sơ đồ cho vòng lặp while lthể hiện trong Hình 6. Hình 6. Một sơ đồ tuần tự cho vòng lặp while Kết luận Hành vi phải làm (must) và có thể làm (may) là một khái niệm cơ sở của UML và của sự phát triển phần mềm nói chung. Các ca sử dụng nắm bắt hành vi phải làm; các kịch bản nắm bắt hành vi có thể làm. Các sơ đồ lớp nắm bắt hành vi phải làm; các sơ đồ cá thể nắm bắt hành vi có thể làm. Tôi đã tập trung vào khái niệm này vì tôi thấy rằng nhiều người không hiểu thấu được tính linh hoạt tối đa của các sơ đồ tuần tự, và bị xung đột trong nhận thức của họ và cách sử dụng từng dạng. Khi đọc các bài này, bạn nên tập trung vào việc phát triển một sự hiểu biết trực giác về ngữ nghĩa của mô hình. Khi bạn quan sát nhiều sơ đồ tuần tự hơn và bắt đầu tạo ra sơ đồ của chính bạn, bạn sẽ nhận thấy rằng nhiều sơ đồ tuần tự dựa vào sự tồn tại của logic điều kiện và bối cảnh sơ đồ để báo hiệu sơ đồ đó trình bày cái nhìn hệ thống dưới góc độ phải làm hay có thể làm. Việc tìm hiểu để nhận ra và áp dụng các phân biệt này từ sớm sẽ giúp đỡ bạn sau này khi chúng ta bước vào các kỹ thuật lập sơ đồ ngày càng phức tạp hơn. Ngoài khám phá ý nghĩa của hành vi phải làm và có thể làm trong việc lập sơ đồ tuần tự, tôi đã chỉ cho bạn cách biểu thị các điều kiện và lần lặp trong một sơ đồ. Đến lúc này bạn đã thấy cách các vòng lặp for và while được lập sơ đồ như thế nào, tôi mời bạn thực hành ký pháp mô hình hoá trên các cấu trúc Java khác, chẳng hạn như vòng lặp do-while. Khi bạn tự mình thực hành vẽ sơ đồ các cấu trúc đơn giản ấy, sự hiểu biết của bạn về cách lập sơ đồ tuần tự sẽ tự nhiên được cải thiện. Mục lục Hai kiểu sơ đồ tuần tự Logic điều kiện trong việc lập sơ đồ tuần tự Vẽ sơ đồ một vòng lặp for Vẽ sơ đồ một vòng lặp while Kết luận . logic điều kiện trong một sơ đồ tuần tự chung, bằng cách này mở rộng kiến thức của bạn về ký pháp UML. Logic điều kiện trong việc lập sơ đồ tuần tự Các sơ đồ tuần tự chung sử dụng logic điều. Lập mô hình với Java: Một cuốn sách bài tập về UML, Phần 2 Logic điều kiện trong các sơ đồ tuần tự Granville Miller, Tác giả, TogetherSoft Tóm tắt: Ông xem xét vai trò của logic điều kiện. Hình 2. Một sơ đồ tuần tự cá thể Các sơ đồ tuần tự cá thể là tốt nhất để lập mô hình các kịch bản riêng lẻ trong các giai đoạn phân tích của vòng đời phát triển phần mềm. Một sơ đồ tuần tự