第四次作业(第1,2题)

题目:

1、敏捷开发是在什么样的背景下产生的?其主要特点有哪些?什么时候选择敏捷开发更恰当,为什么?

2、Code smell 是如何产生的?有哪些典型的 code smell?代码重构(Code refactoring)有哪些优点?有哪些代码重构的方法?

1.答:敏捷软件开发产生的背景:

•软件开发的新挑战

a:快速的市场进入时间,要求高生产率

b:快速变化的需求

c:快速发展的技术

•传统的软件开发方法

a:强调过程和文档

b:对变化的适应能力偏弱

敏捷软件开发的特点:敏捷开发存在优先级,是一种短周期的迭代,具有适应性但是不具有可预测性,可以把一个大的项目拆分成许多相互联系而且能够独立运行的的小项目,但是它主要是强调以人为核心、循序渐进 的过程。

 何时选择敏捷软件开发及原因:项目需求时常发生变化,产品的可靠性不高,团队人数少,有资深程序员带队时选择敏捷开发相对比较恰当。因为敏捷开发的可靠性不高,大的项目开发对软件质量、软件的可使用性的要求比较高,而且容易出错。所以在人数少的小团队用敏捷开发软件比较合适。

2、Code Smell中文译名一般为“代码异味”,或“代码味道”,它是提示代码中某个地方存在错误的一个暗示,开发人员可以通过这种smell(异味)在代码中追捕到问题。通过Code Smell 可以对Code进行改善。

典型的 code smell:

◊ Duplicated Code。代码重复几乎是最常见的异味了。他也是Refactoring 的主要目标之一。代码重复往往来自于copy-and-paste 的编程风格。与他相对应OAOO 是一个好系统的重要标志。

◊   Long method。它是传统结构化的“遗毒”。一个方法应当具有自我独立的意图,不要把几个意图放在一起,特别注意大类和长方法。

◊   Large Class。大类就是你把太多的责任交给了一个类。这里的规则是One Class One。

◊   Divergent Change。一个类里面的内容变化率不同。某些状态一个小时变一次,某些则几个月一年才变一次;某些状态因为这方面的原因发生变化,而另一些则因为其他方面的原因变一 次。面向对象的抽象就是把相对不变的和相对变化相隔离。把问题变化的一方面和另一方面相隔离。这使得这些相对不变的可以重用。问题变化的每个方面都可以单 独重用。这种相异变化的共存使得重用非常困难。

◊   Shotgun Surgery。这正好和上面相反。对系统一个地方的改变涉及到其他许多地方的相关改变。这些变化率和变化内容相似的状态和行为通常应当放在同一个类中。

◊   Feature Envy。对象的目的就是封装状态以及与这些状态紧密相关的行为。如果一个类的方法频繁用get 方法存取其他类的状态进行计算,那么你要考虑把行为移到涉及状态数目最多的那个类。

◊   Data Clumps。某些数据通常像孩子一样成群玩耍:一起出现在很多类的成员变量中,一起出现在许多方法的参数中……,这些数据或许应该自己独立形成对象。

◊   Primitive Obsession。面向对象的新手通常习惯使用几个原始类型的数据来表示一个概念。譬如对于范围,他们会使用两个数字。对于Money,他们会用一个浮点数来表示。因为你没 有使用对象来表达问题中存在的概念,这使得代码变的难以理解,解决问题的难度大大增加。好的习惯是扩充语言所能提供原始类型,用小对象来表示范围、金额、 转化率、邮政编码等等。

◊   Switch Statement。基于常量的开关语句是OO 的大敌,你应当把他变为子类、state 或strategy。

◊    Parallel Inheritance Hierarchies。并行的继承层次是shotgun surgery 的特殊情况。因为当你改变一个层次中的某一个类时,你必须同时改变另外一个层次的并行子类。

◊   Lazy Class。一个干活不多的类。类的维护需要额外的开销,如果一个类承担了太少的责任,应当消除它。

◊   Speculative Generality。一个类实现了 从未用到的功能和通用性。通常这样的类或方法唯一的用户是test case。不要犹豫,删除它。

◊   Temporary Field。一个对象的属性可能只在某些情况下才有意义。这样的代码将难以理解。专门建立一个对象来持有这样的孤儿属性,把只和他相关的行为移到该类。最常见的是一个特定的算法需要某些只有该算法才有用的变量。

