Tải bản đầy đủ (.docx) (23 trang)

Báo cáo lập trình hướng đối tượng PTIT, ứng dụng QL thư viện

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (603.23 KB, 23 trang )

Báo cáo môn học Các mô hình LTTT

MỤC LỤC

Nhóm 2 – Lớp Hệ thống thông tin M16CQIS01-B

Hướng dẫn: TS Đỗ Thị Bích Ngọc


Báo cáo môn học Các mô hình LTTT

Hướng dẫn: TS Đỗ Thị Bích Ngọc

PHẦN I: MỞ ĐẦU
Trong thời đại CNTT phát triển như hiện nay, thì các nhà lập trình luôn
phải suy nghĩ xem làm thế nào để tạo ra những chương trình hay, tiện ích...Và
một trong những thứ hỗ trợ người lập trình là ngôn ngữ lập trình. Có một số
phương pháp lập trình truyền thống như lập trình tuyến tính, lập trình cấu
trúc...Với lập trình tuyến tính thì một số ứng dụng phức tạp không thể thực
hiện được. Trong khi đó với lập trình cấu trúc, chúng ta không quản lý được
sự thay đổi dữ liệu khi có nhiều chương trình cùng sử dụng một biến chung,
không tiết kiệm được tài nguyên...Để khắc phục một số hạn chế trên, người ta
xây dựng một số mô hình lập trình tiên tiến hơn như: Lập trình hàm, lập trình
logic, lập trình trực quan, lập trình tương tranh, lập trình phân tán, lập trình
hướng đối tượng....
Trong bài báo cáo này, nhóm học viên đi vào nghiên cứu mô hình lập
trình hướng đối tượng trong đó có các nội dung cơ bản gồm: Tổng quan về
lập trình hướng đối tượng; một số tính chất đặc trưng của lập trình hướng đối
tượng…
Với thời lượng quy định của một báo cáo môn học, lượng nội dung
kiến thức sẽ không đủ truyền tải hết trong báo cáo. Các nội dung được nêu


trong báo cáo chỉ là các nội dung trọng tâm nhất của mô hình lập trình hướng
đối tượng.

Nhóm 2 – Lớp Hệ thống thông tin M16CQIS01-B


Báo cáo môn học Các mô hình LTTT

Hướng dẫn: TS Đỗ Thị Bích Ngọc

PHẦN II. MÔ HÌNH LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG

I. GIỚI THIỆU VỀ LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG
Lập trình hướng đối tượng (Object Oriented Programming - gọi tắt là
OOP) hay chi tiết hơn là Lập trình định hướng đối tượng, chính là phương
pháp lập trình lấy đối tượng làm nền tảng để xây dựng thuật giải, xây dựng
chương trình. Thực chất đây không phải là một phương pháp mới mà là một
cách nhìn mới trong việc lập trình. Để phân biệt, với phương pháp lập trình
theo kiểu cấu trúc mà chúng ta quen thuộc trước đây, hay còn gọi là phương
pháp lập trình hướng thủ tục (Procedure-Oriented Programming), người lập
trình phân tích một nhiệm vụ lớn thành nhiều công việc nhỏ hơn, sau đó dần
dần chi tiết, cụ thể hoá để được các vấn đề đơn giản, để tìm ra cách giải quyết
vấn đề dưới dạng những thuật giải cụ thể rõ ràng qua đó dễ dàng minh hoạ
bằng ngôn ngữ giải thuật (hay còn gọi các thuật giải này là các chương trình
con). Cách thức phân tích và thiết kế như vậy chúng ta gọi là nguyên lý lập
trình từ trên xuống (top-down), để thể hiện quá trình suy diễn từ cái chung
cho đến cái cụ thể.
Khái niệm hướng đối tượng được xây dựng trên nền tảng của khái niệm
lập trình có cấu trúc và sự trừu tượng hóa dữ liệu. Sự thay đổi căn bản ở chỗ,
một chương trình hướng đối tượng được thiết kế xoay quanh dữ liệu mà

chúng ta có thể làm việc trên đó, hơn là theo bản thân chức năng của chương
trình. Điều này hoàn toàn tự nhiên một khi chúng ta hiểu rằng mục tiêu của
chương trình là xử lý dữ liệu. Suy cho cùng, công việc mà máy tính thực hiện
vẫn thường được gọi là xử lý dữ liệu. Dữ liệu và thao tác liên kết với nhau ở
một mức cơ bản (còn có thể gọi là mức thấp), mỗi thứ đều đòi hỏi ở thứ kia
có mục tiêu cụ thể, các chương trình hướng đối tượng làm tường minh mối
quan hệ này.
Một cách giản lược, đây là khái niệm và là một nỗ lực nhằm giảm nhẹ
các thao tác viết mã cho người lập trình, cho phép họ tạo ra các ứng dụng mà
Nhóm 2 – Lớp Hệ thống thông tin M16CQIS01-B


Báo cáo môn học Các mô hình LTTT

Hướng dẫn: TS Đỗ Thị Bích Ngọc

