OOP Mastery – Lý thuyết 01: OOP Là Gì?

Chuỗi bài viết OOP Mastery sẽ cung cấp đầy đủ kiến thức Lý thuyết và Thực hành để các bạn nắm được OOP và có một đồ án chất lượng là 1 Ứng dụng Android.

OOP là một mảng kiến thức cực kỳ quan trọng cho bất kỳ lập trình viên nào. Cho dù bạn đi theo hướng phát triển Web, Backend, Mobile hay là Data, AI … OOP sẽ luôn đi theo bạn. Việc thành thạo OOP sẽ giúp bạn viết ra những dòng code chất lượng, có tính tái sử dụng cao.

Chúc bạn sẽ thành công với lượng kiến thức trong khóa học OOP Mastery by @dantech0xff

Thế giới lập trình trước khi có OOP

Nghề Lập trình đã trải qua nhiều cuộc cách mạng, nhiều sự thay đổi để có thể đi đến một phương pháp là cơ sở, cốt lõi cho tất cả các phần mềm hiện tại – Phương pháp Lập trình hướng đối tượng. Trong topic đầy thú vị này hãy để tôi giới thiệu cho các bạn các phương pháp lập trình mà tiền nhân đã sử dụng khi chưa có sự xuất hiện của phương pháp lập trình Hướng đối tượng (OOP)

Lập trình Hướng Lệnh

Có thể nhìn nhận Lập trình hướng lệnh là phương pháp Lập trình đơn giản, sơ khai nhất.

Trong giai đoạn phát triển này, một chương trình sẽ gồm Input (dữ liệu đầu vào) – Chuỗi Lệnh xử lý – Output (dữ liệu đầu ra). Các chương trình trong giai đoạn này hầu hết sẽ là các phần mềm dùng để tính toán các phép toán, các công thức để giúp các nhà khoa học tìm ra đáp án nhanh hơn. Những chương trình này đã giúp cho các ngành khoa học có liên quan đến toán học có bước đột phá lớn vì tiết kiệm được thời gian thực nghiệm, tính toán (Trong các ngành liên quan toán học: Vật lý, Hóa học, Thiên văn, …)

Một chương trình được viết bằng Lập trình hướng Lệnh có thể được hình dung như sau:

: Chương trình A
- input
- Lệnh 1 xử lý input -> output 1
- Lệnh 2 xử lý output 1 -> output 2
- Lệnh 3 xử lý output 2 -> output 3
- output

/*Trong thực tế chương trình sẽ chứa nhiều logic phức tạp hơn (loop, if - else, ...) */

Bạn có thể thấy với cách tiếp cận này các chương trình trở nên đặc thù cho từng bài toán. Các lệnh code được viết ra không có khả năng tái sử dụng giữa các bài toán với nhau.

Lúc này người ta đã phát minh ra một hương pháp lập trình mới -> Lập trình hướng Hàm

Lập trình Hướng Hàm

Trong phương pháp lập trình hướng Hàm, cơ bản các lập trình viên vẫn biên soạn phần mềm dựa trên việc thiết kế các chuỗi lệnh cho những bài toán đặc thù. Tuy nhiên khi tiếp cận với lập trình hướng Hàm lập trình viên sẽ chọn xử lý những vấn đề theo hướng tổng quát, rồi mới đến cụ thể. Việc này sẽ giúp gom nhóm các logic cần tái sử dụng vào các hàm, và chia sẻ chúng giữa nhiều bài toán với nhau.

Cải tiến này giúp giảm thiểu nguồn lực dành cho các công việc lặp đi lặp lại, họ phát minh ra các thư viện giúp cho việc thiết kế và thực thi phần mềm trở nên dễ dàng hơn.

Có thể hình dung đến các thư viện như math.h– hỗ trợ việc tái sử dụng logic các phép toán cần sử dụng nhiều lần trong quá trình tính toán.

Một chương trình được viết bằng cách lập trình hướng Hàm có thể được mô phỏng như sau

: Chương trình A

include library-1
include library-2
declare self-function-1
declare self-function-2

- input
- library-1$function // mô tả việc sử dụng hàm của library-1 cho 1 mục đích
- library-2$function // mô tả việc sử dụng hàm của library-2 cho 1 mục đích
- self-function-1 // mô tả việc sử dụng self-function-1 cho 1 mục đích
- self-function-2 // mô tả việc sử dụng self-function-2 cho 1 mục đích
- output

