GUI를 만들 때 논리와 뷰를 분리하는 문제와 관련하여 게시 할 질문이 많습니다.
다음은 "험블 대화 상자"접근 방식을 사용하는 레이블과 버튼이있는 간단한 대화 상자에 대해 수행 할 작업의 최소 예입니다. 버튼을 누르면 레이블에 텍스트가 표시됩니다. 저는 C++을 사용하는데 Qt는 편하게 사용하지만 다른 모든 사람들은 읽을 수 있다고 생각합니다.
어쨌든 나는 언어의 선택 때문에 가능한 부작용에 관심이있다 (나는 이것을 도입하는데 관심이있는 프로젝트에서 C++을 사용하고있다)."겸허 한 대화"에 대한보기를 만드는 방법
class IView {
public:
IView(){}
virtual ~IView(){}
virtual void showResult(const QString &text)=0;
};
class Presenter {
public:
Presenter(IView *view){
m_View = view;
}
~Presenter(){}
void buttonPressed(){
QString text;
// Evaluate text
m_View->showResult(text);
}
private:
IView *m_View;
}
// Multiple inheritance. Is this OK?
class MyView : public QDialog, public IView {
public:
MyView(){
m_Presenter = new Presenter(this);
m_Button = new QPushbutton(this);
m_Label = new QLabel(this);
// Ui event handled inside view but then directly
// propagated to the Presenter
connect(m_Button,SIGNAL(clicked()),this,SLOT(buttonPressed()));
}
~MyView(){
delete m_Presenter;
// Qt will automatically delete m_Button and m_Label;
}
void showResult(const QString &text){
m_Label->setText(text);
}
protected slots:
void buttonPressed(){
m_Presenter->buttonPressed();
}
private:
Presenter *m_Presenter;
QPushbutton *m_Button;
QLabel *m_Label;
}
class TestView : public IView {
public:
TestView(){}
~TestView(){}
void showResult(const QString &text){
m_LabelText = text;
}
QString getResult(){
return m_LabelText;
}
private:
QString m_LabelText;
}
// Test code
TestView view;
Presenter presenter(&view);
presenter.buttonPressed();
EXPECT_EQ(view.getResult(),"Expected Result");
// Procuction code
MyView view;
view.show();
이제는 initial work on the Humble dialog by Feathers을 따라갔습니다. Fowler's implentation에서 얻을 수있는 접근 방법은 MyView 생성자에서 Presenter 클래스의 인스턴스를 만드는 것을 피하고 대신 프로덕션 코드가 테스트 코드처럼 보이도록 매개 변수로 전달하는 것입니다. 나는 개인적으로 내가 여기 제시 한 접근 방식을 좋아한다.
그래서,
- 는 다중 상속 (MYVIEW 클래스 내 댓글 참조)와 함께 사용하기위한 것입니까?
- 이벤트를 발표자에게 직접 전달해야합니까? (발표자를 QObject로 만들어서 UI 이벤트를 처리 할 필요가 없도록하기 위해 여기에서 수행 한 것처럼) 각각의 발표자 동작을 호출하는보기에서 이벤트를 처리해야합니까?
- 다른 의견이 있으십니까?
QString은 유니 코드를 지원합니다. 문자열에 실제로 유니 코드 문자가없는 한 변환에 대해 지불하는 것은 약간의 성능입니다. –