四则运算网页版

一、仓库地址

https://git.coding.net/wowomilkycandy/OPERATION.git

二、PSP

刚开始我是准备把psp的二、十二分着写的,但是看过了夏江华同学的psp,我觉得合在一起写对比的更加明显。

PSP

任务内容

计划时间(min)

完成时间(min)

Planning

计划

40

60

     Estimate

    估计这个任务需要多少时间,并规划大致工作步骤

40

60

Development

开发

55.5*60

68.6*60

    Analysis

    需求分析

50

45

    Design Spec

    生成文档

0

0

    Design Review

    设计复审

2*60

4*60

    Coding Standard

    代码规范

15

15

    Design

    具体设计

16*60

10*60

    Coding

    具体编码

12*3*60

12*4*60

    Code Review

    代码复审

5*60

5*60

    Test

    测试

25

40

Reporting

报告

 

9*60

    Test Report

    测试报告

20

10

    Size Measurement

    计算工作量

40

60

   Postmortem& ProcessImprovement Plan

    事后总结, 并提出过程改进计划

2*60

5*60

三、接口设计

Information Hiding(信息隐藏):指在设计和确定模块时,使得一个模块内包含的特定信息(过程或数据),对于不需要这些信息的其他模块来说,是不可访问的。信息隐藏在设计的所有层次上都有很大作用:从用具名常量代替字面常量,到创建数据类型,再到类的设计、子程序的设计以及子系统的设计等                                    

            a.为什么要隐藏?

                                            1. 隐藏复杂度:这样你就不用再去应付它,除非你要特别关注的时候;

                                            2.隐藏变化源:这样当变化发生时,其影响就能被限制在局部范围内。复杂度的根源包括复杂的数据类型、文件结构、布尔判断以及晦涩的算法等等。

                                    b,未使用信息隐藏的案例:

                                          描述:在系统内部到处都有与人机交互相关的内容,如果突然某一天要改变交互方式——如从图形用户界面变为命令行界面——那么所有与之相关的代码都需要改动 
                                          建议:可以将与人机交互逻辑集中到一个单独的类、包或者子系统中,这样,改动就不会给系统带来全局性的影响了

Interface Design(接口设计):面向对象设计最大的原则就是针对接口设计。可见接口的重要性,如果接口能够定义好,不仅便于自身维护,而且也导致上层应用不需要太多变动,下面是接口设计的原则,只有按照原则才可能设计出高性能的接口。

                           接口设计原则:

                   原则一:必须符合Restful,统一返回格式,约定业务层错误编码,每个编码可以携带可选的错误信息。

                       原则二: 命名必须规范、优雅。

                       原则三:单一性

                       原则四:可扩展

                     原则五:必须有文档。良好的接口设计,离不开清晰的接口文档表述,文档表述一定要足够详细。

                     原则六:产品心。

                     原则七:第三方服务接口数据能缓存就缓存。

                     原则八:第三方服务需要做降级。

                     原则九:建议消除单点。

                     原则十:接口粒度要小。

                     原则十一:客户端能处理的逻辑就不要给服务端处理,减少服务端压力。

                     原则十二:资源预加载。

                     原则十三:不要过度设计。

                     原则十四:缓存尽量不要穿透。

                     原则十五:接口能缓存就缓存。

                     原则十六:思辨大于执行

高性能:如果我们发现这个接口tps和响应时间没有达到我们的要求怎么办。

  • A:数据存储方面:我们会想数据库有没有分库、分表、有没有做主从,有没有读写分离、字段是否有加索引、是否存在慢 sql,数据库引擎是否选用合适、是不是用了事务;

    其次我们会想到是不是引用了分布式缓存、缓存 key 大小是否合适,失效时间是否设置合理,会不会大量缓存穿透、有没有引入本地缓存。

  • B:业务方面:是否有大量的计算、能否异步处理。是否需要引入线程池或者 MQ 来异步处理任务。有没有必要将接口进行垂直拆分和水平拆分、将接口粒度变小。

  • C:其他方面:nginx 层面做缓存、加机器、用 ssd,资源放 cdn,多机房部署、资源文件预加载。

高可用:如何保证服务高可用,需要从几个维度来实现:

  • A:消除单点,基于高可用第二位。

  • B:能做集群的全部做集群。譬如 Redis 集群、mysql集群、MongoDB副本集。

  • C:能做读写分离的都做读写分离。

  • D:异地多机房部署,接入 GSLB

  • E:必须有限流、降级机制。

  • F:监控。高可用的保证,基于第一位。

Loose Coupling(耦合性):耦合性也叫块间联系,指软件系统结构中各模块间相互联系紧密程度的一种度量。模块之间联系越紧密,其耦合性就越强,模块之间越独立则越差,模块间耦合的高低取决于模块间接口的复杂性,调用的方式以及传递的信息。所以低耦合性和接口设计密不可分。其实所谓的低耦合就是将代码模块化,形象的说,就是要将代码写的和电脑一样,主类就是电脑的主机箱,当程序需要实现什么功能的时候只需要加其他的类引入接口,就像电脑上的usb接口。