các yếu tố bên ngoài có thể tương tác với các chương trình đó giống như là
tương tác với các đối tượng vật lý.
Những đối tượng trong một ngôn ngữ OOP là các kết hợp giữa mã và
dữ liệu mà chúng được nhìn nhận như là một đơn vị duy nhất. Mỗi đối tượng
có một tên riêng biệt và tất cả các tham chiếu đến đối tượng đó được tiến
hành qua tên của nó. Như vậy, mỗi đối tượng có khả năng nhận vào các thông
báo, xử lý dữ liệu (bên trong của nó), và gửi ra hay trả lời đến các đối tượng
khác hay đến môi trường.
Lập trình hướng đối tượng liên kết cấu trúc dữ liệu với các thao tác,
theo cách mà tất cả thường nghĩ về thế giới quanh mình. Chúng ta thường gắn
một số các hoạt động cụ thể với một loại hoạt động nào đó và đặt các giả thiết
của mình trên các quan hệ đó.
Ví dụ: Chúng ta biết rằng một chiếc xe có các bánh xe, di chuyển được
và có thể đổi hướng của nó bằng cách quẹo tay lái. Tương tự như thế, một cái

cây là một loại thực vật có thân gỗ và lá. Một chiếc xe không phải là một cái
cây, mà cái cây không phải là một chiếc xe, chúng ta có thể giả thiết rằng cái
mà chúng ta có thể làm được với một chiếc xe thì không thể làm được với
một cái cây. Chẳng hạn, thật là vô nghĩa khi muốn lái một cái cây, còn chiếc
xe thì lại chẳng lớn thêm được khi chúng ta tưới nước cho nó.
II. NHỮNG KHÁI NIỆM CƠ BẢN VỀ LẬP TRÌNH HƯỚNG ĐỐI
TƯỢNG
2.1. Đối tượng
Đối tượng (object): Các dữ liệu và chỉ thị được kết hợp vào một đơn vị
đầy đủ tạo nên một đối tượng. Đơn vị này tương đương với một chương trình
con và vì thế các đối tượng sẽ được chia thành hai bộ phận chính: phần các
phương thức (method) và phần các thuộc tính (property). Trong thực tế, các
phương thức của đối tượng là các hàm và các thuộc tính của nó là các biến,
các tham số hay hằng nội tại của một đối tượng (hay nói cách khác tập hợp
các dữ liệu nội tại tạo thành thuộc tính của đối tượng). Các phương thức là
phương tiện để sử dụng một đối tượng trong khi các thuộc tính sẽ mô tả đối
tượng có những tính chất gì.
Nhóm 2 – Lớp Hệ thống thông tin M16CQIS01-B


Báo cáo môn học Các mô hình LTTT

Hướng dẫn: TS Đỗ Thị Bích Ngọc

2.1. Lớp (class)
Một lớp được hiểu là một kiểu dữ liệu bao gồm các thuộc tính và các
phương thức được định nghĩa từ trước. Đây là sự trừu tượng hóa của đối
tượng. Một đối tượng sẽ được xác lập khi nó được thực thể hóa từ một lớp.
Khác với kiểu dữ liệu thông thường, một lớp là một đơn vị (trừu tượng) bao
gồm sự kết hợp giữa các phương thức và các thuộc tính. Để có một đối tượng

(mà có thể được xem như là một biến) hoạt động được thì việc thực thể hóa sẽ
có thể bao gồm việc cài đặt các giá trị ban đầu của các thuộc tính cũng như
việc đăng kí bộ nhớ, mà công việc này thường được giao cho các phương
thức gọi là “máy kết cấu” (constructor) hay hàm dựng. Ngược lại khi một đối
tượng thuộc về một lớp không còn sử dụng nữa thì cũng có thể có một
phương thức để xử lý gọi là “máy hủy diệt” (destructor) hay hàm hủy.
Như vậy, để có được các đối tượng thì người lập trình OOP cần phải
thiết kế lớp của các đối tượng đó bằng cách xây dựng các thuộc tính và các
phương thức có các đặc tính riêng.
Mỗi một phương thức hay một thuộc tính đầy đủ của một lớp còn được
gọi tên là một thành viên (member) của lớp đó.
2.2. Lớp con (subclass)
Lớp con là một lớp thông thường nhưng có thêm tính chất kế thừa một
phần hay toàn bộ các đặc tính của một lớp khác. Lớp mà chia sẽ sự kế thừa
gọi là lớp phụ mẫu (parent class).
2.3. Lớp trừu tượng hay lớp cơ sở trừu tượng (abstract class)
Lớp trừu tượng là một lớp mà nó không thể thực thể hóa thành một đối
tượng thực dụng được. Lớp này được thiết kế nhằm tạo ra một lớp có các đặc
tính tổng quát nhưng bản thân lớp đó chưa có ý nghĩa (hay không đủ ý nghĩa)
để có thể tiến hành viết mã cho việc thực thể hóa. (xem thí dụ)
Thí dụ: Lớp “hinh_phang” được định nghĩa không có dữ liệu nội tại và
chỉ có các phương thức (hàm nội tại) “tinh_chu_vi”, “tinh_dien_tich”. Nhưng
vì lớp hình_phẳng này chưa xác định được đầy đủ các đặc tính của nó (cụ thể
các biến nội tại là tọa độ các đỉnh nếu là đa giác, là đường bán kính và toạ độ
tâm nếu là hình tròn, …) nên nó chỉ có thể được viết thành một lớp trừu
Nhóm 2 – Lớp Hệ thống thông tin M16CQIS01-B


Báo cáo môn học Các mô hình LTTT


Hướng dẫn: TS Đỗ Thị Bích Ngọc

