实施和执行编码标准

时间:2008-12-04 20:24:31

标签: c# standards coding-style

我的团队(其中我是最新和最初级的成员)在短短一年时间内从3到9名开发人员的规模增加了。我们的主要产品复杂性增加,我们即将进行为期一年的端口/重写Silverlight。在过去,没有强制执行特定的风格/标准。

我向老板建议现在是实施这些标准的好时机。我把IDesign's文件传给了他,他喜欢这个主意。他有两个问题。

  1. 这是一个吸收的大文件。我的想法是为我们可能遇到的最常见项目开发一个精简的备忘单,理解IDesign标准是“Master”,并且应该看看精简版中没有涵盖的任何内容。在“主”文件中。

  2. 执行此操作的最佳方法是什么。这不是试图指挥的问题;这是试图让人们习惯于发展到特定标准的问题。团队中至少有两个人已经发展到目前的非标准状态已有好几年了。为了解决这个问题,我想看看是否有一个工具可以配置为强制执行这些标准,或者至少在编译时或设计时警告“违反”标准。我找到了Microsoft的StyleCop,但是从我能够确定的,它是不可配置的,并且设置为遵循微软的标准,这与IDesign的完全不相符。

  3. 任何关于工具的输入或我正在看的方法都将不胜感激。

13 个答案:

答案 0 :(得分:10)

ReSharper,FxCop / StyleCop的组合(有一种方法可以至少为FxCop定义自定义规则),明确的代码指南和月度评论应该为我认为的九人团队完成工作。如果有人违反规则,你将无法使用鞭子:)

答案 1 :(得分:6)

定期代码审核将是一个很好的方式......

我发现开发人员更好地回应有关特定标准的面对面讨论,而不是仅仅将其留给工具。

使用工具和代码审查应该是好的。

答案 2 :(得分:4)

很难夸大编码标准的重要性。关键是你应该拥有一致的代码库,每个人都可以快速阅读和理解。它选择的标准集合并不那么重要(只要每个人都注册) - 但如果选择广泛使用的标准,那么开发人员就必须调整自己的风格。 Microsoft Design Guidelines for Class Library Developers是我最喜欢的(非常ReSharper友好)。

我的一位同事(Howard van Rooijen)和他的开源团队正在开发优秀的StyleCop for ReSharper,通过在您输入时突出显示它们来实时显示您的违规行为!我们衷心推荐recent release

答案 3 :(得分:4)

这是我的经验,说明越来越买入的编码在我目前的公司的标准(多个项目的小型开发商,每1-6个程序员每人;我们主要是C ++,但我想答案仍然适用):< / p>

代码审核备忘单是一个好主意。为您的组织量身定制(例如容易被忽视或出错),并随时更新(每月一次,回来并删除以其他方式强制执行的内容)。如果您有维基,请提供每个点“为什么”的链接,如果可以的话!

拆分评论。一些承诺要求正式审查,有些则不这样做。我们使用几种类型:

  • Mini-Design-Doc评论其中在实施开始之前,小组评论了短片(通常是维基上的一两页)。非常适合早期发现“重新发明轮子”。
  • 引导热情评论其中一个或多个同伴在提交前与原作者坐在一起(非常适合传播专业知识,使合作社/实习生加快速度)。原作者倾向于发现比这些中的评论者更多的问题。 =)
  • 正式提交后冷评论,其中没有指导的人(签到评论和任何文档除外)审核代码。这往往会揭示逻辑或错误处理问题,以及边界错误。

自动推送,不要提取有用信息。我们从我们的构建服务器发送报告 - 它通常每次提交构建一次(取决于它的繁忙程度)。这些报告可包括例如当前Gimpel PC-Lint运行与最后一次运行之间的差异。这解决了“太多信息”问题:您只需要可能负责的警告/错误以及描述。当信息缩小并易于理解时,人们将其用作学习工具。

我不能强调这一点:不要为小东西撒谎。 (参见奇妙的C ++编码标准书的第0点。)

  • 将您的编码标准分为两个或多个部分,即“必需”和“推荐”部分 - 允许人们在闲暇时阅读推荐部分,并将所需部分保持较小。
  • 在审核时,明确描述现在非常重要的内容,以及不是。例如,对于我们的“热门评论”:括号放置和命名不一致明确地“稍后修复”,因为我们不希望在提交前审核之前使人们做的任何测试无效。逻辑错误是“现在修复,提交前”。错误处理不一致或丢失的情况各不相同。如果您要求人们立即修复甚至捣乱的违规行为,您将会产生怨恨。

最后,鼓励参与变异您的编码标准。 (这是一个wiki可能是有用的。)如果有人不遵守一块标准的合法理由(无论他们有更好的东西,或者是太多皮塔跟随),倾听和回应。如果人们真正积极地参与并理解标准而不仅仅是交付标准,那么你会得到更好的回应。

答案 4 :(得分:3)

StyleCop将是一个很大的帮助。

答案 5 :(得分:1)

尝试ReSharper,它可以根据您的风格格式化您的代码。甚至可以立即重新格式化整个解决方案。

答案 6 :(得分:1)

谢谢大家的建议。我很想听到更多。碰巧的是,当我按照Ilya Ryzhenkov的建议调查Resharper时,我碰巧重新下载了IDesign标准,该标准带有一个zip文件,其中包含指向此blog entry的链接。好的部分是它默认为我想要使用的标准。它很便宜(如果你不捐赠,可以免费阅读)和Ihappend成为Code-Rush! and Refactor的忠实粉丝,所以我已经加载了DXCore!

答案 7 :(得分:1)

我刚刚写了一篇关于一起使用ReSharper和StyleCop的博客,并通过持续集成(使用NAnt)强制执行它。

http://www.robertbeal.com/archives/47

看看你怎么看。它对我们很有用。如果引入了单个代码违规,那么当前的一些抱怨我失败了构建。我们确实有成千上万的违规行为(主要是旧的遗留代码),所以我的回答是清理其中一个,而且代码应该变得更好而不是更糟。

我收到了这个回应一次,希特勒的夜间建造失败: http://www.youtube.com/watch?v=Azl4nqLn4-Y

答案 8 :(得分:1)

查找方式的内容。开发人员所以要记住,期望他们记住超过一页规则是浪费时间。即使你给他们一个备忘单,除非那是官方和唯一的文件,你最终会得到开发人员为其他人创造自己的风格。

最好遵循一个简单的约定,而不是一个没有遵循的大型复杂文档。

顺便说一句,你是否已经从团队中获得了适当的帮助?

我所见过的大多数代码标准都强制要求愚蠢的东西,如果所有if语句必须包含大括号,这会破坏像

这样的东西
public bool compare (Object other){
  if(other == null) throw new NullPointerException("You twit, don't give me a null pointer");
  if(!(other instanceof CustomerObject)) throw new UnsupportedArgumentException("Give me the right argument, dammit");
  ...

因为这样的东西现在占用了三行,因此没有写入(或者如果这样做,阻止程序员弄清楚方法在做什么)。

答案 9 :(得分:0)

如果您的团队有持续构建(例如使用Hudson),则可以通过在构建失败或在某人提交违反样式指南的更改时使其不稳定来强制执行样式约束。 Hudson有一个Violations插件,可以与Checkstyle和StyleCop等工具一起使用。

答案 10 :(得分:0)

在不知道配置管理设置是什么样的情况下,我会说你应该首先寻找与你的版本控制系统集成的工具,在将代码提交到存储库之前评估代码。我已经使用我们的SVN设置完成了这项工作,并且已经看到它与CVS一起完成......它在某种程度上是有效的,因为它迫使开发人员提交“正确”的代码并使您的存储库保持整洁。如果用户没有在提交消息中提供特定信息(即bug#,项目任务等),则一个简单的例子就是拒绝提交。

除了工具之外,您必须找到一种方法来向开发人员描述编码标准的价值。听起来很简单,但对我来说这是迄今为止最艰难的部分。向开发人员展示在维护代码库方面需要花费一些力气。

答案 11 :(得分:0)

在我们公司,我们使用C#的参考卡。使用2张幻灯片在Powerpoint中制作参考卡。前排和后滑(2页打印)。每张幻灯片有3列(报纸设置)。在每列之间制作1厘米的白色以实现折叠。

将公司完整编码指南中最重要的方面放在2张幻灯片中(例如我们有:编码风格,名称空间和解决方案结构,命名约定)。

您选择了IDesign开箱即用的编码指南。也许你更容易熟悉MS编码风格,但这是你的选择。大多数开发人员都熟悉MS指南,因此更容易熟练。

答案 12 :(得分:0)

使用TFS和VS 2010,使用c#base,我们这样做:

我们使用未经编辑的idesign标准作为我们的纸上代码标准。

我们维护一组代码分析和样式警察定义,我们在版本构建上运行零容忍。

我们还维护一个兼容的Resharper根定义,允许开发人员在使用它时将代码快速格式化为样式。这简化了他们的工作流程,因为他们不再需要等待构建时检查中的SA / CA警告。

我们允许开发人员覆盖根定义。

然后在审核过程中找到并解决这两个层未获取的标准冲突。在代码维护中可以找到评论中没有的内容。