Мой коллега хочет использовать одноэлементный паттерн в javascript для ссылки на объекты, которые в нашем текущем приложении могут быть созданы только один раз.
И наоборот, я хочу сослаться на эти объекты, используя глобальный объект с пространством имен.
Его аргумент заключается в том, что если когда-либо будет разрешено создавать более одного из этих объектов, стоимость рефакторинга будетниже при использовании синглетонов, потому что меньше кода придется менять.
Например, допустим, у нас есть приложение с большим центральным элементом интерфейса, например карта в Google Maps.
Я обычно хочу получить доступ к карте из кода приложения, например:
Application.interface.map.zoom(10);
Он хочет получить доступ к карте по всему коду приложения, например:
var map = new Map(); // This is invisibly a singleton
map.zoom(10);
ДляНапример, код в классе ButtonsControl
, представляющий кнопки, управляющие картой, должен был бы каким-либо образом получить доступ к карте, чтобы отразить ввод пользователя.Если он получит доступ к карте, используя new
или Application
?
В нашем приложении маловероятно, что нам придется создавать еще один экземпляр карты, но, скажем, когда-нибудь мы это сделаем ...
Мой аргумент в том, что теперь стоимость чтения кода, подобного его (с использованием new
), превышает любую выгоду, которую мы могли бы получить позже при рефакторинге этого кода, чтобы разрешить несколько карт.Расходы на чтение кода, подобного его, и попытки понять, что он делает.
Например, при чтении кода в ButtonsControl
вы можете быть испуганы, увидев, что, по-видимому, new Map()
будучи созданным в вашем конструкторе ButtonsControl
, вы должны будете изучить код Map, чтобы убедиться, что это на самом деле не происходит.Либо выследить это, либо уже знать, что new Map()
является единичным, - это то, что требует затрат при использовании new Map()
, тогда как чтение Application.interface.Map
очевидно и не обременяет будущего читателя кода.
Даже если синтаксис new Map()
будет изменен на Map.get_instance()
, мой аргумент состоял в том, что использование синглтона на самом деле приведет к дальнейшей работе позже, если мы решим когда-нибудь разрешить несколько карт, потому что код, написанный вокруг синглтона, будет фактически вести себя какхотя важно, чтобы он работал на конкретной карте, а не, возможно, создавал новую карту и работал с it .Другими словами, мне интересно, хороший ли тест для того, использовать ли одиночный код или нет, если код, окружающий его, кажется независимым от того, работает ли он над реальным новым объектом или существующим объектом.Например, канонический пример подключения к базе данных проходит этот тест.
Я знаю, что это не так много информации, но ... хорошо, поэтому создание стандартов кодирования является трудным делом;Трудно принимать эти решения без точной информации.Но предположим, что вы разрабатывали Карты Google с нуля сегодня, и вам пришлось принять это решение.Я также знаю, что это смехотворно маленький вопрос, но по какой-то причине я интуитивно сильно предпочитаю свою версию и пытаюсь понять, почему.
Что вы выбираете и почему?