Lập trình hướng đối tượng
Đã giới thiệu| English | Ý nghĩa |
|---|---|
| object/ˈɒbdʒekt/ | đối tượng |
| encapsulation/ɪnˌkæpsjʊˈleɪʃn/ | bao封装 |
| class/klæs/ | lớp |
| instance/ˈɪnstəns/ | thực thể |
| constructor/kənˈstrʌktə/ | hàm khởi tạo |
| inheritance/ɪnˈherɪtəns/ | kế thừa |
| subclass/ˈsʌbklæs/ | lớp con |
| superclass/ˈsuːpəklæs/ | lớp cha |
| polymorphism/ˈpɒlɪmɔːfɪzəm/ | đa hình |
| abstraction/əbˈstrækʃn/ | Trừu tượng hóa |
| containment/kənˈteɪnmənt/ | bao hàm |
| aggregation/ˌæɡrɪˈɡeɪʃn/ | tích hợp |
Một thay đổi ở một nơi vốn dĩ có nghĩa là phải thay đổi ở năm mươi nơi khác
- Một chương trình lưu số dư của khách hàng dưới dạng số công khai. Hai mươi thủ tục đọc nó và mười lăm thủ tục ghi vào. Bây giờ số dư không bao giờ được âm.
- Nếu không có đối tượng, quy tắc này phải được thêm vào mười lăm nơi, và ngày hôm sau khi ai đó thêm một người ghi thứ mười sáu, nó lại bị hỏng.
- Với các đối tượng, số dư là riêng tư và cách duy nhất để thay đổi nó là một phương pháp tuân thủ quy tắc. Có một nơi để thêm nó và không có cách nào khác để bypass.
- Đó chính là bao bọc, và đó là lý do lập trình hướng đối tượng tồn tại. Bài học này nói về các đối tượng, lớp (classes), và bốn trụ cột.
Đối tượng và lớp
- Một đối tượng kết hợp thuộc tính (attributes), dữ liệu của nó, với phương thức (methods), các thao tác tác động lên dữ liệu đó. Nó là một đơn vị bao gồm cả trạng thái và hành vi.
- Một lớp là bản thiết kế: nó xác định những thuộc tính và phương thức mà mọi đối tượng thuộc loại đó sẽ có. Một đối tượng là một thực thể (instance) của một lớp, với các giá trị riêng của nó.
- Một
Taxilớp, và mỗi chiếc taxi thực tế là một đối tượng với số đăng ký và sức chứa riêng.

Thuộc tính ở trên, phương thức ở dưới, và mức độ truy cập được đánh dấu
Phòng thí nghiệm khái niệm lập trình
Connect examples to the programming idea they show.
Một đối tượng kết hợp:
Difficulty 1/5 · 100 coins + a small bonus on first completion today
Một đối tượng gộp dữ liệu (thuộc tính) với các thao tác (phương thức) tác động lên nó.
Mối quan hệ giữa class và object là gì?
Difficulty 1/5 · 100 coins + a small bonus on first completion today
Một class Taxi xác định các thuộc tính và phương thức; mỗi chiếc taxi thực tế là một object với tải trọng và biển số riêng.
Hàm khởi tạo, getter và setter
- Một hàm khởi tạo (constructor) là một phương thức đặc biệt chạy khi một đối tượng được tạo ra, để thiết lập các thuộc tính của nó thành các giá trị ban đầu hợp lệ.
- Vì các thuộc tính là riêng tư, một lớp cung cấp các phương thức get để đọc giá trị và các phương thức set để thay đổi chúng. Một phương thức set là nơi quy tắc như "không bao giờ âm" được áp dụng.
- Đó chính là lý do khiến thuộc tính riêng tư trở nên hữu ích: quy tắc được áp dụng trên mọi sự thay đổi, vì không có đường dẫn nào khác đến dữ liệu.
CLASS Taxi
PRIVATE Capacity : INTEGER
PUBLIC PROCEDURE NEW(StartCapacity : INTEGER)
Capacity ← StartCapacity
ENDPROCEDURE
PUBLIC FUNCTION GetCapacity() RETURNS INTEGER
RETURN Capacity
ENDFUNCTION
ENDCLASS
Constructor là một phương thức đặc biệt:
Difficulty 1/5 · 100 coins + a small bonus on first completion today
Constructor khởi tạo các thuộc tính của object mới tại thời điểm tạo.
Trụ cột 1: bao bọc
- Bao bọc (Encapsulation) có nghĩa là dữ liệu của đối tượng được ẩn behind các phương thức của nó. Các thuộc tính là riêng tư; mã bên ngoài sử dụng các phương thức công khai.
- Hai lợi ích, và đề thi yêu cầu cả hai: đối tượng có thể tự áp đặt quy tắc của nó trong mọi lần thay đổi, và biểu diễn nội bộ có thể được thay đổi an toàn sau này, vì không có mã bên ngoài nào phụ thuộc vào nó.
- Lưu số dư bằng bảng today và bằng xu tomorrow: mọi người dùng của lớp vẫn gọi
GetBalance()và không có gì bên ngoài bị hỏng.
Encapsulation có nghĩa là:
Difficulty 1/5 · 100 coins + a small bonus on first completion today
Encapsulation ẩn dữ liệu; code bên ngoài sử dụng các phương thức công khai, nên nội bộ có thể thay đổi an toàn.
Encapsulation mang lại lợi ích gì? Chọn tất cả các phương án áp dụng.
Difficulty 2/5 · 140 coins + a small bonus on first completion today
Đóng gói (Encapsulation) liên quan đến khả năng bảo trì và tính đúng đắn, không phải tốc độ. Dữ liệu riêng tư với các phương thức công khai là điều làm cho cả hai điều đó trở nên khả thi.
Trụ cột 2: kế thừa
- Kế thừa (Inheritance) cho phép một lớp con (subclass) được định nghĩa dựa trên một lớp cha (superclass), nhận tất cả thuộc tính và phương thức của nó rồi thêm vào hoặc ghi đè (overriding) chúng.
- Nó mô hình hóa mối quan hệ "là một": Quản lý là một Nhân viên, nên
Managerkế thừa từEmployeevà thêm bộ phận. - Lợi ích là mã dùng chung được viết một lần ở lớp cha, và sự thay đổi đối với nó lan truyền đến mọi lớp con.

