软件工程第四次作业
代码审查
结对伙伴:任延勇
代码地址:https://coding.net/u/renyanyong/p/maxsum/git/blob/master/CustomerTest.java?public=true
重要性| 激活| 级别| 检查项
- | :- | :-: | :-
总计 | | |
命名|||
重要 |Y |20 |命名规则是否与所采用的规范保持一致?
|N |20| 是否遵循了最小长度最多信息原则?
重要 |N |50| has/can/is前缀的函数是否返回布尔型?
注释 |N||
重要 |N |10 |注释是否较清晰且必要?
重要 |N |10 |复杂的分支流程是否已经被注释?
| N |10 |距离较远的}是否已经被注释?
|N |10| 非通用变量是否全部被注释?
重要|N |50 |函数是否已经有文档注释?(功能、输入、返回及其他可选)
|N |10 |特殊用法是否被注释?
声明、空白、缩进 |||
|Y |20 |每行是否只声明了一个变量?(特别是那些可能出错的类型)
重要 |Y |40 |变量是否已经在定义的同时初始化?
重要 |Y|40 |类属性是否都执行了初始化?
|Y|20 |代码段落是否被合适地以空行分隔?
| Y| 20| 是否合理地使用了空格使程序更清晰?
|Y| 20| 代码行长度是否在要求之内?
|Y| 20| 折行是否恰当?
语句/功能分布/规模 |||
|Y| 20 |包含复合语句的{}是否成对出现并符合规范?
|Y| 20 |是否给单个的循环、条件语句也加了{}?
|Y| 20 |if/if-else/if-else if-else/do-while/switch-case语句的格式是否符合规范?
|Y| 40 |单个变量是否只做单个用途?
重要 |Y| 20 |单行是否只有单个功能?(不要使用;进行多行合并)
重要 |Y| 40 |单个函数是否执行了单个功能并与其命名相符?
|Y| 20| 操作符++和— —操作符的应用是否复合规范?
规模 |||
重要 |Y|20| 单个函数不超过规定行数?
重要 |N|100| 缩进层数是否不超过规定?
重要 |N|100 |是否已经消除了所有警告?
重要| N |40 |常数变量是否声明为final?
重要 |N| 80 |对象使用前是否进行了检查?
重要 |N|80| 局部对象变量使用后是否被复位为NULL?
重要 |Y|70 |对数组的访问是否是安全的?(合法的index取值为[0, MAX_SIZE-1])。
重要 |Y|20| 是否确认没有同名变量局部重复定义问题?
|Y|20| 程序中是否只使用了简单的表达式?
重要 |Y|20| 是否已经用()使操作符优先级明确化?
重要 |N|20| 所有判断是否都使用了(常量变量)的形式?
|N|80| 是否消除了流程悬挂?
重要 |Y|80| 是否每个if-else if-else语句都有最后一个else以确保处理了全集?
重要 |N|80| 是否每个switch-case语句都有最后一个default以确保处理了全集?
|Y|80| for循环是否都使用了包含下限不包含上限的形式?(k=0; k<MAX)
重要 |N|40| XML标记书写是否完整,字符串的拼写是否正确?
|N|40| 对于流操作代码的异常捕获是否有finally操作以关闭流对象?
|N|20| 退出代码段时是否对临时对象做了释放处理?
重要 |N|40| 对浮点数值的相等判断是否是恰当的?(严禁使用直接判断)
可靠性(函数)|||
重要| Y |60 |入口对象是否都被进行了判断不为空?
重要| N |60| 入口数据的合法范围是否都被进行了判断?(尤其是数组)
重要 |N |20 |是否对有异常抛出的方法都执行了try...catch保护?
重要 |Y |80 |是否函数的所有分支都有返回值?
重要 |N|50| int的返回值是否合理?(负值为失败,非负值成功)
|N|20| 对于反复进行了int返回值判断是否定义了函数来处理?
|N|60| 关键代码是否做了捕获异常处理?
重要 |N|60| 是否确保函数返回CORBA对象的任何一个属性都不能为null?
重要 |N|60| 是否对方法返回值对象做了null检查,该返回值定义时是否被初始化?
重要 |N|60| 是否对同步对象的遍历访问做了代码同步?
重要 |Y|80| 是否确认在对Map对象使用迭代遍历过程中没有做增减元素操作?
重要 |N|60| 线程处理函数循环内部是否有异常捕获处理,防止线程抛出异常而退出?
|N|20| 原子操作代码异常中断,使用的相关外部变量是否恢复先前状态?
重要 |N|100| 函数对错误的处理是恰当的?
可维护性 |||
重要 |N|100| 实现代码中是否消除了直接常量?(用于计数起点的简单常数例外)
|Y|20| 是否消除了导致结构模糊的连续赋值?(如a= (b=d+c ))
|N|20| 是否每个return前都要有日志记录?
|N|20| 是否有冗余判断语句?(如:if (b) return true; else return false;)
|N|20| 是否把方法中的重复代码抽象成私有函数?
在软件工程的学习过程中,我们改变了以前自己闷头造车的代码编写习惯,接触到了一种新的理念:结对编程。
结对编程究竟有哪些优点呢,我想很多同学也都很困惑。接下来我们就一起分析结对编程的优势都有什么。
更高质量的代码
如果每行代码在编写的同时都在被审查,代码质量就会急剧提高。由于审查者完全参与到代码的编写过程中,因此代码审查的质量也会提升。类似Alistair Cockburn和Laurie Williams所做的研究,其他研究也对比了结对编程和单人编程产生的代码,发现结对编程产生的代码缺陷更少,设计更良好。在Cockburn和Williams的研究中,结对编程产生的程序“普遍比单人编程产生的程序短20%,这表明前者的代码更优雅、可维护性更高。
更强的团队凝聚力
和同事整天在一起工作可以让你更好地了解他们,从而更加理解他们,增强团队凝聚力。
更高的工作满意度
大多数程序员最后会发现和同事分担编程任务可以让自己更轻松——当他们习惯之后。他们不再需要自己承担所有责任,并且可以互相帮助。
更高的效率
是的,没错,结对编程比单人编程的效率更高。这确实有点违反直觉,两个人写一份代码怎么会比两个人分别写两份代码更快呢?
当你和其他人一起讨论的时候,可以更快地解决问题。队友会帮助你把精力聚焦在问题上,并且能帮你搞定一些你自己不确定或者不熟悉的领域的问题。你花费在常见问题、研究和查找代码语法上的时间会减少。
更少的缺陷意味着更多时间用在创建新特性而不是修复bug上!因此,效率更高。在上面提到的Williams和Cockburn的研究中,结对编程花费的人时只增加了大约15%,远小于从修复bug上节约的时间(bug也减少了15%)。因为在代码编写完成之后修复bug需要花费更多的时间,因此编写同样代码,结对编程的总时间更少。
更容易维护的代码
当两个人一起编程时,他们需要在方法、数据结构甚至是变量和函数名上达成一致。这会减少其中一方随意编写代码的可能性。结对编程者也更有可能选择更加标准的语法、格式以及类似TDD这样的最佳实践。
更有助于成员发展
结对编程是软件开发中学习新技能最快的方法之一。除了语言和技术,结对编程者还会共享很多其他技能,从解决问题的思路、算法到键盘快捷键和调试技巧。没错,你可以通过阅读他人的代码来学习他们解决问题的方法,但是和他们一起工作可以让你更加清楚他们的思考过程。
更高的团队灵活性
能让人们快速地掌握技术和编程领域意味着他们可以以最小的代价从一个团队转移到另一个团队。这种灵活性对所有人都有好处。如果一个项目突然需要外援,负责人可以从其他团队“借”资源并让资源快速发挥作用。类似地,如果开发者想学习一些新东西,或者想改变工作节奏,可以申请转移到其他团队。团队可以以最小的损失来满足这些申请。
在这次作业中,我的小伙伴深入学习了并发问题中常见的生产者-消费者模式,并用JAVA语言实现了它。美观的代码就如同好看的字,使人心情愉悦,而如何写出美观的代码就是每个程序员应该掌握的技能。
生产者-消费者模式,首先应该确定的是对象都有谁,职能都有什么,缓存用什么,这里,任延勇同学使用了信号量机制作为实现的基础,customer producer mall三个类作为整体架构,代码整洁且不失优雅,采用多个线程进行测试验证,严谨而仔细,可以说是一篇上佳的代码了。