软件测试


网站首页 | 软件测试论坛 | 软件测试培训 | 软件测试博客 | 软件测试杂志 | 软件测试沙龙 | 软件测试下载 | 软件测试顾问
业界新闻 | 软件测试人才 | 软件测试技术 | 软件测试工具 | 行业软件测试 | 软件测试管理 | 软件质量专栏 | 软件开发专栏
当前位置:首页>>软件开发专栏>>java>>正文
MVC模式在j2me项目中的应用(二)
文章出处:www.j2medev.com 作者:FavoYang 发布时间:2005-12-11
内容提要:
如果想试验一下自己对一个知识到底有几分的掌握,最好的方法就是实践她。结合一个名为“NOTE”的项目(记事本),运用MVC模式进行构建,一起体会一下MVC的强大与灵活。请注意的是,本文中关于不再使用MVC这样的术语,而是使用边界类、控制类、实体类、生命周期类这样的称呼。关于MVC的在j2me上的种种变化请看本文的(一),尤其看看我的习惯做法,否则交流上有困难。
本文重视的是总体设计,细节上没有过多的谈。
I want a good sleep.
 
版权声明:
本文同时发表在www.j2medev.com和我的Blog(blog.csdn.net/alikeboy)上,如果需要转载,有三个途径:1)联系我并经我同意;2)和www.j2medev.com有转载文章合作协议的 3)通过Rss聚合我的Blog。另外网上转载需要全文转发(包括文章的头部的声明),不要断章取义。
 
正文:
 

Note项目描述

 
手机是一个真正随身携带的数字终端,我们除了利用手机打电话、发信息外,往往让他帮助我们记录文字性的信息。PDA有较大的屏幕和手写输入的功能,而手机上的记事功能有限,记录的内容很简单。可以说利用手机记录信息是一种被视为理所应当的功能,也造就了一个一系列的应用——将手机作为随时随地的信息收集器。不难设想此类应用会用一定的市场,我们今天选择的Note记事本项目,正是此类应用的单机版的原形。
 
Note是很多手机的内建应用程序,一般叫做记事本或便签,说明这是一个非常常用的服务。也许朋友们可能认为开发一个已有的程序没有挑战性。是的,在开发上最忌讳的就是重作车轮,但对于教学则可两说着。毕竟一个简单的原型程序不会让我们陷入太多的细节,我的主旨是向大家介绍MVC模式的应用方法。
 
Note为手机用户提供记录一些简短信息的功能,用户可以添加记录,打开浏览记录,并可以随时修改已经保存在手机上的记录,当然也可以删除它们。就好象Windows下的记事本一样,只不过多了管理的功能。
 

用例分析

 
首先设想一下谁在使用这个程序:手机用户。好,我们以后就称这个参与者为用户(user)。
然后设想一下,用户都利用我们的NOTE(中文我们叫做记录好了)干些什么呢?很显然,用户可以添加新的记录,浏览他添加的记录,修改他所添加的记录,并且他还可以删除记录。一条记录应该简单的包括用户对记录起的名字,记录的创建或修改时间,以及最重要的记录的内容。
 
一般的情况开发人员是很反感这种文字性的描述的,往往是因为开发人员习惯于对待硬梆梆的PC机,而不愿意去面对客户,收集这种需求。其实文字性的东西,既是一个对系统的概述,又是我们发现开发要素的土壤。试想如果你的软件要发布了,你却无法组织起语言让用户恰当的理解软件的功能与使用对象,是多么的让人烦恼。
 
精练用户的需求(其实是我的教学需求哈哈)。很显然添加记录与修改记录同属于对记录进行编辑操作,就叫做编辑记录用例(NoteEdit好了。浏览记录也是一个很明显的用例,就叫做浏览用例(Notepad。删除是对记录进行的一种管理,叫做管理记录用例(NoteManager。到此,我们已发现并精练了三个主要用例,还不错,系统正一步步变的清晰。在这里提醒大家,这个阶段是站在客户的观点(这里是用户的观点)想问题的,你的工作是发现并系统化客户的想法,不必站在开发者的角度思考任何细节。
 
So,let ‘go。
编辑记录用例(NoteEdit
事件流1:
1) 显示用户Note的内容
2) 用户编辑内容
3) 用户放弃修改,note内容不变,正常退出
 
事件流2:
1) 显示用户Note的内容
2) 用户编辑内容
3) 用户save,退回主菜单
 
事件流3:
1) 显示用户Note的内容
2) 用户编辑内容
3) 用户save As,提示让用户输入新的文件名
4) Save,退回主菜单
 
浏览用例(Notepad
事件流1:
1) 显示用户的Note的标题、创建时间、内容
2) 用户选择退出,返回主菜单
 
事件流2:
1) 显示用户的Note的标题、创建时间、内容
2) 用户显示编辑,转向编辑用例
 
管理记录用例(NoteManager)
事件流1:
1) 显示用户的Note列表
2) 用户打开选择的Note,转向浏览用例
 
事件流2:
1) 显示用户的Note列表
2) 用户编辑选择的Note,转向编辑用例
 
事件流3:
1) 显示用户的Note列表
2) 用户新建一个Note,转向编辑用例
 
事件流4:
1) 显示用户的Note列表
2) 用户删除选择的Note
3) 出现确认提示
4) 用户确认,删除Note
5) 更新显示,回到Note列表
 
三个用例的事件流一经被分析出来了,很显然应该在第一次迭代全部完成。
 

寻找类(oo分析)

首先是实体类(Entity),只需要从事件流中提取名字就可以缩小范围。
Note,显然是个对象。
内容(content)、时间(datetime)、标题(title),恩,应该是Note的元素。
Note的方法包括对域成员的操作set/get。因为要保存,所以需要序列化反序列化方法。
 
一般实体类都是由一个对应的生命周期类(lifecycle)用于他的产生、存储、消亡等等操作,一般把这样的操作独立出来大大有利用实体类的重用。不过此阶段还用不着分析他,一会儿画顺序图时,自然就会发现它。
 
习惯上为了高效的画顺序图,边界类和控制类的方法都需一一列出。不过我们省了,大家只知道每个用例都对应着一个边界类就好了。
 

设计实践

我举三个用例中管理记录用例(NoteManager)的一部分和浏览用例(Notepad)的一部分来介绍详细的设计过程。在这里,我们试图从一个客户的角度转化到一个开发者角度。要面对很多的挑战,可能包括一部分细节。应该学习从分离的角度思考整个系统。MVC的精华就在这里。
 
记录用例(NoteManager)事件流1:
NoteManagerUI并不知道Note列表的具体组织形式,它通过预先商定好的接口getNoteTitleList向控制类NoteManagerWorkflow所要数据,控制类返回一个String[]数组。
同样,NoteManagerWorkflow需要向生命周期类NoteLocator所要数据,不过NoteManagerWorkflow知道数据的细节。为了能够识别数据,除了返回记录的Title这一信息外,还要同时返回一个唯一识别的ID作为整个系统内识别Note的方法。所以NoteManagerWorkflow就有了两个域一个是TitleList、一个是IdList。
这里有几个细节:
1) NoteManagerUI、NoteManagerWorkflow如何通信,这不成问题,我们有理由相信他们是紧密相关的。
2) NoteManagerWorkflow如何找到NoteLocator,一般情况下,NoteLoator都是单件Singlton。
3) 当NoteManagerUI的showNote(index),调用的时候,他会调用NoteManager的showNoteDispose(index),而showNoteDispose会根据内部的实现,将这一Index转化为id用于识别Note
 
浏览用例(Notepad)事件流1:
NotepadUI向控制类所要标题,控制类有域note、和noteid,但是控制类通过getNode,这里很明显的可以使用惰性初始化技术,向生命周期类所要Note。取得记录对象的引用后,你可以方便的像实体类请求数据了。
 

经验分享

 
当然了,打好骨架后你就可以开始时coding了,画图的好处是强迫你在设计阶段做好各个部件之间的接口设计。这可以有效地减少你返工的几率,但是往往我们在设计阶段过多的思考了细节,比如NoteLocator是如何和Rms交流的等等。这都是很不好的习惯,但是不太容易改正。因为无论是学校里,还是陪训等等都是训练,反复的训练我们对coding的敏感。我们太依赖于从代码的角度思考问题了,这阻碍了我们从大局思考问题,发现更通用的模式。
 
如果要开始coding了,也不要一开始就全面铺开,一般实体类具有很强的独立性。可以独立开发,而开发其它类的时候可以从边界类开始,如果想一边开发一边测试一下,大可把控制类、生命周期类的方法暂时用fade data(伪支撑数据),这都是大大降低复杂性的好办法。
 
有条件的话请进行单元测试,不然测试效率实在是低。(Ps,有人写篇j2me下使用单元测试的文章好吗,我好想让测试自动化)
 
惰性初始化是我使用的最为频繁的技术,我觉得它可以大大降低代码混乱的程度。

整个系统的UML

 
有人说看不懂UML,但如果给我这么大的代码,我肯定看不懂。UML吗,有可能看懂:)
 

屏幕快照

开始后的画面:(管理用例)
新建后的画面:(编辑用例)
按下save,输入title名字
更新显示:
选择你喜欢的浏览,比如标题是easy的记录:(浏览用例)
 

屏幕导航:

代码种种

有朋友不愿意公开自己的代码,但是对于java来说,反编译太容易了。你没有什么秘密可言。相对于设计来说,代码是个很细碎的东西。如果有人愿意为你修改代码,共同完善的话,那是打着灯笼也找不到的呀,我用eclipse开发,就是在使用开放源码的结晶呀。当然这是对文章的附加代码而言。真正的项目如果开源一定要在GPL下进行。谁也不想再出现divx那样的事了。转载的朋友,再说一遍免费不但等于 not copyright。

站内搜索
相关文章
◎MVC模式在j2me项目中的应用(一)
◎J2ME程序开发新手入门九大要点
◎精通J2ME中的Hello World
◎浅析Java多线程程序设计机制
◎J2EE架构学习者的6个最佳实践
◎Tomcat在Windows 2000下的安装配制
◎KJava在移动设备中的应用
◎Java-IDE环境
◎理解Java应用服务器的七种武器
◎Java嵌入式开发之二
◎Java嵌入式开发之一
◎Java学习从入门到精通
◎凤凰浴火JBuilder2006新功能赏析
◎UML技术在基于Web的应用系统中的应用
◎Oracle9i 数据库控制文件
◎J2EE Server下的第一个EJB程序
◎Java CORBA入门
◎CORBA 入门
◎Struts 框架
◎Struts标记库
◎ejb入门
◎Java语言编码规范
◎J2EE从零开始之J2EE平台简介
◎J2EE从零开始之测试平台安装
◎J2EE从零开始之准备工作
◎J2EE从零开始之EJB开发过程
◎J2EE从零开始之企业Beans(EJB)简介
◎J2EE从零开始之EJB(1)
◎J2EE从零开始之EJB(2)
◎J2EE从零开始之实体EJB
热门文章
◎Java学习从入门到精通
◎Windows下JAVA环境变量的设置祥解
◎Struts标记库
◎Struts 框架
◎Java学习之路:不走弯路,就是捷径
◎JAVA基础测试中异常问题汇总
◎凤凰浴火JBuilder2006新功能赏析
◎hibernate应用配置说明-middlegen和hbm2java的配置
◎java经典网址
◎J2EE从零开始之J2EE平台简介
◎MVC设计模式
◎将数据库操作封装到Javabean
◎J2EE从零开始之EJB(1)
◎ejb入门
◎Java常见问题集锦
◎J2EE从零开始之EJB开发过程
◎Java语言编码规范
◎消除内存泄漏
◎Hibernate如何配置操作多个数据库
◎J2EE从零开始之EJB(2)
◎java基础知识问答—java入门与加深二 (1)
◎J2EE从零开始之测试平台安装
◎以小博大Java性能优化技巧集锦
◎java经典问题:传值还是传引用
◎java基础知识问答—java入门与加深二 (2)
◎Oracle9i 数据库控制文件
◎J2EE从零开始之实体EJB
◎Struts行为测试框架StrutsTestCase实战
◎用Java实现磁盘文件以大对象二进制文件形式存储到Oracle数据库
◎J2EE从零开始之准备工作
◎Tomcat在Windows 2000下的安装配制
◎J2EE从零开始之企业Beans(EJB)简介
◎Java CORBA入门
◎J2EE Server下的第一个EJB程序
◎六种异常处理的陋习
◎应用Java技术实现数据库应用系统
◎JRockit JVM 中的内存泄漏检测
◎J2EE架构学习者的6个最佳实践
◎UML技术在基于Web的应用系统中的应用
◎Java平台上的CRM系统
◎Java-IDE环境
◎POJO应用架构:Spring与EJB 3.0的对比
◎有可能挑战Java开发优势的四种技术
◎J2ME程序开发新手入门九大要点
◎CORBA 入门
◎Java嵌入式开发之一
◎KJava在移动设备中的应用
◎理解Java应用服务器的七种武器
◎构建高性能J2EE应用的10个技巧
◎基于JDK5.0的一些Thread总结

Google提供的广告