Как я могу реализовать singleton-класс в жемчуге?

Какова лучшая практика для реализации Одиночных элементов в Perl?

7
задан planetp 22 February 2010 в 10:47
поделиться

3 ответа

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

Класс "Singleton" также может быть легко реализован с помощью переменной my или state (последняя доступна начиная с Perl 5.10). Но см. комментарий @Michael's ниже.

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

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

    if (! defined $instance) {
        $instance = bless {}, $class;
    }
    return $instance;
}
16
ответ дан 6 December 2019 в 06:36
поделиться

Если вы используете Moose, тогда MooseX :: Singleton . Его интерфейс совместим с Class :: Singleton.

9
ответ дан 6 December 2019 в 06:36
поделиться

SQLITE будет хорошим выбором, который я чувствую. Версия 3 и далее BLOB полностью поддерживается, поэтому можно подумать о SQLITE.

-121--5085931-

Если дочерний процесс не является вашим собственным кодом, вы можете использовать этот код для поиска и уничтожения всех дочерних процессов:

using System;
using System.ComponentModel;
using System.Diagnostics;
using System.Runtime.InteropServices;

namespace Util {
    public static class ProcessExtensions {
        public static void KillDescendants(this Process processToNotKillYet) {
            foreach (var eachProcess in Process.GetProcesses()) {
                if (eachProcess.ParentPid() == processToNotKillYet.Id) {
                    eachProcess.KillTree();
                }
            }
        }

        public static void KillTree(this Process processToKill) {
            processToKill.KillDescendants();
            processToKill.Kill();
        }

        public static PROCESS_BASIC_INFORMATION Info(this Process process) {
            var processInfo = new PROCESS_BASIC_INFORMATION();
            try {
                uint bytesWritten;
                NtQueryInformationProcess(process.Handle,
                                          0,
                                          ref processInfo,
                                          (uint)Marshal.SizeOf(processInfo),
                                          out bytesWritten); // == 0 is OK
            }
            catch (Win32Exception e) {
                if (!e.Message.Equals("Access is denied")) throw;
            }

            return processInfo;
        }

        public static int ParentPid(this Process process) {
            return process.Info().ParentPid;
        }

        [DllImport("ntdll.dll")]
        private static extern int NtQueryInformationProcess(
            IntPtr hProcess,
            int processInformationClass /* 0 */,
            ref PROCESS_BASIC_INFORMATION processBasicInformation,
            uint processInformationLength,
            out uint returnLength);

        [StructLayout(LayoutKind.Sequential)]
        public struct PROCESS_BASIC_INFORMATION {
            public int ExitStatus;
            public int PebBaseAddress;
            public int AffinityMask;
            public int BasePriority;
            public int Pid;
            public int ParentPid;
        }
    }
}
-121--3867366-

Singleton Summary:

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

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

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

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

2
ответ дан 6 December 2019 в 06:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: