#ооп #ruby #шаблон_одиночка
Много наслышан об паттерне программирования "singleton". Вот только никогда на практике не приходилось встречать его в действии (а может и приходилось, но я об этом не догадываюсь). Расскажите, что это такое (по русски, гуглом пользоваться умею, но кроме сухой терминологии и пары non-real-life примеров ничего не находил), как, а главное в каких случаях им можно/нужно пользоваться, ну и желательно пример (на Ruby, если можно).
Ответы
Ответ 1
Синглетон - это паттерн, описывающий объект в единственном экземпляре, без возможности создания его копии. Например, у вас имеются настройки для приложения и они должны быть в единственном экземпляре, не допускается создать копию такого объекта, изменить её в одной части приложения, а в другой станется не измененная старая копия. Или установив соединение с базой данных один раз, нужно воспользоваться уже установленным соединением и не создавать его повторно. Вместо базы данных, может быть лог-файл или любой другое хранилище существующее в единственном экземпляре. Для того, чтобы создать синглетон в Ruby вы должны закрыть возможность создания объекта через new и клонирование объекта (методы clone, dup, _dup). В стандартной библиотеки Ruby уже реализован модуль, подмешав который в собственный класс, вы можете превратить его в синглетон, включив его в класс. class MyClass include Singleton # ... end o = MyClass.instanceОтвет 2
Важно понимать, что в целом "паттерны ООП" -- это костыли, исторически возникающие для решения определенных проблем определенных языков программирования, т.е. не цель, а средство. Естественно, что во всех языках ООП разное, и например, Синглтон, как нечто особенное, не имеет острой необходимости в Руби вообще. Есть понятие "статическое поле (атрибут)" -- через него экземпляры класса могут общаться между собой или конфигурироваться извне все разом. Если вы подумаете об этом как об особом экземпляре, который есть изначально и он всегда один. вы можете захотеть его куда-то передать, но некоторые языки программирования не позволяют передавать класс в качестве аргументов функции -- принятым костылем для этой проблемы являлся Синглтон, но в Руби класс передавать можно. С остальным прекрасно справляются статические поля и методы класса, потому что на самом деле они являются обычными полями и методами метакласса -- неявного класса, который Руби создает для каждого явного, незаметно для пользователя инстанциируя его один раз, затем навешивая на него те методы, которые по вашему мнению висят на явно определенном классе, но "статически". Это по сути уже реализует Синглтон. Остальные выдумки, как например, модуль Singleton, существует в стандартной рубишной библиотеке лишь для того, чтоб люди, пришедшие из других языков программирования могли писать код визуально так, как привыкли, но не нужно "писать на языке А так, будто это Б" -- используйте инструмент правильно, обходитесь полями и методами класса. Примеры кода и еще немного объяснений про метаклассы: https://www.practicingruby.com/articles/ruby-and-the-singleton-pattern-dont-get-along https://stackoverflow.com/a/2505077/322020 https://rubymonk.com/learning/books/4-ruby-primer-ascent/chapters/39-ruby-s-object-model/lessons/131-singleton-methods-and-metaclasses
Комментариев нет:
Отправить комментарий