Рефакторинг формы в государственный шаблон?

2

Я хочу реорганизовать некоторый код.

В основном код, который я хочу реорганизовать, - это форма (с использованием System.Windows.Forms;)

Теперь он настраивается, в зависимости от того, какой переключатель вы выбрали, показывает другой макет для окна: разные метки, кнопки и т.д. Не всегда большая разница, но другая. Это много условных высказываний по всему месту. Я хотел вместо этого реорганизовать его с помощью шаблона штата. Существует три основных состояния.

Я не уверен, что это лучший способ. В настоящее время интерфейс IState имеет метод DoAction(), который выполняет некоторые действия, специфичные для уникального состояния, и метод DrawForm(), который повторно рисует форму на основе текущего состояния... Однако, чтобы сделать DrawForm(), классы состояний должны иметь доступ к переменным-членам формы. Это меня бросило в петлю. Я действительно не хотел их раскрывать.

Есть ли лучший способ сделать это?

  • 2
    Из того, что я знаю о шаблоне состояний, DID требует, чтобы эти конкретные классы состояний имели доступ к «контексту» (форма в вашем случае). Кажется, что доступ к этим переменным-членам неизбежен.
  • 0
    Спасибо, я должен был дать вашему комментарию некоторую любовь, потому что нет ни одного ответа на upvote, lol.
Теги:
design-patterns
refactoring

4 ответа

3
Лучший ответ

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

  • 0
    Ааа, отличный момент. Благодарю.
  • 0
    Это именно то, что мне нужно, чтобы чувствовать себя хорошо, когда я его настраивал. Как-то я совсем забыл про вложенные классы.
1

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

0

Чтобы получить "состояние" формы, вы описываете шаблон, более известный как "модель представления". Вы найдете хорошую информацию и советы о том, как обычно вы хотите, чтобы форма и состояние взаимодействовали, прочитав эту статью Мартина Фаулера. В вашем случае ваша форма - это "Вид", и ваше государство является моделью презентации. Как всегда, Фаулер отлично справляется с этим вопросом и многое другое.

  • 0
    Я посмотрю на это, спасибо.
0

Я не знаю, помогает ли это, но почему бы не иметь что-то вроде шаблона стратегии для рисования формы?

Итак, что-то вроде строк

interface IDrawStrategy
{ 
   void Draw(FormType form);
}

И затем, когда вы выбираете, в каком состоянии находится форма, вы можете назначить стратегию рисования формы. Да, вам все равно нужно предоставить доступ методу draw к переменным Forms, чтобы он мог их расположить, но он по крайней мере позволяет вам упростить добавление разных взглядов на основе состояний.

  • 0
    У меня есть метод DrawForm () для каждого состояния, в котором может находиться форма. Это очень похоже на то, что вы говорите.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню