Phương thức ẩn danh
Anonymous method
Anonymous method
Phương thức ẩn danh (anonymous method) là một phương thức mà không có tên. Phương thức này có thể gán cho một biến delegate cùng kiểu để sử dụng lại ở nhiều nơi khác nhau.
Ví dụ nhé, ví dụ này sử dụng Delphi 10.3 có tính năng khai báo biến cục bộ nên rất dễ dàng.
begin
var BinhPhuong := function (x: Integer): LongInt begin Result := x * x end;
writeln(BinhPhuong(10));
end;
Thay vì phải viết ra một hàm riêng như thế này sẽ dài dòng
function BinhPhuong(x: Integer): LongInt;
begin
Result := x * x;
end;
begin
writeln(BinhPhuong(10));
end;
Tuy nhiên, phương thức ẩn danh trong delphi khác với khái niệm lambda expression trong cách ngôn ngữ khác. Hi vọng Embarcadero sẽ nâng cấp phương thức ẩn danh thành lambda expression sớm.
Một phương thức ẩn danh có thể được gắn vào một delegate để sử dụng lại ở nhiều nơi
type
TProc = reference to procedure (s: string);
var
HelloProc: TProc;
begin
HelloProc := procedure (s: string)
begin
writeln(s);
end;
HelloProc('Le Van B');
end;
Sau khi delegate được gán vào một phương thức ẩn danh, bạn có thể sử dụng bất kì đâu trong phạm vi của biến delegate (biến HelloProc).
Đối với các anonymous method ngắn, bạn có thể rút gọn nó vào chung một dòng như ở phần giới thiệu.
Phương thức ẩn danh cũng có thể làm tham số cho một method. Đơn cử ví dụ phổ biến nhất là khởi tạo một thread bằng TTask.
var
aTask: ITask;
begin
aTask := TTask.Create(procedure
begin
// Do some things
end);
end;
Như trên, constructor Create của lớp TTask đã được khai báo với tham số là một delegate
type
TProc = reference to procedure;
TTask = class
constructor Create(aProc: TProc);
end;
constructor TTask.Create(aProc: TProc);
begin
...
end;
Đối với những method nhận tham số là method, chúng ta có hai cách truyền: một là truyền trực tiếp như đoạn code trên (đoạn thứ 2 từ đây đếm lên), hai là sử dụng delegate làm biến trung gian để lưu lại method. Cách nào cũng được.
type
TProc = reference of procedure;
...
var
aProc: TProc;
aTask: ITask;
begin
aProc := procedure
begin
...
end;
aTask := TTask.Create(aProc);
end;
Phương thức ẩn danh là một tính năng của ngôn ngữ lập trình hiện đại. Nó giúp ta viết mã nhanh, gọn và linh hoạt hơn. Và đặc biệt phương thức ẩn danh được sử dụng nhiều trong lập trình song song (parallel programing) với TTask, Parallel.For và trong lập trình sự kiện.