'Trở thành:' của Smalltalk có công dụng gì?


12

Các become:tin nhắn trong Smalltalk gây một đối tượng để thay đổi thành khác, ảnh hưởng đến tất cả các tham chiếu đến nó.

Tính năng ngôn ngữ này có công dụng gì? Nó có được sử dụng trong mã thực không? Có phải chỉ là một sự tò mò? Nó được coi là một thực hành tốt / xấu để sử dụng nó?

Câu trả lời:


11

Gilad Bracha nói về become:một số chiều dài:

Một trong những tính năng độc đáo và mạnh mẽ nhất của Smalltalk cũng là một trong những tính năng ít được biết đến nhất ngoài cộng đồng Smalltalk. Đó là một phương pháp nhỏ gọi là trở thành :.

Những gì trở thành: does là trao đổi danh tính của người nhận và đối số của nó. Đó là, sau

a trở thành: b

tất cả các tham chiếu đến đối tượng được ký hiệu là a trước điểm gọi tham chiếu đến đối tượng được ký hiệu là b và ngược lại.

Hãy dành một phút để nội tâm hóa điều này; bạn có thể hiểu nhầm nó là một cái gì đó tầm thường. Đây không phải là về việc hoán đổi hai biến - nó thực sự là về một đối tượng trở thành một đối tượng khác. Tôi không biết bất kỳ ngôn ngữ nào khác có tính năng này. Đó là một tính năng của sức mạnh to lớn - và nguy hiểm.

Xem xét nhiệm vụ mở rộng ngôn ngữ của bạn để hỗ trợ các đối tượng liên tục. Giả sử bạn muốn tải một đối tượng từ đĩa, nhưng không muốn tải tất cả các đối tượng mà nó đề cập quá cảnh (nếu không, đó chỉ là giải nén đối tượng đơn giản). Vì vậy, bạn tải chính đối tượng, nhưng thay vì tải các tham chiếu trực tiếp của nó, bạn thay thế chúng bằng các đối tượng trấu.

Các trấu đứng trong dữ liệu thực trên bộ lưu trữ thứ cấp. Dữ liệu đó được tải một cách lười biếng. Khi bạn thực sự cần phải gọi một phương thức trên vỏ trấu, phương thức doesNotUnderstand: của nó tải đối tượng dữ liệu tương ứng từ đĩa (nhưng một lần nữa, không quá cảnh).

Sau đó, nó thực hiện trở thành:, thay thế tất cả các tham chiếu đến vỏ trấu bằng các tham chiếu đến đối tượng mới được tải và thử lại cuộc gọi.

Một số công cụ kiên trì đã thực hiện loại điều này trong nhiều thập kỷ - nhưng chúng thường dựa vào quyền truy cập cấp thấp vào đại diện. Trở thành: cho phép bạn làm điều này ở cấp mã nguồn.

Bây giờ hãy làm điều này trong Java. Hoặc thậm chí trong một ngôn ngữ năng động khác. Bạn sẽ nhận ra rằng bạn có thể thực hiện một hình thức tương lai chung theo cách này, và do đó sự lười biếng. Tất cả không có quyền truy cập đặc quyền vào các hoạt động của việc thực hiện. Nó cũng hữu ích cho sự phát triển lược đồ - ví dụ khi bạn thêm một biến thể hiện vào một lớp. Bạn có thể định hình lại hình ảnh khác tất cả các trường hợp cần thiết.

Tất nhiên, bạn không nên sử dụng trở thành: tình cờ. Nó đi kèm với một chi phí, có thể bị cấm trong nhiều triển khai. Trong Smalltalks ban đầu, trở thành: rẻ tiền, bởi vì tất cả các đối tượng được tham chiếu gián tiếp bằng bảng đối tượng. Trong trường hợp không có bảng đối tượng, hãy trở thành: đi qua vùng heap theo cách tương tự như trình thu gom rác. Bạn càng có nhiều bộ nhớ, càng trở nên đắt đỏ: trở thành.

Có một bảng đối tượng chiếm dung lượng lưu trữ và làm chậm truy cập; nhưng nó mua cho bạn rất nhiều tính linh hoạt. Hỗ trợ phần cứng có thể giảm bớt hình phạt hiệu suất. Ưu điểm là nhiều vấn đề khó trở nên khá dễ xử lý nếu bạn sẵn sàng trả chi phí gián tiếp thông qua một bảng đối tượng ở phía trước. Hãy nhớ rằng: mọi vấn đề trong khoa học máy tính đều có thể được giải quyết với các mức độ gián tiếp. Alex Warth có một số công việc rất thú vị phù hợp với thể loại này, ví dụ.

Trở thành: có một số biến thể - một cách trở thành: thay đổi danh tính của một đối tượng A thành đối tượng B khác, để tham chiếu đến A bây giờ tại B; tham chiếu đến B không thay đổi. Nó thường hữu ích để trở thành: đồng loạt - chuyển đổi danh tính của tất cả các đối tượng trong một mảng (một chiều hoặc hai chiều). Một nhóm trở thành: ví dụ, nó thực hiện phép thuật rất tuyệt vời để thực hiện các cập nhật phản chiếu cho một hệ thống. Bạn có thể thay đổi toàn bộ tập hợp các lớp và các thể hiện của chúng trong một lần.

Bạn thậm chí có thể hình dung loại an toàn trở thành :. Hai cách trở thành: chỉ loại an toàn nếu loại A giống với loại B, nhưng một cách trở thành: chỉ yêu cầu đối tượng mới là một kiểu con của loại cũ.

Có lẽ đã đến lúc phải xem xét lại việc có một bảng đối tượng thực sự là một điều tốt hay không.

Hiệu quả những gì bạn nhận được là một hình thức lười tải thông qua số tiền để lập trình siêu dữ liệu. Như Bracha chỉ ra điều này có thể rất hữu ích nhưng nó cũng nguy hiểm vì nó có thể ảnh hưởng nghiêm trọng đến hiệu suất.


Tôi lo lắng hơn về becometác động đối với sự tỉnh táo của tôi so với hiệu suất của chương trình của tôi ...
Benjamin Hodgson

Hardware support could ease the performance penalty.Trong tất cả những nơi tôi đã nghe điều này, cộng đồng Smalltalk là nơi nổi bật nhất. Tại sao chúng ta nên "dành" các cải tiến phần cứng để kích hoạt các mô hình lập trình lý tưởng khi nó có thể dẫn đến tăng hiệu suất, giảm mức sử dụng năng lượng hoặc tăng khả năng.
Alexander - Tái lập Monica

2

Nó không được sử dụng nhiều. Trong hình ảnh Pharo 5 tôi đã mở, có 9 người gửi #become:, 7 trong số đó đang trong các bài kiểm tra đơn vị. Nó được sử dụng trong trình biên dịch trong việc tạo mã và trong thư viện tuần tự hóa nhiên liệu để thay thế các proxy bằng nội dung của chúng.


Hấp dẫn. Các bài kiểm tra đơn vị sử dụng nó để làm gì?
dpk

để xem nó có hoạt động không ...
Stephan Eggermont
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.