OOP là từ viết tắt của cụm từ Object Oriented Programming. Nó có nghĩa là lập trình hướng đối tượng. Đây là một phương pháp lập trình dựa trên những khái niệm về đối tượng và lớp. OOP thường tập trung vào những đối tượng thao tác hơn là tập trung vào logic để có thể thao tác chúng.

OOP chính là một nền tảng quen thuộc của những mẫu thiết kế phần mềm hiện nay. OOP đặt ra những mục tiêu quản lý source code giúp gia tăng được khả năng tái sử dụng. Và quan trọng hơn hết chính là nó có thể tóm gọn được những thủ tục đã biết trước tính chất thông qua quá trình sử dụng các đối tượng này.

Đối tượng (Object)

Mỗi một đối tượng sẽ gồm có 2 thông tin là thuộc tính và phương thức;

  • Thuộc tính: là những thông tin, đặc điểm của đối tượng mà những lập trình viên hướng đến.
  • Phương thức: Chính là những thao tác, hành động mà đối tượng lập trình có thể thực hiện.

Lớp (Class)

Mỗi một lớp sẽ là một kiểu dữ liệu và nó sẽ bao gồm nhiều thuộc tính cũng như phương thức đã được định nghĩa ở phần trước. Nó được xem là sự trừu tượng hóa của nhiều đối tượng. Lớp hoàn toàn khác với những kiểu dữ liệu thông thường. Mỗi một lớp sẽ là một đơn vị gồm những sự kết hợp giữa phương thức và thuộc tính.

Sự khác nhau giữa đối tượng và lớp

Để dễ hiểu hơn thì hãy tưởng tượng Lớp (Class) giống như một “Khuôn đúc”, còn Đối tượng (Object) là “Sản phẩm thực tế” được đúc ra từ khuôn đó.

Ví dụ: Để nói về loài mèo, bạn có thể hiểu nó là lớp mèo có:

  • Các thông tin và đặc điểm: Tên, cân nặng, màu lông, giống mèo,…
  • Các hành động như: kêu, bắt chuột, trèo cây, ăn, ngủ,…

Đối tượng được hiểu ví dụ như đó chính là mèo tam thể cũng mang đặc tính của lớp mèo.

Ưu điểm của lập trình hướng đối tượng OOP là gì?

OOP được sử dụng phổ biến được xem là một trong những kỹ thuật lập trình quan trọng nhờ vào sở hữu nhiều đặc điểm nổi bật như:

  • Hoàn toàn có thể được sử dụng lại code nên sẽ tiết kiệm được tài nguyên cho các lập trình viên. Giúp tối ưu và tái sử dụng code một cách hiệu quả.
  • OOP mô hình chuyển hóa được các thứ phức tạo dưới dạng những cấu trúc đơn giản.
  • Giúp cho quá trình sửa lỗi trở nên dễ dàng hơn. So với quá trình tìm lỗi ở nhiều vị trí khác ở trong code, thì tìm lỗi ở trong các lớp sẽ đơn giản và ít tốn thời gian hơn.
  • Sở hữu tính bảo mật cao, nó có khả năng bảo vệ các thông tin thông qua việc đóng gói.
  • Dựa trên nguyên lý về kế thừa trong quá trình mô tả các lớp, nó sẽ có thể giúp loại bỏ các chương trình bị lặp, dư.
  • Đảm bảo rút ngắn thời gian trong quá trình xây dựng hệ thống và giúp tăng năng suất thực hiện.
  • Sự xuất hiện của 2 khái niệm lớp và đối tượng được xem là đặc trưng của phương pháp lập trình hướng đối tượng. Nó đã giải quyết được những khuyết điểm của phương pháp lập trình hướng cấu trúc đã để lại. Ngoài ra 2 khái niệm còn giúp biểu diễn tốt hơn về thế giới thực trên máy tính.

Bốn Trụ cột của OOP trong Dart

Tính đóng gói (Encapsulation)

