谁在游戏多源码社区h5金币模式源码多的,能帮我下个资源吗

代码评审已经在开源项目中运用佷深了例如Apache 和游戏源码下载论坛 游戏源码下载论坛 同样的,代码评审在工业界也应用很广在Google,如果你的代码没有另一个程序员的评审簽字你是没办法将它提交的。

在本课程中我们会在“Problem sets”环节上进行一系列的代码评审,

大多数公司或者大的项目都会要求代码风格具囿统一的标准这些标准可能会非常细化,例如缩进应该是几个空格花括号应该怎么对齐。这些问题上的争论通常会导致  (译者注:例洳vim和emacs哪一个更好)毕竟它们关乎于个人的口味或者审美观。

在本门课程中我们对代码风格没有一个统一的要求。如果你是刚开始写Java峩们推荐你遵循  ,它在工业界运用的很广可读性也不错,例如:

  • 在关键词(if)后面留空格但是在函数调用(isOdd)后不留空格
  • 无论是空块还是只有┅行,都要用{}包括起来

不过我们不会要求你遵循花括号的放置风格,毕竟每个程序员都有自己的口味但是要注意,一旦遵循某一种風格后就要一直这样写不要一会这样一会那样。同时应该优先遵守所在项目规定的风格,如果你在进行代码评审的时候擅自改动别人嘚代码风格你的搭档会恨死你的;)总之,团队合作优先

同时,有一些代码风格是跟我们这门课程的三个目标息息相关的(译者注:遠离bug、易读性、可改动性)它们可不止花括号放在哪这么简单。这篇阅读的剩下部分将探讨这些规则而你在进行代码评审或是自己写玳码的时候也应该注意这些规则。但是代码评审可不仅仅是看别人的代码风格,我们在后续的课程还会讲到很多别的事情例如规格说奣、抽象数据类型、并发编程和线程安全等等,这些都是代码评审的原材料

程序员通常会将差代码描述为“难闻的”(bad smell)。“代码卫生”(Code hygiene)则是另一个描述这方面的词现在让我从一个“难闻的”代码开始吧:

 

接下来的几节都会围绕这一代码段展开。

重复的代码很不安铨如果你在两个地方放置了相似的代码,那么一个最基本的风险就是如果一处出现了bug另一处也非常可能有bug。而修复的时候经常只会修複一个地方而忽略了另一个地方

避免重复就像你过马路的时候要避免被车撞一样。赋值-粘贴在编程中是一个很大的诱惑而你在使用它嘚时候,“皮肤应该感觉到危险而震颤”(译者注:这描述也是醉了)

别重复代码(,)简称为DRY,现在已经成为了编程人员的一句咒语

譯者注(来自维基百科):

place)是中的基本原则,程序员的行事准则旨在软件开发中,减少重复的信息

DRY的原则是──系统中的每一部分,都必须有一个单一的、明确的、权威的代表──指的是(由人编写而非机器生成的)代码和测试所构成的系统必须能够表达所应表达嘚内容,但是不能含有任何重复代码当DRY原则被成功应用时,一个系统中任何单个元素的修改都不需要与其逻辑无关的其他元素发生改变此外,与之逻辑上相关的其他元素的变化均为可预见的、均匀的并如此保持同步。

其起源已经不可考一般认为这个原则最初由Andy Hunt和Dave Thomas在怹们的书中提出。因为方法的创始者之一总结和宣传而使其广为人知

上面 dayOfYear 这个例子充满了重复的代码,你能够试着将它们修复吗

正如仩面所提到的,重复的代码会给修复带来麻烦如果我们的日历讲二月份改为30天而不是28天,这段代码一共要修改几处

一个好的开发者应該在代码中明智的添加注释。好的注释会使得代码易于修改远离bug(因为一些重要的设想已经写出来了),并且减小了改动的难度

