12/08/2018, 15:10

Object-oriented programming

Trong nghành phát triển phần mềm, chúng ta đã không xa lạ gì với OOP - Object-Oriented Programming - Lập trình hướng đối tượng. Ở bài viết này, tôi sẽ tổng kết lại những khái niệm lập trình hướng đối tượng sao cho gần gũi hơn với thực tế cuộc sống. Nếu nhìn vào đời sống thực tế, ta có thể ...

Trong nghành phát triển phần mềm, chúng ta đã không xa lạ gì với OOP - Object-Oriented Programming - Lập trình hướng đối tượng. Ở bài viết này, tôi sẽ tổng kết lại những khái niệm lập trình hướng đối tượng sao cho gần gũi hơn với thực tế cuộc sống.

Nếu nhìn vào đời sống thực tế, ta có thể nhận biết mọi thứ xung quanh ta đều là đối tượng. Một chiếc bàn, một người bạn, một cái cây ven đường, một ngôi nhà, một chiếc điện thoại,... Đối tượng là những cá thể, tập cá thể tồn tại trong đời sống thực có những thuộc tính (thuộc liệu - attributes - những thứ thuộc về nó) và hành vi (actions - khả năng thực hiện, thực hiện, giao tiếp và những thực thi nội tại,...).

Ví dụ nếu ta nhìn vào cây là một đối tượng, ta sẽ thấy nó có hoa, lá quả, cành, gốc rễ... Đó là những attributes - thuộc tính của đối tượng cây đó. Về actions - hành vi, cây đó có thể quang hợp, ra hoa, đơm quả, lớn lên...

Lấy một ví dụ khác về con người. Ông B có chiều cao 1,75, mắt xanh, da vàng, tóc đỏ... đó là những thuộc tính (attributes) thuộc sở hữu của ông B. Ông B có thể có một số hành động như nói chuyện, làm việc, chạy, ăn uống, mang vác, thở... những hành vi đó có thể do chính ông B thực thi cho bản thân mình hoặc những tác động từ bên ngoài.

Như vậy, mọi vật trong đời sống thực này đều là đối tượng, các đối tượng này có thuộc liệu (attributes) và hành vi (actions). Mọi thuộc liệu có thể phơi bày hoặc che dấu. Mọi hành vi có thể do nội tại hoặc tác động bởi bên ngoài.

Khoa học máy tính luôn luôn muốn tiến gần hơn tới đời sống con người. Ngôn ngữ lập trình, tuy duy lập trình hay công việc lập trình cũng muốn thực hơn, người hơn, thân thiện hơn...

Scripting là một minh chứng cho điều này, thay vì asembly, những ngôn ngữ như scripting khá là gần gũi với ngôn ngữ giao tiếp hàng ngày. Nơi mọi mệnh lệnh (câu lệnh thực thi) giống như một câu cú pháp bình thường dùng trong giao tiếp giữa con người với con người. Chẳng hạn, select * from sinh_vien_table.

Tư duy lập trình cũng không khác là mấy, hướng đối tượng là một dạng đời sống hóa quy trình phát triển phần mềm và thực thi trong nội tại phần mềm. Hãy tưởng tượng, phần mềm lúc này không phải là một tập lệnh hay một tập các module có thể được triệu gọi khi có yêu cầu. Phần mềm lúc này là một tập các đối tượng, các đối tượng này (giống như một dây truyền sản xuất trong nhà máy) thực thi những công việc hoặc mang trong nó những nguyên liệu, thành phẩm (data) hữu dụng cho chương trình. Đó là chuỗi dây truyền có tính chuyên môn hóa cao nhờ vào việc phân công hành vi (actions) và dữ liệu (data) từ chương trình lớn tới những đối tượng nhỏ hơn. Do đó, tập đối tượng thực thi này có sự rạch ròi, tường minh, khả năng chia sẻ hay dùng lại các chức năng, dữ liệu rất cao. Nhờ đó, chí phí nguyên nhiên liệu, thời gian phát triển, khả năng kiểm soát, nâng cấp cũng dễ dàng hơn rất nhiều.