tượng. Sau đó, người lập trình có thể tạo ra các lớp con chẳng hạn như là lớp
“tam_giac”, lớp “hinh_tron”, lớp “tu_giac”,…. Và trong các lớp con này
người viết mã sẽ cung cấp các dữ liệu nội tại (như là biến nội tại r làm bán
kính và hằng số nội tại Pi cho lớp “hinh_tron” và sau đó viết mã cụ thể cho
các phương thức “tinh_chu_vi” và “tinh_dien_tich”).
2.4. Phương Thức (method)
Là hàm nội tại của một lớp (hay một đối tượng). Tùy theo đặc tính mà
người lập trình gán cho, một phương pháp có thể chỉ được gọi bên trong các
hàm khác của lớp đó, có thể cho phép các câu lệnh bên ngoài lớp gọi tới nó,
hay chỉ cho phép các lớp có quan hệ đặc biệt như là quan hệ lớp con, và quan
hệ bạn bè (friend) được phép gọi tới nó. Mỗi phương pháp đều có thể có kiểu
trả về, chúng có thể trả các kiểu dữ liệu cổ điển hay trả về một kiểu là một lớp
đã được định nghĩa từ trước. Một tên gọi khác của phương pháp của một lớp
là hàm thành viên.
Người ta còn định nghĩa thêm vài loại phương pháp đặc biệt:
- Hàm dựng (constructor) là hàm được dùng để cài đặt các giá tri ban
đầu cho các biến nội tại và đôi khi còn dùng để khai báo về việc xử dụng bộ
nhớ.
Hàm hủy (destructor) là hàm dùng vào việc làm sạch bộ nhớ và hủy bỏ tên
của một đối tượng sau khi đã dùng xong, trong đó có thể bao gồm cả việc xóa
các con trỏ nội tại và trả về các phần bộ nhớ mà đối tượng đã dùng.
Trong một số trường hợp thì hàm hủy hay hàm dựng có thể được tự động hóa
bởi ngôn ngữ OOP như là trường hợp của Visual C++, C#.
- Tiện ích (utility) là các hàm chỉ họat động bên trong của một lớp mà
không cho phép môi trường bên ngoài gọi tới. Các hàm này có thể là những
tính toán trung gian nội bộ của một đối tượng mà xét thấy không cần thiết
phải cho thế giới bên ngoài của đối tượng biết là gì.
2.5. Thuộc tính (attribute)

Thuộc tính của một lớp bao gồm các biến, các hằng, hay tham số nội tại
của lớp đó. Ở đây, vai trò quan trọng nhất của các thuộc tính là các biến vì
chúng sẽ có thể bị thay đổi trong suốt quá trình hoạt động của một đối tượng.
Nhóm 2 – Lớp Hệ thống thông tin M16CQIS01-B


Báo cáo môn học Các mô hình LTTT

Hướng dẫn: TS Đỗ Thị Bích Ngọc

Các thuộc tính có thể được xác định kiểu và kiểu của chúng có thể là các kiểu
dữ liệu cổ điển hay đó là một lớp đã định nghĩa từ trước. Như đã ghi, khi một
lớp đã được thực thể hoá thành đối tượng cụ thể thì tập họp các giá trị của các
biến nội tại làm thành trạng thái của đối tượng. Giống như trường hợp của
phương pháp, tùy theo người viết mã, biến nội tại có thể chỉ được dùng bên
trong các phương pháp của chính lớp đó, có thể cho phép các câu lệnh bên
ngoài lớp, hay chỉ cho phép các lớp có quan hệ đặc biệt như là quan hệ lớp
con, (và quan hệ bạn bè (friend) trong C++) được phép dùng tới nó (hay thay
đổi giá trị của nó). Mỗi thuộc tính của một lớp còn được gọi là thành viên dữ
liệu của lớp đó.
2.6. Thực thể (instance)
Thực thể hóa (instantiate) là quá trình khai báo để có một tên (có thể
được xem như là một biến) trở thành một đối tượng từ một lớp nào đó. Một
lớp sau khi được tiến hành thực thể hóa để có một đối tượng cụ thể gọi là một
thực thể. Hay nói ngược lại một thực thể là một đối tượng riêng lẽ của một
lớp đã định trước. Như các biến thông thường, hai thực thể của cùng một lớp
có thể có trạng thái nội tại khác nhau (xác định bởi các giá trị hiện có của các
biến nội tại) và do đó hoàn toàn độc lập nhau nếu không có yêu cầu gì đặc
biệt từ người lập trình.
2.7. Công cộng (public)

Công cộng là một tính chất được dùng để gán cho các phương pháp,
các biến nội tại, hay các lớp mà khi khai báo thì người lập trình đã cho phép
các câu lệnh bên ngoài cũng như các đối tượng khác được phép dùng đến nó.
Thí dụ: Trong C++ khai báo public: int my_var; thì biến my_var có hai tính
chất là tính công cộng và là một integer cả hai tính chất này hợp thành đặc
tính của biến my_var khiến nó có thể được xử dụng hay thay đổi giá trị của nó
(bởi các câu lệnh) ở mọi nơi bên ngoài lẫn bên trong của lớp.
2.8. Riêng tư (private)
Riêng tư là sự thể hiện tính chất đóng mạnh nhất (của một đặc tính hay
một lớp). Khi dùng tính chất này gán cho một biến, một phương pháp thì biến
hay phương pháp đó chỉ có thể được sử dụng bên trong của lớp mà chúng
Nhóm 2 – Lớp Hệ thống thông tin M16CQIS01-B


Báo cáo môn học Các mô hình LTTT