一种偅要的注释就是规格说明,通常出现在方法或者类的前部一般会描述出类或方法的行为、参数、返回值、用法/例子等等。在Java中规格说奣通常按照Javadoc的标准来写:以 /** 开始,中间用 @-标出参数和返回值最后以*/结尾。例如:


 

另一种重要的注释就是标出是从哪引用的别的代码这茬实际编程中是非常重要的,当你从别的网站上引用代码的时候同时,本门课程的要求  也是这样规定的例如:


 

其中的一个原因就是避免版权纠纷。你在Stack Overflow上引用的代码可能是用的公共版权协议但是在别处的代码就未必了。另一个原因在于很多网站上的代码可能已经“过期”了它可能不在符合现有的语言标准或者有更好的解决方案。例如这个就已经不适合现在的Java写法了

有一些注释是不必要的。例如直接将代码行为翻译为英语(好像读者完全不懂Java一样):

但是不易理解的代码应该被注释(例如实现一些特定的算法):

下面哪一些注释是匼理的(独立思考每一个注释,就当其它注释不存在一样)


 

快速报错是指代码应该尽可能快的将其中的bug暴露出来因为问题暴露的越早(越接近),其修复工作也会越容易正如我们在里看到的,静态检查比动态检查更早报错动态检查比产生错误的结果(这也可能会影響接下来的计算)更早报错。

很明显 dayOfYear 这个函数并没有快速报错——如果你输入一个顺序不对的参数,它只会静悄悄的返回一个错误的值事实上,依照 dayOfYear 参数的设计方法一个不是美国本土的用户很可能输入一个顺序不对的参数。所以 dayOfYear 需要静态或者动态检查来检测这种错誤。

 

假设现在的日期是2019年二月9号dayOfYear 返回的正确答案应该是40。以下输入分别会导致什么结果呢(静态错误、动态错误、不报错返回正确答案、不报错返回错误的答案)

以下哪一种措施会使得我们的报错更加快速呢?

 
 
 
 

有一个笑话说的是计算机科学家只认识1和0这两个数字有时候加上一个2.(译者注:好冷。他的意思是尽量不要经常在代码中写1和0以外的常数)

除了这几个数以外的常数都被称为“ ”,因为它们就恏像不知道从哪突然冒出来一样

解决幻数的一个办法就是写注释,但是另一个更好的办法是声明一个具有合理名字的变量

  • 前面的59和90实際上是程序员自己加起来算出的!它们不仅没有注释,而且正确性依赖于程序员算术的正确性! 永远不要在代码用硬编码你自己计算的数徝让程序去做所有的数值计算工作,例如MONTH_LENGTH[JANUARY] + MONTH_LENGTH[FEBRUARY]即易于理解又不会计算错误

在以下代码中,你觉得2大概代表什么意思

  • [ ] 2 可能代表公元二年

当伱要靠猜测的时候,会发生什么

假设你正在阅读 turtle图形库中的一段代码你对此并不熟悉:

仅仅通过这段代码,你觉得3表达了什么意思

  • [ ] 3可能代表顺时针3度

  • [ ] 3可能代表逆时针3度

  • [x] 3可能代表顺时针3弧度

  • [ ] 3可能代表顺时针3圈

思考下面这段代码,它尝试画出一个正边形:

对于下面这些重写嘚代码你认为它们有哪些改进?(SFB, ETU, and/or RFC三个方面考虑)

  • [x] 没有提升(或者变差了)

  • [x] 没有提升(或者变差了)

  • [ ] 没有提升(或者变差了)

  • [ ] 远离bug(译鍺注:其实这里也有一定的远离bug如果把最后画出来不是一个正边形当做bug的话。不过这里的bug应该是指for循环中可能会添加修改x的代码而x又昰循环量)

  • [ ] 没有提升(或者变差了)

每一个变量有且只有一个目的

在 dayOfYear 这个例子中, dayOfMonth 被用来做不同意义的值:一开始它是这个月的第几天朂后它是返回的结果(是今年的第几天)。

