游戏源码下载论坛

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

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

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

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

if (isOdd(n)) {    
    n = 3*n + 1;
}
  • 在关键词(if)后面留空格,但是在函数调用(isOdd)后不留空格
  • 在行的末尾写{  ,而 } 自己单独一行
  • 无论是空块还是只有一行,都要用{ }包括起来

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

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


难闻的(Smelly)例子 #1

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

public static int dayOfYear(int month, int dayOfMonth, int year) {
    if (month == 2) {
        dayOfMonth += 31;
    } else if (month == 3) {
        dayOfMonth += 59;
    } else if (month == 4) {
        dayOfMonth += 90;
    } else if (month == 5) {
        dayOfMonth += 31 + 28 + 31 + 30;
    } else if (month == 6) {
        dayOfMonth += 31 + 28 + 31 + 30 + 31;
    } else if (month == 7) {
        dayOfMonth += 31 + 28 + 31 + 30 + 31 + 30;
    } else if (month == 8) {
        dayOfMonth += 31 + 28 + 31 + 30 + 31 + 30 + 31;
    } else if (month == 9) {
        dayOfMonth += 31 + 28 + 31 + 30 + 31 + 30 + 31 + 31;
    } else if (month == 10) {
        dayOfMonth += 31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + 30;
    } else if (month == 11) {
        dayOfMonth += 31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31;
    } else if (month == 12) {
        dayOfMonth += 31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31 + 31;
    }
    return dayOfMonth;
}

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


别写重复的代码(Don’t Repeat Yourself)

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

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

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

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

一次且仅一次once and only once,简称OAOO)又称为Don't repeat yourself(不要重复你自己,简称DRY)或一个规则,实现一次one rule, one place)是面向对象编程中的基本原则,程序员的行事准则。旨在软件开发中,减少重复的信息。

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

其起源已经不可考,一般认为这个原则最初由Andy Hunt和Dave Thomas在他们的书The Pragmatic Programmer中提出。因为极限编程方法的创始者之一肯特·贝克总结和宣传而使其广为人知。

违反DRY原则的解决方案通常被称为WET,其有多种全称,包括“write everything twice”(在每个地方写两次)、“we enjoy typing”(我们就是喜欢打字)或“waste everyone's time”(浪费大家的时间)。

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

阅读小练习

在 dayOfYear() 有一种重复是数值的重复,请问在 dayOfYear() 一共出现了几次四月份的天数?

9

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

10

另一种重复是代码 dayOfMonth+=的重复。假设你建立了一个数组:int[] monthLengths = new int[] { 31, 28, 31, 30, ..., 31} ,以下哪一种语句架构能够帮助你DRY,使得 dayOfMonth+= 仅出现一次呢?

  • [x] for (int m = 1; m < month; ++m) { ... }
  • [ ] switch (month) { case 1: ...; break; case 2: ...; break; ... }
  • [ ] while (m < month) { ...; m += 1; }
  • [ ] if (month == 1) { ... } else { ... dayOfYear(month-1, dayOfMonth, year) ... }


仅在需要的地方注释

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

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

/**
 * Compute the hailstone sequence.
 * See http://en.wikipedia.org/wiki/Collatz_conjecture#Statement_of_the_problem
 * @param n starting number of sequence; requires n > 0.
 * @return the hailstone sequence starting at n and ending with 1.
 *         For example, hailstone(3)=[3,10,5,16,8,4,2,1].
 */
public static List<Integer> hailstoneSequence(int n) {
    ...
}

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

// read a web page into a string
// see http://stackoverflow.com/questions/4328711/read-url-to-string-in-few-lines-of-java-code
String mitHomepage = new Scanner(new URL("http://www.mit.edu").openStream(), "UTF-8").useDelimiter("\\A").next();

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

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

while (n != 1) { // test whether n is 1   (don't write comments like this!)
   ++i; // increment i
   l.add(n); // add n to l
}

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

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
游戏门户网站源码 主要功能 游戏门户网站主要由前台和后台两部分组成。前台主要包括“游戏公告”、“新手指南”、“职业技能”、“积分乐园”、“下载中心”、“汇款方式”、“玩家论坛”等信息。后台主要对前台显示的信息进行管理,操作用户只针对网站管理员。 操作注意事项 用户在使用《游戏门户网站》之前,应注意以下事项: (1)本系统后台管理员用户名为:51aspx,密码为:51aspx。 (2)前台玩家论坛页面中,“新闻发布区”只有版主可以发表话题。其余发布区普通用户可以发表及回复帖子,只有版主可以删除帖子。 业务流程 在使用本系统时,请按照以下流程进行操作: 1.前台 (1)单击“游戏公告”按钮,进入公告信息页面,在此页面中单击公告标题可以查看公告的详细信息。 (2)单击“新手指南”按钮,进入新手指南页面。 (3)单击“职业技能”按钮,进入职业技能页面可以查看职业技能信息。 (4)单击“积分乐园”按钮,进入积分公告页面,在此页面中单击公告标题可以查看详细信息。 (5)单击“下载中心”按钮,进入下载页面,单击“下载”按钮可以下载文件。 (6)单击“汇款方式”按钮,进入汇款方式页面。 (7)单击“玩家论坛”按钮,进入论款页面,在此页面中可以在不同的区发表话题和回复帖子。 注意:“新闻发布区”只有版主可以发表话题,普通用户只可以回复帖子。 发表话题的具体操作步骤如下: (1)首先进入论坛页面,在发表话题前需要先进行注册,以获取用户名和密码。 (2)注册成功后,单击“用户登录”按钮,如图1.1所示,在此页面中填写正确的用户名和密码。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值