MVP的模型属于表示层还是领域层?

 收藏

I understand the MVP. However i do not understand model belongs to presentation layer or domain layer. It is said in some resources, mvp only models the presentation layer, in other words model is in presentation layer. https://antonioleiva.com/mvp-android/

However, in other resources https://proandroiddev.com/clean-architecture-data-flow-dependency-rule-615ffdd79e29 , model belongs to domain layer. Which one is correct? Thanks in advance.

回复
  • 雅典娜 回复

    You can have different types of models. You can have a DomainModel, a PresentationModel an ApplicationModel etc.

    如果需要,可以在MVP应用程序中使用各种模型。例如,如果您的复杂应用程序具有需要相互通信的多个Presenter,则添加一个具有特定于应用程序的数据和行为的模型来添加附加的ApplicationModel来简化这些通信可能会很有用。如果没有,则可以使用纯DomainModel。

    In this article, Martin Fowler says:

    监督控制器将演示功能分解为两个   部件:控制器(通常称为演示者)和视图。域数据   需要显示的内容是单独的,并遵循大致的MVC   术语我将其称为模型,尽管它不一定是   域模型。

    这是一个棘手的问题,但是基本的区别是,纯DomainModel通常会建模某些域(数学,银行等),并且没有任何表示或应用程序特定的数据和/或行为。您可以在应用程序中混合使用不同类型的模型。

    If your application has some complex logic, say that when one thing is selected another thing need to be deselected. you can capture this in a specific Model let's say ApplicationState that is not a 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();
        }
    }
    

    Here is a good article on GUI architectures.