Hướng dẫn: TS Đỗ Thị Bích Ngọc

được định nghĩa. Mọi nỗ lực dùng đến chúng từ bên ngoài qua các câu lệnh
hay từ các lớp con sẽ bị phủ nhận hay bị lỗi.
2.9. Bảo tồn (protected)
Tùy theo ngôn ngữ, sẽ có vài điểm nhỏ khác nhau về cách hiểu tính
chất này. Nhìn chung đây là tính chất mà mà khi dùng để áp dụng cho các
phương pháp, các biến nội tại, hay các lớp thì chỉ có trong nội bộ của lớp đó
hay các lớp con của nó (hay trong nội bộ một gói như trong Java) được phép
gọi đến hay dùng đến các phương pháp, biến hay lớp đó.
So với tính chất riêng tư thì tính bảo tồn rộng rãi hơn về nghĩa chia sẻ
dữ liệu hay chức năng. Nó cho phép một số trường hợp được dùng tới các đặc
tính của một lớp (từ một lớp con chẳng hạn).
Lưu ý: Các tính chất cộng cộng, riêng tư và bảo tồn đôi khi còn được

dùng để chỉ thị cho một lớp con cách thức kế thừa một lớp cha mẹ như trong
C++.
2.10. Đa kế thừa (muliple inheritance)
Đây là một tính chất cho phép một lớp con có khả năng kế thừa trực
tiếp cùng lúc nhiều lớp khác.
Vài điểm cần lưu ý khi viết mã dùng tính chất đa kế thừa:
Khi muốn có một sự kế thừa từ nhiều lớp phụ mẫu thì các lớp này cần
phải độc lập và đặc biệt tên của các dữ liệu hay hàm cho phép kế thừa phải có
tên khác nhau để tránh lỗi “ambiguilty”. Bởi vì lúc đó phần mềm chuyển dịch
sẽ không thể xác định được là lớp con sẽ thừa kế tên nào của các lớp phụ
mẫu.
Không phải ngôn ngữ OOP loại phân lớp nào cũng hỗ trợ cho tính chất này.
Ngoài các khái niệm trên, tùy theo ngôn ngữ, có thể sẽ có các chức năng OOP
riêng biệt được cấp thêm vào.
III. CÁC TÍNH CHẤT CƠ BẢN CỦA LẬP TRÌNH HƯỚNG ĐỐI
TƯỢNG
Các phương thức và các thuộc tính thường gắn chặt với thực tế các đặc
tính và sử dụng của một đối tượng. Trong thực tế, các đối tượng thường được
Nhóm 2 – Lớp Hệ thống thông tin M16CQIS01-B


Báo cáo môn học Các mô hình LTTT

Hướng dẫn: TS Đỗ Thị Bích Ngọc

trừu tượng hóa qua việc định nghĩa của các lớp (class). Tập hợp các giá trị
hiện có của các thuộc tính tạo nên trạng thái của một đối tượng. Mỗi phương
thức hay mỗi dữ liệu nội tại cùng với các tính chất được định nghĩa (bởi
người lập trình) được xem là một đặc tính riêng của đối tượng. Tập hợp các
đặc tính này gọi chung là đặc tính của đối tượng.

Lập trình hướng đối tượng là một phương pháp lập trình có các tính
chất chính sau:
3.1. Tính kế thừa

Tính kế thừa (inheritance): Đặc tính này cho phép một đối tượng có thể
có sẵn các đặc tính mà đối tượng khác đã có thông qua kế thừa. Điều này cho
phép các đối tượng chia sẻ hay mở rộng các đặc tính sẵn có mà không phải
tiến hành định nghĩa lại. Tuy nhiên, không phải ngôn ngữ định hướng đối
tượng nào cũng có tính chất này.
Khi bắt đầu xây dựng ứng dụng chúng ta sẽ bắt đầu việc thiết kế các
lớp, thông thường chúng ta sẽ thấy có trường hợp một số lớp dường như có
quan hệ với những lớp khác, chúng có những đặc tính khá giống nhau. VD: 3
lớp AndroidPhone, IPhone, WindowsPhone ở hình dưới:

Mỗi lớp đều đại diện cho một loại smartphone khác nhau nhưng lại có
những thuộc tính giống nhau. Thay vì sao chép những thuộc tính này, sẽ hay
hơn nếu ta đặt chúng ở một nơi có thể dùng bởi những lớp khác. Điều này
được thực hiện bởi tính kế thừa trong OOP: chúng ta có thể định nghĩa lớp
cha – base class (trong trường hợp này là Smartphone ) và có những lớp con
kế thừa từ nó (derived class), tạo ra một mối quan hệ cha/con như hình dưới:

Nhóm 2 – Lớp Hệ thống thông tin M16CQIS01-B


Báo cáo môn học Các mô hình LTTT

Hướng dẫn: TS Đỗ Thị Bích Ngọc

Bây giờ, các lớp con có thể kế thừa 3 thuộc tính từ lớp cha. Nếu các
chức năng của lớp cha đã được định nghĩa đầy đủ thì lập trình viên sẽ không

phải làm bất cứ việc gì ở lớp con. Còn nếu một lớp con muốn chức năng khác
so với định nghĩa ở lớp cha thì nó có thể ghi đè (override) chức năng đã được
định nghĩa trên lớp cha này.

