Một khái niệm đầy hiệu lực đợc đa vào với lập trình có cấu trúc là trừu tợng Trừu tợng có thể đợc định nghĩa nh là khả năng xét một điều gì đó mà không quan tâm đến các chi tiết bên tron
Trang 1Kỹ thuật lập trình hớng đối tợng
Thành Viên Nhóm Công Cụ :
Dơng Chí Đức ( c), Hoàng Trung Hải , Nguyễn Việt Dũng
Thạch Đăng Sơn, Nguyễn Thị Hoà
Ngời Trình Bầy
Hoàng Trung Hải
Ngày nay khi tin học ngày càng phát triển mạnh mẽ và thâm nhập vào mọi lĩnh vực của đời sống việc xây dựng ứng dụng cho các ngành nghiệp vụ không đơn thuần chỉ bó hẹp trong một vấn đề mà phải sử dụng những kiến thức, thành quả của nhiều lĩnh vực khác nhau Sẽ khó khăn nếu tự mình xây dựng ứng dụng, khái niệm Object(đối tợng) ra đời nhằm giải quyết vấn đề đó
Để hiểu rõ u điểm của lập trình hớng đối tợng chúng ta hãy tìm hiểu một chút
về lập trình có cấu trúc
Lập trình có cấu trúc đợc xuất hiện vào những năm 60-70 Chơng trình có cấu trúc đợc tổ chức theo các phép toán mà nó phải thực hiện Về bản chất ch ơng trình đợc chia thành các thủ tục riêng lẻ(còn gọi là hàm), chúng đợc thực hiện các nhiệm vụ riêng rẽ trong một quá trìng lớn và phức tạp hơn Các thủ tục này
đợc giữ riêng biệt nhau nhiều nhất có thể đợc, mỗi quá trình có logic và dữ liệu riêng Thông tin đợc truyền qua các thủ tục bằng cách dùng tham biến, mà thủ tục có thể có dữ liệu riêng mà bên ngoài phạm vi của nó không thể thâm nhập đ
-ợc Nói cách khác hàm nh một chờng trình chính đợc thu nhỏ có thể gắn với nhau để xây dựng một ứng dụng
Mục tiêu của lập trình có cấu trúc là làm cho việc phát triển phần mềm đ ợc dễ dàng hơn đ/v ngời lập trình trong khi phẫn tăng cờng đợc độ tin cậy và tính dễ bảo trì Chơng trình có cấu trúc đợc xây dựng bằng cách chia nhỏ chơng trình lớn thành các phần cơ bản, các thành phần này lại trở thành hàm bên trong
ch-ơng trình Bằng cách cô lập các quá trình bên trong hàm, chch-ơng trình có cấu trúc làm giảm thiểu cơ may thủ tục nọ ảnh hởng tới thủ tục kia Điều này cũng làm cho việc cô lập vấn đề trở nên dễ dàng hơn Việc tách bạch hoá chơng trình cũng cho phép bạn viết chơng trình dễ dàng hơn và duy trì sự kiểm soát trên từng hàm Biến toàn cục bị thay thế bởi biến nội bộ và các tham biến vốn có phạm vi nhỏ hơn và dễ kiếm soát hơn Cách tổ chức tốt hơn này bạn có khả năng hiểu logic chơng trình làm cho việc phát triển bảo trì của nó đợc hiệu quả hơn
Một khái niệm đầy hiệu lực đợc đa vào với lập trình có cấu trúc là trừu tợng Trừu tợng có thể đợc định nghĩa nh là khả năng xét một điều gì đó mà không quan tâm đến các chi tiết bên trong của nó Trong một chơng trình có cấu trúc, ta chỉ cần biết rằng thủ tục đã cho thực hiện một nhiệm vị xác định Việc nhiệm vụ này thực hiện nh thế nào không quan trọng, chừng nào mà thủ tục còn tin cậy
đ-ợc thì còn có thể dùng nó mà không cần phải biết làm sao nó hoàn thành đúng
đắn chức năng của mình Điều này đợc xem nh nền tảng của lập trình có cấu trúc
Khi độ phức tạp của chơng trình tăng lên, sự phụ thuộc của nó vào các kiểu dữ liệu cơ bản mà nó sử lý cũng tăng theo Vấn đề trở nên rõ ràng rằng cấu trúc dữ liệu trong chơng trình quan trọng không kém các phép toán thực hiện trên chúng Điều này trở nên hiển nhiên hơn khi chơng trình càng tăng về kích thớc Các kiểu dữ liệu xử lý trong nhiều thủ tục bên trong một chơng trình có cấu
Trang 2trúc, và khi có sự thay đổi trong các kiểu dữ liệu này thì cũng phải thực hiện cả những thay đổi ở mọi nơi có các tác động lên kiểu dữ liệu đó Đây là một công việc tốn thời gian và hiệu quả đối với các chơng trình có hàng nghìn dòng lệnh
và hàng trăm hàm
Một nhợc điểm nữa của lập trình có cấu trúc lộ ra khi cần phải dùng nhiều ng ời
để lập trình cho một ứng dụng Trong một chơng trình có cấu trúc, từng ngời đợc giao xây dựng một tập các hàm và kiểu dữ liệu dùng chung cho lẫn nhau cho nên những thay đổi về cấu trúc dữ liệu của ngời này sẽ ảnh hơng tới công việc của ngời khác, những sai sót trong liên lạc giữa các thành viên trong nhóm có thể dẫn tới việc mất thời gian để viết lại
Ngợc lại, lập trình hớng đối tợng làm cho chơng trình gọn hơn, dễ dàng kết hợp với các chơng trình khác OOP là phơng pháp đóng gói từng phần của chơng trình thành các đối tợng để có thể tái sử dụng cũng nh duy trì bảo dỡng dễ dàng hơn Lập trình viên có thể tập trung sâu hơn vào công việc cần phải giải quyết, tiết kiệm thời gian công sức xây dựng chơng trình mà vẫn sử dụng đợc các chức năng đã có
II.Lập trình hớng đối tợng
1 Đối tợng:
- Đối tợng là sự kết hợp của chơng trình với dữ liệucó thể sử dụng nh một đơn
vị độc lập
- Đối tợng là phần dữ liệu đợc khai báo thuộc lớp Khái niệm về lớp sẽ đợc giới thiệu ở phần sau
3 thành phần đặc trng của đối tợng :
- Thuộc tính: là các thông tin về bản thân đối tợng, có thể lây ra từ chúng hoặc thay đổi chúng
Ví dụ: đối tợng xe thì có thuộc tính số xe, màu sơn, số máy,
- Phơng pháp: Có thể là công việc mà đối tợng đó phải thực hiện
Ví dụ: Xe thì phơng pháp là đi, ngoặt,
- Sự kiện : là hoạt động xẩy ra mà đối tợng nhận biết đợc
Vd: ở Windows khi ta nhấp chuột vào một form nào đó thì sự kiện nhâp chuột xảy ra
2 Lập trình hớng đối tợng
- Lập trình hớng đối tợng gắn câu trúc dữ liệu với cac phép toán
- Lập trình hớng đối tợng là phơng pháp mới đợc tiếp cận việc lập trình Nó đợc xây dựng trên nền tảng của các khái niệm lập trình có cấu trúc và sự trừu t
Trang 3-ợng hoá dữ liệu Sự thay đổi cơ bản là OOP đợc thiết kế thiết kế xoay quanh dữ liệu mà nó thao tác chứ không theo bản thân các thao tác
- OOP cho phép ta dùng các quá trình trí tuệ này với các khái niệm trừu tợng
đ-ợc dùng trong chơng trình máy tính
VD: không thể viết số phức lên bản ghi nhân sự hoặc không đợc cộng hai bản ghi với nhau
- OOP cho phép ta chia bài toán thành các bài toán nhỏ quan hệ với nhau Mỗi bài toán là một đối tợng chứa dũ liệu và lệnh có quan hệ với có quan hệ với
đối tợng đó
- Phơng pháp trong lập trình hớng đối tợng mô phỏng sự phân lớp trong tự nhiên
III Kỹ thuật lập trình OOP :
Trong mục này chúng sẽ tìm hiểu các khái niệm nh sự đóng gói, lớp, thực thể, tình kế thừa của đối tợng, tính đa hình, phơng thức ảo Đây là những khái niệm căn bản và là nền tảng trong lập trình hơng đối tợng
Sự đóng gói :
Máy tính là một ngành khoa học nghiên cứu về việc lu trữ và xử lý thông tin, thực chất đó là việc xử lí dữ liệu Vì vậy sẽ hoàn toàn tự nhiên nếu một
ch-ơng trình đợc thiết kế xoay quanh dữ liệu hơn là theo bản thân các chức năng của chơng trình Dữ liệu và thao tác trên dữ liệu đợc lên kết với nhau, cái này đòi hỏi các kia chính vì thế OOP làm cho các quan hệ hỗ trợ đợc thể hiện rõ ràng nhất
Trong quá trình một chơng trình OOP thực hiện, chúng ta có gửi cùng một thông
điệp đến các đối tợng khác nhau Để làm đợc điều đó cấu trúc chơng trình đã
đ-ợc tổ chức sao cho có sự tơng ứng, sự đồng nhất giữa dữ liệu và các thao tác tác
động đến dữ liệu Khi đó chúng ta quan tâm đến vấn đề " phải làm công việc cụ thể gì " mà chỉ điều khiển bằng mệnh lệnh "làm việc" có nghĩa là cùng với một mệnh lệnh một thông điệp chơng trình vẫn nhận biết để thực hiện Sự đóng gói chính là khả năng cất giữ riêng biệt dữ liệu và phơng thức tác động lên dữ liệu
đó, " tất cả thông tin của một hệ thống định hớng đối tợng đợc lu giữ bên trong các đối tợng và nó 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ậy sự đóng gói không đơn thuần chỉ sự gom chung dữ liệu và chơng trình vào bên trong một khối, chúng còn đợc hiểu thêm theo nghĩa đó là sự đồng nhất dữ liệu và các thao tác tác động lên giữ liệu đó
**vd: với vật liệu xi măng, sắt thép đợc đồng nhất với thao tác làm móng, xây tờng khi đó ngời điều hành chỉ với một mệnh lệnh "hãy làm đi" ngời thợ sẽ biết công việc của mình Tất cả những gì thấy đợc của đối tợng đã đợc đóng gói
đó là các phơng thức giao tiếp của đối tợng
Trang 4Lớp và thực thể :
Khi đợc đề cập đến hệ thống đợc tổ chức xung quanh các cấu trúc dữ liệu, rõ ràng chúng ta quan tâm đến các lớp các cấu trúc dữ liệu hơn là bản thân từng dữ liệu, từng đối tợng Phấn quan tâm trong một hệ thống không phải là một mô tả dữ liệu riêng, một cú pháp đơn lẻ, mà là tất cả các bộ mô tả tập hợp cấu trúc dữ liệu đợc đặt trng bởi các tính chất chung
Lớp ( Class ) thực chất là một kiểu dữ liệu đợc định nghĩa trong chơng trình Tuy nhiên khái niệm về lớp còn xa hơn, nó chứa bên trong sự cài đặt về đặc tính cũng
nh những thao tác có thể có trên dữ liệu Một cách tổng quát, lớp đặc trng cho một mẫu của một vài đối tợng và mô tả cấu trúc bên trong của những đối tợng này Những đối tợng của cùng một lớp có cùng định nghĩa về các thao tác và cùng cấu trúc dữ liệu của chúng
VD: chúng ta tạo một lớp POINT hai thành phần là toạ độ và điểm trong mặt phẳng và thao tác nh gán giá trị cho toạ độ, hiển thị toạ đọ của điểm
class point
{ int x // toạ độ của điểm
int y
voidsetXY (int a, int b)
{ x:=a; // thủ tục gán giá trị cho toạ độ y:=b;
}
voidDisplay (void)
{ printf("hoành độ: %d\n", x); // in hoành độ và tung độ printf ("tung độ : %d\n", y);
} }
Thực thể (instance) là một vật thể có thực bên trong bộ nhớ, thực chất đó là đối tợng, nói cách khác thực thể là một biến (variable) đợc khai báo thuộc kiểu lớp Một thực thể là một đối tợng đợc tạo ra từ một lớp Lớp môt tả cấu trúc (hành vi
và thông tin ) của thực thể, trong khi đó tình trạnh hiện hành (curent state) của thực thể đợc xác định bởi những thao tác tác động lên thực thể
Vd:
class point
{ int x // toạ độ của điểm
int y
voidsetXY (int a, int b)
{ x:=a; // thủ tục gán giá trị cho toạ độ y:=b;
}
voidDisplay (void)
{ printf("hoành độ: %d\n", x); // in hoành độ và tung độ printf ("tung độ : %d\n", y);
} }
Voidmain(void)
{
printf (" gan cho p hai toa do (0, 1) va (4, 5) \n");
point p; // tạo ra đối tợng P
p setXY(0, 1); // cho thực thể p giá trị là (0, 1)
p display () ;
p setXY(4, 5); // cho thực thể p giá trị là (4, 5)
p display;
}
Trang 5trong vd này lớp point đợc định nghĩa nôm na nh một kiểu dữ liệu mới
Tính kế thừa (Inheritance)
Trớc khi đề cập đến khái niệm kế thừa chúng ta tìm hiểu qua một ít về sự phân lớp các đối tợng Đây chính là sự xắp xếp các đối tợng, tổ chức sao cho thế giới thực ( real world) đang khảo sát nằm trong một khôn khổ nhất định Khi đó, nếu gặp đợc một đối tợng mới chúng ta dễ dàng đa nó vào lớp thích hợp Sự phân lớp của đối tợng giúp cho hệ thống đơn giản hơn tập hợp lại các đối tợng có cùng những hành vi giao tiếp Sự phân lớp nh vậy chính là bớc đầu tiên trong việc xây dựng chơng trình theo hớng đối tợng
Bây giờ chúng ta bàn đến tính kế thừa Sau khi tiến hành phân lớp, công việc kế tiếp là xây dựng các lớp dẫn xuất từ những lớp đã có gọi là lớp cơ sở những lớp này, ngoài tính chất riêng của mình thì chúng còn giữ lại các đặc điểm của các lớp cơ sở, nói cách khác chúng thừa kế các hành vi và dữ liệu của lớp cơ sở Lớp
kế thừa từ lớp cơ sở gọi là lớp dẫn xuất, những lớp dẫn xuất này đến lần l ợt chúng lại đóng vai trò lớp cơ sở của các dẫn xuất khác
Vd: chúng ta xây dựng lớp window trong đó có một phơng thức
sau đó dẫn đến lớp dẫn xuất Title_Window từ lớp Window
để xuất dòng chữ trong khung cửa sổ
class window { public:
voidShownd (int x, int y, int w, int h)
{
rectangle (x, y, x+w, y+h) }
} class title_window : public window { public:
voidshownTitlewnd(int x, int y, int w, int h, char*title);
rectangle(x, y, x+w, y+h);
outtext(x, y+2);
shownwindow(x, y+14, x+w, y+h);
} }
Với tính kế thừa chúng ta không phải mất công xây dựng lại từ đầu những đối t -ợng mới, chỉ cần bổ sung để có đợc trong các lớp dẫn xuất những đặc tính cần thiết Nhớ tính kế thừa các đối tợng thuộc lớp khác nhau sẽ có chung một vài
ph-ơng thức nh những hành vi giao tiếp Khi đó chúng ta có thể gửi cùng một thông
điệp đến tất cả các đối tợng có cùng tính một chất đó là những đối tợng có cùng kiểu cơ sở
Tính đa hình (Polymorphism):
Đ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ùng có 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ả đối t-ợng hình hộp lẫn hình tròn Trong hai đối tt-ợng này đếu có phơng thức vẽ hình, nê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
Trang 6Trong 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 Đặ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 rờm rà trong chơng trình của mì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 Dùng để viết chơng trình có thể mở rộng nhiều hơn nghiã là khi dữ liệu mới đợc thêm vào có liên hệ với các kiểu dữ liệu đang có thì bản chất đa dạng sẽ làm cho loại này thích hợp ngay mà không cần phải thay đổi chơng trình Tính
đa hình có đợc chính nhờ các khái niêm nh phơng thức ảo, kết nối động
Phơng thức ảo (vitual method):
Trong các phần trên chúng ta đề cập đến sự hoàn chỉnh của việc lập trình hớng
đối tợng, đó là việc có thể gửi cùng một thông điệp đến các đối tợng khác nhau
mà không cần những cấu trúc điều khiển rờm rà, đối tợng sẽ nhận đợc chỉ thị cần thiết ngay sau khi chạy chơng trình Kỹ thuật này gọi là " sự kết nối động " (dynamic binding), nó cho phép chúng ta can thiệp vào sự hoạt động của các thực thể mà không cần biên dịch lại chơng trình, chúng ta có thể truyền và nhận thông tin từ những đối tợng mới này giống nh các đối tợng đã có
Để có sự thuận lợi đó, trong khi cài đặt các lớp của đối tợng, chúng ta phải cài
đặt các phơng thức ảo trong ngôn ngữ OOP thờng đợc gọi là thành phần ảo Đây
là các phơng thức sẽ mang nội dung cụ thể vào lúc thực hiện chơng trình Khi chơng trình biên dịch dịch từ ngôn ngữ nguồn sang ngôn ngữ máy các đoạn
ch-ơng trình của các phch-ơng thức ảo sẽ đợc đa vào trong bảng các phch-ơng thức ảo (vitual method table VMT) Vào thời điểm chơng trình thực hiện, các phơng thức
ảo này sẽ gọi từ các bảng này Chính vì vậy kỹ thuật kết nối động đôi khi còn
đ-ợc gọi là kỹ thuật kết nối trễ hay kết nối lúc chạy
Chẳng hạn, trong khi đề cập đến tính đa hình ở trên chúng ta nhận thấy thông
điệp vẽ hình đã đợc gửi đến các đối tợng khác nhau để thực hiện một công việc
vẽ một hình ảnh Phơng thức vẽ hình trong trờng hợp này là một phơng thức ảo,
nó không phải độc quyền của một đối tợng nào mà nó có thể xuất hiện trong các kiểu khác nhau và tuỳ thuộc vào nội dung cụ thể của kiểu đó
Trên đây chúng tôi đã giới thiệu một số khái niệm cơ bản về kỹ thuật lập trình h-ớng đối tợng cũng nh u điểm của kỹ thuật này so với các kỹ thuật lập trình khác
Tài liệu tham khảo
Lập trình hớng đối tợng C++ (Trần Văn Lăng) Object oriented modeling and deginer
Turbo C++ and Application (Yoeung Kosal)