在我们的结对项目中,对计算模块的函数进行了封装,将数据从前台页面提交到contoller层,数据从controler层传送到jsp页面中,在这个JSP页面中调用计算函数,进行运算。这个过程,我们看不见具体的计算函数,只是看的见参数调用这个方法后产生的结果,实现了信息隐藏。出题模块和做题模块利用了接口设计,实现了低耦合。 

四、接口实现

后端代码共5个类,出题的类,计算的类,测试的类,判断的类,文件生成的类。

五、效能分析

项目总体分析图,从内存,多线程,CPU等方面分析了计算模块的性能,截图如下

六、单元测试

 测试产生计算式,中缀转后缀和计算:

 

七、异常处理

 在整个Java的异常处理中,实际上也是按照面向对象的方式进行处理的,处理步骤: 


1,一旦产生异常,则首先会产生一个异常类的实例化对象。


2,在try语句中对此异常对象进行捕捉。


3,产生的异常对象与catch语句中的各个异常类型进行匹配,如果匹配成功则执行catch语句中的代码。

 

捕获异常,获取生成文件的路径。

 八、模块设计

 用户在"生成题目 (文档)"上左键单击(在"生成题目 - Mozilla Firefox"中)

用户在"下载 (按钮)"上左键单击(在"生成题目 - Mozilla Firefox"中)

用户在"确定 (按钮)"上左键单击(在"正在打开 result.txt"中)

 用户在"文本编辑器 (编辑)"上鼠标滚轮向下滚动(在"result-3.txt - 记事本"中)

用户在"返回 (按钮)"上左键单击(在"生成题目 - Mozilla Firefox"中)

 用户在"上传 (按钮)"上左键单击(在"生成题目 - Mozilla Firefox"中)

 用户在"浏览… (按钮)"上左键单击(在"上传题目 - Mozilla Firefox"中)

用户在"result.txt (列表项目)"上左键单击(在"文件上传"中)

用户在"上传 (按钮)"上左键单击(在"上传题目 - Mozilla Firefox"中)

用户在"题目上传成功,点击这里开始答题! (编辑)"上左键单击(在"上传题目 - Mozilla Firefox"中)

用户在"答题 (文档)"上左键双击(在"答题 - Mozilla Firefox"中)

用户在"结束 (按钮)"上左键单击(在"答题 - Mozilla Firefox"中)

用户在"返回 (按钮)"上左键单击(在"答题 - Mozilla Firefox"中)

 

九、模块对接

  其实我们的功能是有很多缺陷的,目前只能实现整体提交的题判断对错,不能对每一道题展示出对错,我们结对的两个人都不是工作室成员,以前也不怎么编程

是因为这门课程,从头开始学的,很多不懂的地方都是查博客,问大佬,敲了很多遍的。前后端交互的过程中,连el表达式都是现学的,前端写的东西,我后端没有

能实现这个功能,我的小伙伴是在前端做了计时器的,登录注册,记录使用软件的每个人的做题记录,但是对于我这个初学的人来说,挺不容易的,如果之后有时间

的话,我们还会一起商量改好这个代码的。 

  和身边的大佬们存在很大差距,人家学了两年的代码,积累了很多的代码经验,我用一个月的时间肯定是达不到那个水平的,但是我们也没有放弃这个作业,硬

着头皮赶完了项目。两个人互相鼓励,这个对接的过程让我收获的是一段友情,同学间的关心,队友间的照顾,挺好的。

 、结对同伴

一张合照:

 

李金昊 (红衣直男)优点:做事认真、为人正直、动手能力强

                          缺点:缺少积极性、性子比较直、

我      (傻的乐观 )优点:目标明确、知道自己要干什么、做事认真

                          缺点:缺少毅力。

十一、结对编程思考

凡事都是有正负面的,结对编程也是有利有弊的,但我觉得更多是利。

 

结对编程的优点:


1.减轻独自编程的工作量

2.两个人互相讨论,提高了编程乐趣,互相提出意见一起改进,一起进步

3.因为这个项目不仅是自己的,还有同伴的付出,不能半途而废,所以平时对零散时间的利用率就比较高,抓紧一切时间写

 

结对编程的缺点:

 

1.结对难,一般都是前后端结对效果比较好,但是前后端会的程度也各不相同,所以真正分工的时候就比较难,会出现会的多的多做,会的少做就做得少。

2.沟通不到位会浪费时间,前台写好的东西,后台用不上,后台写好的功能在前台没法实现。

3.讨论的激烈容易引起矛盾

引用的博客:

https://blog.csdn.net/gongchuangsu/article/details/53895916

https://blog.csdn.net/xottmeqg/article/details/53349070         

https://blog.csdn.net/struggleoldboy/article/details/51868660

原文地址:https://www.cnblogs.com/respective/p/8757364.html