/*Trong thực tế chương trình sẽ chứa nhiều logic phức tạp hơn (loop, if - else, ...) */

Ở cách tiếp cận này, chương trình đã trở nên tổng quát hơn, tái sử dụng được nhiều hơn. Đây là 1 cách tiếp cận tốt hơn so với hướng thủ tục ở phần trước.

Khi xã hội phát triển dẫn đến nhu cầu xã hội tăng lên – con người sáng tạo nhiều hơn và cũng yêu cầu cao hơn. Phần mềm lúc này không chỉ đơn thuần là các phép tính nữa – lúc này phần mềm trở thành một hệ thống giải pháp cho con người. Việc tổ chức chương trình thông qua các hàm không còn là phù hợp với nhu cầu xã hội nữa.

Việc phát triển phần mềm lúc này cũng cần nhiều người hơn, nhiều công việc được chia ra hơn. Để tối ưu được nguồn lực của các Lập trình viên, họ đã đi đến một cách tiếp cận mới là Lập trình hướng đối tượng – bằng cách cô lập, đối tượng hóa các tính năng trong chương trình để việc phát triển và tái sử dụng code trở nên dễ dàng hơn.

Lập trình Hướng đối tượng (OOP) ra đời

Lập trình Hướng đối tượng (OOP) là phương pháp tiếp cận vấn đề dựa trên khái niệm “Đối tượng”OOP sẽ mô hình hóa phần mềm thành các thực thể (có thể là hữu hình, hoặc vô hình); các thực thể sẽ luôn có 2 dạng tài nguyên cơ bản là đặc tính – attribute/property và hành vi – method.

  • Đặc tính – attribute: Là các giá trị mà đối tượng đó nắm giữ, có thể cập nhật thay đổi theo thời gian.
- Thiết kế phần mềm để vẽ lên màn hình máy tính một cửa sổ với chiều ngang 200px, chiều dọc 80px, viền cửa sổ màu xám, nền màu trắng.
- Trong đặc tả này ta có thể thiết kế đối tượng Window có các thuộc tính để phục vụ cho chương trình
  - width: 200px
  - height: 80px
  - borderColor: GRAY
  - backgroundColor: WHITE
  • Hành vi – method: Là các hành vi mà đối tượng đó có thể thực hiện. Việc thực hiện các method có thể thay đổi giá trị của các attribute.
- Kế thừa đặc tả phía trên, cửa sổ lúc này có tính năng thay đổi kích thước
- Trong đặc tả này ta có thể thiết kế đối tượng Window có các hành vi phục vụ cho chương trình
  - function draw() -> dùng để hiển thị lên màn hình máy tính
  - function setSize(width, height) -> dùng để cập nhật giá trị width, height của cửa sổ

Sau khi đã có các đặc tả và giải pháp Hướng đối tượng cho một chương trình ta tiến hành triển khai nó vào mã nguồn.

class Window(private var width: Int, private var height: Int) {
  fun draw() {
    println("Draw window $this with width: $witdh, height: $height")
  }
  fun setSize(w: Int, h: Int) {
    width = w
    height = h
  }
}

fun main() {
  val w = Window(720, 1280)
  w.draw()
  w.setSize(1280, 720)
  w.draw()
}

Giá trị cốt lõi của lập trình Hướng đối tượng (OOP)

Lập trình Hướng đối tượng được tạo ra giúp giải quyết được nhiều vấn đề trong việc phát triển phần mềm hiện đại.

Trong thế giới hiện đại, và thay đổi rất nhanh. Một phần mềm hiện đại phải phục vụ nhiều mục đích. Phải có tính linh hoạt cao (Flexibility) nhưng cũng phải đảm bảo tính ổn định (Stability). OOP là giải pháp xuất sắc cho 2 vấn đề này.

Bằng việc thành thạo các Đặc tính của OOP, bạn sẽ hiểu rõ hơn thế nào là Flexibility, Stability trong phát triển phần mềm và có cách xây dựng phù hợp cho các dự án sau này cho sự nghiệp. Hãy đọc các phần Lý thuyết và thực hành tiếp theo trong chuỗi bài viết này để hiểu thêm nhé!