2010-02-22 4 views
7

Какова наилучшая практика для внедрения Singletons в Perl?Как я могу реализовать одноэлементный класс в perl?

+1

Лучшая практика для внедрения синглтонов - это ** Не надо! ** –

+0

@gbacon - какова была бы причина для внедрения сиглетонов? Конечно, я никогда не использовал их широко (или, скорее, почти никогда), но я не знаю ни одной причины, чтобы избежать их, а не просто не обязательно их нуждаться. – DVK

+3

@DVK Синглтон - это глобальная переменная, носящая причудливый костюм. –

ответ

16

Вы можете использовать модуль Class::Singleton.

Класс «Singleton» также может быть легко реализован с использованием переменной my или state (последняя доступна с Perl 5.10). Но см. Комментарий Майкла.

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

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

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

Это не удается, если модуль подклассифицирован; переменная экземпляра должна жить в последнем пакете. Класс :: Singleton получает это право. –

+3

Это действительно не «сбой», если он унаследован. Унаследованный класс просто должен получить доступ и взаимодействовать с объектом singleton, как и любой другой класс. Однако все зависит от того, что вы пытаетесь сделать. –

2

Singleton Резюме:

  • Большую часть времени нормальный объект будет работать.
  • Будьте осторожны с одиночными играми.
  • Локализуйте взаимодействие как можно больше

Хотя одиночки являются хорошей идеей, я, как правило, просто реализовать нормальный объект и использовать его. Если критически важно, чтобы у меня был только один такой объект, я модифицирую конструктор, чтобы вызвать фатальное исключение, когда создается второй объект. Различные модули singleton, похоже, не делают ничего, кроме добавления зависимости.

Я делаю это, потому что это легко, это работает, и когда в каком-то странном будущем мне нужно работать со вторым объектом в моем приложении, изменения сводятся к минимуму.

Мне также нравится локализовать взаимодействие с моими объектами «singleton» - поддерживать взаимодействие как можно меньше мест. Поэтому вместо каждого объекта, имеющего прямой доступ к синглтону, я посредничаю во всем взаимодействии через свой объект «Приложение». Когда это возможно, объект приложения получает данные из «singleton» и передает его в качестве параметра методу в других объектах. Ответы других объектов также могут быть отброшены и переданы в «singleton». Все это помогает, когда мне нужно внести изменения в объект «singleton», и когда я хочу повторно использовать другие объекты в другом приложении, которые могут не понадобиться или быть в состоянии использовать оригинальный объект «singleton».

+1

Я думаю, что вам не хватает точки синглтона. Это шаблон, который вы можете использовать, поэтому вам не нужно делать все сложное посредничество. Вам не обязательно использовать его, но не обесценивайте его просто потому, что он вам не нужен. Не все вписывается в схему, которую вы описали. –

Смежные вопросы