今天写得,不会有多余废话,全是心得和经验。
这段时间,写完一个项目,目前,测试通过。不过,回头去看代码,还是发现不少问题。总得来说,就是那个亘古不变的话题——高内聚,低耦合。一个主页,我花了600多行代码。虽然,这比起很多项目一个主页花2000多行代码来说,是好了不少。但是,这依然是不合格的。主页应该可以容许的代码是200行左右吧。
所以,会在后面的时间,进行重构。
首先,提出一些理念:逻辑数和代码树匹配;业务代码和技术代码分离;业务抽象和技术内聚;这些理念也是,在后续编码会去注意和学习的地方。当然,最后会有一个叫异步的东西需要优化和处理(这个难度比较大,说实话,即使工作3年,也未必能特别明白异步的东西,别给我说,就是什么线程调度的问题,这里面的学问大了去了),所以,关于异步的问题,先不提,免得误导别人,等自己能力够了再提。
首先聊聊逻辑树和代码树的东西:逻辑树,顾名思义,就是分叉树,比如一级是有没有订单,有订单怎么走,没订单怎么走。代码树,这个可能比较陌生,好吧,这个词儿,我自创的。就是我们对逻辑的映射。把逻辑映射到代码中。简而言之,就是一个逻辑对应一行或者一段代码(写的好的话,就是一个逻辑,一行代码)。就相当于翻译一样,逻辑可以理解为中文,代码理解为中文。就比如 I am a boy,对应:我是一个男孩。做到这样一一映射。当然,做到这样很难,因为有时候一个逻辑,用代码实现,其实是要很多行代码的。那么这个问题就需要我后面提的一个概念了:业务代码和技术代码分离。
现在我们聊聊业务代码和技术代码分离:相信大家都听过前后端分离,也许有人看过我的文章还知道页面分离,所谓业务代码和技术代码分离,可以理解为业务逻辑,业务需求和技术的分离。举个简单例子:判断手机号正确与否,这是一个业务(业务逻辑,业务需求,我就统称业务了),业务就是一句话,但是,代码实现,就是 1通过Edittext或者起来来源获取字符串2。判断这个字符串是否为空 3.用正则或是其他方式判断字符串格式。显而易见,要完成这个业务,其实代码是要走三步的。那么怎么办呢?ok,这里就来了,就是这个业务就是
checkPhone(参数):业务
public boolean checkPhone(参数){
//获取字符串(控件获取或者其他途径)
//非空判断
//格式校验
}
如上,业务代码,就是一个checkPhone方法,而技术代码,就是具体的方法实现,同时,也实现了业务和代码的映射关系。
当然,上诉是很基础,也是大多数人比较容易做到的。
下面再来聊聊业务抽象和技术内聚的问题,业务抽象,其实就是,把具体需求进行抽象和总结。技术内聚,就是把相似,相同的技术归类,聚合。举一个例子。项目中有如下需求,1.进入地图界面,获取当前定位,显示指定图标。2点击按钮,获取定位,显示指定图标。 这是2个具体需求,但是,他们技术实现都是,获取定位,显示图标。那么我们就可以对这个需求进行抽象,抽象为:获取定位,显示图标。
ok,这个时候,相信,大多数会这么做,封装一个方法,叫getPosition2Map的方法,这个方法,就是实现获取图标,定位方法。分别在点击事件,activity的oncreat()方法中调用。当然最初我也是这么写的,那么有没有更优化的方法呢?答案是肯定的。
还是封装这样一个方法。只是,会建一个生命周期管理器(这个生命周期管理器的作用就是管理控件,eventbus,黄油刀等需要注册,注销等生命周期的类,这里就不说了,以后有机会再说这个),然后,在生命周期管理器中,添加我的定位生命周期,在定位生命周期中,写我的定位方法和显示方法。将我的按钮传入其中。然后我的主页,就只看到一句关于定位生命周期的话,在定位生命周期的代码中,再和具体需求对应。
这个可能说得有点抽象,不过,只是,引入一个概念。具体编码,就需要在实践中去体悟了。至于最后说的同异步问题,这个问题,就真的等自己完全弄懂再聊了。
我所写的心得,都是一些经验和设计方面的东西。技术方面的,网络上很多文章,就不扎堆了。
网友评论