◊  Message Chain。消息链发生于当一个客户向一个对象要求另一个对象,然后客户又向这另一对象要求另一个对象,再向这另一个对象要求另一个对象,如此如此。这时,你需要隐藏分派。

◊  Middle Man。对象的基本特性之一就是封装,而你经常会通过分派去实现封装。但是这一步不能走得太远,如果你发现一个类接口的一大半方法都在做分派,你可能需要移去这个中间人。

◊   Inappropriate Intimacy。某些类相互之间太亲密,它们花费了太多的时间去砖研别人的私有部分。对人类而言,我们也许不应该太假正经,但我们应当让自己的类严格遵守禁欲主义。

◊   Alternative Classes with Different Interfaces。做相同事情的方法有不同的函数signature,一致把它们往类层次上移,直至协议一致。

◊   Incomplete Library Class。要建立一个好的类库非常困难。我们大量的程序工作都基于类库实现。然而,如此广泛而又相异的目标对库构建者提出了苛刻的要求。库构建者也不是万能的。有时 候我们会发现库类无法实现我们需要的功能。而直接对库类的修改有非常困难。这时候就需要用各种手段进行Refactoring。

◊   Data Class。对象包括状态和行为。如果一个类只有状态没有行为,那么肯定有什么地方出问题了。

◊   Refused Bequest。超类传下来很多行为和状态,而子类只是用了其中的很小一部分。这通常意味着你的类层次有问题。

◊   Comments。经常觉得要写很多注释表示你的代码难以理解。如果这种感觉太多,表示你需要Refactoring。

代码重构优点:

◊  通过让软件程序更清晰,更简洁和更条理来改进软件的质量

◊  使软件更具有一致性和可读性更强

◊  能帮助发现隐藏的代码缺陷

◊  提高软件的开发速度,优化系统的结构,使系统对于需求具有较强的功能。

◊  能提高编程效率。

      代码重构的方法:

                • 提取类/抽离方法:正如上面提到的,像“臃肿的类”(一个类提供了本该有几个类提供的功能)这种代码异味应该将原有类中的方法和属性移动到适当数目的新类中去。旧类中对应新类的方法和属性应该被移除。另外,有时候一些类过于臃肿是因为它包含了被其他类使用本应该是其他类的成员方法的成员方法。这些方法也应该被迁移到合适的类中。

                  •提取方法:像上面提到的“过长的方法”这种代码异味可以通过从旧方法中提取代码到一个或多个新方法中消除。

                 • 分离条件:许多时候,一个方法很长是因为包含好几个分支语句(if-else)。这些分支条件可以被提取和移动到几个单独的方法中。这确实能大大改善代码可读性和可理解性。

                  • 引入参数对象/保留全局对象:将相关方法参数组成一个对象(引入参数对象),让方法传递这些对象而不是每个单独的参数。

                 • 用符号常量替换魔法数字:对于有意义的并且到处被使用的字面常量,应该为它们分配一个命名常量。这能大大增强代码可读性和可理解性。

                • 重命名方法:模糊不清的方法名会影响代码的可使用性。这些模糊不清的名称应该重命名为有意义的可能与业务术语有关的名称,来帮助开发者通过业务上下文更好地理解代码。这很需要技巧并且要求开发者与业务专家一起协作来理清代码需要满足的业务需求。

 

时间: 2024-11-11 03:19:27

第四次作业(第1,2题)的相关文章

04+罗潇潇+罗潇第四次作业

04+罗潇潇+罗潇第四次作业 1.项目整体管理的过程 (1)项目启动,制定章程 (2)制定初步的项目范围说明书. (3)制定项目管理计划 (4)指导和管理项目执行 (5)监督和控制项目 (6)整体变更 (7)项目收尾 2.项目启动就是以书面的.正式的形式肯定项目的成立与存在,同时以书面正式的形式为项目经理进行授权.项目章程应当由项目组织以外的项目发起人发布,若项目为本组织开发也可以由投资人发布. 3.项目章程包括: (1)基于项目干系人的需求和期望提出的要求. (2)项目必须满足的业务要求和产品

软件工程(第四次作业)

