序言:
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模板基本思路:
基于Python创建MVP模板的好处:
基于Python实现的快速搭建MVP相关类:
相比较上边繁琐的创建文件夹,文件
,这里简化了许多步骤,只需要你在新工程中导入MVP模板,并引入对应的mvp.py文件到项目根目录下,就可以使用以下命令生成MVP的相关文件:
python mvp.py
例如,新建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中对应的相关文件夹及文件,减少了手动创建过程,且因为创建出来的类已做关联,且有部分初始化,极大减小了开发周期。感兴趣的可以尝试使用。