• 系统设计(团队作业4)


    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的截图来展示分工和完成的过程

    • 最后给出燃尽图

  • 相关阅读:
    SAP的PI日志查看工具
    微信小程序调用SAP发布的REST显示数据列表
    SAP发布REST/HTTP接口
    SAP的JSON没有双引号问题
    SAP扩展库位
    函数使用十一:BAPI_BANK_CREATE
    竟然有人在群里谈交钱培训PI。。。。等哥哥有时间,断了你们的财路
    FPM十一:点击POPUP显示明细
    WDA基础十八:Select option配置
    SAP常见查询组合
  • 原文地址:https://www.cnblogs.com/mumuyinxin/p/10012040.html
Copyright © 2020-2023  润新知