怎么做持续发展的软件

来源:互联网 发布:linux python环境 编辑:程序博客网 时间:2024/04/28 18:36

编程可以说是一个很简单的事情,也可以说是一个很复杂的事情。当我们做一个需求明确的项目的时候,会感觉编程一点儿也不难。但不幸的是,业务需求100%是不断变化的,这样导致项目后来越修改越乱,越乱BUG越多,新加入功能越来越难,这样的软件就是不可持续发展的软件。有人可能会觉得采用敏捷开发嫩解决这个问题,但敏捷开发只是一个开发的流程模型,软件是否可以持续发展关键还是软件自身的代码结构是否是健康的。软件的核心就是数据结构,算法和设计模式,而采用恰当的数据结构和设计模式对于软件的可持续发展是至关重要的。

下面我使用一个简单ANDROID开发实例来说明一下什么是好的设计,好的设计就在于怎么把众多的问题进行抽象化处理,使功能可以最大化的集中和重用。


上面是一个很普通的ANDROID输入界面,里面有要输入数据的控件EditText,还有Button按钮控件,一个项目当中类似的Activitiy可能会很多,每个Activitiy可能需要处理对应的一个数据模型MODEL,我看到的全部项目的代码都和下面类似,


这个代码里面控件已经算很少的了,很多项目里面控件的声明,初始化,设值和取值满天飞,还有OnClickListener也是满天飞,这些都给代码的阅读和后期代码维护带来了很多的问题。

我们怎么来解决这个问题呢?其实我们可以通过选择合适数据结构和抽象来解决这个问题,使代码扩展性和重用性得到极大的提升。我们下面就展示说明下面的例子,这部分代码和上面实现的相同功能,但代码的质量是远远超越上面代码的,这部分代码大量使用了JAVA的反射原理,如果你不懂JAVA反射原理,请自己学习。



我们设计了一个BaseActivity的基类,这个基类实现了对任何组件界面的设值和取值操作,不依赖任何数据模型,前面的例子是依赖于UserInfo模型的,这样这个基类就具备了更大额灵活性,细心的人可能会发现这个类里面数据模型的类型是Object,做抽象化的时候我们是千万不能有具体类出现的,UserInfo是具体化的基类是不能放在我们一个抽象化的基类里面的,如果加入进去,我们的抽象就失去了意义。

这个基类当中关键的方法有两个,一个是把GUI的输入值取出赋给我们的MODEL,如下图:




这个方法当中我们使用了命名规则和反射原理对MODEL进行了设值,其实这就是GETTER和SETTER的原理,很多框架如STRUTS,SPRING都大量使用了这种规则,通过这个方式我们把具体的MODEL类和这个基类的COUPLING解除了。

还有一个方法是读取MODEL的值把数据设值到GUI控件上面,如下图


上面两个例子当中都使用了一个重要的数据接口MAP,m_viewMap, 这个MAP是需要在继承类里面进行数据填充的,这里保存了模型对象里面的属性名称和控件ID之间的对应关系,也是这个设计的精华之一。下面是子类对m_viewMap进行了数据填充。


第一个例子当中不是OnClickListener满天飞吗,第二个例子当中我们只在基类创建了一个OnClickListener,下面的继承类都可以使用,大大减少了代码量,但这么多BUTTON都一起使用这个OnClickListener实例,命令怎么得到分发和处理呢?这里我们使用了COMMAND设计模式和反射原理。



里面有一个重要的数据MAP, m_BtnlistnerMap,这里把BUTTON的ID和命令处理方法名称进行了关联,是我们可以通过反射激活相应的方法名称。

通过上面的设计,我们把很多很多的类变量缩减到了3个,把监听器缩减到了一个,而且通过继承这个基类,子类自然获得了GUI和MODEL之间进行数据交换的功能,那些大量的取值和赋值也都砍掉了,代码阅读顿然减少了很多,是不是心情大悦呀。

其实这个案例当中还有很多不足的地方,至少是有两个问题是需要大大改进的,可以使代码质量进一步提升,因为需要细化东西比较多,这里就不在多讲了。


0 0
原创粉丝点击