Như hình trên bây giờ nếu gọi thuộc tính OSVersion trên lớp Android
Phone thì nó sẽ dùng định nghĩa được khai báo ở lớp này, trong khi hai lớp
Iphone & Windows Phone vẫn dùng định nghĩa được khai báo ở lớp cha
Smartphone.
3.2. Tính đóng gói (encapsulation) và che dấu thông tin
(information hiding)
Sự đóng gói là cơ chế ràng buộc dữ liệu và thao tác trên dữ liệu đó
thành một thể thống nhất, tránh được các tác động bất ngờ từ bên ngoài. Thể
thống nhất này gọi là đối tượng.
Trong Objetc Oriented Software Engineering của Ivar Jacibson, tất cả
các thông tin của một hệ thống định hướng đối tượng được lưu trữ bên trong
đối tượng của nó và chỉ có thể hành động khi các đối tượng đó được ra lệnh
thực hiện các thao tác. Như vật, sự đóng gói không chỉ đơn thuần là sự gom
chung dữ liệu và chương trình vào trong một khối, chúng còn được hiểu theo
nghĩa là sự đồng nhất giữa dữ liệu và các thao tác tác động lên dữ liệu đó.
Trong một đối tượng, dữ liệu hay thao tác hay cả hai có thể là riêng (private)
hoặc chung (public) của đối tượng đó. Thao tác hay dữ liệu riêng là thuộc về
đối tượng đó chỉ được truy cập bởi các thành phần của đối tượng, điều này
nghĩa là thao tác hay dữ liệu riêng không thể truy cập bởi các phần khác của
chương trình tồn tại ngoài đối tượng. Khi thao tác hay dữ liệu là chung, các
phần khác của chương trình có thể truy cập nó mặc dù nó được định nghĩa
Nhóm 2 – Lớp Hệ thống thông tin M16CQIS01-B


Báo cáo môn học Các mô hình LTTT


Hướng dẫn: TS Đỗ Thị Bích Ngọc

trong một đối tượng. Các thành phần chung của một đối tượng dùng để cung
cấp một giao diện có điều khiển cho các thành thành riêng của đối tượng.
Trong một đối tượng, dữ liệu hay thao tác hay cả hai có thể là riêng
(private) hoặc chung (public) của đối tượng đó. Thao tác hay dữ liệu riêng là
thuộc về đối tượng đó chỉ được truy cập bởi các thành phần của đối tượng,
điều này nghĩa là thao tác hay dữ liệu riêng không thể truy cập bởi các phần
khác của chương trình tồn tại ngoài đối tượng. Khi thao tác hay dữ liệu là
chung, các phần khác của chương trình có thể truy cập nó mặc dù nó được
định nghĩa trong một đối tượng. Các thành phần chung của một đối tượng
dùng để cung cấp một giao diện có điều khiển cho các thành thành riêng của
đối tượng. Cơ chế đóng gói là phương thức tốt để thực hiện cơ chế che dấu
thông tin so với các ngôn ngữ lập trình cấu trúc.
3.3. Tính đa hình (polymorphism)
Đó là khả năng để cho một thông điệp có thể thay đổi cách thực hiện
của nó theo lớp cụ thể của đối tượng nhận thông điệp. Khi một lớp dẫn xuất
được tạo ra, nó có thể thay đổi cách thực hiện các phương thức nào đó mà nó
thừa hưởng từ lớp cơ sở của nó. Một thông điệp khi được gởi đến một đối
tượng của lớp cơ sở, sẽ dùng phương thức đã định nghĩa cho nó trong lớp cơ
sở. Nếu một lớp dẫn xuất định nghĩa lại một phương thức thừa hưởng từ lớp
cơ sở của nó thì một thông điệp có cùng tên với phương thức này, khi được
gởi tới một đối tượng của lớp dẫn xuất sẽ gọi phương thức đã định nghĩa cho
lớp dẫn xuất. Như vậy đa hình là khả năng cho phép gởi cùng một thông điệp
đến những đối tượng khác nhau có cùng chung một đặc điểm, nói cách khác
thông điệp được gởi đi không cần biết thực thể nhận thuộc lớp nào, chỉ biết
rằng tập hợp các thực thể nhận có chung một tính chất nào đó. Chẳng hạn,
thông điệp “vẽ hình” được gởi đến cả hai đối tượng hình hộp và hình tròn.
Trong hai đối tượng này đều có chung phương thức vẽ hình, tuy nhiên tuỳ
theo thời điểm mà đối tượng nhận thông điệp, hình tương ứng sẽ được vẽ lên.

Trong các ngôn ngữ lập trình OOP, tính đa hình thể hiện qua khả năng cho
phép mô tả những phương thức có tên giống nhau trong các lớp khác nhau.
Đặc điểm này giúp người lập trình không phải viết những cấu trúc điều khiển
Nhóm 2 – Lớp Hệ thống thông tin M16CQIS01-B


Báo cáo môn học Các mô hình LTTT

Hướng dẫn: TS Đỗ Thị Bích Ngọc

