2010-02-22 31 views
7

Thực tiễn tốt nhất để triển khai Singletons trong Perl là gì?Làm thế nào tôi có thể thực hiện một lớp singleton trong perl?

+1

Cách thực hành tốt nhất để triển khai thực đơn là ** Không! ** –

+0

@gbacon - lý do gì để chống lại việc triển khai sigletons? Tôi đã không bao giờ sử dụng chúng rộng rãi (hoặc gần như không bao giờ) nhưng tôi không biết bất kỳ lý do gì để tránh chúng thay vì chỉ không nhất thiết cần chúng. – DVK

+3

@DVK Một singleton là một biến toàn cầu mặc một bộ đồ lạ mắt. –

Trả lời

16

Bạn có thể sử dụng mô-đun Class::Singleton.

Lớp "Singleton" cũng có thể dễ dàng được triển khai bằng cách sử dụng biến số my hoặc state (sau này có sẵn từ Perl 5.10). Nhưng hãy xem bình luận của @ Michael bên dưới.

package MySingletonClass; 
use strict; 
use warnings; 
use feature 'state'; 

sub new { 
    my ($class) = @_; 
    state $instance; 

    if (! defined $instance) { 
     $instance = bless {}, $class; 
    } 
    return $instance; 
} 
+4

Điều này không thành công nếu mô đun được phân lớp; biến cá thể cần phải sống trong gói cuối cùng. Class :: Singleton được quyền này. –

+3

Nó không thực sự "thất bại" nếu nó được thừa hưởng. Lớp kế thừa chỉ cần truy cập và tương tác với đối tượng singleton như bất kỳ lớp nào khác. Tuy nhiên, tất cả phụ thuộc vào những gì bạn đang cố gắng làm. –

9

Nếu bạn đang sử dụng Moose, thì MooseX::Singleton. Giao diện của nó tương thích với Class :: Singleton.

2

Singleton Tóm tắt:

  • Phần lớn thời gian một đối tượng bình thường sẽ làm việc.
  • Hãy cẩn thận với người độc thân.
  • Khoanh vùng tương tác càng nhiều càng tốt

Trong khi độc thân là một ý tưởng tốt đẹp, tôi có xu hướng chỉ cần thực hiện một đối tượng bình thường và sử dụng nó. Nếu nó là quan trọng mà tôi chỉ có một đối tượng như vậy, tôi sẽ sửa đổi constructor để ném một ngoại lệ gây tử vong khi đối tượng thứ hai được tạo ra. Các mô-đun singleton khác nhau dường như không làm gì nhiều ngoài việc thêm một phụ thuộc.

Tôi làm điều này vì nó rất dễ, nó hoạt động, và khi trong một tương lai kỳ lạ nào đó tôi cần làm việc với đối tượng thứ hai trong ứng dụng của tôi, những thay đổi sẽ được giảm thiểu.

Tôi cũng muốn bản địa hóa tương tác với các đối tượng 'singleton' của mình - giữ tương tác ở ít địa điểm nhất có thể. Vì vậy, thay vì mọi đối tượng có quyền truy cập trực tiếp vào singleton, tôi dàn xếp tất cả tương tác thông qua đối tượng "Ứng dụng" của tôi. Bất cứ khi nào có thể, đối tượng ứng dụng nhận dữ liệu từ 'singleton' và chuyển nó thành tham số cho phương thức trong các đối tượng khác. Câu trả lời từ các đối tượng khác cũng có thể được cắt và chuyển đến 'singleton'. Tất cả nỗ lực này giúp khi tôi cần thay đổi đối tượng 'singleton' và khi tôi muốn sử dụng lại các đối tượng khác trong một ứng dụng khác có thể không cần hoặc không thể sử dụng đối tượng 'singleton' gốc.

+1

Tôi nghĩ rằng bạn đang thiếu điểm của singleton. Đó là một khuôn mẫu bạn có thể sử dụng, do đó bạn không phải làm tất cả các hòa giải phức tạp. Bạn không cần phải sử dụng nó, nhưng không giảm giá nó đơn giản chỉ vì bạn không cần nó. Không phải mọi thứ đều phù hợp với đề án mà bạn đã mô tả. –

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