Презентаторы и Контроллеры в "Чистой архитектуре"
От: es3000  
Дата: 21.03.19 13:02
Оценка:
Добрый день!

Читаю книгу: Роберт Мартин. Чистая архитектура.
Также прочитал несколько статей в интернете.

Суть понятна — сделать внутренние слои независимыми от внешних.

Однако, не до конца понятны отношения между классами.
Понятны отношения "видимости": кто к кому обращается — понятно.

А вот отношения "владения" не понятны.
Например, вот картинка про Презентаторов и Контроллеров:



Кто тут кем "владеет"? Кто кого создает?
Кокой объект "держит" ссылки и каких других объектов?

Допустим, есть простое десктопное приложение типа "Hello world".
Только немного усложним.
Это приложение при запуске должно на главном окне написать либо "good morning!" либо "good afternoon!" либо "good evening!" в зависимости от времени запуска программы.
И обновить этот текст при нажатии на кнопку.

Как я понимаю, логика формирования строки должна быть в Контроллере.
Презентатор — передает эту строку в форму (представление), и форма отображает эту строку.

Вопрос: кто кого создает? и кто кем владеет?

void Main ()
{
    FormView view = new FormView();
    Presenter presenter = new Presenter(view);
    Application.Run(view);
}


public class FormView : Form, IView
{
    private TextBox _GoodTextBox;

    public FormView()
    {
    }

    public void SetText (string GoodText)
    {
        _GoodTextBox.Text = GoodText; 
    }

    public event EventHandler<EventArgs> ButtonClicked;

    private void _Button_Click(object sender, EventArgs e)
    {
        ButtonClicked(this, EventArgs.Empty);
    }
}

public class Presenter
{
    private GoodController _Controller = new GoodController();
    private IView _view;

    public Presenter(IView view)
    {
        _view = view;
        _view.ButtonClicked += new EventHandler<EventArgs>(OnButtonClick);

        _Controller.CalcGoodText();
        RefreshView();
    }

    private void OnButtonClick(object sender, EventArgs e)
    {
        _Controller.CalcGoodText();
        RefreshView();
    }

    private void RefreshView()
    {
        _view.SetText(_Controller.GoodText);
    }
}

public class Controller
{
    private String _GoodText;

    public void CalcGoodText()
    {
        if (CurrentTime() < 12-00) then
        {
            _GoodText = "good morning!";
        }
        else if (CurrentTime() >= 12-00) and (CurrentTime() < 18-00) then
        {
            _GoodText = "good afternoon!";
        }
        else
        {
            _GoodText = "good evening!";
        }
    }

    public GoodText
    {
         return _GoodText;
    }
}


Тут получается, что main "держит" ссылку на Презентатора и Форму.
Презентатор держит ссылки на форму и Контроллер.

Правильно ли будет так сделать?
Отредактировано 21.03.2019 13:06 es3000 . Предыдущая версия . Еще …
Отредактировано 21.03.2019 13:04 es3000 . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.