对于开发C#编码标准/最佳实践文档有什么build议吗?
我是一个近期的AIgradle生(大约2年),为一个适度的运作。 它已经落在了我的头上(主要是因为我是该部门的第一个“采用者”)来创build一个基本的(读取有用的)C#编码标准文档。
我想我应该解释一下,我可能是最初级的软件工程师,但是我期待着这个任务,希望我能够生产出一半可用的东西。 我已经做了相当广泛的互联网search,并阅读关于什么编码标准文件应该/不应该包含的文章。 这似乎是一个很好的地方,任何要求一些build议。
我意识到,我正潜在地打开一扇关于“做事的最佳方式”的整个世界的不同意见。 我都理解和尊重每个程序员都有解决每个任务的首选方法这个不可否认的事实,因此我不想写任何如此严格的规范性的东西来扼杀个人的天赋,而是试图获得一般的方法论,并且同意标准(例如命名约定)来帮助使个人代码更具可读性。
所以这里去….任何build议? 任何呢?
我们开始
- Microsoft的.NET指导原则: http : //msdn.microsoft.com/en-us/library/ms229042.aspx (更新了.NET 4.5的链接)
- 微软的C#指导原则: http : //blogs.msdn.com/brada/articles/361363.aspx 。
然后logging下这个基线的差异和补充。
IDesign有一个常用的C#编码标准文档。 另请参阅Framework Design Guidelines 2nd Ed 。
具有讽刺意味的是,设定实际的标准很可能是一件容易的事。
我的第一个build议是从其他工程师那里得到他们认为应该被覆盖的build议,以及他们认为什么样的指导是重要的。 执行任何一种指导方针都需要获得一定程度的人员支持。 如果你突然在文件上写下指定如何编写代码的文件,你会遇到阻力,无论你是最年长还是最年长的人。
在您提出一套build议后,将其发送给团队以进行反馈和审核。 再次,让人们都买入他们。
可能已经有被采用的非正式编码实践(例如,成员variables的前缀,camelcase函数名称)。 如果存在这种情况,而且大部分代码都符合这个标准,那么这个代码将会正式使用。 采用相反的标准会导致更多的悲痛,即使这是一般推荐的东西。
也值得考虑重构现有的代码以符合新的编码标准。 这可能看起来像是浪费时间,但是如果代码不符合标准,可能会适得其反,因为您会有不同风格的混搭。 这也使人们陷入一个两难的境地,一个模块中的代码是否应该符合新的标准,或者遵循现有的代码风格。
在做内部编码标准/最佳实践时,我总是使用Juval Lowy的pdf作为参考。 它与FxCop / Source Analysis非常接近,这是确保遵循标准的另一个宝贵工具。 在这些工具和引用之间,你应该能够提出一个很好的标准,所有的开发人员不会介意遵循并能够执行它们。
其他的海报已经指出你在基线,我要补充的是让你的文件简短,甜蜜,并在这一点上,用大量的Strunk和白色区分“必须拥有”从“这将是很好的ifs ”。
编码标准文件的问题是,没有人真正阅读它们,当他们阅读时,他们不遵循它们。 这样的文件被阅读和遵循的可能性与其长度成反比。
我同意FxCop是一个很好的工具,但是这太多了,可以把所有的乐趣都放在编程之外,所以要小心。
不要写自己的编码标准,使用MS标准(或者适合您的语言的Sun标准)。 线索是在标准的话,如果每个组织都没有决定写自己的话,世界将是一个更容易编码的地方。 每当你改变团队/项目/angular色时,谁真的认为学习一套新的“标准”对于任何人来说都是一个很好的利用。 你应该做的最多的是总结临界点,但是我build议不要这样做,因为关键在于人与人之间的关系。 我想在编码标准上另外提两点
- closures就足够好了 – 只要代码足够接近,更改代码以遵循编码标准就可以浪费时间。
- 如果您要更改代码,则不要按照“本地编码标准”编写代码,即使新代码看起来像周围的代码。
这两点是我希望每个人都会写代码看起来一样的现实。
我发现以下文档非常有帮助和简洁。 它来自idesign.net网站,由Juval Lowy撰写
C#编码标准
注意:上面的链接现在已经死了。 要获得.zip文件,你需要给他们你的电子邮件地址(但他们不会用它的营销…诚实) 在这里尝试
我刚刚开始在一个编码标准要求使用m_作为成员variables的地方,p_表示types的参数和前缀,比如'str'表示string。 所以,你可能在方法体内有这样的东西:
m_strName = p_strName;
可怕。 真的很可怕。
我将代码完成2添加到列表中(我知道杰夫是一个风扇在这里)…如果你是一个初级开发人员,这本书来派上用场,奠定了你的想法,为最好的基础代码编写实践和软件build设有。
我不得不说我的职业生涯有点晚,但是在我的职业生涯中,它规定了很多关于编码和框架开发的思考方式。
这是值得检查;)
微软自己的规则是一个很好的起点。 你可以用FxCop强制执行它们。
我会试图强制微软的StyleCop作为标准。 它可以在构build时执行。 但是如果你有遗留代码,那么只需在新代码上使用StyleCop。
http://code.msdn.microsoft.com/sourceanalysis
最终它将有一个重构选项来清理代码。
我个人喜欢IDesign已经放在一起的那个。 但这不是我发布的原因
在我公司的棘手的一点是考虑到所有不同的语言。 而且我知道我的公司并不孤单。 我们使用C#,C,程序集(我们制作设备),SQL,XAML等。虽然标准中会有一些相似之处,但每个标准通常都有不同的处理方式。
另外,我认为更高层次的标准对最终产品的质量有更大的影响。 例如:如何以及何时使用注释,何时例外是强制性的(例如,用户发起的事件),是否(或什么时候)使用exception与返回值,确定什么是控制器代码与表示代码的客观方式是什么,不要误会我的意思,也需要低级别的标准(格式化对于可读性来说非常重要!)我只是偏向于整体结构。
另一个要记住的是买入和执法。 编码标准很好。 但是,如果没有人同意他们(可能更重要的是)没有人强制他们,那么这一切都是徒劳的。
正如我为飞利浦医疗系统发表的一篇文章和http://csharpguidelines.codeplex.com上的文章所写的那样,我可能有些偏颇,但是我已经有十多年的时间来编写,维护和推广编码标准了。; 我试着写一个CodePlex的意见分歧,花了大部分介绍如何处理你的特定组织。 阅读并提供反馈…..
SSW规则
它包括一些C#标准+更多….主要针对微软开发者
你很可能被设置为失败。 欢迎来到这个行业。
我不同意 – 只要他创造了这个文件,最糟糕的事就是被大家忘记了。
如果其他人对内容有问题,则可以要求他们更新以显示他们更喜欢的内容。 这样,它就不在你的盘子里,而其他人有责任certificate他们的改变。
我最近发现了Encodo C#手册 ,其中包括许多其他来源(IDesign,飞利浦,MSDN)的想法。
另一个来源可能是Professional C#/ VB .NET编码指南 。
我是Francesco Balena的书“ VB和C#开发人员实用指南和最佳实践 ”的忠实粉丝。
其内容非常详细,涵盖了所有重要的主题,它不仅仅是给你的规则,而且还解释了规则背后的原因,甚至提供了一个反规则,可以有两个相反的最佳做法。 唯一的缺点是它是为.NET 1.1开发人员编写的。
我们的整个编码标准大致读取“使用StyleCop”。
看到这个: http : //www.noesispedia.com/post/2008/11/28/C-Coding-Guidelines-and-Best-Practices.aspx 。
我必须build议dotnetspider.com文件。
这是一个伟大而详细的文件,在任何地方都很有用。
我曾经使用Juval's,即使不过分,但是我很懒,现在只是顺应了Resharper的意志。
你可以看看这个,前7编码标准和指导文件的C#/。NET开发人员http://www.amazedsaint.com/2010/11/top-6-coding-standards-guideline.html希望这可以帮助;
我想我在这里回应其他评论,MS指导已经联系起来是一个很好的起点。 我主要在这些模型上编写我的代码。
这很有趣,因为我的经理过去告诉我说他不太喜欢他们:D
你在我的朋友面前有一个有趣的任务。 祝你好运,请问你是否需要更多的东西:)
飞利浦医疗系统的标准写得很好,主要遵循微软的指导方针:www.tiobe.com/content/paperinfo/gemrcsharpcs.pdf
我的标准是基于这一点的一些调整,以及.NET 2.0的一些更新(飞利浦标准是为.NET 1.x编写的,所以有点过时)。
我也跟着Resharper。 另外斯科特格思里博客上提到的指导线http://weblogs.asp.net/scottgu/archive/2007/10/08/october-8th-links-asp-net-asp-net-ajax-silverlight-and-net .aspx和http://csharpguidelines.codeplex.com/releases/view/46280
在我编写的代码中,我通常遵循.NET框架devise指南 (Public Framework APIs)和单引擎编码指南 ( Mono Coding Guidelines)来提供私有成员封装和缩进 。 Mono是.NET的开源实现,我认为这些人知道他们的业务。
我讨厌微软代码如何浪费空间:
try { if (condition) { Something(new delegate { SomeCall(a, b); }); } else { SomethingElse(); Foobar(foo, bar); } } catch (Exception ex) { Console.WriteLine("Okay, you got me"); }
Mono指南中您可能会感到奇怪的是,它们使用8个空格的制表符。 但是,经过一番练习,我发现它实际上帮助我通过执行一种缩进限制来减less纠结的代码。
我也很喜欢在左括号之前放置一个空格。
try { if (condition) { Something (new delegate { SomeCall (a, b); }); } else { SomethingElse (); Foobar (foo, bar); } } catch (Exception ex) { Console.WriteLine ("Okay, you got me"); }
但是,请不要执行这样的事情,如果你的同事不喜欢它(除非你愿意贡献给单声道;-)