2015-04-26 3 views
0

Я хотел бы получить ваше мнение о следующем использовании, которое я нахожу в приложении OO в C++, и считаете ли вы его правильным или плохим. Мы используем шаблон наблюдения для imeplement Model-View-контроллер следующим образом:Шаблон наблюдателя - состояние гонки

(Subject) (notify) (Listeners) 
controller ---> DB 
       ---> Viewer 

Правильно ли рассчитывать на то, что БД Registed первым в контроллер (до просмотра) и, следовательно, будет обновляться до просмотра. Это важно, потому что, когда Viewer получает уведомление, он считывает информацию из БД (потому что он предполагает, что БД уже обновлена).

EDIT: Контроллер и просмотр - это потоки, а DB нет. контроллер всегда уведомляет БД сначала и только затем уведомляет Viewer. Приложение работает правильно. Я просто подумал, что регистрация БД перед зрителем является чем-то уродливым и хотела твое мнение.

Спасибо,

Ран

ответ

1

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

Анализ ситуации: Учитывая, что обновление базы данных может завершиться неудачно, ваше представление может делать обновления, которые не нужны. В случае, если у вас есть распределенное приложение, это может привести к серьезным проблемам с производительностью.

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

Решение: Поместите крючок на что-то вроде CommitFinished на ваш слой доступа к базе данных для обновления вида.

Так более надежный способ сделать это:

1) Изменить => контроллер => DB

2) DB совершают законченный (некоторые DataChanged крюк будет делать) => контроллер => Просмотр

+0

Привет, Спасибо, я отредактировал вопрос. На самом деле нет сбоев, просто я подумал, что это, может быть, не «приятно» из-за требования, которое БД должно зарегистрировать до просмотра. – ransh

+0

Я думаю, что ты прав. Этот неявный порядок исполнения (данный только по порядку регистрации) является «уродливым». Это может привести к ошибкам и приведет к ошибкам. Если не сейчас, то в какое-то время, когда другой разработчик получает ваш код и должен делать изменения. Сделайте его явным и, следовательно, пусть представление будет сообщено после изменения базы данных. Не из-за регистрационного заказа, а из-за какого-то события, вызванного изменением базы данных. –

+0

Спасибо за предложение! – ransh