Tổng quan về giáo trình

Giáo trình Lập trình hướng đối tượng (Object-Oriented Programming - OOP) được biên soạn bởi TS. Cao Tuấn Dũng (dungct@soict.vn), thuộc Bộ môn Công nghệ phần mềm, Viện Công nghệ Thông tin và Truyền thông – Trường Đại học Bách khoa Hà Nội. Đây là học phần cơ sở ngành bắt buộc trong khung chương trình đào tạo kỹ sư và cử nhân ngành Công nghệ Thông tin, Kỹ thuật Phần mềm và Hệ thống Thông tin.

Mục tiêu học tập của giáo trình tập trung vào việc trang bị cho người học nền tảng lý thuyết và kỹ năng thực hành về mô hình hướng đối tượng:

  • Hiểu rõ bản chất của công nghệ đối tượng và các quy tắc cốt lõi (trừu tượng hóa, đóng gói, đa hình).
  • Phân biệt cơ chế vận hành giữa mô hình lập trình cấu trúc/thủ tục và mô hình hướng đối tượng.
  • Nắm vững cấu trúc, vòng đời, trạng thái và hành vi của đối tượng và lớp.
  • Áp dụng phương pháp phân tích, thiết kế hướng đối tượng (OOAD) để mô hình hóa các bài toán thực tế.
  • Hiện thực hóa thiết kế phần mềm thông qua hai ngôn ngữ lập trình phổ biến là Java và C++.

Cấu trúc giáo trình được xây dựng theo phương pháp tiếp cận tiến trình lịch sử và mức độ trừu tượng hóa: bắt đầu từ sự phát triển của các thế hệ ngôn ngữ lập trình (Hợp ngữ $\rightarrow$ Cấu trúc $\rightarrow$ Hướng đối tượng), tiến đến việc giải thích bản chất thực thể thế giới thực trong không gian bài toán và ánh xạ vào không gian lời giải phần mềm. Điểm đặc sắc của tài liệu là sự kết hợp chặt chẽ giữa triết lý thiết kế (trích dẫn các luận điểm của Alan Kay và công trình nghiên cứu của David Taylor năm 1997) với các ví dụ mô hình hóa cụ thể và mã nguồn đối chiếu trực tiếp giữa Java và C++.


Nội dung kiến thức cốt lõi

Các chương/chủ đề chính

Nội dung đào tạo được cấu trúc thành 6 chủ đề tuần tự:

  1. Công nghệ hướng đối tượng (Object Technology): Định nghĩa công nghệ đối tượng theo David Taylor (1997) – tập hợp các quy tắc (trừu tượng hóa, đóng gói, đa hình) cùng hệ thống ngôn ngữ, cơ sở dữ liệu và công cụ hỗ trợ. Phân tích các miền ứng dụng: hệ thống phân tán Client/Server, ứng dụng Web, hệ thống nhúng (Embedded systems) và các hệ thống thời gian thực (Real-time systems) trong vệ tinh, hàng không vũ trụ, quốc phòng. Trình bày lược sử công nghệ đối tượng qua các mốc: Simula (1967), Smalltalk (1972), C++ (cuối thập niên 1980), Java (1991), The UML (1996) và UML 2 (2004).
  2. Đối tượng và lớp (Objects and Classes): Phân tích khái niệm đối tượng thực tế và đối tượng phần mềm. Định nghĩa cấu trúc đối tượng gồm 3 yếu tố: Trạng thái (State - biểu diễn qua Attributes và Relationships), Hành vi (Behavior - biểu diễn qua Operations/Methods) và Định danh (Identity - minh họa qua ví dụ nhân vật Dave, Brett, Gary và "The great Poppini"). Định nghĩa Lớp như một bản thiết kế mẫu (blueprint/prototype) để khởi tạo các thể hiện (instances).
  3. Các nguyên lý cơ bản của OO: Trình bày 4 trụ cột cơ bản: Trừu tượng hóa (Abstraction), Đóng gói (Encapsulation), Phân cấp/Kế thừa (Hierarchy), và Mô-đun hóa (Modularity), cùng tính Đa hình (Polymorphism). Phân tích nguyên lý Trừu tượng hóa dưới góc độ "sự bỏ qua có chọn lựa" – giữ lại các đặc điểm cốt lõi, loại bỏ chi tiết thứ yếu tùy thuộc vào ngữ cảnh góc nhìn (ví dụ: góc nhìn của Sinh viên và Giáo viên về cùng một Khóa học).
  4. Tương tác và Giao diện của đối tượng: Cơ chế trao đổi thông điệp (Message passing) giữa các đối tượng. Phân biệt bản chất giữa "Gọi hàm" (Call function: thực thi đoạn mã cố định duy nhất, không trùng tên) và "Gửi thông điệp" (Message sending: yêu cầu dịch vụ, đối tượng tự quyết định phương thức xử lý đáp ứng). Định nghĩa Giao diện (Interface) như tập hợp các dịch vụ mà đối tượng cung cấp ra bên ngoài.
  5. Ngôn ngữ lập trình Java và C++: Hiện thực hóa các khái niệm hướng đối tượng bằng cú pháp mã nguồn; so sánh cách khai báo lớp, khởi tạo đối tượng, định nghĩa thuộc tính và phương thức qua ví dụ lớp Time và lớp Light trong cả hai môi trường Java (Light lt = new Light(); lt.on();) và C++ (Light lt; lt.on();).
  6. Ví dụ và bài tập ứng dụng: Xây dựng mô hình hướng đối tượng cho các bài toán thực tế: Quản lý tài khoản ngân hàng – thẻ ATM – thanh toán điện tử (lớp Account, đối tượng Mr Duc Binh, Mrs Thu Lan), mô hình hóa hệ thống thương mại điện tử Amazon và hệ thống quản lý đào tạo SIS của Đại học Bách khoa Hà Nội.

