Trong Dart, có hai cách chính để truyền tham số vào một hàm: tham số vị trí (positional parameters) và tham số đặt tên (named parameters). Dưới đây là sự phân biệt giữa hai loại tham số này.
1. Tham số vị trí (Positional Parameters)
Tham số vị trí là những tham số mà thứ tự truyền vào quan trọng. Khi gọi hàm, bạn phải truyền giá trị theo đúng thứ tự mà hàm yêu cầu.
Cú pháp:
void hamViTri(String param1, int param2) {
print('Tham số 1: $param1');
print('Tham số 2: $param2');
}
void main() {
hamViTri('Hello', 42); // Gọi hàm với các tham số theo thứ tự
}
Trong ví dụ trên, tham số 'Hello'
sẽ tương ứng với param1
và 42
tương ứng với param2
. Nếu bạn thay đổi thứ tự, chương trình sẽ bị sai vì thứ tự các tham số rất quan trọng.
Tham số vị trí tùy chọn (Optional Positional Parameters)
Dart cũng cho phép sử dụng các tham số vị trí tùy chọn bằng cách đặt chúng trong cặp dấu []
. Các tham số này có thể có giá trị mặc định hoặc có thể bị bỏ qua khi gọi hàm.
void hamViTriTuyChon(String param1, [int param2 = 10]) {
print('Tham số 1: $param1');
print('Tham số 2: $param2');
}
void main() {
hamViTriTuyChon('Hello'); // Tham số 2 được mặc định là 10
hamViTriTuyChon('Hello', 42); // Tham số 2 là 42
}
2. Tham số đặt tên (Named Parameters)
Tham số đặt tên cho phép bạn chỉ định giá trị cho từng tham số cụ thể bằng cách sử dụng tên của tham số khi gọi hàm. Điều này giúp làm cho mã dễ đọc hơn, đặc biệt khi hàm có nhiều tham số, và không cần phải tuân thủ theo thứ tự của tham số.
Cú pháp:
void hamDatTen({required String param1, required int param2}) {
print('Tham số 1: $param1');
print('Tham số 2: $param2');
}
void main() {
hamDatTen(param1: 'Hello', param2: 42); // Sử dụng tên tham số khi gọi
}
Trong ví dụ trên, bạn có thể truyền các giá trị theo thứ tự bất kỳ miễn là bạn chỉ định tên tham số tương ứng.
Tham số đặt tên tùy chọn (Optional Named Parameters)
Tương tự như tham số vị trí, bạn cũng có thể tạo các tham số đặt tên tùy chọn. Những tham số này có thể có giá trị mặc định, hoặc bạn có thể bỏ qua chúng khi gọi hàm.
void hamDatTenTuyChon({String param1 = 'Mặc định', int? param2}) {
print('Tham số 1: $param1');
print('Tham số 2: ${param2 ?? 'Chưa có giá trị'}');
}
void main() {
hamDatTenTuyChon(); // Cả hai tham số đều dùng giá trị mặc định
hamDatTenTuyChon(param1: 'Hello'); // Tham số 1 là 'Hello', tham số 2 mặc định null
hamDatTenTuyChon(param2: 42); // Tham số 1 mặc định, tham số 2 là 42
}
Sự khác biệt chính:
- Thứ tự truyền tham số:
- Tham số vị trí: Thứ tự truyền tham số quan trọng.
- Tham số đặt tên: Không quan trọng thứ tự truyền, miễn là chỉ định đúng tên tham số.
- Mức độ rõ ràng của mã nguồn:
- Tham số vị trí: Có thể khó hiểu khi hàm có nhiều tham số.
- Tham số đặt tên: Dễ đọc hơn, vì tên tham số cung cấp ngữ cảnh về ý nghĩa của từng giá trị truyền vào.
Kết luận
Tham số vị trí thích hợp khi bạn muốn giữ cú pháp gọi hàm đơn giản và các tham số có thứ tự cố định. Trong khi đó, tham số đặt tên sẽ hữu ích khi hàm có nhiều tham số hoặc khi thứ tự không quan trọng, giúp cải thiện tính rõ ràng của mã.