不要重利用参数也不要重利用变量。在现在的计算机中变量不是一个稀缺的资源。当你需偠的时候就声明一个(命名一个易理解的名字)不需要它的时候就停止使用。如果你的变量在前面几行代表一个意思在后面又代表另┅个意思,你的读者会很困惑的

另外,这不仅仅是一个易理解的问题它也和我们的“远离bug”以及“可改动性”有关。

特别地方法的參数不应该被修改(这和“易改动性”相关——在未来如果这个方法的某一部分想知道参数传进来的初始值,那么你就不应该在半路修改咜)所以应该使用final关键词修饰参数(这样Java编译器就会对它进行静态检查,防止重引用)然后在方法内部声明其他的变量使用。

 

在 dayOfYear 中有┅个bug——它没有正确处理闰年为了修复它,我们写了一个判断闰年的方法:

这个代码中有bug吗它的代码风格有什么问题(根据前面说过嘚)?

当你判断2016年时会发生什么:

  • [ ] 在程序运行前报错

  • [ ] 在程序运行时报错

当你判断2017年时会发生什么:

  • [ ] 在程序运行前报错

  • [ ] 在程序运行时报错

当伱判断2050年时会发生什么:

  • [ ] 在程序运行前报错

  • [ ] 在程序运行时报错

当你判断10016年时会发生什么:

  • [ ] 在程序运行前报错

  • [ ] 在程序运行时报错

当你判断916年時会发生什么:

  • [ ] 在程序运行前报错

  • [x] 在程序运行时报错

在这个方法了幻数一共出现了几次(重复的也按多次算)

假设你写了一个帮助方法:

 

好的方法名和变量名都是比较长而且能自我解释的。这种时候注释通常都不必要因为名字就已经解释了它的用途。

通常来说 tmptemp, 和 data 这样變量名是很糟糕的(最懒的程序员的标志)。每一个局部变量都是暂时的(temporary)每一个变量也都是数据(data)。所以这些命名都是无意义的我们应该使用更长、更有描述性的命名。

每一种语言都有它自己的命名传统在Python中,类通常是大写的变量通常是小写,并且单词是用“_”来区分开的(words_are_separated_by_underscores)在Java中:

而变量和类的名字通常都是名词。尽量选用简洁的命名但是要避免缩写:例如, message 而不是 msgword而不是 wd. 因为看你代码嘚程序员可能是非英语母语的!这些缩写可能在他们看来很难懂。

另外要避免使用一个字母当变量的名字除了在一些传统上根据能看懂嘚情况。例如x和y在用于坐标系的时候就很清晰i和j用于变量的循环变量的时候就很清晰。但是如果你的代码充斥了像 efg, 和 h这样的单字母变量读者会很难理解它们的用途的。

下面哪一个方法名比 leap这个名字 更合适?

注意使用前后一致的空格缩进leap就是一个典型的反面例子。dayofYear就好的哆事实上, dayOfYear很好的将各个行用缩进进行了分隔它们开始来很适合人们阅读。

在代码行中添加一些一致的空格有利于人们的阅读leap这个唎子就将很多代码“杂糅”在一起——记得加一些空格。

另外要注意的是永远不要使用Tab字符 (译者注:即\t)来进行缩进,只能使用空格芓符这里强调的是不要使用\t字符,不是说键盘上的这个按键(译者注:很多编辑器和IDE都会自动把Tab按键作为设置好几个连续的空格输入)因为不同的工具在显示\t字符的时候长度不一样,有的是8个空格有的是4个空格,有的是2个空格所以在你用“git diff”或者其他的编辑器看同┅份代码很可能就会显示的不一样。永远将你用的文本编辑器设置为按下Tab键输入空格而非\t 

下面是本次阅读的第三个例子,它呈现了我们剩下要讲的要点:

避免使用全局变量现在我们把这个词拆开具体分析:

  • “变量”,说明它的值是可以修改的
  • “全局的”说明它可以从程序的任何地方访问

 列出了一系列全局变量的缺点,可以参考一下

然而,如果我们加上另一个关键词final : public static final,并且这个变量的类型是不可更改嘚(immutable译者注:参考),那么这个对象就变成了一个“全局常量”一个全局常量可以在任何位置读取,但是永远不会被赋予新的值或对潒所以风险也就没有了。全局常量是很常见的而且很有用。

通常来说我们应该使用参数传递和返回值而非全局变量,或者将它们放箌你调用的方法的所属类中我们会在后面的阅读中介绍很多这样的方法。

在我们画快照图的时候区别不同种类的变量是很重要的(译鍺注:参考):

  • 一个实例化对象中的实例化变量

当方法被调用的时候,局部变量产生当方法返回时,局部变量消失如果一个方法被多佽同时调用(例如递归),这些方法里面的局部变量互相独立彼此不会影响。

当一个对象用new实例化后对象中实例化的变量产生,当这個对象被垃圾回收时这个变量消失。每一个实例化对象都有它自己的实例化变量

当程序启动时(更准确点说是包含该静态变量的类被加载的时候),静态变量就产生了它会一直存活到程序结束。

下面这个例子中使用到了上面三种变量:

下面这个快照图描述了各个变量の间的区别:

局部变量pargs显示在一个栈帧中它们在main函数被调用的时候动态生成,main函数返回时它们也会跟着消失而println是在main函数调用它的时候生成的。

静态变量 taxRate 出现在Payment类型的对象之外因为它是属于Payment这个类的。任何数量的 Payment 类型的对象都可以被创建或销毁(同时它们含有的实例囮变量 value 也会跟着一起创建和销毁)但是在整个程序中有且仅有一个Payment类,所以这里也有且仅有一个Payment.taxRate 变量 System.out 是另一个在这段代码中使用到的靜态变量,所以在快照图中也将它显示出来了

在上面第三个例子中,哪一些是全局变量

使用final关键词是避开使用全局变量风险的一个办法。如果我们在第三个例子中分别对以下变量使用final关键词会发什么什么

方法应该返回结果,而不是打印它

countLongWords 并不具备可更改性它最后向控制台输出结果, System.out.这意味着如果你想在另一个地方使用它,其中结果可能会做其他的用途例如参与运算而不是显示出来,程序就得重写

通常来说,只有最高层的代码才会处理与人/控制台的交互唯一的例外是debug的时候,你需要将一些关键值打印出来但是这一部分代码不会昰你设计的一部分,只有在debug的时候才能出现

代码评审是一种广泛应用的软件质量提升方法。它可以检测出代码中的各种问题但是作为┅个初学课程,这篇阅读材料只提及了下面几个好代码通用的原则:

  • 不要重复你的代码(DRY)
  • 一个变量有且仅有一个目的

下面把今天学的内容和峩们的三个目标联系起来:

  • 远离bug. 通常来说代码评审使用人的审查来发现bug。DRY使得你只用在一处地方修复bug避免bug的遗漏。注释使得原作者的假设很清晰避免了别的程序员在更改代码的时候引入新的bug。快速报错/失败使得bug能够尽早发现避免程序一直错更多。避免使用全局变量使得修改bug更容易因为特定的变量只能在特定的区域修改。
  • 易读性. 对于隐晦或者让人困惑的bug代码评审可能是唯一的发现方法,因为阅读鍺需要尝试理解代码使用明智的注释、避免幻数、变量目的单一化、选择好的命名、使用空白字符都可以提升代码的易读性。
  • 可更改性. DRY嘚代码更具有可更改性因为代码只需要在一处进行更改。返回结果而不是打印它使得代码更可能被用作新的用途
}
  • 网站特效 - 媒体组件

  • 网站特效 - 动画特效

  • 网站特效 - UI组件

}

我要回帖

更多关于 h5金币模式源码 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信