Progression logic của giáo trình đi từ nhận thức lịch sử và triết lý trừu tượng hóa, qua việc định hình cấu trúc dữ liệu - hành vi của thực thể, đến việc thiết lập cơ chế tương tác thông điệp và cuối cùng là cài đặt mã nguồn cụ thể.

Kiến thức nền tảng được xây dựng

  • Fundamental theories: Tiến trình tiến hóa của các mức độ trừu tượng hóa trong ngôn ngữ lập trình:
    • Hợp ngữ (Assembly): Trừu tượng hóa ở mức chỉ thị phần cứng và kiểu dữ liệu cơ bản, gắn liền với tập lệnh CPU, xử lý tuần tự, độ phức tạp cao trong bảo trì.
    • Ngôn ngữ cấu trúc/thủ tục: Trừu tượng hóa điều khiển (Control abstraction) kết hợp trừu tượng hóa chức năng (Functional abstraction). Phân tách dữ liệu và thuật toán xử lý.
    • Ngôn ngữ hướng đối tượng: Trừu tượng hóa dữ liệu (Data abstraction). Đóng gói dữ liệu và phương thức xử lý thành một thực thể thống nhất.
  • Core principles: Hệ thống 4 tư tưởng nền tảng của Alan Kay:
    1. Mọi thành phần trong hệ thống đều là đối tượng; chương trình là tập hợp các đối tượng tương tác với nhau.
    2. Mỗi đối tượng quản lý vùng dữ liệu độc lập và chiếm không gian bộ nhớ riêng.
    3. Mỗi đối tượng đều mang cấu trúc đặc trưng của lớp chứa nó.
    4. Các đối tượng thuộc cùng một lớp đều chia sẻ tập hành vi giống nhau.
  • Essential frameworks: Đối sánh hai công thức cấu tạo chương trình:
    • Mô hình thủ tục: $\text{Data structures} + \text{Algorithms} = \text{Program}$
    • Mô hình hướng đối tượng: $\text{Objects} + \text{Messages} = \text{Program}$

Kỹ năng phát triển

  • Technical skills: Khai báo cấu trúc lớp, định nghĩa biến thành viên (member variables), cài đặt phương thức (methods), khởi tạo đối tượng thể hiện (instantiation), và quản lý truy cập giao diện đối tượng bằng Java và C++.
  • Analytical skills: Phân tích thực thể thế giới thực trong không gian bài toán để ánh xạ chính xác thành các lớp và đối tượng trong không gian lời giải phần mềm; xác định ranh giới giữa thuộc tính (trạng thái) và phương thức (hành vi).
  • Practical competencies: Kỹ năng phân rã hệ thống phần mềm lớn thành các thành phần có khả năng tái sử dụng (reusable components); mô hình hóa luồng gửi - nhận thông điệp giữa các module trong hệ thống thông tin quản lý và thương mại điện tử.

