вопрос объектно-ориентированного проектирования для графического приложения - PullRequest
5 голосов
/ 01 октября 2010

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

Итак, во-первых, я использую шаблон наблюдателя для построения абстрактных классов Model и View, а также конкретных моделей (контейнер cd) и конкретных представлений (представление контейнера cd). Затем я начинаю использовать среду wxwidget для разработки и графического оформления или макета (CDContainerWidget, из wxPanel) контейнера cd и других элементов управления графическим интерфейсом MainFrame (из wxFrame) и т. Д.

так что теперь у меня есть три класса: CDContainerModel (контейнер cd), CDContainerView (класс для шаблона наблюдателя) и CDContainerWidget (элементы управления графическим интерфейсом). тогда я не очень понимаю, что мне делать с CDContainerView и CDContainerWidget?

Я думаю, что для CDContainerWidget и CDContainerView необходим CDContainerModel. Я думаю о четырех подходах, но не знаю, какой из них стоит оценивать:

1). свяжите CDContainerWidget в CDContainerView в качестве переменной-члена, затем поместите CDContainerView в основной фрейм в качестве переменной-члена.

class CDContainerView:
  def __init__:
     self.gui=CDContainerWidget

class MainFrame:
  def __init__:
     CDContainerView

2). CDContainerView подкласс CDContainerWidget:

class CDContainerView(CDContainerWidget):

class MainFrame:

   def __init__:

     CDContainerView

3). CDContainerWidget подкласс CDContainerView:

class CDContainerWidget(CDContainerView):

class MainFrame:
  def __init__:
     CDContainerWidget

4). вместо использования CDContainerWidget и CDContainerView, используйте только один класс CDContainerBig, который подклассирует абстрактный класс View и wxPanel

class CDContainerBig(View, wxPanel)

У меня вопрос, каково правильное решение? Я прочитал вики-страницу шаблона MVC, но я не совсем понимаю его описание и не знаю, как, а также удивляюсь, стоит ли его применять к моей проблеме.

Хорошо, я добавил несколько дополнительных комментариев. Первоначально, когда я начинаю заниматься программированием, я не особо задумывался и просто выбирал 2) подход. но сейчас я думаю 3) это хорошо. так как разумно поместить виджет в виджет (CDContainerWidget в MainFrame). но я не совсем уверен. Кроме того, похоже, с паттерном наблюдателя, три класса скручены и неуклюжи. И иногда мне кажется, что эти 4, возможно, одинаковы, просто кто включает кого, или кто отправляет сообщения кому. ну, я думаю, мне действительно нужны разъяснения по этому вопросу.

Кроме того, я поддерживаю 3) из-за практической точки зрения. CDContainerWidget на самом деле содержит несколько компонентов подвиджетов (кнопка, поле ввода и т. Д.), И если мы изменяем что-то, например, устанавливаем новые значения через виджет субкомпонента, 1) нам нужно, чтобы CDContainerWidget был осведомлен о CDContainerView, чтобы позволить CDContainerView уведомлять другие представления. для 2) что еще хуже, CDContainerWidget должен знать о своем детском CDContainerView. для 3) CDContainerWidget сам по себе является CDContainerView, так что вполне разумно. за 4) ну легко но логического разделения нет. это моя собственная мысль, не знаю, правильно ли это.

Спасибо !!

Ответы [ 2 ]

1 голос
/ 07 октября 2010

Что могло бы облегчить для вас потерю связи между классами, так это реализовать шаблон сигнальных слотов с чем-то вроде Spiff Signal или одним из других доступных модулей сигналов / слотов.

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

1 голос
/ 01 октября 2010

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

...