美文网首页Android实用技术
2019日更挑战(十一),Android-聊聊MVP

2019日更挑战(十一),Android-聊聊MVP

作者: Jlanglang | 来源:发表于2019-01-11 21:26 被阅读27次

瞎扯

既然说到了MVVM,就再说说MVP.
已经是老生常谈了.
MVP的文章我写了有7 8篇了吧
从2016年使用以来.写法一变再变,不得不说.国内真的没什么技术交流环境.
同样的文章,同样的内容,复制再复制.盗来盗去.
有心得的文章太少了

说说MVP最开始的样子

public class Contract {
    public interface View{
    }

    public interface Presenter{
    }

    public interface Model {
    }
}

然后
activity实现View.
PresenterImpl实现Presenter
ModelImpl实现Model

这么写好吗?

不好,非常不好.

哪里不好?

乍得的一看,接口隔离,接口分明.多厉害,多有设计感.
实际,垃圾的一比

随便一个,增加一个方法.首先改契约类,然后需要实现.
工作量*2

删,改

同增一样,不过多了把之前有引用的地方也删了这一步.

想看源码,先看到的永远是这个契约类,然后再看实现.

随便改动一个地方,要改3个类,你跟我说这设计好?

想想也是醉了.不写接口,直接写pubic方法不行吗?

无人质疑的问题

不知什么原因,从第一篇MVP文章出来后,几乎所有的人都跟随一个风格.
无人质疑这种写法的问题.彷佛权威一样,不这样写就是错了
甚至连生成MVP类的插件都做出来了.
就算有生成的工具又如何.还是麻烦的要死.

MVP的设计

image.png

其实就这么一个设计.
是谁规定的MVP一定要写接口的呢?
一定要写个契约类的呢?
这就想到了一个问题.我们好像照搬的多,思考的少.
平时在开发群里聊天也是,
大家最喜欢问的也是有没有demo能抄.而不是讨论这个问题.当然,不是说问demo有错.而且不应该仅仅是要demo.

写个最简单的例子.

class M {
    
}

class V {
    val p by lazy {
        val p = P()
        p.attach(this)
        return@lazy p
    }

    fun detached() {
        p.detached();
    }

}

class P {
    var view: V? = null
    val m: M by lazy {
        return@lazy M()
    }

    fun attach(v: V) {
        view = v
    }

    fun detached() {
        view = null
    }
}

MVP其实无非就是这样子.

P控制
V视图,与P绑定,通过P来与M进行通信
M数据来源,只被P持有,与M完全隔离开.完全不打交道

一个这么简单的思想设计,非要搞得那么麻烦.

那么问题来了.写接口对不对?

对 ! 把功能抽象,写接口没错
但是

不应该每个页面都去写.
我们平时写代码.
业务代码封装功能代码.

我们应该只有在写封装代码,模板代码的时候才应该去写接口.写接口隔离.
而不应该每次写页面写业务代码都去写接口设计.
因为业务代码,界面可以说是唯一的.不需要抽象.没有设计接口的必要.

就一个问题.你这份业务代码.copy到其他地方能用吗?

答案是: 不能.

这不是和自己过不去吗.

那岂不是完全没有写接口的必要了?我写的都是业务代码.

不是!

我们应该把业务代码当中,可以重复使用的功能代码抽离出来.
这种就应该写接口,写隔离.抽象.

契约类需要吗?

我认为是不需要的.这玩意完全鸡肋,多此一举.
要说有用,只是为了把接口放在一起,好找而已.
但其实通过命名规则就可以了.


MVP用的多,心得也多.写的也多.哈哈.

您的喜欢与回复是我最大的动力-_-
交流群:493180098

相关文章

网友评论

    本文标题:2019日更挑战(十一),Android-聊聊MVP

    本文链接:https://www.haomeiwen.com/subject/wrdfdqtx.html