Thứ Hai, 11 tháng 3, 2013

Các đặc tính của lập trình hướng đối tượng (OOP)

4 đặc tính quan trọng của OOP (object oriented programming) là: Abstraction, encapsulation, inheritance và polymorphism. Có rất nhiều tài liệu viết về 4 đặc tính này và dĩ nhiên mỗi tác giả có cách diễn đạt khác nhau. Thật sự ban đầu mình đọc một tài liệu nào đó nói về vấn đề này, sau một khoảng thời gian mình lại đọc một tài liệu của người khác cũng bàn về vấn đề tương tự, mình nhận ra sự khác nhau. Nói đúng hơn là mình chỉ hiểu mang máng các khái niệm chứ không hiểu rõ bản chất thật sự của nó. Ngoài ra trong quá trình học, giảng viên lại nói về v/đ này nhưng lại diễn đạt khác nhau, đôi lúc lại khác với những gì mình đọc được. Đó là nỗi băn khoăn đối với những người mới học lập trình OOP như mình.

 

Bài này mình ghi chú lại vì đây là câu hỏi thường gặp khi bạn nộp đơn xin việc vào công ty nào tuyển LTV OOP (như Java, C#, C++, VB.NET…).


  1. Abstraction (Tính trừu tượng)


- Trừu tượng tức là chung chung, không cụ thể. Đặc tính này được thể hiện trong lớp trừu tượng (abstract class). Ví dụ: ta có lớp động vật (class dongvat) có các phương thức: mắt, màu lông,… và thuộc tính: ăn, uống, đi,… nhưng ta không thể biết được đó là động vật nào. Cũng như trong sinh học lớp 10 có nói đến ngành-lớp-bộ-họ-chi-loài trong đó có lớp thú, ta cũng đâu có biết đó là con gì, đúng không? Chỉ khi nào ta hiện thực lớp động vật này tức là cụ thể hóa đối tượng từ lớp này thì thông tin đối tượng lúc này mới chính xác. Ví dụ: ta có lớp chó (class dog) là con của lớp động vật (lớp cha). Một ví dụ khác, ta có 3 hình sau: hình chữ  nhật, hình thang, hình tam giác, cả 3 đều có chu vi, diện tích nhưng công thức tính của chúng hoàn toàn khác nhau. Như vậy trong OOP, ta sẽ có 1 lớp trừu tượng là hình học (class hinhhoc), trong class này có 2 phương tính tính chu vi và diện tích nhưng không ghi công thức tính (trừu tượng là đây). Ta sẽ hiện thức 3 hình trên (tức kế thừa từ lớp hình học) và viết các công thức tính tương ứng cho mỗi hình.

- Tính trừu tượng còn bỏ qua những thứ không cần thiết của thông tin mà nó đang làm việc lên. Ví dụ con người có những thuộc tính: tên, tuổi, địa chỉ, chiều cao, màu tóc,… . Giả sử ta có 1 ứng dụng quản lý khách hàng thì chiều cao, màu tóc là không cần thiết trong khi 1 ứng dụng điều tra tội phạm thì chiều cao, màu tóc đối tượng là không thể thiếu.

2.  Encapsulation (tính bao đóng).

Tính chất này không cho phép người sử dụng các đối tượng thay đổi trạng thái nội tại của một đối tượng. Chỉ có các phương thức nội tại của đối tượng cho phép thay đổi trạng thái của nó. Việc cho phép môi trường bên ngoài tác động lên các dữ liệu nội tại của một đối tượng theo cách nào là hoàn toàn tùy thuộc vào người viết mã. Đây là tính chất đảm bảo sự toàn vẹn của đối tượng.

3. Inheritance (Tính kế thừa).

Đặc tính này cho phép lớp thừa hưởng những các thuộc tính và phương thức của lớp mà nó kế thừa. Lớp được kế thừa có thể là lớp trừu tượng hoặc đơn giản chỉ là 1 lớp bình thường. Thuật ngữ gọi lớp kế thừa là base class (lớp con), lớp được kế thừa là derived class (lớp dẫn xuất / lớp cha). Tùy vào ngôn ngữ lập trình, 1 con có nhiều cha hay chỉ 1 cha. Trong Java, bản thân ngôn ngữ này chỉ có đơn kế thừa (tức chỉ 1 con có 1 cha), tuy nhiên 1 con có thể vừa extends từ 1 abstract class đồng thời có thể implement 1 hay nhiều interfaces. Lưu ý: đây không phải đa kế thừa bởi bản chất interface không hoàn toàn giống bản chất của một lớp trừu tượng (abstract class).  Vấn đề này sẽ bàn sau ở một bài khác. Ví dụ về kế thừa, bạn xem ví dụ 3 hình học ở phần 1 nhé.

4.  Polymorphism (Tính đa hình).

Tính này được thể hiển ở đặc điểm overloading (nạp chồng) và overriding (ghi chồng).

- Overloading: nghĩa là ta có nhiều phương thức có cùng tên nhưng tham số truyền vào khác nhau (khác nghĩa là khác về kiểu dữ liệu, số lượng tham số và thứ tự tham số). Tại sao phải overloading, ví dụ thế này: ta có 3 hình: tam giác, vuông, chữ nhật – cả 3 có diện tích. Thay vì ta viết 3 phương thức tính diện tích tương ứng cho cả 3 hình, ta chỉ cần viết 1 phương thức là: dientich(tham số truyền vào) nhưng viết 3 lần với tham số truyền vào khác nhau.

- Overriding: nghĩa là ta viết lại phương thức có chức năng cụ thể khi kế thừa lại phương thức này từ lớp cha. Điều này đồng nghĩa với việc phương thức đứa con kế thừa phải cùng kiểu dữ liệu và số lượng tham số truyền vào như của lớp cha. Lúc thực thi, nếu con kế thừa cha mà không override lại phương thức của cha, thì phương thức lớp cha được gọi hoặc ngược lại.

Bài viết có tham khảo tư liệu từ:

http://vi.wikipedia.org/

http://www.ibm.com/developerworks/vn/edu/j-intermed/section2.html

http://www.wattpad.com

http://www.thuvien-it.net/home/tinhoc/view.asp?threadid=754

Giáo trình Aptech

7 nhận xét:

  1. I’m a long time watcher and I just believed I’d drop by and say hello there there for the quite initially time.

    Trả lờiXóa
  2. I have read not 1 article in your weblog. You’re a huge lad

    Trả lờiXóa
  3. Thanks you very much.I'm very glad to know you :)

    Trả lờiXóa
  4. Thanks , I've just been looking for info about this topic for ages and yours is the greatest I've discovered till now. But, what about the conclusion? Are you sure about the source?

    Trả lờiXóa
  5. It’s exhausting to search out knowledgeable individuals on this subject, but you sound like you understand what you’re talking about! Thanks

    Trả lờiXóa
  6. Good site! I really love how it is easy on my eyes and the data are well written. I am wondering how I might be notified when a new post has been made. I've subscribed to your feed which must do the trick! Have a nice day!

    Trả lờiXóa
  7. Sure.why do you ask me about that?

    Trả lờiXóa