1.修改完善已提交的需求规格说明书
2.讨论制定团队的编码规范
2.1 程序风格:
2.1.1 严格采用阶梯层次组织程序代码
- 每层次缩进为4格,括号位于下一行。要求相匹配的大括号在同一列,对继行则要求再缩进4格
2.1.2 其他所有的提示信息必须定义在资源中。
- 对变量的定义,尽量位于函数的开始位置。
2.2 命名规则
-
变量名的命名规则
分析:变量名的命名规则遵循用户自定义标识符命名规则
(1) 只能由字母、数字、下划线组成;
(2) 第一个字符必须是英文字母;
(3) 有效长度为255个字符;
(4) 不可以包含标点符号和类型说明符%,&,!,# ,@,$;
(5) 不可以是系统的关键词比如else。 -
变量标识符
(1) 成员变量、局部变量使用lowerCamelCase风格(小驼峰法,首字母小写),如:inputUserId。
(2) 变量命名不能以下划线或美元符号开始,也不能以下划线或美元符号结束。
(3) 严禁使用拼音和英文混合的方式,更不允许直接使用中文的方式来命名。纯拼音命名方式也要避免使用,但国际通用的名称可视同英文,如:taobao, alibaba,xiamen等。
(4)去掉没必要的公共变量。
(5)仔细定义并明确公共变量的含义、作用、取值范围及公共变量间的关系。
(6)明确公共变量与操作此公共变量的函数或过程的关系,如访问、修改及创建等。
(7)当向公共变量传递数据时,要十分小心,防止赋与不合理的值或越界等现象发生。
(8)防止局部变量与公共变量同名。
(9)仔细设计结构中元素的布局与排列顺序,使结构容易理解、节省占用空间,并减 少引起误用现象。
(10)结构的设计要尽量考虑 向前兼容和以后的版本升级,并为某些未来可能的应用保留余地(如预留一些空间等)。
(11)严禁使用未经初始化的变量。声明变量的同时对变量进行初始化。
(12)编程时,要注意数据类型的 强制转换。
-
包
(1) 包名统一用小写,点分符号之间有且仅有一个自然语义的英语单词。包名统一使用单数形式,但类名如有复数含义,类名可以用复数形式。如:com.alibaba.open.util.MessageUtils。 -
类
(1) 类名使用UpperCamelCase风格(大驼峰法,首字母大写),如:XmlService, TcpUdpDeal, TaPromotion。
(2) 抽象类命名使用Abstract或Base开头。 -
枚举 (Enum)
(1)枚举类名建议带上Enum后缀,如:DealStatusEnum。
(2) 枚举成员名称需要全大写,单词间用下划线隔开。(枚举其实就是特殊的常量类,且构造方法被默认强制是私有)如:UNKNOW_REASON。 -
参数
(1)参数名使用lowerCamelCase风格(小驼峰法,首字母小写),如:localValue。 -
方法
(1)方法名使用lowerCamelCase风格(小驼峰法,首字母小写),如:getHttpMessage()。 -
常量 (const)
(1)常量命名全部大写,单词间用下划线隔开,力求语义表达完整清楚,不要嫌名字长。如:MAX_SOCKET_COUNT。
(2)long或者Long初始赋值时,必须使用大写的L,不能是小写的l,小写容易跟数字1混淆,造成误解。如:Long a = 2l; 很难辨别写的是数字的21还是Long型的2。 -
异常类
(1)异常类命名使用Exception结尾。 -
测试类
(1)测试类命名要以它要测试的类的名称开始,以Test结尾。 -
数组
(1) 数组定义使用String[] args,不要使用String args[]的方式来定义。 -
各层命名规约:
(1) 获取单个对象的方法用 get 做前缀。
(2) 获取多个对象的方法用 list 做前缀。
(3) 获取统计值的方法用 count 做前缀。
(4) 插入的方法用 save(推荐)或 insert 做前缀。
(5) 删除的方法用 remove(推荐)或 delete 做前缀。
(6) 修改的方法用 update 做前缀。
2.3 可读性
- 注释规约:
(1) 注释要简单明了。
(2) 边写代码边注释,修改代码同时修改相应的注释,以保证注释与代码的一致性 。
(3) 在必要的地方注释,注释量要适中。注释的内容要清楚,明了,含义准确。
保持注释与其描述的代码相邻,即注释的就近原则。
(4) 对代码的注释应放在其上方相邻位置,不可放在下面。
(5) 对数据结构的注释应放在其上方相邻位置,不可放在下面;对结构中的每个域 的注释应放在此域的右方;
同一结构中不同域的注释要对齐。
(6) 变量、常量的注释应放在其上方相邻位置或右方。
(7) 全局变量要有较详细的注释,包括对其功能、取值范围、哪些函数或过程存取它以及存取时注意事项等的说明。
(8) 在每个源文件的头部要有必要的注释信息,包括:文件名;版本号;作者;生成日期;
模块功能描述(如功能、主要算法、内部各部分之间的关系、该文件与其它文件关系等);
主要函数或过程清单及本文件历史修改记录等。
(9) 在每个函数或过程的前面要有必要的注释信息,包括:函数或过程名称;功能描述;
输入,输出及返回值说明;调用关系及被调用关系说明等。
-
其他规约:
(1) 循环体内,字符串的联接方式,使用 StringBuilder 的 append 方法进行扩展。(反编译出的字节码文件显示每次循环都会new出一个StringBuilder对象,然后进行append操作,最后通过toString方法返回String对象,造成内存资源浪费)
(2) 类成员与方法访问控制从严,要严控类、方法、参数、变量的访问范围。过宽泛的访问范围不利于模块解耦。
思考:如果是一个 private 的方法,想删除就删除,可是一个 public 的 Service 方法,或者一个 public 的成员变量,删除一下,不得手心冒点汗吗?变量像自己的小孩,尽量在自己的视线内,变量作用域太大,会无限制的到处跑,那么你会担心的。
(3) 所有的相同类型的包装类对象之间值的比较,全部使用equals方法比较。如:对于Integer var=?在-128至127之间的赋值,Integer对象是在IntegerCache.cache产生,会复用已有对象,这个区间内的Integer值可以直接使用==进行判断,但是这个区间之外的所有数据,都会在堆上产生,并不会复用已有对象,这是一个大坑,推荐使用equals方法进行判断。
(4) 关于基本数据类型与包装数据类型的使用标准如下: -
所有的局部变量【推荐】使用基本数据类型。
(5) 类内方法定义顺序依次是:
公有方法或保护方法 > 私有方法 > getter/setter方法。
说明:公有方法是类的调用者和维护者最关心的方法,首屏展示最好;
保护方法虽然只是子类关心,也可能是“模板设计模式”下的核心方法;
而私有方法外部一般不需要特别关心,是一个黑盒实现;
因为方法信息价值较低,所有Service和DAO的getter/setter方法放在类体最后。
(6) setter方法中,参数名称与类成员变量名称一致,this.成员名=参数名。在getter/setter方法中,尽量不要增加业务逻辑,增加排查问题的难度。
(7) final可提高程序响应效率,声明成final的情况:
(1) 不需要重新赋值的变量,包括类属性、局部变量。
(2) 对象参数前加final,表示不允许修改引用的指向。
(3) 类方法确定不允许被重写。
2.4 代码编译
(1) 编写代码时要注意随时保存,并定期备份,防止由于断电、硬盘损坏等原因造成代码丢失。
(2) 同一项目组内,最好使用相同的编辑器,并使用相同的设置选项。
(3) 合理地设计软件系统目录,方便开发人员使用。
(4) 使用工具软件对代码版本进行维护。
2.5 总结
- 代码规范十分重要,写的规范,可以减少错误的发生。比如一个变量或者方法的命名,随便写一个符号,自己一开始可能还能知道,但时间久了,自己都有可能忘记是为什么而定义的了,更不用说别人。
- 在团队合作中代码规范显得尤为重要,别人能看懂代码这是十分重要。
- 还有代码的缩进,合理的缩进会使得代码看起来更清晰,更有条理。可以直接看出哪一行语句属于哪个函数,如果不规范代码,就会显得很乱,查看起来很浪费时间。
- 所以代码规范有利于对代码的管理,检查及修改
3.数据库设计
-
选择合适的数据库产品,完成数据库设计
-
在随笔中展示数据库设计的结果,至少需要包含ER图。
4.项目的后端架构设计
选择通用架构,由于方便调试,通用性强,适合前期开发
5.确定团队Alpha版本要实现的功能
- 参考分而治之给出相应的WBS图
- 利用象限法(《构建之法》 8.5)审核上一次作业所确定需求优先级,明确项目的核心功能
- 列出团队Alpha版本需要实现的功能,表格中至少应包含:优先级、名称、用户故事描述;用户故事描述可以参考模板“作为一个<角色>,可以<活动>,以便于<价值>”,用一句话说明
6.关键技术与难点
6.1 程序进行数据交换的实现
网络socket技术
网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket。
建立网络通信连接至少要一对端口号(socket)。socket本质是编程接口(API),对TCP/IP的封装,TCP/IP也要提供可供程序员做网络开发所用的接口,这就是Socket编程接口;HTTP是轿车,提供了封装或者显示数据的具体形式;Socket是发动机,提供了网络通信的能力。
Socket的英文原义是“孔”或“插座”。作为BSD UNIX的进程通信机制,取后一种意思。通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,可以用来实现不同虚拟机或不同计算机之间的通信。在Internet上的主机一般运行了多个服务软件,同时提供几种服务。每种服务都打开一个Socket,并绑定到一个端口上,不同的端口对应于不同的服务。Socket正如其英文原义那样,像一个多孔插座。一台主机犹如布满各种插座的房间,每个插座有一个编号,有的插座提供220伏交流电, 有的提供110伏交流电,有的则提供有线电视节目。 客户软件将插头插到不同编号的插座,就可以得到不同的服务。
6.2 设置头像上传的实现
Java图片上传+回显技术
需求为给角色上传头像,通过添加页面对用户添加头像并回显,然后填写信息后进行表单提交,发送ajaxfileupload请求给java,java处理相应请求后,将图片上传tomcat服务器,最后将真实路径存入数据库,并在前台JSP调取相对应的img真实路径,最后显示在前台页面,整体需求完成。
6.3 拦截应用通知的实现
使用Xposed
拦截系统所有的通知信息,对其进行过滤,当信息是来自我们想要拦截的应用时,hook掉它。
7.团队管理
-
描述组员在上述任务中的分工和工作量比例
组员 比例权重 参与工作范围 林恩 17% 团队管理,博客及排版等 寇永明 12% 确定团队Alpha版本要实现的功能 杨长元 14% 修改完善已提交的需求规格说明书,讨论制定团队的编码规范 胡彤 15% 项目的后端架构设计 李震 13% 数据库设计 王浩 11% 关键技术与难点 李杰 18% 确定团队Alpha版本要实现的功能 -
请用Leangoo的截图来展示分工和完成的过程
- 最后给出燃尽图