rườm rà trong chương trình, các khả năng khác nhau của thông điệp chỉ thực
sự đòi hỏi khi chương trình thực hiện.
Thí dụ khi định nghĩa hai đối tượng “hinh_vuong” và “hinh_tron” thì
có một phương thức chung là “chu_vi”. Khi gọi phương thức này thì nếu đối
tượng là “hinh_vuong” nó sẽ tính theo công thức khác với khi đối tượng là
“hinh_tron”.
IV. CÁC NGUYÊN LÝ CỦA THIẾT KẾ HƯỚNG ĐỐI TƯỢNG
Những nguyên lý thiết kế hướng đối tượng (object oriented desing
principle) là nền tảng trong lập trình hướng đối tượng. Điều quan trọng trong
việc học nền tảng cơ bản của lập trình hướng đối tượng là Abstraction (Tính
trừu tượng), Encapsulation(Tính đóng gói), Polymorphism(Tính đa hình) và
Inheritance(Tính kế thừa), nhưng đồng thời, việc quan trọng không kém là
phải biết những nguyên lý của những tính chất cơ bản này, tạo ra một thiết kế
trong sáng và có tính module hóa.
Cách tốt nhất để học bất kì mẫu hay nguyên lý thiết kế hướng đối tượng nào
đó là các ví dụ trong thực tế và hiểu được hậu quả khi vi phạm nguyên lý thiết
kế hướng đối tượng :
SOLID (S – O – L – I – D)
4.1. Single Responsibility Principle (SRP)
Single responsibility principle một nguyên lý thiết kế trong SOLID,

biểu thị chữ “S” trong SOLID. Như tiêu đề SRP, không nên có hơn một lý do
để thay đổi một lớp hay một lớp nên luôn luôn xử lý một chức năng đơn lẻ,
duy nhất. Nếu bạn đặt nhiều chức năng vào trong một lớp, điều đó dẫn đến sự
phụ thuộc giữa các chức năng với nhau và mặc dù bạn chỉ thay đổi ở một
chức năng thì cũng phá vỡ các chức năng còn lại, điều đó sẽ dẫn đến cần các
nhiều vòng kiểm thử khác để tránh có bất cứ sự ngạc nhiên trên môi trường
production (môi trường chạy thật).
4.2. Open-Closed Principle(OCP)
Những lớp, những phương thức hay những hàm nên dễ dàng(OPEN)
cho việc mở rộng (thêm chức năng mới) và ĐÓNG(CLOSED) cho việc thay
Nhóm 2 – Lớp Hệ thống thông tin M16CQIS01-B


Báo cáo môn học Các mô hình LTTT

Hướng dẫn: TS Đỗ Thị Bích Ngọc

đổi. Đây là một nguyên lý thiết kế hay trong SOLID, nhằm tránh một ai đó
thay đổi mã nguồn đã ổn định và đã qua kiểm thử. Open-Closed principle là
“O” trong SOLID
4.3. Liskov Substitution Principle (LSP)
Theo nguyên lý LSP, khi các hàm hoặc phương thức của lớp cha sẽ
hoạt động mà không xảy ra bất cứ vấn đề gì ở lớp con nếu đối tượng của lớp
con thay thế cho đối tượng của lớp cha. LSP liên quan tương đối với SRP và
ISP (mục tiếp theo). Nếu một lớp có nhiều chức năng hơn lớp con mà không
thể hỗ trợ một số chức năng trên thì nó phá bỡ quy tắt LSP. Để hiện thực
đúng với LSP, lớp con tăng thêm chức năng cho hàm hay phương thức ở lớp
cha, nhưng không được làm giảm chức năng của phương thức đó. LSP biểu
thị chữ “L” trong SOLID.
4.4. Interface Segregation Principle (ISP)

Chương trình không nên cài đặt một Interface nếu nó không sử dụng
đến. Điều này thường xảy ra khi một Interface chưa nhiều hơn một chức
năng, và chương trình chỉ cần một phương thức(chức năng) trong Interface
đó.Thiết kế Interface là một công việc khá phức tạp bởi một khi cho ra một
Interface thì không thể thay đổi nó mà không phá huỷ tất cả các cài đặt cho nó
trước đó.
4.5. Dependency Injection or Inversion Principle (DIP)
Đừng yêu cầu các đối tượng phụ thuộc, nó sẽ được cung cấp bởi
framework. Điều này được hiện thực rất tốt trong Spring framework, một
nguyên lý thiết kế hay (đẹp) là bất cứ lớp nào cũng sẽ được tiêm (inject) bởi
DI framework, dễ dàng kiểm thử với đối tượng mock và đơn giản cho việc
bảo trì chương trình bởi vì việc tạo ra một đối tượng trong mã nguồn được tập
trung trong framework và mã của chương trình sẽ không còn bừa bãi (litter)
khi áp dùng DI framework. Có khá nhiều cách để cài đặt một DI (Dependency
Injection) như thay đổi bytecode mà một số framework về AOP làm ví dụ
AspectJ hay sử dụng proxies như Spring đang làm. Lướt qua example of IOC
and DI design pattern để học hỏi được nhiều hơn về nguyên lý thiết kế này.
DIP biểu thị cho chữ “D” trong SOLID.
Nhóm 2 – Lớp Hệ thống thông tin M16CQIS01-B


Báo cáo môn học Các mô hình LTTT

Hướng dẫn: TS Đỗ Thị Bích Ngọc

4.6. DRY (Don’t repeat yourself)
Nguyên lý đầu tiên (ngoài SOLID) trong các nguyên lý thiết kế hướng
đối tượng là DRY (don’t repeat yourself) có nghĩa là đừng bao giờ viết mã bị
trùng lặp, thay vào đó sử dụng Abstraction (tính trừu tượng) để trừa tượng
hoá những thứ chung tại một nơi. Nếu có 2 đoạn mã y chang nhau ở hai nơi

