Для простоты я использую простой пример. В примере приложения Class-A считывает некоторые данные.
Класс-A затем создает экземпляр класса B, который затем создает класс C. Итак, во всем существует 3-уровневая иерархия классов A --> B --> C
Класс B создает & управляет настраиваемыми объектами на основе данных, найденных в классе A. Я просто передал эти данные из класса А в класс-B в форма параметров функции/метода.
Класс C, однако, отличается. Он имеет 2 функции/методы, которые дают ему свои данные.
firstMethod(arg)
- который дает ему данные для работы. (называемый классом-B)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» перечислены некоторые проблемы одиночных игр, которые наблюдаются вокруг сети.
- От this link, Как правило, они используются в качестве глобального экземпляра, почему это так плохо? Потому что вы скрываете зависимости вашего приложения в своем коде, вместо того, чтобы разоблачать их через интерфейсы. Сделать что-то глобальное, чтобы избежать его распространения, - это запах кода. [мое править] - В то время как класс-S является, используемым в качестве глобального экземпляра,
Class-c
имеет четко определенные зависимости. Методы/функции, необходимые для работы, определяются в его интерфейсе. - от this link, Они по сути заставляют код плотно соединяться. Это во многих случаях затрудняет их проверку. [мое редактирование] - эта установка все еще плотно связывает класс-C с синглом? Если Class-C должен быть проверен модулем, то синглтон не нужен (по крайней мере, я так не думаю). Поскольку функции четко определены, макетный класс может подделывать свои данные.
- Они несут состояние в течение всего срока службы приложения. Еще один удар по тестированию, так как вы можете закончить ситуацию, когда нужно заказать тесты, что не является большим для нетипичных тестов. Зачем?Потому что каждый модульный тест должен быть независимым от другого. [мое править] Учитывая настройку, я не уверен, что это будет проблемой?
Любые указатели на это очень помогут. Пожалуйста, не ненавидите. Я искал 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 знал бы, где получить свою конкретную информацию.
Почему вы не хотите передать дополнительные данные в 'b'? Если эти данные необходимы для выполнения команды, то это должен быть параметр. Независимо от того, использует ли 'B' его непосредственно или передает его. –
@NicoSchertler Я отредактировал вопрос, чтобы добавить комментарий, потому что я думал, что это хороший вопрос. –
Хорошо. Ваше описание все еще очень общее. Я думаю, что это очень помогло бы, если бы вы могли добавить конкретный пример. Я совершенно уверен, что синглтон - плохая идея. Может быть, B должен передать C обратно A, а A может добавить необходимые данные? –