Truyền tin nhắn là một cách khác nhau để xử lý nhu cầu trong mã OO cho một đối tượng để có được một đối tượng khác (hoặc có khả năng là chính nó) để làm một việc gì đó.
Trong hầu hết các ngôn ngữ hiện đại xuất phát từ phương pháp C ++, chúng tôi thực hiện điều đó bằng các cuộc gọi phương thức. Trong trường hợp này, đối tượng được gọi (thông qua định nghĩa lớp của nó) đưa ra một danh sách lớn về phương thức gọi nó là phương thức nào và sau đó bộ mã hóa của đối tượng gọi đơn giản chỉ cần viết lệnh gọi:
public void doSomething ( String input )
...
other_object.dosomething ( local )
Đối với các ngôn ngữ được nhập tĩnh, sau đó trình biên dịch có thể kiểm tra loại của sự vật được gọi và xác nhận rằng phương thức đã được khai báo. Đối với các ngôn ngữ gõ động thì điều đó được thực hiện trong thời gian chạy.
Nhưng về bản chất, điều xảy ra là một bó các biến được gửi đến một khối mã cụ thể.
Thông qua
Trong các ngôn ngữ truyền thông điệp (như Mục tiêu C) thay vì các phương thức có người nhận, nhưng nhìn chung cách tiếp cận xác định chúng và gọi chúng là giống nhau - sự khác biệt là cách xử lý của nó.
Trong một thông điệp được truyền bằng ngôn ngữ, trình biên dịch có thể kiểm tra xem máy thu mà bạn đã gọi có tồn tại hay không, nhưng tệ nhất là nó sẽ hiện ra một cảnh báo để nói rằng nó không chắc chắn rằng nó ở đó. Điều này là do tại thời điểm chạy, điều sẽ xảy ra là một khối mã trên đối tượng nhận sẽ được gọi chuyển qua cả bó biến và chữ ký của người nhận mà bạn muốn gọi. Khối mã đó sau đó tìm kiếm người nhận và gọi nó. Tuy nhiên, nếu người nhận không tồn tại thì mã sẽ chỉ trả về một giá trị mặc định.
Kết quả là một trong những điều kỳ lạ được tìm thấy khi chuyển từ C ++ / Java -> Mục tiêu C hiểu rằng bạn có thể "gọi một phương thức" trên một đối tượng không được khai báo theo kiểu thời gian biên dịch và thậm chí không tồn tại loại thời gian chạy ... và rằng cuộc gọi sẽ không dẫn đến ngoại lệ bị ném nhưng thực tế là kết quả được truyền lại.
Ưu điểm của phương pháp này là nó làm phẳng lớp hierachy và tránh hầu hết các nhu cầu cho giao diện / nhiều kiểu thừa kế / vịt. Nó cũng cho phép các đối tượng xác định hành vi mặc định khi được yêu cầu làm điều gì đó mà họ không có người nhận (thường là "nếu tôi không làm điều đó, hãy chuyển tiếp yêu cầu đến đối tượng khác này"). Nó cũng có thể đơn giản hóa việc liên kết đến các cuộc gọi lại (ví dụ: đối với các thành phần UI và các sự kiện được định thời gian) đặc biệt là các ngôn ngữ được nhập tĩnh như Java (để bạn có thể gọi nút gọi là "runTest" thay vì gọi phương thức "actionPerformed" trên lớp bên trong "RunTestButtonListener" thực hiện cuộc gọi cho bạn).
Tuy nhiên, có vẻ như phải trả giá cho nhu cầu kiểm tra bổ sung của nhà phát triển rằng cuộc gọi mà họ nghĩ rằng họ đang thực hiện đúng đối tượng với đúng loại và truyền đúng tham số theo đúng thứ tự, bởi vì trình biên dịch có thể không cảnh báo bạn và nó sẽ chạy hoàn toàn tốt trong thời gian chạy (chỉ cần trả về một phản hồi mặc định). Ngoài ra còn có một hiệu suất đạt được từ việc tìm kiếm thêm và thông qua.
Ngày nay, các ngôn ngữ được gõ động có thể mang lại rất nhiều lợi ích của thông điệp được truyền qua OO với ít vấn đề hơn.