|
|
|
Использование паттерна Observer
|
|||
|---|---|---|---|
|
#18+
Разрабатываю приложение с GUI интерфейсом. Хочется спроектировать ее классы максимально независимыми друг от друга. Типичная ситуация - при нажатии на кнопку идет вызов некого метода, который может завершиться как успешно, так и неуспешно (у пользователя нет прав выполнять операцию, произошла системная ошибка, и пр.) Интуитивно понимаю, что код, отвечающий за показ сообщения об ошибке, нельзя размещать прямо в этом же методе. Напрашивается выход - вернуть из метода код ошибки, которых может быть несколько (и со временем могут появляться новые). Также обработать эту ошибку могут хотеть не только интерфейс (показать сообщение для пользователя), но и другие объекты, например компонент логирования. Почитал про используемые практики, и так понял, что в данном случае используют паттерн Observer, т.е. мой объект будет говорить всем обозревателям, что "произошло некое событие". Если так, то где лучше разместить обращение ко всем "обозревателям" 1) в коде метода, непосредственно при возникновении ситуации 2) в коде, который вызывает этот метод В 1-м случае у объекта все равно остается связть с общей системой (он должен знать об обозревателях) Во 2-м код, который вызывается метод, будет сопровождаться обязательной обработкой результата метода, что тоже не совсем правильно. Посоветуйте как быть и что ещё стоит почитать про правильное проектирование с практическими примерами. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.11.2009, 00:41:16 |
|
||
|
Использование паттерна Observer
|
|||
|---|---|---|---|
|
#18+
hddart wrote: > Почитал про используемые практики, и так понял, что в данном случае > используют паттерн Observer, т.е. мой объект будет говорить всем > обозревателям, что "произошло некое событие". Subject/Observer не связаны с обработкой событий и ошибок. Т.е. это не то что вам надо. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.11.2009, 01:29:50 |
|
||
|
Использование паттерна Observer
|
|||
|---|---|---|---|
|
#18+
Как правило гуйные библиотеки позволяют сделать централизованную обработку исключений, "ушедших" из метода окна (WndProc и т. п.). Попробуйте в ошибочных ситуациях генерировать исключения и централизовать "там" их обработку. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.11.2009, 08:25:02 |
|
||
|
Использование паттерна Observer
|
|||
|---|---|---|---|
|
#18+
MasterZiv, в каких случаях тогда используется Observer? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.11.2009, 09:59:14 |
|
||
|
Использование паттерна Observer
|
|||
|---|---|---|---|
|
#18+
hddart wrote: > MasterZiv, в каких случаях тогда используется Observer? Ну, ты можешь прочитать про это в GoF. В основном это реализация мега-паттерна MVC или вариаций на его тему. Реализация GUI для редактирования сложных документов. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.11.2009, 12:16:20 |
|
||
|
Использование паттерна Observer
|
|||
|---|---|---|---|
|
#18+
Ок, спасибо. Если развить мой вопрос, то каков будет "правильный" подход (без привязки к технологиям, будь то клиентское или веб приложение, думаю разницы быть не должно). В 1-м случае будет: user->getList(); // метод getList может завершиться удачно, а может и не выполниться по разным причинам (нет прав выполнять действие, ошибка подключения к БД, .... ) И если произошла какая-то ошибка, то код обработчик этих ошибок будет заключен в самом же методе. 2-й случай будет выглядеть так: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. В этом случае придется каждый вызов метода сопровождать рядом try / catch / if / switch с обработкой ошибок. И тот и другой подход имеют недостатки: 1-й создаст ненужные связи с другими классами 2-й обяжет каждый раз при вызове городить разные проверки с практически одинаковыми обработками, что создаст дублирование кода Хочется знать где я неправ, и как пишут приложения взрослые люди :) Модератор: кнопку src не плохо бы иногда нажимать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.11.2009, 22:30:46 |
|
||
|
Использование паттерна Observer
|
|||
|---|---|---|---|
|
#18+
hddartВ этом случае придется каждый вызов метода сопровождать рядом try / catch / if / switch с обработкой ошибок.Зачем задавать в форуме вопросы и не читать ответы? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.11.2009, 08:33:49 |
|
||
|
Использование паттерна Observer
|
|||
|---|---|---|---|
|
#18+
Я прочитал все сообщения. Ожидал более развернутых ответов, т.к. тема для меня новая, и когда смотришь на псевдо-код, становится более понятно. От себя я его привел, это было как приглашение к разговору, в ответ надеялся увидеть что-то похожее. Хочется на конкретном примере посмотреть, как строят код опытные люди. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.11.2009, 00:14:24 |
|
||
|
Использование паттерна Observer
|
|||
|---|---|---|---|
|
#18+
Выводите исключения на самый верх, в гуевый слой. Там и обрабатывайте(сообщайте пользователю, логируйте) reusable код подавлять исключения не должен. Главное - хорошо документируйте возможные ошибки. Особо тут и код никакой писать нет смысла - все и так вроде понятно. Обсервер тут действительно ни при чем. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.11.2009, 02:01:20 |
|
||
|
|

start [/forum/topic.php?fid=16&fpage=113&tid=1344079]: |
0ms |
get settings: |
9ms |
get forum list: |
20ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
48ms |
get topic data: |
14ms |
get forum data: |
3ms |
get page messages: |
59ms |
get tp. blocked users: |
2ms |
| others: | 220ms |
| total: | 383ms |

| 0 / 0 |