Một đối tượng có thể hàm chứa trong nó nhiều đối tượng con. Liên hệ với đời sống, một người là một đối tượng, người có đầu, chân, tay,...và những thứ đó cũng được gọi là đối tượng. Đối tượng đầu có thuộc liệu (attributes) là mắt, óc, tóc, tai,... có hành vi là suy nghĩ, nghe, nhìn,... Trong lập trình, một đối tượng lớn có thể chứa nhiều đối tượng con và đối con lại có thể chứa nhiều đối tượng con khác nữa. Mỗi đối tượng có thể là thuộc liệu (attributes) của đối tượng lớn hơn chứa nó. Một chuỗi các hành vi của đối tượng con có thể trở thành một hành vi của đối tượng lớn hơn bao hàm nó. Chẳng hạn, tai nghe, mắt nhìn,... tiếp nhận thông tin cho não xử lý, não xử lý xong thì chân tay hành động. Cả chuỗi hành xử đó tạo nên hành vi lớn hơn của một cá thể người. Ví dụ, vận động viên nghe tiếng súng và cờ hiệu phất rồi bắt đầu chạy. Tất cả hành xử nghe, nhìn, chạy, tạo nên một hành vi lớn hơn là nhận lệnh bắt đầu thi đấu.

Sự mô hình hóa dữ liệu (data) và hành vi (action) của đời sống thực vào trong kỹ thuật lập trình thì kiểu lập trình đó được gọi là Object-Oriented Programming (Lập trình hướng đối tượng). Không dừng ở kỹ thuật viết mã, hướng đối tượng thể hiện cả trong tư duy thiết kế mã lệnh, mở rộng hơn đến tư duy thiết kế chức năng rồi cuối cùng là tư duy thiết kế phần mềm. Như vậy Object-Oriented Programming là một phương pháp thiết kế và cài đặt hệ thống phần mềm bằng tư duy đối tượng đời sống thực.

Lập trình hướng đối tượng là phương pháp đưa dữ liệu và các tập mã lệnh thực thi vào nhiều đối tượng theo một thiết kế của người viết mã. Nói tóm lại, chúng ta cần mô hình hóa đối tượng. Khâu mô hình hóa đối tượng trong OOP được gọi là trừu tượng hóa dữ liệu. Vậy trừu tượng hóa dữ liệu là gì?

Xin được lấy ví dụ về xây dựng một chương trình xuất hóa đơn bán hàng cho một cửa hàng bán máy tính.

Chúng ta có đối tượng khách hàng. Ông khách hàng này có các attributes như chiều cao, màu tóc, màu mắt, tên, ngày sinh tháng đẻ, địa chỉ, giới tính, thể trạng sức khỏe,... Ông ta đi vào cửa hàng, xem các mẫu máy tính rồi cuối cùng ông ta chọn mua một chiếc máy tính, thanh toán tiền, nhận hóa đơn và mang máy tính về.

Chúng ta có đối tượng cửa hàng. Bao gồm địa chỉ, các mẫu máy tính trưng bày, nhân viên cửa hàng,...

Chúng ta có đối tượng bán hàng. Một cô nhân viên X có tên, màu da, chiều cao, địa chỉ,... Cô ta dẫn khách đi xem hàng, nhận yêu cầu bán, thanh toán tiền, xuất hóa đơn và tiễn khách.

Như vậy, có rất nhiều đối tượng cùng các thuộc tính, hành vi xảy ra. Bài toán đặt ra là cần xây dựng một đối tượng HÓA ĐƠN. Dĩ nhiên, hóa đơn không cần thiết phải dùng hết tất cả các dữ liệu và hành vi. Đối tượng hóa đơn chỉ bao hàm một lượng nhỏ thông tin cần thiết. Chúng ta phải tạo nên một đối tượng mới (hóa đơn) trên những thuộc liệu và hành vi của các đối tượng kể trên. Dữ liệu và hành vi của HÓA ĐƠN bao gồm:

Attributes:

  • Tên khách hàng.
  • Địa chỉ khách hàng.
  • Mẫu máy mà khách mua.
  • Người bán.

Actions:

  • Nhập tên người mua.
  • Địa chỉ người mua.
  • Tên người bán.
  • Mẫu máy tính.
  • Cuối cùng là in ra hóa đơn.

Mô hình hóa đối tượng cài đặt trong phát triển phầm mềm được gọi là trừu tượng hóa dữ liệu. Tiến trình trừu tượng hóa là phép định danh (chỉ rõ) và phân loại các thuộc liệu cùng hành vi từ những đối tượng cụ thể thành đối tượng cần thiết cho chương trình.

Trừu tượng hóa dữ liệu giúp chúng ta tập trung vào vấn đề của bài toán, loại bỏ dữ liệu thừa để có được những đặc tính và hành vi thiết yếu.

