Wzorzec MVP - gdzie powinna znajdować się logika GUI w Winforms

0

Chciałbym się dowiedzieć gdzie powinna się znajdować logika GUI w Winforms MVP.

Załóżmy, że mam formę odpowiedzialną za wyświetlanie danych pojazdu. Kontrolki na tej formie powinny być wyszarzone lub aktywne, w zależności od typu pojazdu.

Czy poniższy kod jest jest zgodny z ideą MVP?

Widok:

public interface IView
{
        bool TextBox1IsEnabled { get; set; }
        bool TextBox2IsEnabled { get; set; }
        bool CheckBox1IsChecked { get; set; }
		VehicleType VehicleType { get; set; }
}

**
Prezenter:**

public class Presenter
{
        private readonly IView view;

        public Presenter(IView view)
        {
            this.view = view;
        }

        public void ChangeControlVisible()
        {
            switch (view.VehicleType)
            {
                case VehicleType.Car:
                    {
                        this.view.TextBox1IsEnabled = true;
                        this.view.TextBox2IsEnabled = true;
                        this.view.CheckBox1IsChecked = true;
                    };
                    break;
                case VehicleType.Train:
                    {
                        this.view.TextBox1IsEnabled = false;
                        this.view.TextBox2IsEnabled = false;
                        this.view.CheckBox1IsChecked = false;
                    }
                    break;
                case VehicleType.Motobike:
                    {
                        this.view.TextBox1IsEnabled = true;
                        this.view.TextBox2IsEnabled = false;
                        this.view.CheckBox1IsChecked = true;
                    }
                    break;
            }
        }
}

**
Wywołanie na formie:**

private void CheckBoxFormType_CheckedChanged(object sender, EventArgs e)
{
	new Presenter(this).ChangeControlVisible();
}

W podanym przeze mnie przykładzie mogę z łatwością przetestować logikę GUI. Mam natomiast wątpliwości czy widok powinien posiadać takie właściwości jak
TextBox1IsEnabled, czy CheckBox1IsChecked.

Będę bardzo wdzięczny za wyjaśnienie. Szczególnie liczę na opinię @somekind, który wklejał na forum przykładową aplikację implementującą MVP, na której starałem się wzorować. Niestety na podstawie w/w aplikacji nie jestem w stanie jednoznacznie ocenić czy podążam w dobrym kierunku :)

0

Widok powinien zawierać OnXCheckedChanged, do którego może się podłączyć Presenter tworzony w konstruktorze widoku. W każdym miejscu widoku będziesz robił new Presenter(this)?

0

@moneusz: Oczywiście, że nie. Moje wątpliwości dotyczą miejsca trzymania logiki GUI i properties widoku, które określają stan kontrolek.

0

Na subskrypcje tego eventu w presenterze wykonujesz ta metoda ktora masz czyli ChangeControlVisible

2
Sheldon Cooper napisał(a):

Mam natomiast wątpliwości czy widok powinien posiadać takie właściwości jak TextBox1IsEnabled, czy CheckBox1IsChecked.

Chyba nie bardzo, textboxy, checkboxy to szczegóły implementacji, a nazwy textBox1, checkbox1 już w ogóle nic nie mówią, nawet w ramach widoku.
Moim zdaniem widok powinien oferować jakąś bardziej sensowną enkapsulację, np. AllowEditName, ShowSomething.

moneusz napisał(a):

Widok powinien zawierać OnXCheckedChanged, do którego może się podłączyć Presenter tworzony w konstruktorze widoku.

A w czym to lepsze od obsłużenia eventu wewnątrz widoku i wywołania metody Prezentera?

0

Ok, chciałbym się upewnić, że dobrze rozumiem. Dla przykładu, mam LayoutPanel na którym znajdują kontrolki pojazdu. Czyli dla właściwości .Enabled na widoku powinno być coś w stylu AllowEditVehicleGroup?

Jeszcze pytanie odnośnie trzymania logiki GUI w prezenterze. Czy takie rozwiązanie jest ok?

2
Sheldon Cooper napisał(a):

Ok, chciałbym się upewnić, że dobrze rozumiem. Dla przykładu, mam LayoutPanel na którym znajdują kontrolki pojazdu. Czyli dla właściwości .Enabled na widoku powinno być coś w stylu AllowEditVehicleGroup?

No na przykład tak. Niech nazwa opisuje czego to dotyczy z punktu widzenia użytkownika aplikacji, a nie użytych przez programistę kontrolek.

Jeszcze pytanie odnośnie trzymania logiki GUI w prezenterze. Czy takie rozwiązanie jest ok?

No chyba od tego jest prezenter, żeby była w nim logika prezentacji. :)

1
somekind napisał(a):
Sheldon Cooper napisał(a):

Mam natomiast wątpliwości czy widok powinien posiadać takie właściwości jak TextBox1IsEnabled, czy CheckBox1IsChecked.

Chyba nie bardzo, textboxy, checkboxy to szczegóły implementacji, a nazwy textBox1, checkbox1 już w ogóle nic nie mówią, nawet w ramach widoku.
Moim zdaniem widok powinien oferować jakąś bardziej sensowną enkapsulację, np. AllowEditName, ShowSomething.

moneusz napisał(a):

Widok powinien zawierać OnXCheckedChanged, do którego może się podłączyć Presenter tworzony w konstruktorze widoku.

A w czym to lepsze od obsłużenia eventu wewnątrz widoku i wywołania metody Prezentera?

@somekind w tej konkretnej sytuacji ciężko mi odpowiedzieć na pytanie z czym jest lepsze, ale jeśli już implementujemy MVP to wydaje mi się, że to Presenter powinien wykonywać logikę prezentacji a widok w zasadzie nie powinien wiedzieć o istnieniu presentera..

1

Oczywiście masz rację.

1 użytkowników online, w tym zalogowanych: 0, gości: 1