GUI-приложение и внедрение синглтона / зависимости - PullRequest
2 голосов
/ 30 июля 2010

Я работаю над приложением с графическим интерфейсом, используя wxWidgets. Я получил объект, используемый в качестве «модели»: его данные должны использоваться для рисования пользовательского интерфейса, и пользовательский интерфейс должен изменить его. Давайте назовем этот класс Model.

Структура приложений выглядит следующим образом:

A wxApp -приобретенный объект, обладающий:

  • a wxFrame -приобретенный объект, который обладает wxGLCanvas -приобретенный объект.
  • другой wxFrame -приобретенный объект.

Для класса Model,

  1. Я мог бы использовать singleton , который сделает все очень просто: я можно просто использовать model.getThatData() или model.setThatData() где угодно.

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

  2. Я также мог бы использовать зависимость впрыск (или это что то еще): я инстанцирую Model в wxApp объект, а затем я передаю ссылка на экземпляр model в конструкторы обоих wxFrame -производных классов, то же самое с wxGLCanvas конструктор, и я храню ссылка как атрибут необходимые занятия.

    Однако, это не кажется очень хорошее решение. Предположим, первый wxFrame объект не нужен использовать model. Мы будем тем не менее должен передать ссылку на model в своем конструкторе, чтобы иметь возможность передать его wxGLCanvas объект. Так что дизайн может привести к много (?) ненужных переходов.

Что ты думаешь? Я давно задавал себе этот вопрос ...

Ответы [ 3 ]

2 голосов
/ 31 июля 2010

Тем не менее, это не очень хорошее решение. Предположим, что первый объект wxFrame не должен использовать модель. Тем не менее, нам нужно будет передать ссылку на модель в ее конструкторе, чтобы иметь возможность передать ее производному от wxGLCanvas объекту. Так что дизайн может привести ко многим (?) Ненужным переходам.

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

# 2 - это то, как я это делаю. Цель состоит в том, чтобы просто взглянуть на объявление класса, чтобы получить представление о предпосылках класса. В идеале, если в контексте у меня есть все, что нужно методу c'tor / init, я должен иметь возможность создавать и использовать объект. Таким образом, жизненный цикл также становится понятным: предпосылки не могут быть освобождены до тех пор, пока объект не будет освобожден.

1 голос
/ 31 июля 2010

Поместите это в простую модель MVC.(Напомним, что C взаимодействует с M и V, а M и V не взаимодействуют друг с другом.)

Ваша модель (очевидно) - "M" в MVC.Ваши виджеты - это буква "V" в MVC.

Видите проблему здесь?Вы пытаетесь дать «М» для «V»;вам не хватает "C", чтобы делегировать все.Ваше «C» может быть вашим wxApp (это зависит от того, как вы хотите проектировать вещи).

Другими словами, контроллер должен передавать данные, необходимые для представления из модели в представление;представление не должно извлекать свои собственные данные непосредственно из модели.

(Поэтому, по моему мнению, оба ваших предложения - плохие варианты в приложении MVC.)

1 голос
/ 31 июля 2010

Зависит ли фрейм от определенного класса холста? Или объект холста взаимозаменяем?

Если последний случай, то конструктор для фрейма должен быть параметризован ссылкой на объект холста. Таким образом, приложение позаботится о создании экземпляра модели, создании холста с использованием указанной модели и передаче холста в рамку. Рамка больше не будет зависеть от модели напрямую.

Если фрейм зависит от определенного класса холста (то есть фрейм создает свой собственный холст и знает, какой тип холста ему нужен). Тогда, если конструктор canvas зависит от объекта Model, то по прокси ваш фрейм также зависит от модели. Так что # 2 правильно.

...