第四次作业 题目: 1. 敏捷开发是在什么样的背景下产生的?其主要特点有哪些?什么时候选择敏捷开发更恰当,为什么? 2. Code smell 是如何产生的?有哪些典型的 code smell?代码重构(Code refactoring)有哪些优点?有哪些代码重构的方法? 答:1(1)敏捷开发的背景: 所谓敏捷开发是以用户的需求进化为核心,采用迭代.循序渐进的方法进行软件开发.在敏捷开发中,软件项目在构建初期被切分成多个子项目,各个子项目的成果都经过测试,具备可视.可集成和可运行使用的特征.换言

软件工程第四次作业——团队作业

软件工程第四次作业--团队作业 本次作业采用团队作业的方式,我的队友是我的同班同学,他们分别为:(队长)亢健强,贾猛,黄明帅,黄珂锐.我们团队的总体任务是要做一个"乐谱识别与演奏"的软件,拍摄一张乐谱图片,它会使用光学识别转换成音乐. 此次团队作业中我得任务主要是做需求调研,为此我先总结了一下常用的需求调研方法的优缺点,然后结合我们团队的实际情况选出了一种最适合我们的调研方法. 调研方法 优 点 缺 点 实地观察法 调查者在实地通过观察获得直接的.真实可靠的第一手资料 有一定的偶然性,

<第四次作业查阅>hashmap由value找key的算法

问题:不同于第三次作业,第三次作业是按照key的值排序输出,第四次作业则是要求按照频率(hashmap的value值)排序,然后输出key的值,最开始的想法是还是沿用第三次作业的做法,想着查询一下怎么从value反得到key的值,最后发现这种做法不仅麻烦,而且效率特别低,也给了我启示,由于key-value对可能出现多对一的情况,所以由key的value比较容易高效,但是反之的效率就比较低,应该尽量能够避免试图通过value得key. Map中是一个key有且只有一个value. 但是一个val

WEB服务器搭建(作业)没有原题只是结果

WEB服务器搭建(作业)没有原题只是结果

结对作业(软件工程第四次作业)

软件工程第四次作业---代码审查 一.partner 结对伙伴:林路 代码链接:coding 二.代码审查表 功能模块名称 简单的语法分析程序 审查人 王灵杰 审查日期 2018.4.6 代码名称 简单的语法分析程序 代码作者 林路 文件结构 重要性 审查项 结论 头文件和定义文件的名称是否合理? 合理 头文件和定义文件的目录结构是否合理? 合理 版权和版本声明是否完整? 不完整 重要 头文件是否使用了 ifndef/define/endif 预处理块? 没有 头文件中是否只存放"声明"

第四次作业——04树

第四次作业--树 一.学习总结 树的思维结构图 2.对于树学习总结 ⑴.树结构认识:树是一种非线性结构,每个节点有0个或多个后继节点,有且仅有一个前驱节点(根节点除外).在树中,递归方法可以放在考虑的首要位置 ⑵.学习这个结构遇到的困难:递归调用不会很清晰,代码量大,较难记忆. ⑶.树结构可以解决的问题:并查集问题 哈夫曼编码的问题. 二.6-1 二叉树操作集 1.设计思路 void CreateBTree(BTree &BT,string str){ 创建一个树T 定义一个i来计数 创建一个队

第四次作业page100第5,6题

5.给定如表4-9所示的概率模型,求出序列a1a1a3a2a3a1 的实值标签. 答:由公式 计算: 定义随机变量X(ai)=i.由概率模型我们知道: Fx(1)=0.2, Fx(2)=0.5, Fx(3)=1. 根据上面公式,我们将u(0)和l(0)初始化. u(0)=1 l(0)=0 给定符号序列第一个元素为a1,更新为: l(1) =0+(1-0)Fx(0)=0 u(1) =0+(1-0)Fx(1)=0.2 给定符号序列第二个元素为a1,利用更新公式更新为: l(2) =0+(0.2-0)

第四次作业-第二题

很多事情的处理可以按照不同性质进行多个维度的划分,这样复杂的事情可以通过清晰的逻辑划分而简单化. 工作生活中的很多繁琐事情可以按照事件的重要性和紧急度进行这两个维度的划分,如图: 根据重要性和紧急度两个维度可以将事情划分为四个象限:第一项象限的事情是首先要进行处理的,第二象限的事情是应该在第一象限处理后进行处理的,第三象限的事情可以在重要的事情处理完成后,在闲暇的时间内进行处理,第四象限的事情是不在预期范围内突然发生的事情,比如,在你处理第二象限的事情时,来了一个电话,也许不重要,但是你必须要接