Структура единого документа - PullRequest
0 голосов
/ 11 мая 2009

Ранее я спрашивал о правильном способе доступа к переменным-членам, присутствующим в проекте. В проекте у меня есть производный от CWinapp класс, класс CMainFrm, список различных классов представлений. Однако в настоящее время у меня есть экземпляры различных пользовательских классов, созданных в классе, производном от CWinApp, тогда как остальные классы используют указатель, полученный из функции AfxGetApp (), и затем получают доступ к различным пользовательским классам. Некоторые члены сообщества из группы новостей MFC сказали мне, что это очень плохой дизайн (то есть родитель не должен ничего знать о классе приложения, классе представления или классе документа). Однако я не уверен, как иначе я могу получить доступ к различным пользовательским классам, не используя этот дизайн. Было бы здорово услышать некоторые предложения, так как я недостаточно знаком с MFC, чтобы найти правильные условия поиска.

1 Ответ

0 голосов
/ 12 мая 2009

"(т.е. родитель не должен ничего знать о классе приложения, классе представления или классе документа)"

Я не уверен, что понимаю это предложение, что вы имеете в виду под словом «родитель» здесь?

В любом случае, по моему мнению, дизайн, который вы описываете, на самом деле не является проблемой. Это компромисс: передаете ли вы эти классы всем функциям, которые в них нуждаются, усложняя их использование и API, или же вы храните их в виде глобальных переменных, как вы делаете? Это зависит от данных, к которым осуществляется доступ, и как часто. Данные, которые нужны во многих местах, также могут быть «глобальными».

Есть несколько способов сделать данные «глобальными»: сделать их членом CWinApp (то есть, вашего производного от CWinApp класса), или CMainFrame, или вы делаете фактическую «глобальную переменную», или вы делаете синглтон, ...

Проблема с глобальными переменными состоит в том, что становится трудно определить, кто и когда получает к нему доступ. Если вы данные как член CWinApp, вы можете получить к нему доступ через функцию доступа и отследить доступ оттуда (через сообщения журнала, точку останова, ...). Это, на мой взгляд, уменьшает большинство проблем, связанных с глобальными переменными. В настоящее время я обычно использую синглтон Loki.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...