2009-02-18 14 views
7

Moose::Manual::Attributes trạng thái:Tại sao công cụ xây dựng của Moose lấy giá trị chuỗi?

Là một thay thế cho việc sử dụng một tài liệu tham khảo chương trình con [cho mặc định], bạn thay vì có thể cung cấp một phương pháp xây dựng cho thuộc tính của bạn: ... này có một số lợi thế. Đầu tiên, nó di chuyển một đoạn mã sang phương thức được đặt tên riêng của nó, giúp cải thiện khả năng đọc và tổ chức mã.

Vì vậy, thuộc tính của bạn có thể xác định một mặc định thusly:

has attr => (
    is => 'ro', 
    builder => 'subroutine' 
); 
sub subroutine { 
    # figure out and return default value 
} 

Tôi không hiểu lý do tại sao điều này đã được tách biệt với mặc định. Bạn không thể chuyển một tham chiếu đến một chương trình con được đặt tên?

has attr => (
    is => 'ro', 
    default => \&subroutine 
); 

Và đó không phải là thực hành lập trình tốt hơn, vì bạn được đảm bảo không vô tình tham chiếu đến chương trình con không tồn tại? Bạn muốn tham chiếu đến phương thức với tham chiếu logic thay vì tham chiếu tượng trưng.

Trả lời

14

Khi xây dựng được gọi là, điều này xảy ra:

$object->$builder 

Nếu builder là một chuỗi (giả sử build_attr), sau đó người dùng có thể viết phương pháp build_attr riêng của họ trong một lớp con và nó sẽ được gọi. Điều này làm cho giá trị mặc định có thể mở rộng thông qua một cơ chế phương thức được đặt tên đơn giản.

Nếu đó là tham chiếu đến chương trình con, tham chiếu được thực hiện trong gói của lớp gốc, có nghĩa là nó không thể được ghi đè theo cùng một cách.

10

Đây không phải là tham chiếu "biểu tượng". Trình tạo là phương thức tên. Điều đó có nghĩa là nó có thể kế thừa và hợp thành từ một vai trò. Nếu bạn vượt qua tham chiếu chương trình con, tham chiếu đó phải tồn tại trong cùng một gói (hoặc hoàn toàn đủ điều kiện).

Tôi khá chắc chắn tôi giải thích điều này trong sách hướng dẫn. Nó không rõ ràng?

+0

Vâng, tôi biết nó không phải là một tham chiếu trong ý nghĩa Perl; Tôi đã chỉ nghĩ rằng thực hành lập trình tốt hơn sẽ là để vượt qua một tham chiếu thực sự đến một chương trình con được đặt tên, vì những lý do tôi đã đề cập. Tuy nhiên, bạn nói đúng; phần còn lại của hướng dẫn không cho thấy lý do tại sao nó là mong muốn ... – skiphoppy

+1

Lưu ý đoạn bắt đầu "Điều này có một số lợi thế. Đầu tiên ..."; có lẽ nó sẽ giúp di chuyển một số phần tiếp theo lên đó để theo dõi vì vậy đoạn văn cho nhiều hơn chỉ là một lợi thế, sớm hơn một chút cho những người đang tự hỏi. – skiphoppy

7

Phân lớp phụ.

Builder chỉ định một tên phương pháp để gọi, vì vậy

package Something; 
use Moose; 

extends 'YourClass'; 

sub subroutine { <some other default> } 

sẽ có cái gì đó :: chương trình con gọi cho một người thợ xây của 'chương trình con', trong khi đó nếu bạn sử dụng phong cách subref thì YourClass :: chương trình con sẽ là được gọi thay vì bạn đã thực hiện một tham chiếu trực tiếp đến chương trình con thay vì để nó đi qua phương thức gửi đi.

Các vấn đề liên quan