2009-07-27 6 views
2

Я хочу реорганизовать некоторый код.Рефакторинг формы государственного образца?

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

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

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

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

+2

Из того, что я знаю о шаблоне состояния, DID требует, чтобы эти конкретные классы состояний имели доступ к «контексту» (форма в вашем случае). Похоже, что доступ к этим переменным-членам неизбежно. – xandy

+0

Спасибо, я должен был дать вашему комментарию некоторую любовь, потому что нет ни одного ответа, чтобы поддержать, lol. –

ответ

3

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

+0

Ahhh, замечательная точка. Благодарю. –

+0

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

0

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

Так что-то вдоль линий

interface IDrawStrategy 
{ 
    void Draw(FormType form); 
} 

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

+0

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

0

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

+0

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

1

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

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