Mọi dữ liệu cũng như phương thức có liên quan sẽ được đóng gói thành các lớp để tạo sự tiện lợi cho quá trình sử dụng cũng như quản lý. Nhờ quá trình này mà mỗi lớp đều sẽ được xây dựng nhằm thực hiện một nhóm chức năng đặc trưng riêng của lớp đó. Tính đóng gói sẽ giúp ẩn đi một số các thông tin và chi tiết cài đặt nội bộ mà bên ngoài không thể nhìn thấy.

Trong trường hợp bạn nhìn thấy trạng thái đối tượng không hợp lệ là do: Nó chưa được kiểm tra tính hợp lệ hoặc những bước thực hiện không đúng quy trình hay đã bị bỏ qua. Do vậy, bạn cần lưu ý trong OOP có nguyên tắc là luôn phải khai báo những trạng thái bên trong của đối tượng là private và nó chỉ cho quy cập qua: public/protected method/property

Ví dụ : Ta thấy một viên thuốc chữa cảm. Chúng ta chỉ có thể biết nó chữa cảm sổ mũi nhức đầu và một số thành phần chính của nó. Còn cụ thể bên trong nó có hoạt chất gì thì ta hoàn toàn không biết.

Tính năng kế thừa (Inheritance)

Tính kế thừa cho phép xây dựng một lớp mới dựa vào những định nghĩa của lớp đã có. Có nghĩa là các lớp cha có thể chia sẻ những dữ liệu cũng như các phương thức cho lớp con. Các lớp con sẽ không cần thực hiện định nghĩa lại. Bên cạnh đó, nó có thể mở rộng những thành phần kế thừa cũng như bổ sung thêm những thành phần mới. Tái sử dụng mã nguồn chính là một cách tối ưu, giúp tận dụng được mã nguồn. Một số loại kế loại kế thừa phổ biến là: đơn kế thừa, đa kế thừa, và kế thừa đa cấp, hay kế thừa thứ bậc.

Ví dụ: 2 lớp Android và iPhone

Mỗi lớp trên đều sẽ đại diện cho một loại smartphone khác nhau. Tuy nhiên, chúng có những thuộc tính giống nhau như gọi điện, nhắn tin, hay chụp hình. Thay vì phải sao chép những thuộc tính này, ta có thể đặt chúng vào một lớp chung gọi chính là lớp cha. Có thể định nghĩa lớp cha – trong trường hợp này chính là Smartphone và có những lớp con kế thừa của nó, tạo ra mối quan hệ cha/con.

Tính đa hình (Polymorphism)

Tính đa hình chính là hành động có thể thực hiện được bằng nhiều cách khác. Đây lại là một tính chất có thể được nói là nó chứa đựng hầu hết sức mạnh của lập trình hướng đối tượng (OOP).

Hiểu theo một cách đơn giản, tính đa hình chính là khái niệm mà hai hoặc nhiều lớp có các phương thức giống nhau nhưng có thể được thực thi theo những cách thức khác nhau.

Ví dụ như ở phần trên có đề cập, mỗi một smartphone sẽ kế thừa từ lớp cha Smartphone nhưng nó có thể lưu trữ dữ liệu ở trên cloud theo những cách khác nhau. Cụ thể là Android lưu trữ bằng Google Drive, iPhone lưu trên iCloud.

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

Tính trừu tượng được thể hiện tổng quát hóa lên một cái gì đó mà không cần chú ý đến các chi tiết bên trong. Nó sẽ không quan tâm đến các chi tiết bên trong là gì nhưng ta vẫn có thể hiểu nó ngay khi nó được nhắc đến.

Ví dụ : Khi kiểm tra thông tin trong danh sách hồ sơ thì bạn sẽ cần xem tên, ngày sinh, giới tính chư không cần phải xem thông tin  chi tiết khác như chiều cao, cân nặng,…

Các từ khóa OOP quan trọng trong Dart

Khai báo Lớp và Thành phần

  • class: Dùng để định nghĩa một lớp.
  • abstract: Khai báo lớp trừu tượng hoặc phương thức trừu tượng.
  • mixin / mixin class: Dùng để định nghĩa hoặc kết hợp các lớp mixin giúp tái sử dụng mã nguồn qua nhiều hệ thống phân cấp.
  • extension: Dùng để mở rộng thêm tính năng/phương thức cho một lớp sẵn có mà không cần sửa code gốc hay tạo lớp con

Kế thừa và Triển khai

  • extends: Dùng để kế thừa từ một lớp cha (đơn kế thừa).
  • implements: Dùng để triển khai interface (giao diện) của một lớp khác; bắt buộc lớp con phải viết lại (override) toàn bộ thuộc tính và phương thức.
  • with: Dùng để gắn (mix in) một hoặc nhiều mixin vào lớp hiện tại.
  • on: Dùng trong khai báo mixin để giới hạn các lớp có thể sử dụng mixin đó (chỉ các lớp kế thừa hoặc tương thích với kiểu được chỉ định).
  • @override: Chú thích báo hiệu phương thức đang ghi đè lại từ lớp cha hoặc interface.

Từ khóa liên quan đến đối tượng

  • this: Tham chiếu đến chính đối tượng hiện tại của lớp.
  • super: Tham chiếu đến lớp cha (dùng để gọi constructor hoặc phương thức của lớp cha).
  • new: Dùng để khởi tạo đối tượng mới (trong các phiên bản Dart hiện đại, từ khóa này là tùy chọn và thường bị lược bỏ).
  • factory: Dùng cho constructor nhà máy (dùng khi muốn kiểm soát việc tạo instance, ví dụ trả về instance cũ đã có hoặc trả về từ lớp con).
  • static: Đánh dấu các thuộc tính hoặc phương thức thuộc về chính lớp đó thay vì thuộc về từng đối tượng cụ thể.

Bài viết khác

Flutter Layout & Responsive UI

Flutter Layout & Responsive UI 1. Flutter Layout Layout trong Flutter là quá trình xác định kích thước và vị trí của các Widget trên màn hình. Flutter sử dụng hệ thống Widget để xây dựng giao diện. Các Widget Layout quyết định: Widget nằm ở đâu. Widget có kích thước bao nhiêu. Các Widget […]

StatelessWidget vs StatefulWidget

StatelessWidget vs StatefulWidget 1. Khái niệm Trong Flutter, StatelessWidget và StatefulWidget là hai loại Widget cơ bản dùng để xây dựng giao diện. Điểm khác biệt quan trọng nhất nằm ở State (trạng thái). StatelessWidget: Widget không có State nội bộ có thể thay đổi. StatefulWidget: Widget có State nội bộ có thể thay đổi trong quá […]

Flutter Widget Fundamentals

Flutter Widget Fundamentals 1. Widget Trong Flutter, Widget là thành phần cơ bản dùng để xây dựng giao diện người dùng (UI). Có thể hiểu đơn giản: Mọi thành phần xuất hiện trên giao diện Flutter đều được xây dựng từ Widget. Ví dụ: Text → hiển thị văn bản. Image → hiển thị hình […]

Isolate & Concurrency

Isolate & Concurrency Isolate và Concurrency (đồng thời) là cơ chế trong Dart dùng để thực hiện nhiều công việc mà không làm một công việc phải chờ hoàn thành hoàn toàn mới có thể xử lý công việc khác. Lý thuyết 1. Concurrency Concurrency (xử lý đồng thời) là khả năng chương trình quản […]

Null Safety trong Dart

Null Safety là cơ chế phân biệt rõ ràng giữa kiểu dữ liệu có thể chứa null (Nullable) và kiểu dữ liệu không thể chứa null (Non-nullable) ngay ở mức ngôn ngữ lập trình, giúp trình biên dịch phát hiện và bắt lỗi liên quan đến null ngay trong quá trình viết mã thay vì […]

Test Scenario(Kịch bản kiểm thử)

1. Lời mở đầu và vị trí chiến lược của Test Scenario trong quy trình kiểm thử: Trong bức tranh tổng thể của vòng đời kiểm thử phần mềm (STLC), sau khi đã hoàn thành việc phân tích yêu cầu và lập kế hoạch kiểm thử (Test Plan), công việc tiếp theo mang tính chất […]

Leave a Reply

Your email address will not be published. Required fields are marked *