powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Использование паттерна Observer
9 сообщений из 9, страница 1 из 1
Использование паттерна Observer
    #36302673
hddart
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Разрабатываю приложение с GUI интерфейсом. Хочется спроектировать ее классы максимально независимыми друг от друга. Типичная ситуация - при нажатии на кнопку идет вызов некого метода, который может завершиться как успешно, так и неуспешно (у пользователя нет прав выполнять операцию, произошла системная ошибка, и пр.)

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

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

Почитал про используемые практики, и так понял, что в данном случае используют паттерн Observer, т.е. мой объект будет говорить всем обозревателям, что "произошло некое событие".

Если так, то где лучше разместить обращение ко всем "обозревателям"
1) в коде метода, непосредственно при возникновении ситуации
2) в коде, который вызывает этот метод

В 1-м случае у объекта все равно остается связть с общей системой (он должен знать об обозревателях)
Во 2-м код, который вызывается метод, будет сопровождаться обязательной обработкой результата метода, что тоже не совсем правильно.

Посоветуйте как быть и что ещё стоит почитать про правильное проектирование с практическими примерами.
...
Рейтинг: 0 / 0
Использование паттерна Observer
    #36302732
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hddart wrote:

> Почитал про используемые практики, и так понял, что в данном случае
> используют паттерн Observer, т.е. мой объект будет говорить всем
> обозревателям, что "произошло некое событие".

Subject/Observer не связаны с обработкой событий и ошибок.

Т.е. это не то что вам надо.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Использование паттерна Observer
    #36302868
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как правило гуйные библиотеки позволяют сделать централизованную обработку исключений, "ушедших" из метода окна (WndProc и т. п.). Попробуйте в ошибочных ситуациях генерировать исключения и централизовать "там" их обработку.
...
Рейтинг: 0 / 0
Использование паттерна Observer
    #36303019
hddart
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MasterZiv, в каких случаях тогда используется Observer?
...
Рейтинг: 0 / 0
Использование паттерна Observer
    #36303490
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hddart wrote:

> MasterZiv, в каких случаях тогда используется Observer?

Ну, ты можешь прочитать про это в GoF.

В основном это реализация мега-паттерна MVC
или вариаций на его тему. Реализация GUI для
редактирования сложных документов.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Использование паттерна Observer
    #36305321
hddart
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ок, спасибо.
Если развить мой вопрос, то каков будет "правильный" подход (без привязки к технологиям, будь то клиентское или веб приложение, думаю разницы быть не должно).

В 1-м случае будет:
user->getList(); // метод getList может завершиться удачно, а может и не выполниться по разным причинам (нет прав выполнять действие, ошибка подключения к БД, .... )

И если произошла какая-то ошибка, то код обработчик этих ошибок будет заключен в самом же методе.

2-й случай будет выглядеть так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
try {
    user->getList();
} catch (Exception1) {
    // Если нет прав, то покажем сообщение
} catch (Exception2) {
    // Если ошибка в процессе выполнения, то покажем сообщение
    // Также запишем в лог
} catch (...) {
    // ...
}

В этом случае придется каждый вызов метода сопровождать рядом try / catch / if / switch с обработкой ошибок.

И тот и другой подход имеют недостатки:
1-й создаст ненужные связи с другими классами
2-й обяжет каждый раз при вызове городить разные проверки с практически одинаковыми обработками, что создаст дублирование кода

Хочется знать где я неправ, и как пишут приложения взрослые люди :)
Модератор:
кнопку src не плохо бы иногда нажимать.
...
Рейтинг: 0 / 0
Использование паттерна Observer
    #36305682
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hddartВ этом случае придется каждый вызов метода сопровождать рядом try / catch / if / switch с обработкой ошибок.Зачем задавать в форуме вопросы и не читать ответы?
...
Рейтинг: 0 / 0
Использование паттерна Observer
    #36324906
hddart
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я прочитал все сообщения. Ожидал более развернутых ответов, т.к. тема для меня новая, и когда смотришь на псевдо-код, становится более понятно. От себя я его привел, это было как приглашение к разговору, в ответ надеялся увидеть что-то похожее. Хочется на конкретном примере посмотреть, как строят код опытные люди.
...
Рейтинг: 0 / 0
Использование паттерна Observer
    #36324950
чур меня...
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Выводите исключения на самый верх, в гуевый слой. Там и обрабатывайте(сообщайте пользователю, логируйте)
reusable код подавлять исключения не должен. Главное - хорошо документируйте возможные ошибки.
Особо тут и код никакой писать нет смысла - все и так вроде понятно.
Обсервер тут действительно ни при чем.
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Использование паттерна Observer
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]