openplanning

Các phương thức mở rộng (Extension) trong Dart

  1. Dart extensions
  2. Extension không tên
  3. Kết luận
Dart là ngôn ngữ lập trình hướng đối tượng hiện đại được sử dụng trong phát triển web và thiết bị di động. Một trong những tính năng mạnh mẽ nhất của nó là các phương thức mở rộng (extension methods). Với các phương thức mở rộng, nhà phát triển có thể mở rộng chức năng của một lớp mà không cần sửa đổi chính lớp đó.
Trong bài viết này, chúng ta sẽ thảo luận về các phương thức mở rộng, cách chúng hoạt động và cách sử dụng chúng trong lập trình Dart.

1. Dart extensions

Phương thức mở rộng là một tính năng trong Dart cho phép các nhà phát triển thêm các phương thức mới vào các lớp hoặc interface hiện có mà không thay đổi cách triển khai ban đầu của chúng. Những phương thức này có thể được sử dụng như thể chúng là một phần của lớp gốc. Nói cách khác, tiện ích mở rộng cho phép nhà phát triển thêm chức năng vào lớp hoặc interface mà họ không viết và không kiểm soát.
Để đơn giản chúng ta xem xét lớp String - đây là một lớp cơ bản, sẵn có trong thư viện Dart. Bạn không thể sửa đổi mã nguồn của nó, ngoài ra vì nó được định nghĩa là "final" nên bạn cũng không thể viết một lớp thừa kế từ nó. Tuy nhiên, bạn có thể thêm các phương thức mở rộng cho lớp String, và có thể sử dụng chúng trong phạm vi ứng dụng của bạn.
abstract final class String implements Comparable<String>, Pattern {
   ...
}
Tạo một file Dart để định nghĩa 2 phương thức mở rộng cho lớp String:
my_string_extension.dart
extension MyStringExtension on String {

  String sayHello()  {
      return "Hello $this";
  }

  String sayBye()  {
    return "Bye $this";
  }
}
Sau đó, ở đâu đó trong dự án của mình bạn có thể dụng hai phương thức này:
my_string_extension_test.dart
import 'my_string_extension.dart';

void main()  {
   // This is a String:
   String name = "Tom";

   var s1 = name.sayHello();
   print("s1 = $s1");

   var s2 = name.sayBye();
   print("s2 = $s2");
}
Output:
s1 = Hello Tom
s2 = Bye Tom
Tiếp theo, giả sử rằng Person là một lớp trong một thư viện nào đó, và bạn muốn thêm một vài phương thức mở rộng cho nó.
person.dart
class Person {
  String name;
  String? phone;
  Person(this.name, this.phone);

  void intro() {
    print("Hi!, my name is $name");
  }
}
Viết "Extension" cho lớp Person:
person_extension_1.dart
import 'person.dart';

extension PersonExtension on Person {
  void selfIntroduce() {
    print("Hello, my name is $name");
  } 
}
Test
person_extension_1_test.dart
import 'person.dart';
import 'person_extension_1.dart';

void main() {
  var tom = Person("Tom", "123456789");

  tom.intro();
  tom.selfIntroduce();
}
Output:
Hi!, my name is Tom
Hello, my name is Tom

2. Extension không tên

Bạn cũng có thể định nghĩa một "Extension" không tên, các phương thức được định nghĩa trong "Extension" này chỉ được sử dụng nội bộ trong file đã định nghĩa ra nó.
Dưới đây chúng ta định nghĩa một "Extension" cho lớp String, phương thức imagePath() của nó chỉ được sử dụng trong nội bộ file đã định nghĩa nó.
no_name_extension.dart
// No name extension:
extension on String {
  String imagePath() {
    return "/static/images/$this";
  }
}

final String logoPath = "logo.png".imagePath();
final String carPath = "car.jpg".imagePath();

void main() {
  print("logoPath: $logoPath");
  print("carPath: $carPath");

  var buyNowPath = "buyNow.gif".imagePath();
  print("buyNowPath: $buyNowPath");
}
Output:
logoPath: /static/images/logo.png
carPath: /static/images/car.jpg
buyNowPath: /static/images/buyNow.gif

3. Kết luận

Cuối cùng, sau đây là các lợi ích của việc sử dụng Extension:
Tổ chức tốt hơn
Các phương thức mở rộng cung cấp một cách rõ ràng và ngắn gọn để thêm chức năng mới vào các lớp hiện có mà không làm lộn xộn cơ sở mã.
Không cần phân lớp
Với các phương thức mở rộng, bạn không cần tạo lớp con mới để thêm chức năng cho lớp hiện có. Điều này làm cho việc bảo trì mã dễ dàng hơn nhiều.
Dễ sử dụng
Các phương thức mở rộng giúp dễ dàng thêm chức năng vào một lớp và sử dụng nó giống như bất kỳ phương thức lớp nào khác.
Khả năng sử dụng lại mã
Các phương thức mở rộng có thể được sử dụng trên nhiều dự án và thư viện, khiến chúng trở thành công cụ có giá trị để tái sử dụng mã.