khác nhau, hãy đưa chúng vào một hàm, hay nếu sử dụng một giá trị cứng
(hard-coded value) hơn một lần hãy tạo cho nó một constant (public final
constant).
Ích lợi của nguyên lý này là để dễ bào trì mã nguồn. Quan trọng là
đừng lạm dụng nó quá nhiều, trùng lặp không phải cho mã lệnh, mà là cho
một chức năng. Nghĩa là, nếu đã sử dụng một đoạn mã chung để kiểm tra tính
hợp lệ của OrderID và SSN, không đồng nghĩa hai phương thức kiểm tra phải
giống nhau hay chúng sẽ vẫn còn giống nhau trong tương lai. Bởi khi sử dụng
một mã chung cho hai chức năng khác nhau (một kiểm tra OrderID, một kiểm
tra SSN) đã vô tình đưa chúng dính chặt vào nhau mãi mãi và khi OrderID
thay đổi hình thức, chức năng kiểm tra tính hợp lệ của SSN cũng lẽ bị phá
huỷ. Vì vậy để đề phòng sự dính chặt này không nên phối hợp mọi thứ lại mà
nên sử dụng mã lệnh giống nhau nhưng không bị phụ thuộc vào nhau.
4.7. Encapsulate What Changes
Chỉ có một thứ bất biến trong phần mềm và đó chính là “Change” (Sự
thay đổi, chơi chữ), vì vậy phải bao đóng (encapsulate) mã nguồn mà ta
mong muôn hoặc mã nguồn ta nghi ngờ sẽ bị thay đổi trong tương lai. Một số
mẫu thiết kế hướng đối tượng sử dụng nguyên lý này, Factory design pattern
là một ví dụ điển hình, nó bao đóng việc tạo ra đối tượng và cung cấp một
cách mềm dẻo để tạo ra các “sản phẩm” mới mà không ảnh hưởng đến mã
hiện tại.
4.8. Favor Composition over Inheritance
Luôn luôn sử dụng favor composition thay cho inheritance nếu có thể.
Composition chấp nhận thay đổi hành vi của một lớp trong lúc Runtime (lúc
chương trình đang chạy) bằng cách thiết lập những thuộc tính trong suốt quá
trình runtime và bằng cách sử dụng Interface thay thế cho lớp, chúng ta sử
Nhóm 2 – Lớp Hệ thống thông tin M16CQIS01-B


Báo cáo môn học Các mô hình LTTT


Hướng dẫn: TS Đỗ Thị Bích Ngọc

dụng tính đa hình (polymorphism) để thay thế lớp cài đặt Interface tốt hơn
một cách mềm dẻo bất cứ lúc nào.

4.9. Programming for Interface not Implementation
Luôn luôn lập trình cho Interface, không lập trình cho việc cài đặt. Điều
này sẽ giúp tạo ra mã lệnh mềm dẻo, và mã lệnh sẽ luôn làm việc với bất kì
một cài đặt mới nào cho Interface.
4.10. Delegation principle
Đừng tự mình làm hết mọi thứ, hãy giao nó cho lớp tương ứng. Để so
sánh hai đối tượng có giống nhau, chúng ta yêu cầu chính nó so sánh thay vì
đưa cho một lớp khác kiểm tra. Lợi ích của nguyên lý này là để trùng lặp mã
và dễ dàng thay đổi hành vi của lớp.
Tất cả những nguyên lý thiết kế hướng đối tượng sẽ giúp chúng viết mã
linh hoạt và tốt hơn, giảm sự phụ thuộcthuộc và tạo được mối liên kết cao. Lý
thuyết là bước đầu tiên, nhưng nó rất quan trong trong quá trình quát triển khả
năng và tìm cách ứng dụng những nguyên lý này.

Nhóm 2 – Lớp Hệ thống thông tin M16CQIS01-B


Báo cáo môn học Các mô hình LTTT

Hướng dẫn: TS Đỗ Thị Bích Ngọc

PHẦN III. CÁC NGÔN NGỮ VÀ VÀI ỨNG DỤNG CỦA OOP

I. CÁC NGÔN NGỮ LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG

Xuất phát từ tư tưởng của ngôn ngữ SIMULA67, trung tâm nghiên cứu
Palo Alto (PARC) của hãng XEROR đã tập trung 10 năm nghiên cứu để hoàn
thiện ngôn ngữ OOP đầu tiên với tên gọi là Smalltalk. Sau đó các ngôn ngữ
OOP lần lượt ra đời như Eiffel, Clos, Loops, Flavors, Object Pascal, Object
C, C++, Delphi, Java, C#…
II. MỘT SỐ ỨNG DỤNG TIÊU BIỂU
Chính XEROR trên cơ sở ngôn ngữ OOP đã đề ra tư tưởng giao diện
biểu tượng trên màn hình (icon base screen interface), kể từ đó Apple
Macintosh cũng như Microsoft Windows phát triển giao diện đồ họa như
ngày nay. Trong Microsoft Windows, tư tưởng OOP được thể hiện một cách
rõ nét nhất đó là "chúng ta click vào đối tượng", mỗi đối tượng có thể là
control menu, control menu box, menu bar, scroll bar, button, minimize box,
maximize box, … sẽ đáp ứng công việc tùy theo đặc tính của đối tượng.
Turbo Vision của hãng Borland là một ứng dụng OOP tuyệt vời, giúp lập
trình viên không quan tâm đến chi tiết của chương trình gia diện mà chỉ cần
thực hiện các nội dung chính của vấn đề.

