关于基础组件开发

  基础组件是相对于业务功能来说的,因为业务线的事务一般比较繁杂,在没有基础组件的情况下,遇到相似功能的复用大多是直接copy代码然后再粘贴修改。这样的话,类似功能存在多份代码,如果要修改一个BUG,就需要找到所有的相关代码然后再修改,费时费力,效率也不高。而且当需求功能复杂时,代码量也会随之增加,维护成本也相应增加,调试修改都变得很麻烦。所以我们需要在业务层下面抽象出一个基础组件层,该层介于基础库与业务代码之间。

  我们来看看这种轮播功能:

               

 

  这是很常见的内容轮播组件,在编码前我们需要找到这种组件相对变与不变的需求点,


  不变的地方:
    都具有一系列内容
    具有自动播放功能
    可以人工进行切换内容


  会改变的地方:
    图片大小不一样
    可能某些产品的需求会有说明文字,某些没有
    按钮的样子和位置不一样,某些需求没有交互按钮
    不同的产品中,会有不同的动画切换效果

  由此可以看出,改变的大多是UI和交互层面的,所以我们可以把本质的不变的东西直接抽象出来,再把UI层面的剃除出去就可以得到以下的设计思路:

    1.列表管理功能,管理添加的内容。
    2.切换功能,用以切换列表
    3.播放功能,用来让内容自动轮播
    4.UI渲染功能,通过配置不同的模板来得到不同的UI呈现

  以上是按单一职责原则把各功能进行了拆分,抽离了基本逻辑和UI层,用图来描述大概就是这样:

    

  其中,List列表功能管理内容,因为这种切换内容的数据结构是线形的,所以用列表描述就够了,然后其包含了“添加”、“删除”、“插入”和“清除”功能;
  Switch切换功能是对列表数据进行管理,可以获取到需要的内容,包含“下一条”,“前一条”,“跳转到某一条”功能;
  Player播放功能可以实现自动播放,包括“播放”和“停止”功能;
  然后这里抽象出了一个View接口,并且有二个View类实现了该接口(ViewClass1和ViewClass2),于是接口的render方法就得到了不同的实现,用以呈现不同的UI风格。

  这样做有什么好处呢,
  首先,我们把各功能拆分出去后,各功能间就得到了解藕,代码间的影响就小了,这样对于代码维护也方便了很多。比如发现自动播放功能有个BUG,可以直接找到Player这个类进行排查修改就行,不用再在一大坨代码里去找半天;
  其次,拆分后的代码复用率得到了提高,遇到相似功能的需求时就不用直接COPY代码修改,而是获取现有的功能来使用或封装;
  最后,以后有类似需求的扩展,只需要再开发实现View接口的类,配上不同的模板既可,而且不会影响到基础功能。

  最后再简单总结一下,做需求开发的时候,先考虑下该功能层面的变与不变的点,然后再跟据单一职责原则进行功能拆分,分离开各独立功能以达到解藕的目的。

posted @ 2012-12-30 22:46  随机  阅读(1802)  评论(1编辑  收藏  举报