CHƯƠNG 1. MÔ HÌNH HÓA ĐỐI TƯỢNG Mô hình hóa hướng đối tượng (Object-oriented modeling – OOM) là phươnng pháp dùng để mô hình hóa các chươnng trình máy tính theo phương pháp hướng đối tượng (OOP). Trước khi đến với phương pháp hướng đối tượng, người ta chủ yếu sử dụng phương pháp lập trình thủ tục (procedural programming), là phương pháp lập trình hướng đến cung cấp các chức năng của chương trình cho hệ thống sử dụng. Mô hình hóa hướng đối tượng giúp chúng ta hướng đến sự phức tạp của bài toán bằng cách xem xét bài toán không phải là tập các chức năng được thực hiện mà là tập các đối tượng liên quan tương tác lẫn nhau.
Việc mô hình hóa vì vậy tập trung vào đặc tả các đối tượng, tập các thuộc tính và phương thức của chúng trong một ngữ cảnh xác định. Chương đầu tiên giới thiệu tổng quan, các nguyên tắc và các khái niệm cơ bản về mô hình hóa hướng đối tượng. Các nguyên tắc cơ bản của hướng đối tượng Dựa trên đặc điểm của phươnng pháp hướng đối tượng, người ta đưa ra 4 nguyên tắc chính của mô hình hướng hóa hướng đối tượng là: Sự trừu tượng hóa, tính đóng gói, tính mô-đun hóa, sự phân cấp 1. Sự trừu tượng hóa Trừu tượng hóa (Abstraction) là việc xây dựng một mô hình chỉ bao gồm các đặc điểm quan trọng, cần thiết và phân biệt với các đặc điểm của mô hình khác, mô hình này đã xóa bỏ các đặc tính chi tiết, ít quan trọng và không cần thiết để tạo thành một mô hình có các đặc tính riêng biệt.
Trừu tượng hóa cho phép chúng ta quản lý sự phức tạp của mô hình bằng cách chỉ quan tâm đến các đặc điểm cần thiết của các thực thể để phân biệt với các thực thể khác trong mô hình. Chúng ta cũng cần chú ý rằng trừu tượng hóa phụ thuộc vào ngữ cảnh, vì vậy những gì quan trọng ở trong ngữ cảnh này có thể không quan trọng trong ngữ cảnh khác. Trong lý thuyết về lập trình hướng đối tượng, trừu tượng hóa là các phương pháp để xây dựng các đối tượng đồng thời nó được xem như các tác nhân ảo có thể thực hiện các hành vi, tự thay đổi trạng thái của mình và có thể giao tiếp với các đối tượng khác trong hệ thống. PHÂN TÍCH VÀ THIẾT KẾ HƯỚNG ĐỐI TƯỢNG |2 Các ngôn ngữ lập trình hướng đối tượng thường cho phép trừu tượng hóa các thực thể tương tự nhau, vấn đề này nhằm mục đích hỗ trợ cho kỹ thuật đa hình (polymorphism) trong lập trình hướng đối tượng, là kỹ thuật cho phép thay thế kiểu của đối tượng bằng một kiểu khác có vai trò tương tự.
Xem xét một ví dụ về một chương trình viết bằng Java để biểu diễn một số con vật có cùng mức trừu tượng hóa. Trong chương trình này, lớp Animal dùng để biểu diễn trạng thái của con vật và các hành vi của chúng. public class Animal extends LivingThing { private Location loc; private double energyReserves; boolean isHungry() { return energyReserves < 2.5; } void eat(Food f) { //Consume food energyReserves += f.getCalories(); } void moveTo(Location l) { loc = l; } } Với các định nghĩa trên, chúng ta có thể tạo ra các đối tượng với kiểu Animal và gọi các phương thức của chúng như sau: thePig = new Animal(); theCow = new Animal(); if (thePig.isHungry()) { PHÂN TÍCH VÀ THIẾT KẾ HƯỚNG ĐỐI TƯỢNG |3 thePig.eat(tableScraps); } if(theCow.eat(grass); } Trong ví dụ trên, lớp Animal là sự trừu tượng hóa sử dụng cho các con vật hiện tại, LivingThing được xem như sự trừu tượng hóa ở mức cao hơn của Animal, dùng để mô tả tất cả lớp các động thực vật có sự sống. Tính đóng gói Tính đóng gói (Encapsulation) là sự quy tụ các tính chất (các thuộc tính và các hành vi) vào trong một hộp đen của sự trừu tượng hóa, cho phép ẩn đi sự cải đặt ở phía sau các giao diện.
Tính đóng gói thường được đề cập đến với khái niệm che giấu thông tin (Information hiding), cho phép sự truy cập đến các thành phần thông qua các giao diện mà không cần biết sự cài đặt của nó. Tính đóng gói loại bỏ sự phụ thuộc trực tiếp trong cải đặt giữa các thành phần. Vì thế có thể thay đổi sự cài đặt của thành phần mà không cần cập nhật các thành phần khác và giao điện cũng không thay đổi. Sự thay đổi trong cài đặt của một thành phần không ảnh hưởng đến các thành phần khác vì vậy việc bảo trì dễ dàng và chỉ phi thấp hơn.
Sự đóng gói cũng cho phép bảo vệ các trạng thái nội tại của đối tượng bởi các đối tượng bên ngoài và bảo vệ các đối tượng bên ngoài bởi sự thay đổi cài đặt của đối tượng này. Trong kỹ thuật đóng gói, dữ liệu được tổ chức sao cho các đối tượng ở lớp khác không truy nhập được vào những thuộc tỉnh riêng và chỉ cho phép các hàm trong cùng lớp hoặc trong những lớp có quan hệ kế thừa với nhau được quyền truy nhập đến vùng cho phép. Vùng công khai của lớp thì cho phép mọi đối tượng được phép PHÂN TÍCH VÀ THIẾT KẾ HƯỚNG ĐỐI TƯỢNG |4 truy nhập. Các hàm công khai của lớp đóng vai trò như là giao diện của các đối tượng với phần còn lại của hệ thống.
Tính mô-đun hóa Tính mô-đun hóa (Modularity) có thể được định nghĩa như là sự phân chia các khối vật thể lớn thành các nhóm nhỏ và cấu trúc đơn giản hơn. Các hệ thống phần mềm được phát triển thường rất phức tạp. Để dễ dàng hiểu được hệ thống, chúng ta thường phân chia thành các thành phần nhỏ hơn và các thành phần này được quản lý một cách độc lập. Sự phân chia hệ thống theo cách này gọi là tính mo - đun hóa.
Đó là công việc quan trọng để phát triển các hệ thống lớn và phức tạp. Ví dụ với Hệ thống đăng ký môn học (Course Registration System), hệ thống này cho phép sinh viên trong Trường đại học đăng ký môn học theo học chế tin chi, thanh toán tiền học phi theo số tín chỉ đăng ký. Đây là một hệ thống lớn và phức tạp, thường được các nhóm phát triển phân chia thành ba phần độc lập như sau: - Hệ thống thanh toán tiền - Hệ thống cung cấp danh sách môn học - Hệ thống quản lý sinh viên. Sự phân cấp Sự phân cấp (Hierarchy) có thể được định nghĩa như là sự sắp xếp thứ tự hoặc phân hạng sự trừu tượng hóa của các đối tượng theo một cấu trúc cây.
Các kiểu của sự phân cấp bao gồm: phân cấp toàn thể - bộ phận, phân cấp lớp, phân cấp các đối tượng chứa nhau, phân cấp sự kế thừa, phân cấp theo kiểu của đối tượng. Sự phân cấp là một cách tổ chức theo kiểu phân loại. Sử dụng sự phân cấp cho phép chúng ta dễ dàng hơn để nhận biết sự giống nhau và khác nhau giữa các phân lớp. Ví dụ, trong thực vật học, người ta thường tổ chức cây cối theo họ để dễ dàng phân biệt và tìm mối liên hệ giữa các loài cây khác nhau.
Trong kỹ thuật hướng đối tượng, sự phân cấp cũng thường được sử dụng để tổ chức các đối tượng trong hệ thống. PHÂN TÍCH VÀ THIẾT KẾ HƯỚNG ĐỐI TƯỢNG |5 1. Khái niệm cơ bản về mô hình hướng đối tượng 1. Đối tượng Khái niệm đối tượng cho phép người phát triển phần mềm biểu diễn các khái niệm thế giới thực trong bản thiết kế phần mềm của họ.
Các khái niệm thế giới thực này có thể là một thực thể vật lý như người, xe tải, con chó, cái bàn, xe đạp. Các đối tượng cũng có thể là các khái niệm về một tiến trình hóa học hoặc thuật toán. Các đối tượng thế giới thực có cùng 2 đặc điểm chung là các trạng thái và hành vi. Con chó có các trạng thái (tên, màu sắc, no, đói) và hành vi (sủa, chạy, vẫy đuôi).
Xe đạp có trạng thái (nhịp bản đạp, tốc độ) và hành vi (thay đổi nhịp bàn đạp, phanh xe). Xác định trạng thái và hành vi của các đối tượng thế giới thực là một phương pháp để bắt đầu cách nghĩ về mô hình hóa hướng đối tượng. Với mỗi đối tượng trong thực tế, chúng ta có thể đặt hai câu hỏi: "Có những trạng thái nào của đối tượng?" và "Những hành vi nào đối tượng có thể thực hiện?". Hãy quan sát và viết ra những gì nhìn thấy được, chúng ta có thể thấy rằng, chiếc đèn bàn có thể có 2 trạng thái: bật (on) và tắt (off), có 2 hành vi bật đèn (turn on) và tắt đèn (turn off), nhưng chiếc radio có thể có thêm các trạng thái: bật (on), tắt (off), âm lượng hiện tại (current volume), kênh hiện tại (current station) và hành vi bật đài (turn on), tắt đài (turn off), tăng âm thanh (increase volume), giảm âm thanh (decrease volume), tim kênh (seek), dò kênh (scan), và chỉnh sóng (ture).
Chúng ta cũng nhận thấy rằng, một số đối tượng chứa các đối tượng khác. Những quan sát thế giới thực này đều được chuyển vào thế giới của lập trình hướng đối tượng. Các đối tượng phần mềm được mô hình tương tự các đối tượng thế giới thực: chúng gồm các trạng thái và hành vi. Một đối tượng cất giữ các trạng thái của nó trong thuộc tỉnh (là biến trong một số ngôn ngữ lập trình) và thể hiện hành vi của nó qua các phương thức (là các hàm trong một số ngôn ngữ lập trình).
Các phương thức dùng để thay đổi trạng thái của đối tượng, ngoài ra còn dùng để giao tiếp với các đối tượng khác. Che giấu các trạng thái nội tại và yêu cầu tất cả sự tương tác được thực hiện thông qua phương thức của đối tượng là cơ chế Đóng gói dữ liệu. PHÂN TÍCH VÀ THIẾT KẾ HƯỚNG ĐỐI TƯỢNG |6 Hình 1.1 Mô hình hóa xe đạp Xem xét ví dụ một chiếc xe đạp được mô hình hóa như một đổi tượng phần mềm (Hình 1. Chuyển các trạng thái vào thuộc tỉnh của đối tượng (tốc độ hiện tại (current speed), nhịp bàn đạp hiện tại (current pedal cadence), và trạng thái líp hiện tại (current gear)) và cung cấp các phương thức để thay đổi các trạng thái, đối tượng bảy giờ đã được sẵn sàng sử dụng bởi các đối tượng bên ngoài.
Lớp đối tượng Một lớp định nghĩa một khung chứa các cấu trúc và hành vi chung của các đối tượng. Các đối tượng được tạo ra từ lớp được gọi là các thể hiện của lớp. Lớp là sự mô tả tĩnh và đối tượng là các thế hiện khi chạy của lớp Nhắc lại rằng, mô hình hóa là quá trình trừu tượng hóa các đối tượng của thế giới thực vào ngữ cảnh của hệ thống.