Принадлежит ли модель MVP уровню представления или уровню домена? - PullRequest
0 голосов
/ 18 мая 2019

Я понимаю MVP. Однако я не понимаю, модель относится к уровню представления или уровня домена. В некоторых ресурсах говорится, что mvp моделирует только уровень представления, другими словами, модель находится на уровне представления. https://antonioleiva.com/mvp-android/

Однако в других ресурсах https://proandroiddev.com/clean-architecture-data-flow-dependency-rule-615ffdd79e29 модель относится к доменному слою. Который правильный? Заранее спасибо.

1 Ответ

0 голосов
/ 19 мая 2019

Вы можете иметь разные типы моделей. Вы можете иметь DomainModel , PresentationModel ApplicationModel и т. Д.

Вы можете использовать каждый тип модели в приложении MVP, если вам нужно. например, если у вас есть сложное приложение с несколькими докладчиками , которым необходимо взаимодействовать друг с другом, может быть полезно добавить дополнительные ApplicationModel чтобы упростить эту связь, добавив Модель , которая имеет Данные и поведение, специфичные для приложения . Если у вас его нет, вы можете просто использовать DomainModel .

В этой статье Мартин Фаулер говорит:

Контролирующий контроллер разделяет функциональность представления на две части. части: контроллер (часто называемый ведущим) и вид. Данные домена что нужно отображать отдельно, а следуя грубому MVC Терминология я буду ссылаться на него как на модель, хотя это не должно быть Модель предметной области.

Это сложный вопрос, но основное отличие состоит в том, что чистый DomainModel обычно моделирует некоторый домен (математика, банковское дело и т. Д.) И не имеет данных представления или приложения и / или поведение. Вы можете смешивать различные типы моделей в вашем приложении.

Если ваше приложение имеет некоторую сложную логику, скажите, что, когда одна вещь выбрана, другую вещь нужно отменить. Вы можете захватить это в конкретной модели, скажем, ApplicationState, которая не является DomainModel .

Вот пример. Допустим, у нас есть приложение, которое имеет Ключевые слова и Теги и отображает их для пользователя. Пользователь может выбрать только ключевое слово или тег . Он не может выбрать оба одновременно. Вот способ сделать это с помощью модели, которая фиксирует специфическую логику этого приложения, которая не является частью нашего домена . Мы используем паттерн наблюдателя здесь. Когда это Модель изменяется, мы инициируем события.

class ApplicationSate : Subject {

    private Tag mSelectedTag;
    private Keyword mSelectedKeyword;

    public Tag getSelectedTag() { return mSelectedTag;  }
    public Keyword getSelectedKeyword() { return mSelectedKeyword; }

    public Tag HasSelectedTag() { return mSelectedTag != null; }
    public Tag HasSelectedKeyword() { return mSelectedKeyword != null; }

    public void selectKeyword(Keyword keyword) {

        if(hasSelectedTag()) {
            mSelectedTag = null;
        }

        mSelectedKeyword = keyword;
        raiseChangedEvent();
    }

    public void selectTag(Tag tag) {

        if(hasSelectedKeyword()){
            mSelectedKeyword = null;
        }

        mSelectedTag = tag;
        raiseChangedEvent();
    }
}

Вот хорошая статья об архитектурах GUI.

...