Phương pháp giảng dạy và học tập

Giáo trình áp dụng phương pháp sư phạm đối sánh (Comparative Pedagogy) kết hợp mô hình hóa trực quan:

  • Phương pháp đối sánh liên tục: Đặt song song các khái niệm của lập trình cấu trúc bên cạnh lập trình hướng đối tượng (Hàm vs. Phương thức, Cấu trúc dữ liệu tách rời vs. Đóng gói dữ liệu, Gọi hàm trực tiếp vs. Gửi thông điệp) giúp người học chuyển đổi mô thức tư duy lập trình một cách có hệ thống.
  • Phân tích Case Studies thực tế:
    • Hệ thống tài khoản ngân hàng: Phân tích lớp Account với các thuộc tính (String name, long balance) và phương thức (void deposit(int money), void withdraw(), int checkBalance()). Minh họa luồng trao đổi thông điệp khi đối tượng người dùng (User object) gửi yêu cầu checkBalance() tới đối tượng tài khoản cụ thể (Account object of Mr Duc Binh số dư 2.000 VND và Account object of Mrs Thu Lan số dư 1.000 VND).
    • Hệ thống nghiệp vụ quy mô lớn: Đưa ra bài tập tình huống phân tích các lớp và đối tượng trong nền tảng bán hàng trực tuyến Amazon và hệ thống thông tin quản lý đào tạo SIS ĐHBK.
  • Hệ thống bài tập và thực hành:
    • Bài tập đọc hiểu tài liệu chuyên sâu so sánh sự khác biệt cơ bản giữa lập trình cấu trúc và OOP qua tài liệu chuẩn trực tuyến.
    • Bài tập mô hình hóa các thực thể quen thuộc (Chiếc ô tô, Xe đạp, Cửa ra vào, Khóa học) để rèn luyện kỹ năng trừu tượng hóa theo góc nhìn nghiệp vụ.
    • Bài tập lập trình thực hành cài đặt lớp Time và lớp Light trên môi trường C++ và Java.
  • Phương pháp đánh giá và tự học: Kiểm tra mức độ hiểu thông qua các câu hỏi tình huống ngắn tại lớp, đánh giá khả năng ánh xạ bài toán thông qua sơ đồ lớp, và kiểm thử tính đúng đắn của mã nguồn qua các bài tập lập trình độc lập.

Điểm nổi bật và cập nhật

  • Tính chuẩn xác về lịch sử công nghệ: Cung cấp trục thời gian phát triển hoàn chỉnh của công nghệ đối tượng từ Simula (1967), Smalltalk (1972), C++ (Late 1980s), Java (1991), đến các chuẩn ngôn ngữ mô hình hóa UML (1996) và UML 2 (2004).
  • Mở rộng phạm vi ứng dụng công nghệ đối tượng: Giáo trình không giới hạn OOP trong các phần mềm ứng dụng desktop đơn lẻ mà làm rõ vai trò của công nghệ đối tượng trong các kiến trúc phức tạp hiện đại:
    • Hệ thống Client/Server và Web: Đóng gói thông tin doanh nghiệp thành các đối tượng phân tán phục vụ xử lý qua mạng Internet.
    • Hệ thống nhúng và thời gian thực (Real-time Embedded Systems): Nâng cao chất lượng và tính linh hoạt trong phát triển phần mềm điều khiển vệ tinh, hệ thống quốc phòng và thiết bị hàng không vũ trụ.
  • Liên kết lý thuyết học thuật với tài liệu công nghiệp: Tích hợp định nghĩa chuẩn mực từ tài liệu Object Technology - A Manager's Guide của David Taylor (1997), giúp sinh viên nắm bắt góc nhìn quản lý công nghệ phần mềm: quy trình phát triển + ngôn ngữ mô hình hóa + kỹ thuật công cụ phát triển nhằm tối ưu hóa khả năng tái sử dụng mã nguồn.