Nhóm 2 – Lớp Hệ thống thông tin M16CQIS01-B


Báo cáo môn học Các mô hình LTTT

Hướng dẫn: TS Đỗ Thị Bích Ngọc

PHẦN IV: ỨNG DỤNG QUẢN LÝ THƯ VIỆN MÔ HÌNH 3 LAYER
I. KHÁI QUÁT VỀ ỨNG DỤNG
Ứng dụng Quản lý Thư viện được lập trình theo mô hình hướng đối
tượng với 3 layer:
- DataAcces Layer: Layer này thực hiện nhiệm vụ kết nối CSDL. Layer
này có 01 class: Xuly.cs.

- Business Layer: Layer này thực hiện nhiệm vụ xử lý dữ liệu trước khi
hiển thị gồm các chức năng cơ bản thêm, sửa, xóa. Có 02 class trên layer này:
Dulieu.cs (lưu trữ dữ liệu) và XL_Dulieu.cs (thực hiện các thao tác SQL).
- Presentation Layer: Layer này giao tiếp với người dùng để lấy dữ
liệu và hiển thị kết quả thông qua các thành phần trong giao diện người dùng.
Ngôn ngữ được sử dụng lập trình: C#;
Hệ quản trị CSDL: SQLServer;
Môi trường: Visual Studio 2015
Chức năng: Quản lý sách, độc giả, mượn – trả sách, nhân viên thư
viện.
II. MÔ HÌNH CSDL CỦA CHƯƠNG TRÌNH

Nhóm 2 – Lớp Hệ thống thông tin M16CQIS01-B


Báo cáo môn học Các mô hình LTTT

III. CÁC FORM CHỨC NĂNG
3.1. Chương trình chính

3.2. Quản lý sách

Nhóm 2 – Lớp Hệ thống thông tin M16CQIS01-B

Hướng dẫn: TS Đỗ Thị Bích Ngọc


Báo cáo môn học Các mô hình LTTT

3.3. Quản lý độc giả


Nhóm 2 – Lớp Hệ thống thông tin M16CQIS01-B

Hướng dẫn: TS Đỗ Thị Bích Ngọc


Báo cáo môn học Các mô hình LTTT

3.4. Quản lý mượn – trả sách

3.5. Quản lý nhân viên thư viện
Nhóm 2 – Lớp Hệ thống thông tin M16CQIS01-B

Hướng dẫn: TS Đỗ Thị Bích Ngọc


Báo cáo môn học Các mô hình LTTT

Nhóm 2 – Lớp Hệ thống thông tin M16CQIS01-B

Hướng dẫn: TS Đỗ Thị Bích Ngọc


Báo cáo môn học Các mô hình LTTT

Hướng dẫn: TS Đỗ Thị Bích Ngọc

PHẦN IV. KẾT LUẬN
Trong những năm gần đây, lập trình hướng đối tượng đã nhanh chóng
trở nên gần gũi nhờ sự ra đời liên tiếp của các ngôn ngữ lập trình hướng đối

tượng. Sức mạnh của mô hình lập trình hướng đối tượng thể hiện ở việc mô
hình hóa hệ thống dựa trên các đối tượng thực tế, khả năng đóng gói và bảo
vệ an toàn dữ liệu, khả năng sử dụng lại mã nguồn để tiết kiệm chi phí và tài
nguyên. Đặc biệt là khả năng chia sẻ mã nguồn trong cộng đồng các lập trình
viên. Những điểm mạnh này hứa hẹn thúc đẩy phát triển một môi trường lập
trình tiên tiến cùng với nền công nghiệp lắp ráp phần mềm với các thư viện
thành phần có sẵn.
Báo cáo môn học “Các mô hình lập trình tiên tiến” với chủ đề “Mô
hình lập trình hướng đối tượng” của nhóm học viên chúng tôi chỉ nêu khái
quát một số khai niệm cơ bản về mô hình lập trình hướng đối tượng, các tính
chất cũng như ứng dụng của mô hình lập trình hướng đối tượng.
Với thời lượng không cho phép, lượng kiến thức còn hạn chế, những
vẫn đề nhóm chúng tôi nêu trong báo cáo sẽ còn nhiều tồn tại, hạn chế.
Nhóm chúng tôi xin được gửi lời cảm ơn trân trọng nhất đến giáo viên
hướng dẫn TS Đỗ Thị Bích Ngọc đã cung cấp tài liệu, phương pháp nghiên
cứu để chúng tôi có thể hoàn thiện báo cáo đúng tiến độ.

Nhóm 2 – Lớp Hệ thống thông tin M16CQIS01-B


Báo cáo môn học Các mô hình LTTT

Hướng dẫn: TS Đỗ Thị Bích Ngọc

TÀI LIỆU THAM KHẢO

[1] Lập trình hướng đối tượng C++ của Nguyễn Thanh Thuỷ
[2] Lập trình hướng đối tượng C++ của Trần Văn Lăng
[3] C++ Kỹ thuật và Ứng dụng – Scott Robert Ladd
[4] Ngôn ngữ lập trình C và C++

[5] Giáo trình lập trình hướng đối tượng của Lê Thị Mỹ Hạnh – ĐH Đà Nẵng
[6] Lập trình hướng đối tượng – Trần Đình Quế, HVCN BCVT

Nhóm 2 – Lớp Hệ thống thông tin M16CQIS01-B



×