Thế lập trình hướng đối tượng cung cấp cho lập trình viên những khả năng gì?
Ngôn ngữ lập trình hướng đối tượng đã xây dựng một mối liên kết khắng khít giữa cấu trúc dữ liệu và những phương thức điều tác chúng. Điều quan trọng là khi tiếp cận với lập trình hướng đối tượng những gì bạn phải nghĩ đến không còn là cấu trúc dữ liệu và các hàm điều tác. Thay vào đó bạn phải luôn nghĩ đến cái gọi là "đối tượng" (object).
Hầu hết mọi người khi nhìn vào một chiếc xe hơi, họ không nghĩ về những thông tin mà nó có và làm cách nào để điều quản những thông tin ấy. Họ nghĩ về các bánh xe, bộ truyền động, hộp số… Họ nghĩ về cách cho xe chạy, dừng lại, tăng tốc… Họ nghĩ về đường đi, cảnh sát công lộ và những vé phạt quá tốc độ… Nói ngắn gọn là hầu hết mọi người nghĩ đến những sự vật (things) và những sự vật đó làm những gì. Thực tế, đây là cách mà loài người nghĩ về mọi thứ. Quá trình tiến hoá hàng chục triệu năm đã dạy chúng ta cách nhìn về một thế giới như được lắp đầy bởi những sự vật. Một vài trong số những sự vật đó chúng ta có thể ăn, một số khác lại ăn chúng ta…
Một cách lý tưởng, phần mềm của chúng ta được mô hình hóa rất giống với thế giới thực. Nhìn theo góc độ này, những chương trình của chúng ta trở nên dễ hiểu hơn và dễ bảo trì hơn. Những đối tượng trong thế giới thực có những đặc tính và những hành vi riêng, đối tượng trong chương trình cũng vậy.
Bây giờ chúng ta xem những khác biệt trong ngôn ngữ lập trình hướng đối tượng mà cụ thể là C++. Hãy xem đoạn mã sau:
#include <iostream.h>
class Employee
{
public:
Employee(int salary, int level);
~Employee(){}
void GiveARaise(double pctg);
int GetSalary() const {return mSalary;}
private:
int mSalary;
int mLevel;
};
Employee::Employee(int salary, int
level):mSalary(salary),mLevel(level)
{
cout<<"Initializing Employee with salary :"<<mSalary<<endl;
}
void Employee::GiveARaise(double pctg)
{
int increment = int(mSalary*pctg);
cout<<"Incrementing salary by "<<increment<<endl;
mSalary+=increment;
}
int main()
{
Employee Emp(50000,3);
Cout<<"Emp''s salary :"<<Emp.GetSalary()<<endl;
}
Trong chương trình trên chúng ta khai báo một lớp (class) có tên là Employee. Một lớp chẳng qua là một kiểu dữ liệu mở rộng. Chúng ta bắt đầu với những kiểu dữ liệu xây dựng sẵn trong C như kiểu int, double, float … nhưng bây giờ chúng ta thêm vào một danh sách bằng cách tạo ra một kiểu dữ liệu mới và sau đó khai báo biến sử dụng kiểu dữ liệu mới này.
Một kiểu dữ liệu có thể có những hành vi (behavior) và những thuộc tính (atribute). Hành vi được thể hiện bởi những phương thức (method) trong lớp, còn những thuộc tính được đại diện bởi các biến thành viên của lớp. Trong lớp Employee ở trên có 2 biến thành viên: mSalary và mLevel; 4 phương thức: hàm dựng (contructor), hàm hủy (destructor), hàm truy cập (accessor) GetSalary và GiveARaise.
Hàm dựng dùng để khởi tạo các biến khi đối tượng được tạo ra. Trong ví dụ của chúng ta, hàm dựng làm tác vụ khởi tạo giá trị cho hai biến là mSalary và mLevel.
Hàm hủy được dùng khi huỷ đối tượng và có tác dụng giải phóng tài nguyên như bộ nhớ mà đối tượng được cấp phát. Trong ví dụ này, hàm hủy không làm gì cả.
GetSalary chỉ làm công việc trả về giá trị của mSalary.
GetARaise là hàm thành viên của Employee và nó truy xuất được đến biến cục bộ mSalary. Hàm này được dùng khi bạn muốn tăng lương cho nhân viên.
" Sử dụng đối tượng Employee như thế nào ?
Một "khách hàng" (client) của một lớp là bất kỳ đối tượng hay một hàm có gọi đến các phương thức của lớp. Trong trường hợp của chúng ta, hàm main() có gọi đến các phương thức của lớp Employee nên có thể xem hàm main() là một khách hàng của lớp này. Trong hàm main(), chúng ta tạo ra một thể hiện (instance) của lớp Employee.
Chúng ta xem lại những phân biệt giữa một lớp Employee và một đối tượng Employee cụ thể (giả sử đó là Fred, nhân viên của phòng tiếp thị). Lớp Employee là tổng quát cho tất cả nhân viên, những thuộc tính mà lớp Employee có là gì và hành xử của nó như thế nào? Employee được thể hiện trong C++ là một lớp. Đối với nhân viên cụ thể (Fred chẳng hạn) là một thể hiện của lớp và được đại diện trong C++ bởi một đối tượng.
" Tại sao lại phải phiền phức đến thế ?
Bạn đã điều tác được cấu trúc Employee bằng những hàm trong C, vậy tại sao lại phải học những thứ phiền toái chỉ để phục vụ cho cùng một công việc ?
Một lợi điểm của hướng đối tượng là tạo ra những đối tượng có biên chặt chẽ hơn. Mọi thứ mà chúng ta biết và mọi thứ mà chúng ta làm được bó lại với nhau thành một gói gọn gàng. Ý tưởng này được gọi là bao đóng (encapsulation). Bằng cách bao đóng những phương thức và biến vào trong một thực thể đơn, chúng ta giảm được ức chế tâm lý cho lập trình viên. Những nhà phát triển hướng đối tượng chia giới lập trình hướng đối tượng thành hai loại: nhà cung cấp và khách hàng. Nhà cung cấp chuyên viết các lớp và làm cho nó chạy. Khách hàng kết hợp các thể hiện của những lớp này cho chúng làm việc với nhau.
Bookmarks