Chẳng hạn với ví dụ xuất hóa đơn, một số thuộc tính như chiều cao, tuổi, màu da,... hoặc các hành vi như đi lại xem hàng, trả tiền,... của hai đối tượng người là không cần thiết. Chúng ta chỉ tập trung vào những dữ liệu như tên khách hàng, địa chỉ khách hàng, mẫu máy tính, người bán.

Chúng ta có nhiều đối tượng người. Mỗi đối tượng này có màu da khác nhau nhưng tất cả đều có da.

Họ cũng có mái tóc dài ngắn, thẳng xoăn khác nhau nhưng tất cả đối tượng người đều có tóc (trừ những người đã cạo hoặc bị rụng).

Như vậy, nhắc đến đối tượng người, chúng ta nghĩ ngay đến người phải có tóc, có chân, có đầu, có mắt,... mặc dù đầu có thể to, có thể nhỏ; chân có thể ngắn, có thể dài; màu tóc có thể xanh, đỏ, tím, vàng,... Người được gọi là lớp - LỚP NGƯỜI.

Cây, ví dụ một cây bằng lăng và một cây xà cừ. Cả hai đều có thân, có lá, có cành, có rễ, có hoa mặc dù hoa có thể khác nhau, hình dạng lá khác nhau. Chúng ta có LỚP CÂY. Khi nhắc đến từ CÂY, chúng ta sẽ hình dung ra ngay chúng có cành, lá, rễ, hoa,... mặc dù cụ thể như thế nào thì phải biết đích xác một cây (đối tượng cây) hiện hữu.

Những quy chuẩn chung nhất về thuộc tính và hành vi cho tập đối tượng được gọi là lớp.

Một lớp là một xác định ở cấp chủng loại của một tập thực thể có những đặc tính và hành vi giống nhau.

Lớp là một mô hình khái niệm. Nó mang tính tổng quát, quy chuẩn chứ không mang tính đặc thù, cụ thể.

Lớp giống như một nguyên mẫu cho tập đối tượng có cùng tập thuộc liệu (attributes) và tập hành vi (actions).

Trong lập trình hướng đối tượng, lớp nhóm hóa, đóng gói dữ liệu, điều biến chức năng thực thi (module hóa các xử lý, hành vi), ... rồi từ đó cấu trúc hóa thành một hệ thống trong cài đặt hướng đối tượng.

Lớp thuộc về trừu tượng thì đối tượng lại thuộc về thực tại. Đối tượng là một cái gì đã tồn tại trong thực tế cuộc sống. Đối tượng là một thể hiện cụ thể những quy chuẩn hàm chứa trong lớp.

Ví dụ: NGƯỜI là một lớp. Lớp NGƯỜI chỉ đến một khái niệm rất chung chung. Ông A, chị B thuộc LỚP NGƯỜI được gọi là đối tượng. Chính xác hơn là ĐỐI TƯỢNG NGƯỜI.

Ví dụ: CÂY là một lớp. LỚP CÂY chỉ chung có thể có hoa, có lá, có cành, có rễ... Nhưng cây xương rồng trong chậu nhà cô bé bên cạnh là một đối tượng có thân, rễ, nhưng không có lá. Nó vẫn thuộc về lớp cây bởi những thuộc tính như lá, hoa, quả,... có thể không bắt buộc với cây. Nhưng những hành vi như quang hợp lại là bắt buộc và cây xương rồng đó có quang hợp.

Như vậy, đối tượng là một trường hợp cụ thể của lớp, nó hiện hữu. Trong đối tượng, những thuộc tính (attributes) được xác định chính xác giá trị và những hành vi đã sẵn sàng hoặc đã được thực thi.

Nếu như lớp trong lập trình là sự mô phỏng, mô hình hóa những dữ kiện từ các đối tượng trong thực tế thì đối tượng trong lập trình là những đối tượng đã được tạo ra trong bộ nhớ từ lớp đó, chúng tồn tại trong thế giới thực, khi phần mềm chạy trên một chiếc máy tính nào đó. Khái niệm lớp và đối tượng cho chúng ta thấy rõ sự rạch ròi giữa implement (cài đặt) và run (chạy) trong phát triển phần mềm.

Chúc mọi người ngày làm việc vui vẻ.

Nguồn tham khảo: https://www.upwork.com/hiring/development/object-oriented-programming/ https://en.wikipedia.org/wiki/Object-oriented_programming http://tromiz.blogspot.com/ http://searchmicroservices.techtarget.com/definition/object-oriented-programming-OOP

0