Lập trình hướng đối tượng với C++ - Mở đầu
Phần C++ đã học chỉ đủ để viết những chương trình
C++ nhỏ.
n Sinh viên gặp nhiều khó khăn khi viết một chương trình
lớn hoặc làm việc trong một nhóm cùng các lập trình
viên khác? Làm thế nào để đảm bảo tính thống nhất
trong chương trình lớn hoặc giữa các lập trình viên khác
nhau?
n Trong môn học này, sinh viên sẽ học những kiến thức
cơ bản về lập trình hướng đối tượng (Object-Oriented
Programming - OOP). Mục đích là để học cách thiết kế
và viết những dự án phần mềm lớn
Mở đầu Lập trình hướng đối tượng @ 2004 Trần Minh Châu. FOTECH. VNU 2 Giới thiệu môn học n Phần C++ đã học chỉ đủ để viết những chương trình C++ nhỏ. n Sinh viên gặp nhiều khó khăn khi viết một chương trình lớn hoặc làm việc trong một nhóm cùng các lập trình viên khác? Làm thế nào để đảm bảo tính thống nhất trong chương trình lớn hoặc giữa các lập trình viên khác nhau? n Trong môn học này, sinh viên sẽ học những kiến thức cơ bản về lập trình hướng đối tượng (Object-Oriented Programming - OOP). Mục đích là để học cách thiết kế và viết những dự án phần mềm lớn. @ 2004 Trần Minh Châu. FOTECH. VNU 3 Lịch sử ngắn gọn Các ngôn ngữ lập trình thời kỳ đầu như Basic, Fortran... không có cấu trúc và cho phép viết những đoạn mã rối rắm (spaghetti code). Lập trình viên sử dụng các lệnh goto” và “gosub” để nhảy đến mọi nơi trong chương trình. 10 k=1 20 gosub 100 30 if y > 120 goto 60 40 k = k + 1 50 goto 20 60 print k, y 70 stop 100 y = 3*k*k + 7*k - 3 110 return Đoạn trình trên khó theo dõi, khó hiểu, dễ gây lỗi, khó sửa đổi. lệnh nhảy đến vị trí bất kỳ trong chương trình @ 2004 Trần Minh Châu. FOTECH. VNU 4 Lịch sử ngắn gọn... Kiểu lập trình rối rắm trên dẫn tới phong cách lập trình mới: lập trình cấu trúc, với các ngôn ngữ Algol, Pascal, C... int func(int j) { return (3*j*j + 7*j-3; } int main() { int k = 1 while (func(k) < 120) k++; printf("%d\t%d\n", k, func(k)); return(0); } Đặc điểm của lập trình cấu trúc hay lập trình thủ tục (Procedural Programming - PP) là: n Sử dụng các cấu trúc vòng lặp: for, while, repeat, do-while n Chương trình là một chuỗi các hàm/ thủ tục n Mã chương trình tập trung thể hiện thuật toán: làm như thế nào. @ 2004 Trần Minh Châu. FOTECH. VNU 5 Hạn chế của lập trình thủ tục struct Date { int day; int month; int year; }; void setDate(Date& date, int newDay, int newMonth, int newYear) { date.day = newDay; ... } ... n dữ liệu và phần xử lý tách biệt n dữ liệu thụ động, xử lý chủ động n không đảm bảo được tính nhất quán và các ràng buộc của dữ liệu ¨ khó cấm mã ứng dụng sửa dữ liệu của thư viện n khó bảo trì code ¨ phần xử lý có thể nằm rải rác và phải hiểu rõ cấu trúc dữ liệu Chuyện gì xảy ra nếu các đối số newDay, newMonth, newYear tạo thành ngày tháng năm không hợp lệ? @ 2004 Trần Minh Châu. FOTECH. VNU 6 Lập trình hướng đối tượng class Date { public: void setDate(int newDay, int newMonth, int newYear); int getDay() { return day; } ... private: int day; int month; int year; }; void Date::setDate(int newDay, int newMonth, int newYear) { //check validity of newDay, newMonth, newYear ... //set new values ... } n Lập trình hướng đối tượng cho phép khắc phục các hạn chế nói trên @ 2004 Trần Minh Châu. FOTECH. VNU 7 Lập trình hướng đối tượng Chú ý: Lập trình hướng đối tượng không tự dưng cho ta thiết kế chương trình tốt. n Ví dụ: hai đoạn trình dưới đây không có gì khác nhau. Thậm chí đoạn chương trình hướng đối tượng còn tồi hơn. struct Date { int day; int month; int year; }; class Date { public: int getDay { return day;} ... int setDay(int newDay) { day = newDay; } ... private: int day; int month; int year; }; @ 2004 Trần Minh Châu. FOTECH. VNU 8 Lịch sử OOP n Các ngôn ngữ lập trình hướng đối tượng không mới ¨ Simula (1967) là ngôn ngữ đầu tiên, có lớp, thừa kế, liên kết động (hay còn gọi là hàm ảo) n Nhưng các ngôn ngữ hướng đối tượng chậm hơn các ngôn ngữ thời kỳ đầu ¨ nên chúng chỉ được dùng rộng rãi khi máy tính bắt đầu chạy nhanh (khoảng thời gian chiếc máy Pentium đầu tiên ra đời) ¨ Lưu ý rằng biên dịch các chương trình hướng đối tượng cũng chậm @ 2004 Trần Minh Châu. FOTECH. VNU 9 Hướng đối tượng là gì? n Một số hệ thống “hướng đối tượng” thời kỳ đầu không có các lớp ¨ chỉ có các “đối tượng” và các “thông điệp” (v.d. Hypertalk) n Hiện giờ, đã có sự thống nhất rằng hướng đối tượng là: ¨ lớp - class ¨ thừa kế - inheritance và liên kết động - dynamic binding n Một số đặc tính của lập trình hướng đối tượng có thể được thực hiện bằng C hoặc các ngôn ngữ lập trình thủ tục khác. n Điểm khác biệt sự hỗ trợ và ép buộc ba khái niệm trên được cài hẳn vào trong ngôn ngữ. n Mức độ hướng đối tượng của các ngôn ngữ không giống nhau ¨ Eiffel (tuyệt đối), Java (rất cao), C++ (nửa nọ nửa kia) @ 2004 Trần Minh Châu. FOTECH. VNU 10 Các đặc điểm quan trọng của OO n Các lớp đối tượng - Classes ¨ Khả năng lưu trạng thái - State retention ¨ Định danh đối tượng - Object identity ¨ Các thông điệp - Messages n Đóng gói – Encapsulation ¨ Che dấu thông tin - Information/implementation hiding n Thừa kế - Inheritance n Đa hình - Polymorphism n Lập trình tổng quát - Genericity abstraction encapsulation inheritance polymorphism Tam giác "P.I.E" @ 2004 Trần Minh Châu. FOTECH. VNU 11 Đóng gói Che dấu thông tin n Đóng gói: Nhóm những gì có liên quan với nhau vào làm một, để sau này có thể dùng một cái tên để gọi đến ¨ Các hàm/ thủ tục đóng gói các câu lệnh ¨ Các đối tượng đóng gói dữ liệu của chúng và các thủ tục có liên quan n Che dấu thông tin: đóng gói để che một số thông tin và chi tiết cài đặt nội bộ để bên ngoài không nhìn thấy ¨ mục tiêu là để khách hàng của ta (thường là các lập trình viên khác) coi các đối tượng của ta là các hộp đen @ 2004 Trần Minh Châu. FOTECH. VNU 12 Đối tượng n Lưu giữ trạng thái: mỗi đối tượng có trạng thái (dữ liệu của nó) và các thao tác ¨ có thể nói đối tượng có một dạng “ký ức” về quá khứ ¨ các thao tác của đối tượng có thể sửa trạng thái của đối tượng đó. n Định danh: Mỗi đối tượng bất kể đang ở trạng thái nào đều có định danh và được đối xử như một thực thể riêng biệt. ¨ mỗi đối tượng có một handle (trong C++ là địa chỉ) ¨ hai đối tượng có thể có giá trị giống nhau nhưng handle khác nhau ¨ ngôn ngữ Lisp phân biệt hai phép so sánh eq và equal @ 2004 Trần Minh Châu. FOTECH. VNU 13 Đối tượng n Thông điệp: là phương tiện để một đối tượng A chuyển tới đối tượng B yêu cầu B thực hiện một trong số các thao tác của B. n một thông điệp gồm 3 phần: ¨ handle của đối tượng đích (đối tượng chủ) ¨ tên thao tác cần thực hiện ¨ các thông tin cần thiết khác (các đối số) n thực ra là một lời gọi hàm với một đối số ẩn là đối tượng chủ n tuy nhiên, khái niệm thông điệp có ý nghĩa lớn đối với OOP ¨ dữ liệu trở nên chủ động ¨ đối lập với quan điểm cũ về lập trình rằng n mọi hành động được điều khiển tập trung n dữ liệu luôn luôn bị động, các thủ tục thao tác dữ liệu @ 2004 Trần Minh Châu. FOTECH. VNU 14 Lớp đối tượng - class n Lớp: là khuôn mẫu để tạo các đối tượng (tạo các thể hiện). Mỗi đối tượng có cấu trúc và hành vi giống như lớp đối tượng mà nó được tạo từ đó ¨ VD. Lớp VánCờ, các ván cờ cụ thể là các đối tượng VánCờ n Lớp là cái ta thiết kế và lập trình n Đối tượng là cái ta tạo (từ một lớp) tại thời gian chạy @ 2004 Trần Minh Châu. FOTECH. VNU 15 Thừa kế n là cơ chế cho phép một lớp D có được các thuộc tính và thao tác của lớp C, như thể các thuộc tính và thao tác đó đã được định nghĩa lại lớp D. n cho phép các phần mềm sử dụng quan hệ “là” n giúp ta thiết kế các dịch vụ tổng quát rồi chuyên môn hóa chúng SHAPE - color + draw() CIRCLE - radius - width - length RECTANGLE @ 2004 Trần Minh Châu. FOTECH. VNU 16 Đa hình n Đa hình hàm - Functional polymorphism ¨ cơ chế cho phép một tên thao tác hoặc thuộc tính có thể được định nghĩa tại nhiều lớp và có thể có nhiều cài đặt khác nhau tại mỗi lớp trong các lớp đó n v.d. lớp Date cài 2 phương thức setDate(),một nhận tham số là một đối tượng Date, phương thức kia nhận 3 tham số day, month, year. n Đa hình đối tượng - Object polymorphism ¨ các đối tượng thuộc các lớp khác nhau có khả năng hiểu cùng một thông điệp theo các cách khác nhau n vd. khi nhận được cùng một thông điệp draw(), các đối tượng Rectangle và Triangle hiểu và thực hiện các thao tác khác nhau @ 2004 Trần Minh Châu. FOTECH. VNU 17 Lập trình tổng quát – genericity n khả năng xây dựng một lớp C sao cho một hoặc nhiều lớp được sử dụng bên trong C sẽ được cung cấp tại thời gian chạy ¨ vd. kiểu ngăn xếp tổng quát, có thể dùng để chứa các đối tượng Date, có thể dùng cho các string n Thực tế với C++: ¨ cài đặt bằng khuôn mẫu – template hay các kiểu có tham số ¨ Lựa chọn khuôn mẫu được quyết định tại thời điểm biên dịch của chương trình khách hàng - user n không phải tại thời điểm biên dịch của chương trình của người thiết kế - thư viện
File đính kèm:
- lap_trinh_huong_doi_tuong_voi_c_mo_dau.pdf