Đối tượng sử dụng giáo trình

  • Sinh viên đại học: Giáo trình được thiết kế cho sinh viên năm thứ hai hoặc năm thứ ba thuộc các khối ngành Công nghệ Thông tin, Kỹ thuật Phần mềm, Khoa học Máy tính, Hệ thống Thông tin và Kỹ thuật Máy tính.
  • Yêu cầu kiến thức tiên quyết (Prerequisites):
    • Người học cần hoàn thành học phần Nhập môn lập trình và Lập trình cấu trúc/thủ tục (ngôn ngữ C hoặc tương đương).
    • Có hiểu biết cơ bản về cấu trúc dữ liệu, giải thuật, và nguyên lý hoạt động của hệ thống máy tính (tập lệnh hợp ngữ/mã máy).
  • Giảng viên chuyên ngành: Sử dụng làm tài liệu giảng dạy chính khóa, khung đề cương bài giảng và ngân hàng câu hỏi thảo luận, bài tập thực hành trên lớp.
  • Người tự học và kỹ sư phần mềm: Tài liệu học thuật tham khảo phục vụ quá trình chuẩn hóa tư duy hướng đối tượng, chuyển đổi nền tảng từ ngôn ngữ hướng thủ tục sang phát triển ứng dụng bằng Java/C++.

Câu hỏi thường gặp

1. Giáo trình này phù hợp với ai?
Giáo trình phục vụ trực tiếp cho sinh viên đại học ngành Công nghệ Thông tin và Kỹ thuật Phần mềm tại các trường kỹ thuật, giảng viên cần tài liệu khung chuẩn mực, và lập trình viên muốn nghiên cứu nền tảng phân tích thiết kế hướng đối tượng.

2. Cần kiến thức nền nào trước khi học giáo trình này?
Người học cần nắm vững kiến thức lập trình cơ bản bằng ngôn ngữ có cấu trúc (như C), hiểu cơ chế điều khiển luồng, hàm, mảng và nguyên lý tổ chức dữ liệu trong bộ nhớ máy tính.

3. Điểm khác biệt của giáo trình này so với các tài liệu lập trình thông thường là gì?
Giáo trình không đơn thuần hướng dẫn cú pháp của một ngôn ngữ cụ thể mà phân tích bản chất công nghệ đối tượng từ góc độ trừu tượng hóa dữ liệu, triết lý thiết kế hệ thống (Alan Kay, David Taylor), đồng thời đối chiếu mã nguồn song song giữa hai ngôn ngữ đại diện là Java và C++.

4. Phương pháp tự học giáo trình này như thế nào để đạt hiệu quả cao?
Người học cần kết hợp đọc hiểu lý thuyết trừu tượng hóa, tự vẽ sơ đồ mô hình hóa cho các bài toán thực tế (ngân hàng, thương mại điện tử, hệ thống SIS), sau đó tự tay cài đặt các lớp đối tượng mẫu trên cả hai môi trường Java và C++ để so sánh sự khác biệt trong cú pháp và cơ chế quản lý bộ nhớ.

5. Giáo trình có đề cập đến các tài liệu bổ trợ và công cụ nào?
Giáo trình cung cấp các liên kết tài liệu đọc hiểu chuyên sâu về lập trình cấu trúc so với OOP, hệ thống sơ đồ mô hình hóa theo chuẩn UML/UML 2, và các ca nghiên cứu thực tế về hệ thống thông tin doanh nghiệp.


Kết luận

Giáo trình Lập trình hướng đối tượng của Bộ môn Công nghệ phần mềm – Trường Đại học Bách khoa Hà Nội cung cấp một khung kiến thức học thuật hệ thống và chuẩn mực về mô hình lập trình hướng đối tượng. Bằng việc phân tích sâu sắc tiến trình trừu tượng hóa, nguyên lý mô hình hóa thực thể, cơ chế tương tác thông điệp và cách thức hiện thực hóa trên Java và C++, tài liệu đóng vai trò nền tảng trong đào tạo kỹ thuật phần mềm.

Lộ trình học tập khuyến nghị bắt đầu từ việc nắm vững lịch sử và các cấp độ trừu tượng hóa, hiểu rõ bản chất Lớp/Đối tượng qua các case study thực tế, và hoàn thiện kỹ năng lập trình hướng đối tượng thông qua thực hành bài tập chuyên sâu.