Листинг 5.2. Неявное изменение состояний приложения (неудачный подход)
//Код, выполняющийся при загрузке формы
private void Form1_Load(object sender, System.EventArgs e) {
textBox1.Visible = true;
listBox1.Visible = false;
}
string m_someImportantInfo;
//Пользователь щелкнул на кнопке, желая перейти к выполнению
//следующего шага, предусмотренного в данном приложении. Скрыть
//текстовое окно и отобразить окно списка в отведенном для этого месте
private void button1_Click(object sender, System.EventArgs e) {
m_someImportantInfo = textBox1.Text;
textBox1.Visible = false;
listBox1.Visible = true;
}
Подход 2: плановое, централизованное, явное управление состояниями (удачный подход)
Явное управление состояниями — прямая противоположность предыдущему подходу. В этом случае любые переходы между состояния реализуются в рамках одной главной функции. В коде обработчика событий, ответственном за изменение некоторого аспекта состояния приложения, это обеспечивается вызовом единственной функции, которая также вызывается любым другим кодом, предназначенным для изменения состояния приложения в соответствии с логикой приложения. Пример реализации такого подхода представлен в листинге 5.3.
Листинг 5.3. Явное изменение состояний приложения (удачный подход)
string m_someImportantInfo;
//Определить состояния, в которых может находиться приложение
enum MyStates {
step1, step2
}
//Главная функция, которая вызывается
//всякий раз, когда возникает необходимость
//в изменении состояния приложения
void ChangeApplicationState(MyStates newState) {
switch (newState) {
case MyStates.step1:
textBox1.Visible = true;
listBox1.Visible = false;
break;
case MyStates.step2:
m_someImportantInfo = textBox1.Text;
textBox1.Visible = false;
listBox1.Visible = true;
break;
}
}
//Пользователь щелкнул на кнопке, желая перейти к выполнению
//следующего шага, предусмотренного в данном приложении. Скрыть
//текстовое окно и отобразить окно списка в отведенном для этого месте
private void button1_Click(object sender, System.EventArgs e) {
//Вызвать главную функцию, осуществляющую изменение состояния
ChangeApplicationState(MyStates.step2);
}
//Код, выполняющийся при загрузке формы
private void Form1_Load(object sender, System.EventArgs e) {
//Вызвать главную функцию, осуществляющую изменение состояния
ChangeApplicationState(MyStates.step1);
}
В приведенном выше коде решаются те же задачи, что и в предыдущем примере, но при этом последовательно используется инкапсуляция. Вместо того чтобы непосредственно изменять состояние интерфейса, коды обработки событий каждого из элементов пользовательского интерфейса вызывают главную функцию управления состояниями, которая и выполняет всю необходимую работу. Этот процесс легко масштабируется при расширении или изменении приложения. Необходимые изменения любых аспектов функционирования приложения обеспечиваются за счет использования единственной главной функции. По мере возникновения потребности в дополнительных элементах управления или состояниях приложения, они могут без труда включаться в нашу программную модель централизованным способом
Постойте-ка! Но ведь речь идет о мобильных приложениях. Разве размер их кода не должен быть меньше размера кода настольных приложений?
Краткий ответ на этот вопрос звучит так: "Нет, не должен". Ваш код вовсе не должен быть меньше по размеру, чем аналогичный код для настольных компьютеров — он должен быть лучше! Среди разработчиков мобильных приложений бытует ошибочная точка зрения, согласно которой при написании кода лучше не разбивать его на отдельные функции, а стараться поместить в любую заданную функцию как можно больше кода и как можно чаще использовать встроенный код. Такой подход противоречит устоявшимся принципам проектирования. Назовем эту тенденцию "оптимизацией под микроскопом".
Оптимизация более высокого порядка реализуются не на микроскопическом уровне, а на макроуровне. Проекты, в которых широко используется инкапсуляция, предоставляют гораздо больше возможностей для макрооптимизации. Имея единственный набор функций, предназначенных для управления приложением, вам будет легче работать со структурой приложения и тем самым оптимизировать ее. Чтобы обеспечить высокую производительность приложения, вам придется возвращаться к уже пройденным стадиям проекта, анализировать их и при необходимости изменять первоначальные предпосылки, которые, как выяснилось впоследствии, оказались неверными. В этом отношении централизованный подход к управлению состояниями приложения принесет вам гораздо больше пользы, чем распределенный специализированный подход.
Читать дальше