c ++ Presenter Tampilan Model: Di mana membangun presenter?

8

Saya menggunakan pola Model View Presenter (MVP) seperti yang dijelaskan dalam kertas The Humble Dialog Box (pdf) dengan proyek MFC. Saya yakin masalahnya sama dengan sebagian besar toolkit GUI.

Hal yang mengganggu saya adalah pandangan konkret (yaitu, kelas dialog) menciptakan tidak hanya presenter tetapi juga layanan yang dibutuhkan presenter. Apakah itu normal? Mengapa pandangan perlu mengetahui layanan apa yang dibutuhkan presenter? Yang saya pikirkan adalah saya harus ketergantungan menyuntikkan presenter ke dalam kelas dialog.

Kontrol utama untuk aplikasi adalah kelas yang berasal dari CWinApp. Jadi haruskah saya membuat layanan dan presenter di kelas ini dan kemudian menyuntikkannya ke dalam kelas dialog?

Meskipun bagaimana saya ketergantungan akan menyuntikkan presenter ke dalam kelas dialog ketika presenter membutuhkan referensi ke kelas tampilan di konstruktor itu?

MyPresenter(IView *view, MyService *service);

Juga bagaimana jika jendela utama memunculkan jendela popup, di mana detail untuk presenter dan layanan windows itu dibangun?

Karena ini adalah C ++ saya tidak berpikir saya akan tertarik pada segala jenis kerangka kerja DI.

MEMPERBARUI

Satu ide yang saya miliki adalah untuk membangun presenter dengan tampilan nol, konstruktor menyuntikkan presenter ke dalam kelas dialog, dan kemudian dalam konstruktor kelas dialog memanggil SetView(IView *view)metode pada presenter dengan di thismana thisakan menjadi kelas dialog (yang berasal dari IView ). Begitu:

MyApp::Start()
{
  SomeService *service = new SomeService();
  MyPresenter *presenter = new MyPresenter(null, service);
  MyDialog *dialog = new MyDialog(presenter);
  ...
}

MyDialog::MyDialog(MyPresenter *presenter):
 presenter_(presenter)
{
  presenter_->SetView(this);
}

Tampaknya sedikit kotor tetapi membuat konstruksi layanan keluar dari kelas Dialog. Tampilan nol sepertinya sedikit berbahaya. Alternatifnya adalah dengan benar-benar membangun kelas NullView yang memiliki tubuh metode kosong dan kemudian meneruskannya ke konstruktor presenter.

Pengguna
sumber

Jawaban:

1

Mungkin solusi yang lebih baik adalah menggunakan kelas atau metode pabrik yang tahu cara membangun presenter? Pandangan akan beralih sendiri ke metode pabrik dan menyimpan nilai kembali di anggota presenter itu.

Ini memisahkan informasi tentang bagaimana presenter dibangun (ketergantungan pada layanan atau apa pun) dari pandangan itu sendiri.

Jørn Jensen
sumber
0

Saya pikir ide awal Anda (membangun presenter dan layanan di dalam tampilan) tidak ada salahnya. Kita harus bertanya pada diri sendiri manfaat dari suntikan dan saya tidak melihat.

Dengan memisahkan tampilan aktual menjadi tampilan abstrak dan presenter, Anda telah mencapai pemisahan kekhawatiran. Dan Anda bisa mendapatkan manfaat dari pencapaian tersebut, misalnya, dengan menguji presenter dengan tampilan penuh atau mengejek. Jadi mengapa Anda ingin menyuntikkan presenter ke tampilan nyata? Saya tidak melihat adanya keharusan.

Tae-Sung Shin
sumber