Phần dùng chung nằm ở trên; phần khác biệt nằm ở dưới
Kế thừa mô hình hóa mối quan hệ "is-a" (một Quản lý là một Nhân viên), do đó lớp con kế thừa và mở rộng lớp cha của nó.
Difficulty 1/5 · 100 coins + a small bonus on first completion today
Kế thừa là sự chuyên biệt hóa "is-a"; các mối quan hệ "has-a" được mô hình hóa bằng cách kết hợp (composition) thay vì kế thừa.
Kế thừa mô hình hóa mối quan hệ "____ a", chẳng hạn như một Quản lý là một Nhân viên.
Difficulty 1/5 · 100 coins + a small bonus on first completion today
Một chiếc xe có động cơ, đó là kết hợp chứ không phải kế thừa. Việc phân biệt rõ ràng này chính là điều mà câu hỏi kiểm tra.
Trụ cột 3 và 4: đa hình và trừu tượng
- Đa hình (Polymorphism) có nghĩa là các đối tượng khác nhau phản hồi lại cùng một lời gọi phương thức theo cách riêng của chúng. Mọi
Shapeđều có một phương thứcArea();CirclevàRectanglemỗi cái đều triển khai nó khác nhau. - Giá trị của nó: mã có thể duyệt qua một danh sách các hình dạng, gọi
Area()trên từng cái, mà không cần biết hay quan tâm mỗi cái là loại nào. Thêm một lớpTrianglesau này và vòng lặp đó không cần thay đổi chút nào. - Trừu tượng (Abstraction) có nghĩa là hiển thị một giao diện đơn giản và ẩn đi độ phức tạp đằng sau: người gọi
Area()không cần biết bất kỳ hình học nào.
Đa hình (Polymorphism) cho phép:
Difficulty 1/5 · 100 coins + a small bonus on first completion today
Cùng một lời gọi (ví dụ: Area()) hoạt động đúng cho mỗi loại — người gọi không cần biết chính xác lớp nào.
Sắp xếp các hệ quả của đa hình theo thứ tự, từ định nghĩa đến lợi ích.
Difficulty 3/5 · 200 coins + a small bonus on first completion today
Một lời gọi, nhiều triển khai, và mã sử dụng nó không bao giờ cần biết về những triển khai mới.
Ví dụ minh họa: gọi tên trụ cột
- Một
BankAccountlớp giữ số dư riêng tư và cung cấpDeposit()vàWithdraw()phương thức từ chối làm cho nó trở thành số âm. Bao bọc: dữ liệu được ẩn và quy tắc được áp đặt bởi các đường dẫn duy nhất để truy cập nó. - Một
SavingsAccountlớp được định nghĩa là mộtBankAccountvới lãi suất được thêm vào. Kế thừa: mối quan hệ is-a, tái sử dụng mã của lớp cha. - Một vòng lặp gọi
Print()trên mỗi tài liệu trong danh sách, và mỗi loại in ra theo cách khác nhau. Đa hình: một lời gọi, nhiều triển khai. - Gọi tên trụ cột và tính năng của tình huống minh chứng cho nó.
Ghép nối mỗi trụ cột của lập trình hướng đối tượng với ý nghĩa của nó.
Difficulty 2/5 · 140 coins + a small bonus on first completion today
Đóng gói = ẩn; kế thừa = chuyên biệt hóa is-a; đa hình = giao diện giống nhau, hành vi biến thiên.
Ví dụ minh họa: tại sao OOP cho hệ thống lớn
- Nêu hai ưu điểm của việc sử dụng lập trình hướng đối tượng cho một hệ thống lớn. [4]
- Bao bọc có nghĩa là các chi tiết nội bộ của mỗi lớp có thể được thay đổi mà không ảnh hưởng đến phần còn lại của chương trình, do đó hệ thống dễ bảo trì hơn và một đội ngũ có thể làm việc song song trên các lớp.
- Kế thừa có nghĩa là hành vi dùng chung được viết một lần và tái sử dụng, do đó ít mã trùng lặp hơn và một sửa chữa áp dụng ngay lập tức ở khắp nơi.
- Đa hình có nghĩa là các loại mới có thể được thêm vào mà không cần thay đổi mã sử dụng chúng. Mỗi câu trả lời là một tính chất và hậu quả của nó.
Một đội có các cầu thủ; nó không phải là một cầu thủ
- Chứa đựng (Containment) có nghĩa là một đối tượng chứa một đối tượng khác như một thuộc tính của nó. Trong tích hợp (aggregation), đối tượng được chứa có thể tồn tại độc lập: một
Teamgiữ tham chiếu đến các đối tượngPlayercó thể chuyển sang đội khác. - Chọn dựa trên mối quan hệ: một
Goalkeeperlà mộtPlayer, nên sử dụng kế thừa; mộtTeamcó các cầu thủ, nên sử dụng tích hợp. Việc một đội kế thừa phương thứcKick()của một cầu thủ là lỗi thiết kế, ngay cả khi đội đó muốn nhận phạt.
Một Team lưu trữ tham chiếu đến các đối tượng Player. Players vẫn tồn tại khi team bị xóa. Mối quan hệ nào phù hợp?
Difficulty 1/5 · 100 coins + a small bonus on first completion today
Team chứa các đối tượng Player độc lập. Kế thừa sẽ yêu cầu mối quan hệ is-a.
Ví dụ minh họa: thiết kế một đội mà không sao chép các cầu thủ
- Đã biết: một
Playercó tên riêng tư và một phương thứcGetName(). Thiết kếTeamvới một tập hợp riêng tưMemberschứa tham chiếu đến các đối tượngPlayervà một phương thứcAddPlayer(NewPlayer)để thêm tham chiếu. - Một
Playercó thể tồn tại trước đội, và đội có thể bị xóa trong khi các cầu thủ vẫn còn. Đây là tích hợp. Thay đổi tên của một cầu thủ thông qua phương thức riêng của cầu thủ đó sẽ khả kiến với mọi đối tượng giữ tham chiếu đến cầu thủ đó; một chuỗi sao chép tên sẽ trở nên lỗi thời.
Player object: name = "Sam"
Team object: Members = [reference to Sam's Player object]
Goalkeeper class: inherits the Player attributes and methods
Trong thiết kế này, việc xóa một Đội cũng phải phá hủy mọi Cầu thủ mà nó chứa.
Difficulty 1/5 · 100 coins + a small bonus on first completion today
Các Cầu thủ tồn tại độc lập. Việc xóa đội sẽ xóa các tham chiếu của nó, chứ không nhất thiết là các đối tượng Cầu thủ.
Ghép nối mỗi thiết kế với mối quan hệ tương ứng.
Difficulty 2/5 · 140 coins + a small bonus on first completion today
Kế thừa mô hình is-a; aggregation mô hình has-a với các đối tượng độc lập; encapsulation kiểm soát truy cập dữ liệu.
Điểm số dễ mất
- Một lớp là bản thiết kế, một đối tượng là thực thể của nó. Đừng sử dụng hai từ này thay thế cho nhau.
- Bao bọc là ẩn dữ liệu đằng sau các phương thức, và lợi ích của nó là áp đặt quy tắc và thay đổi nội bộ an toàn. "Nó an toàn hơn" là quá mơ hồ.
- Kế thừa là mối quan hệ is-a. Xe hơi có một động cơ, đó là composition, không phải kế thừa.
- Đa hình là cùng một lời gọi xử lý khác nhau tùy theo lớp, điều đó cho phép thêm lớp con mới mà không cần thay đổi mã hiện có.
Bạn đã nắm vững
- một đối tượng kết hợp thuộc tính và phương thức; một lớp là bản thiết kế và đối tượng là thực thể, được thiết lập bởi hàm khởi tạo
- bao bọc: dữ liệu riêng tư đằng sau các phương thức công khai, nên quy tắc được áp đặt trong mọi lần thay đổi và nội bộ có thể thay đổi an toàn
- kế thừa: một lớp con nhận các thành viên của lớp cha và thêm vào hoặc ghi đè chúng, mô hình hóa is-a và viết mã dùng chung một lần
- đa hình: cùng một lời gọi được triển khai khác nhau tùy theo lớp, nên các loại mới không cần thay đổi mã hiện có; trừu tượng: một giao diện đơn giản ẩn đi độ phức tạp