Как ответить на вопрос интервью:Что такое синглтон и как бы вы его использовали?[закрыто]

StackOverflow https://stackoverflow.com/questions/815528

Вопрос

Я прочитал вопросы по S.O.что касается Синглтона, то я только что просмотрел часовое выступление Google tech talk.Насколько я могу судить, консенсус в мире OO, похоже, заключается в том, что синглтоны - это скорее антишаблон, чем полезный шаблон проектирования.

Тем не менее, в эти дни я беру интервью, и часто возникает вопрос: что такое синглтон и как бы вы его использовали?

Каков наилучший способ ответить на этот вопрос?Должен ли я просто описать шаблон проектирования, а затем сказать, что единственное приемлемое использование, о котором я слышал, - это ведение журнала, и что оно часто неправильно используется для глобального состояния?

Это было полезно?

Решение

Хитро.Есть много людей, которые считают, что синглтоны по сути являются антишаблоном, как вы сказали (включая меня), но есть также много тех, кто считает, что это просто приемлемый для ООП способ выполнения глобальных операций.

Если интервьюер принадлежит к этому лагерю, то да, я думаю, что он ошибается, но, возможно, это не лучшее, что можно сказать во время интервью.;)

Так что я бы, наверное, постарался быть нейтральным и придерживаться фактов.Вы не знаете, к какому лагерю принадлежит ваш интервьюер, поэтому придерживайтесь неоспоримых фактов.Что делает синглтон?И чтобы продемонстрировать использование, остановитесь на нескольких случаях, когда большинство людей могут согласиться с тем, что синглтон является приемлемым ответом.Или объясните свой опыт (поскольку с этим люди тоже не могут не согласиться).

Но независимо от того, "за" вы или "против" одиночек, интервью, вероятно, не самое подходящее время для крестового похода за это дело.;)

Другие советы

Используйте свой собственный опыт использования / неиспользования. Это лучший ответ в любой день. Если вы не использовали его, но знаете, что это такое, говорите так. Большую часть времени интервьюер не рискует выходить за рамки «Синглетонов», так что постарайтесь это сделать.

До тех пор, пока вы готовы к обсуждению, я думаю, что предложенный вами ответ является хорошим.Но имейте в виду, что некоторые из нас все еще считают синглтоны полезной идеей.Некоторые данные, естественно, являются глобальными по объему, и синглтоны предоставляют разумное средство абстрагирования этих данных.Конечно, вы также можете использовать синглтоны в более ограниченных областях, например, в пределах определенного пространства имен, если ваш язык (языки) поддерживает такую конструкцию.

Синглтон.

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

Это полезный шаблон, когда вы обрабатываете ресурс, когда только один объект может получить к нему доступ одновременно.

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

Кроме того, это может быть проблемой при ведении проекта и попытке изменить часть абстракции. Поэтому я считаю, что лучше всего абстрагировать синглтон через интерфейс. Сохраните " один экземпляр " как деталь реализации и передать экземпляр singleton как интерфейс, означающий, что вызывающий код не привязан к определению класса (и статическому свойству). Это облегчает тестирование и абстрагирование на более позднем этапе за счет архитектурного слесарного дела (например, передача его в Ctors или свойствам setter).

Точно так же, напоминая всем, что мир существовал до GoF, я добавлю, что можно также использовать модификации шаблона Singleton, чтобы обеспечить только один экземпляр для каждой сессии, каждого потока или любого другого. Просто используйте состояние «для каждого сеанса», «для каждого потока» или «для любого другого», чтобы сохранить один экземпляр для каждого.

Мой ответ:

  

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

Или я бы хотел, чтобы это было ...

Мой ответ будет таким:

  

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

     

Я бы использовал его по своему усмотрению.

А как насчет синглетонов, которые не имеют штата? В частности, я имею в виду некоторые возможные идемпотентные конкретные стратегии в шаблоне стратегии, чистый алгоритм, никаких данных.

Или классы Java Enum, которые являются синглетонами. Я нахожу что-то вроде этого полезным:

public enum StringComparator implements Comparator {

  CASE_SENSITIVE {
    int compare(Object lhs, Object rhs) {
      // check for null omitted for brevity
      return lhs.equals(rhs);
    }
  },

  CASE_INSENSITIVE {
    int compare(Object lhs, Object rhs) {
      return String.CASE_INSENSITIVE_ORDER( lhs, rhs ) ;
    }
  };

  boolean equals( Object o ) {
   return this == o ;
  }
} 

Есть несколько вариантов использования, с которыми я столкнулся. Регистрация очевидна. Другой - вывод консоли с использованием nCurses. Я создал библиотеку, которая использует объекты Panel, но каждый из них должен был взаимодействовать с одним контроллером, который контролировал такие вещи, как z-ордера и тому подобное. Еще один генератор случайных чисел для игры. Вы действительно хотите перезаряжать этот мерсенновый твистер в каждой функции или передавать его везде?

Но по большей части они вызывают плохой дизайн.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top