2013-04-19 2 views
1
  • 윈도우 7 SP1
  • MSVS 단일 스레드 응용 프로그램을 작성하는 2010
  • MongoDB를 2.2.0
  • Qt는 4.8.4

. 나는 항상 DBClientConnection을 MongoDB에 대한 액세스가 필요한 모든 함수에 대한 참조 인수로 전달합니다. 대신 인수를 전달할 필요가 없도록 전역 변수를 사용할 수 있습니까?DBClientConnection을 전역 변수로 사용할 수 있습니까?

이것은 Qt의 QKeyEvent를 사용할 때 나타납니다. 나는 MongoDB의 함수를 호출 할

void QWidget::keyPressEvent (QKeyEvent * event) 

하는 기능에서하지만 난 keyPressEvent 내 DBClientConnection에 액세스 할 수 없습니다 :

void keyPressEvent(QKeyEvent * key_event); 

재 구현이이 프로토 타입으로 구현된다. 따라서 왜 나는 DBClientConnection을 글로벌하게 만드는 것을 고려하고 있는가?

답변

1

권장되는 솔루션은 데이터베이스 개체의 추상화입니다.

Here is an explanation of the concept in C#

그러나 단순히 C++ 한마디에 넣어은, 목표는 인터페이스를 정의하는 것이다. 그게 다야. IDatabase 또는 IRepository. 당신이 제안으로

그것은 글로벌 값의 어느 정도 역할을 가지고 있지만, 당신은 Factory에 숨길 것, 또는 DependencyInjection 메커니즘 ... 또는 Singleton 같은 글로벌 값은 당신이 정말로 원하는 경우.

하지만 연결 stuffs를 구현하고이 포인터로 신경 써야하는 실제 mongoDb를 가리키는 것은 콘크리트 class MyMongoDatabase입니다. 나머지 신청서는 아닙니다. 무엇보다도 QWidget :: keyPressEvent와 같은 GUI 안에 있다면 데이터베이스에 액세스하려고합니다. 로직/비즈니스 코드에서

class MyMongoDatabase : public IDatabase 
{ 
    private: 
     void connect(); 
     void disconnect(); 

    public: 
     std::vector<Something> query_something(int param); 
     void insert(AnOtherThing& thing); 
     //.... other crud operations 
}; 

, 당신은 단지 수 :

IDatabase& database = getDatabase(); 
std::vector<Something> somethings = database.query_something(); 

그리고 IDatabase 쿼리, 삽입 및 기타 CRUD 작업에있는 모든 기능을 노출한다. 뒤에 아이디어는 '느슨한 커플 링'이라고합니다.

코딩 가치가 있는지 살펴보십시오. 그것은 당신이 당신의 신청서에서 그런 일을하는 횟수에 달려 있습니다. 일반적으로 데이터베이스만큼 큰 것을 위해, 그것은 정말로 좋은 생각입니다.

+0

귀하의 통찰력에 감사드립니다. –

관련 문제