Android快捷创建MVP模板

Android快捷创建MVP模板

 

序言:

MVP 是从经典的模式MVC演变而来,它们的基本思想有相通的地方:Controller/Presenter负责逻辑的处理,Model提供数据,View负责显示。作为一种新的模式,MVP与MVC有着一个重大的区别:在MVP中View并不直接使用Model,它们之间的通信是通过Presenter (MVC中的Controller)来进行的,所有的交互都发生在Presenter内部,而在MVC中View会从直接Model中读取数据而不是通过 Controller。

随着越来越多的开发者的开发方式从MVC演变至MVP后,一个让人头疼的事情尾随而至,相信很多开发者都有过类似的体会,当新写任意一个V类时,都需要去创建对应的P,M,甚至Contract,创建这些类,并让这些类保持关联关系的过程,其实是时分痛苦的,因为它的过程相似,但是你又不得不每次去写。

 

解决办法:

   应对这种问题,Github上可以找到一系列的解决办法,多数推荐的是使用基于Android Studio的MVP插件,我也尝试过几个,确实可以快速生成M,V,P相关的类,但关联关系以及内部默认方法无法进行调整,存在一定的局限性,且不适用其他的ide,适用性不强。于是,从快速完成具有相似性的事件出发,我想到了最近较火的Python,这种事情,完全可以使用脚本命令来协助完成。

 

常规创建MVP相关类的操作流程:

   

 

看到上面的流程,想想每次新建页面都需要这样的一系列操作,作为一名合格的码农,肯定是不能忍的,于是乎,基于Python的懒人版的创建方式就出现了。当前mvp.py基于Python3.7.3。测试后可正常使用。

Github连接:https://github.com/chenguo0421/CRouter      可使用代码hotfix_1.0.0测试

Python创建MVP模板基本思路:

  1. 准备一个mvp模板,做一定的实现,以后的mvp文件及文件夹创建,都需要使用该模板来创建。
  2. 当需要新写一个页面Activity或Fragment时,首先需要开发者明确在哪个包下的那个文件夹下创建这个Activity或Fragment。例如需求:在cn.com.cg.test.main包下创建一个基于MVP的LoginActivity(登录)页面
  3. 开发者使用命令行,将包路径cn.com.cg.test.main ,需要创建的页面名称Login以及需要创建的页面类型Activity(或者Fragment)传入mvp.py中。(示例命令:python  mvp.py  cn.com.cg.test.main  Login  activity)
  4. mvp.py将自动在指定的包下创建指定名称的页面的mvp模式的文件夹和文件。(创建过程其实就是将模板mvp文件及文件夹复制到指定的包下,然后将页面名称替换成指定名称,将各个类里面的import路径改为指定包的路径。至于mvp之间的关联及继承关系,以及各类中的初始化操作,都已在模板mvp中就已经实现好了。)
  5. 开发者直接使用已经创建好的mvp类进行开发。

 

基于Python创建MVP模板的好处:

  1. 模板内部可自由增删,例如希望创建出的MVP文件中,默认写好onCreate方法,则只需在MVP模板新增该方法,之后通过命令创建传来的mvp文件,都将默认包含onCreate方法,相比只用Android studio的MVP插件创建,模板可随意改变,更加灵活。
  2. 默认做了mvp的关联关系,减少了需要写的代码量。例如,测试的模板中,默认让view持有了对应的presenter。

 

 

基于Python实现的快速搭建MVP相关类:

 

相比较上边繁琐的创建文件夹,文件

,这里简化了许多步骤,只需要你在新工程中导入MVP模板,并引入对应的mvp.py文件到项目根目录下,就可以使用以下命令生成MVP的相关文件:

python mvp.py <mvpDir> <viewName> <type>

例如,新建testmvp文件夹,作为mvp承载容器:

 

现在想创建一个Register页面和一个Person页面,执行以下命令:

Cmd:           python mvp.py cn.com.cg.base.testmvp Register activity

Cmd:           python mvp.py cn.com.cg.base.testmvp Person fragment

则生成如下对应的MVP相关文件,且做了部分初始化:

 

相关脚本代码部分展示:

def doNext(_rootPath,_templateFilePath,_packagePath,_baseName,_type):
    print("start create mvp file, please wait...")

    # 处理mvp所在包路径,假如传入的路径是D:\Project\BaseWorkspace\CBase_Kotlin\app\src\main\java\cn\com\cg\testmvp
    # 则处理成"cn\com\cg\testmvp"
    _packagePath = disposePath(_packagePath)
    print("dispose packagePath as %s" % _packagePath)

    # 获取该项目由多少个module,从setting.gradle中获取
    _modList = get_module_name(_rootPath)

    # 将module路径转换为module下的java文件夹下
    _classPathList = get_module_class_path(_modList,_rootPath)
    print("get_module_class_path success list = %s" % _classPathList)

    # 找到mvp包路径属于哪个module
    _srcPath = scanMatchedPath(_classPathList,_packagePath)

    if len(_srcPath) != 1:
       print("could not find mvp path in anyOne module,please check mvp.py code")
       quit()

    # 获取mvp在机器上的全路径
    _tempPath = os.path.join(_rootPath,_srcPath[0])
    print("mvp temp path is %s" % _tempPath)
    _fullPath = os.path.join(_tempPath,_packagePath)
    print("mvp full path is %s" % _fullPath)

    # 处理mvp类名 若不是首字母大写,处理成首字母大写,假如传入login,处理成Login
    _baseName = disposeName(_baseName)
    print("dispose name as %s" % _baseName)

    # 从模板文件夹复制文件到mvp在机器上的全路径上
    cpOK = cpFile(_templateFilePath,_fullPath,_type)

    if not cpOK:
       print("copy template file to mvp file failed,please check mvp.py code")
       quit()

    # 拷贝文件成功后,替换各文件内部指定内容

    reWriteFileOK = reWriteMVPFile(_fullPath,changePathConnectorType(_packagePath),_baseName,_type)
    if not reWriteFileOK:
       print("reWrite mvp file failed,please check mvp.py code")
       quit()

    print("create mvp file ok,please Synchronize project")

 

总结:该方式通过脚本的形式,自动创建mvp中对应的相关文件夹及文件,减少了手动创建过程,且因为创建出来的类已做关联,且有部分初始化,极大减小了开发周期。感兴趣的可以尝试使用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值