0

Проблема:Является ли этот шаблон дизайна одиночного дизайна плохим? Неправильно ли использовать Singleton в этом случае?

Для простоты я использую простой пример. В примере приложения Class-A считывает некоторые данные.

Класс-A затем создает экземпляр класса B, который затем создает класс C. Итак, во всем существует 3-уровневая иерархия классов A --> B --> C

Класс B создает & управляет настраиваемыми объектами на основе данных, найденных в классе A. Я просто передал эти данные из класса А в класс-B в форма параметров функции/метода.

Класс C, однако, отличается. Он имеет 2 функции/методы, которые дают ему свои данные.

  1. firstMethod(arg) - который дает ему данные для работы. (называемый классом-B)
  2. otherMethod(otherArg) - вместе с другими данными для работы.

Он был установлен классом B, а данные, которые ему нужны из класса B, будут переданы ему по классам B через firstMethod(arg1). Однако существует еще один набор данных, который должен выполняться классом C. Этот другой параметр не имеет ничего общего с классом-B; Поэтому было бы неправильно передавать эту информацию через эти классы в качестве параметра для перехода к классу C.

Как получить эту информацию из класса A в класс C без использования класса B? Что я сделал, так это создать Singleton class-S.

Класс-S определил в нем методы/функции (не переменные) класса-A. После установки его, класса C теперь может вызвать его otherMethod(otherArg) на класс-S, которая вызывает нужную функцию и возвращает необходимые данные непосредственно из класса А.

A-->B-->C 
^  | 
|___S___| 

вопросы:

I» перечислены некоторые проблемы одиночных игр, которые наблюдаются вокруг сети.

  1. От this link, Как правило, они используются в качестве глобального экземпляра, почему это так плохо? Потому что вы скрываете зависимости вашего приложения в своем коде, вместо того, чтобы разоблачать их через интерфейсы. Сделать что-то глобальное, чтобы избежать его распространения, - это запах кода. [мое править] - В то время как класс-S является, используемым в качестве глобального экземпляра, Class-c имеет четко определенные зависимости. Методы/функции, необходимые для работы, определяются в его интерфейсе.
  2. от this link, Они по сути заставляют код плотно соединяться. Это во многих случаях затрудняет их проверку. [мое редактирование] - эта установка все еще плотно связывает класс-C с синглом? Если Class-C должен быть проверен модулем, то синглтон не нужен (по крайней мере, я так не думаю). Поскольку функции четко определены, макетный класс может подделывать свои данные.
  3. Они несут состояние в течение всего срока службы приложения. Еще один удар по тестированию, так как вы можете закончить ситуацию, когда нужно заказать тесты, что не является большим для нетипичных тестов. Зачем?Потому что каждый модульный тест должен быть независимым от другого. [мое править] Учитывая настройку, я не уверен, что это будет проблемой?

Любые указатели на это очень помогут. Пожалуйста, не ненавидите. Я искал Google, но не нашел много окончательных ответов. Благодарю. Есть предположения?

[My Edit] -> Следующий комментарий задал следующий вопрос, который я считал достаточно важным, чтобы добавить сюда.

Почему вы не хотите передавать дополнительные данные в B? Если эти данные необходимы для выполнения команды [in class-C], то это должен быть параметр. Независимо от того, если B использует непосредственно или передает его на

Ответ будет то, что это простой пример использования A, B, C. & Истина заключается в том, что приложение гораздо сложнее. Класс-B является многоразовым классом, который используется во многих других частях приложения. Если бы я сделал класс-B, добавив дополнительные данные в качестве параметра для перехода к классу C, то в любой другой части приложения, где используется класс-B, мне пришлось бы передать nil для этого параметра. Кроме того, если класс B используется в большем количестве мест в приложении: B->C ... B->X ... B->Y ... B->Z ... и т. Д., То многоразовый класс B теперь должен будет нести параметры C, X , Y и Z .. или более. Класс-B - это класс, который может использовать классы экземпляров разных типов, но он не знает, что информация о классах, которые он имеет, была установлена ​​/ распределена. Его задача - просто указать/выделить класс, дать инстанс-классу общую информацию, необходимую ему через параметры, и, наконец, выполнить некоторую дополнительную настройку. Но класс-B не должен знать других конкретных данных своих инстанционных классов. Поэтому он не знал, что класс-C должен перейти в класс-А, чтобы получить информацию. Только класс-C знал бы, где получить свою конкретную информацию.

+0

Почему вы не хотите передать дополнительные данные в 'b'? Если эти данные необходимы для выполнения команды, то это должен быть параметр. Независимо от того, использует ли 'B' его непосредственно или передает его. –

+0

@NicoSchertler Я отредактировал вопрос, чтобы добавить комментарий, потому что я думал, что это хороший вопрос. –

+0

Хорошо. Ваше описание все еще очень общее. Я думаю, что это очень помогло бы, если бы вы могли добавить конкретный пример. Я совершенно уверен, что синглтон - плохая идея. Может быть, B должен передать C обратно A, а A может добавить необходимые данные? –

ответ

1

Я немного потерял понятие «классы порождения».

Вы сказали, что C имеет элемент (т.е. это класс обслуживания?), То скажем, что C называется Кук, и он один из членов называется

Cake bakeACakeMethod(Flour,Chocolate) 

где шоколад класса B, что вам говорят.

Так как вы хотите, чтобы пропустить класс B и использовать класс (ананас) прямо в C, то вы могли бы изменить метод для

Cake bakeACakeMethod(Flour,IYummy) 

Где IYummy является интерфейс и А класс B реализует IYummy, поэтому метод позволяет использовать оба класса.

Другой способ сделать это состоит в использовании перегрузки

+0

Создание нереста класса означало создание нового экземпляра класса. Класс- (B) следует по образцу фабрики здесь: https://en.wikipedia.org/wiki/Factory_%28object-oriented_programming%29. Его многоразовый класс, который создает другие классы. Таким образом, class- (A) считывает исходные данные и создает экземпляры (B). (B) затем создает экземпляр соответствующего класса на основе данных, переданных ему из (A). Он создает экземпляр (C) и передает ему общие данные. Классы A, B и C являются полностью отдельными классами (нет наследования/подклассификации). Поэтому (C) нельзя использовать метод вызова на (A), если он не имеет ссылки на (A). Я использовал singleton для получения справки (A) –

+0

Я также отредактировал вопрос выше, удалив слова «порожденный» и заменил его на «instanced» class –

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