代码是软件开发过程的产物,代码的作用是通过编译器编译后运行,达到预期的效果(功能、稳定性、安全性等等),而另外一个重要作用是给人阅读。对于机器来说只要代码正确就能够正确的运行程序,但是人不同,如果代码编写混乱就会对代码阅读造成障碍,导致代码无法维护,甚至会导致代码重构等高成本活动,所以规范代码势在必行。

  本文从以下几个方面介绍代码规范以及相关工具。

.Net代码规范简介

  文章开始提到过代码是给人看的,代码规范的目的在于创建一个统一的规范来保持代码的整洁,这样有利于提高代码的可维护性,但除此之外还可以将一些代码的最佳实践也作为规范的一部分,这样还可以提高代码的性能和安全性。
  一般来说.Net的代码规范主要有:代码格式规范、代码使用规范,前者保证代码可读性后者保证代码执行效率和安全性。

代码格式规范

  代码格式规范主要的目的是统一代码编写格式,避免开发人员独特的代码编写方式,以便于项目的所有开发人员能快速的阅读其他人员开发的代码,代码格式规范主要有以下几个方面:

  注:除以下规范外,对于一个工程来说应该还有工程结构规范(也可以理解为代码目录结构规范),工程结构规范可能因项目不同而不同,但是统一规范可以提高代码查找效率和开发效率(团队新成员不会再疑惑代码应该放哪里)。

命名规范

  命名规范主要涉及命名空间、类型、接口、属性、方法、变量等相关命名,其主要规范有:

  • 使用Pascal(单词首字母大写)命名方式对命名空间、类型、枚举类型、枚举值、事件、属性、方法、常量进行命名。

  例:public class PersonManager {}

  • 使用Camel()命名方式对参数、变量、字段进行命名。

  例:private string userName;
  禁止使用缩写,除URL、IO等能达成共识的缩写除外,使用缩写可全大写。
  例:System.IO;

  • 接口以I做为前缀进行命名。

  例:public interface IConvertor {}

  • 抽象类以Abstract为前缀或者以Base为后缀进行命名。

  例:public abstract class PersonBase {}

  • 异常类型以Exception为后缀。

  例:public class CustomException {}

  • 在对任何东西命名时需要使用有意义的名称,并且保证单词拼写正确以及语法正确,避免使用拼音(地名等通用拼音除外)。

  例: public string Name {get; set;}
  反例: public string N {get; set;}

布局规范

  布局规范的目的是使代码变得整洁,提高代码可读性,其主要规范有:

  • 代码缩进为4个空格。

  左右花括号必须独自一行,括号内容为空时除外:
  例:public void WriteLog(string log)
    {
      Console.WriteLine(log);
    }

    public void EmptyMethod(string log) {}

  • 括号的使用:

    • if/for/while/do等关键字后面与左括号直接需要加空格:

      if (x == 1)

    • 运算符左右需要加空格:

      a = c + b;

  • 单行代码限制120个字符,超长处理方式:

    • 第二行相对第一行缩进4个空格,从第三行开始无需缩进。
    • 运算符及方法调用的“.”需要跟随换行,但逗号不需要。

      例:WebHost.CreateDefaultBuilder(args)
          .UseStartup<Startup>()
          .Build();
        App.Method(a
          + b,
          c);

注释规范

  注释用来对编写的代码进行说明,包括功能说明以及实现说明,这样可以大大的提高程序的可读性,另外规范的注释还可以通过工具来生成相应的API文档,C#的注释规范有以下几种:

  • 类注释

  例:/// <summary>
  /// This is a Entity Class for Post.
  /// </summary>
  public class Post

  • 属性及方法注释:

  /// <summary>
  /// Get post with id
  /// </summary>
  /// <param name="id">post's identity</param>
  /// <returns>post instance</returns>
  public Post GetPostById(int id)

  • 代码单行注释:

  //this is a single line comment

  • 代码多行注释:

  /*
  this is comment1
  this is comment2
  */

代码使用规范

  代码的使用规范,或者说是代码编写的最佳“实践”(当然优良的格式规范也是一种最佳实践),它们是根据代码的实现/运行原理以及特定的应用场景进行实践的最佳方案,这些方案的使用除了可以提高代码的可读行外,还可以减少程序Bug、提高程序性能及安全性,如以下几个方面:

  • 使用语言特性

  this:使用this区分类型中的属性与变量、静态成员,可以提高程序可读性。
  var:适当的使用var可以提高开发效率且不影响程序可读性,如在不知道返回值具体类型或者不需要知道类型的时候。
  反例:

  

  本例来自:https://weblogs.asp.net/dixin/csharp-coding-guidelines-4-types

  • 字符串内插(string interpolation):字符串内插是C#6.0的特性,使用字符串内插可以提高程序可读性:

  例:

  

  • 异常

    • 当程序出现与预期不符时应该抛出异常让程序上游处理。
    • 尽可能使用C#中内置的异常类型。
    • 捕获异常必须处理。
    • 获取指定异常而非统一使用Exception。
  • 安全准则

  参考:https://docs.microsoft.com/zh-cn/dotnet/standard/security/secure-coding-guidelines
  更多规范可参考:https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/inside-a-program/coding-conventions
  代码使用规范是一个广泛的话题,除了以上一些通用的规范之外,还可以对OOP以及开发框架等方面根据实际情况制定规则,使用统一的规范进行开发可以让代码变得更加容易管理。

常用的代码规范工具

  • Visual Studio

  VS是非常强大的IDE,在众多功能中当然不会缺少对代码规范的支持。

  • StyleCop

  StyleCop是一个代码分析工具,StyleCop有两个版本StyleCop和StyleCop Analyzers,前者适用于VS2010-VS2017所有版本,它的原理是在编译时对代码进行分析,而StyleCop Analyzers仅支持VS2015+,它基于.Net的roslyn编译框架实现的,它支持开发时对代码进行实时分析(不再需要等编译)。
  StyleCop:https://github.com/StyleCop/StyleCop
  StyleCop Analyzers:https://github.com/DotNetAnalyzers/StyleCopAnalyzers

  • Resharper

  Resharper是jetbrains公司开发的一个VS收费插件,它不仅包含了代码分析,还具备了代码生成、编译、测试、调试等功能。
  VS2017与Resharper的功能比较https://www.jetbrains.com/resharper/documentation/comparisonMatrix_R2018_1_vs2017.html

  • EditConfig

  EditConfig是一个跨编辑器/IDE的代码风格一致性维护工具(协议/插件),现在VS2017已经支持EditConfig

  • DocFx

  DocFx是一个API文档生成工具,使用DocFx可以快速的搭建一个程序使用、及API文档,样式可参考:
  DocFx教程:http://dotnet.github.io/docfx/tutorial/docfx_getting_started.html
  API文档:http://dotnet.github.io/docfx/api/Microsoft.DocAsCode.html

小结

  本文主要介绍了C#中的编程规范,并将规范分为了两个类型,分别是格式规范和使用规范,前者主要目的是让代码格式达到一致性,后者则是规定了代码的使用方法,最大化的减少不同经验开发人员编写代码的质量,提高程序的可读性、性能、稳定性及安全性。
  在开发过程中编程规范是一项非常重要的工作,它关系着代码是否能够被维护,提高可维护性可以减少团队成员增减、功能新增、代码变更等带来的高成本。
  编程规范的制定并不简单,不同的人对编程规范也有不同的理解,特别是代码的使用规范,它要求制定者必须要有丰富的代码开发以及代码优化经验。为了确保规范能够顺利的制定,个人认为需要以先制定后修改的方式进行,先制定是为了不耽误开发工作,在开发工作开始之前制定好规范即可按规范开发,后修改,其一是在开发过程中发现不合理的地方进行修改(口说无凭,实践出真理),另外是随着团队能力的提高,可以总结更多的代码使用最佳实践。
  文章的最后介绍了一些常用的规范工具,下篇文章将详细的介绍.Net平台下的规范工具以其使用。

  另附上阿里巴巴定义的Java规范:  https://github.com/alibaba/p3c/blob/master/%E9%98%BF%E9%87%8C%E5%B7%B4%E5%B7%B4Java%E5%BC%80%E5%8F%91%E6%89%8B%E5%86%8C%EF%BC%88%E8%AF%A6%E5%B0%BD%E7%89%88%EF%BC%89.pdf

参考:
  https://docs.microsoft.com/en-us/dotnet/standard/design-guidelines/
  https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/inside-a-program/coding-conventions
  https://docs.microsoft.com/zh-cn/dotnet/standard/security/secure-coding-guidelines#application-code-that-is-not-a-reusable-component
  https://orcharddojo.net/orchard-resources/Library/DevelopmentGuidelines/BestPractices/CSharp
  https://www.codeproject.com/articles/118853/some-best-practices-for-c-application-development
  https://weblogs.asp.net/dixin/csharp-coding-guidelines-1-fundamentals
  https://github.com/dotnet/docfx
  https://github.com/alibaba/p3c/blob/master/%E9%98%BF%E9%87%8C%E5%B7%B4%E5%B7%B4Java%E5%BC%80%E5%8F%91%E6%89%8B%E5%86%8C%EF%BC%88%E8%AF%A6%E5%B0%BD%E7%89%88%EF%BC%89.pdf

本文链接:https://www.cnblogs.com/selimsong/p/9160928.html

好代码是管出来的——浅谈.Net Core的代码管理方法与落地(更新中...)

好代码是管出来的——C#的代码规范的更多相关文章

  1. qt简单界面更新代码(菜鸟级)(部分代码)

    qt简单界面更新代码(菜鸟级)(部分代码)self.timers_1=QtCore.QTimer(self)self.timers_1.timeout.connect(self.min_1)self. ...

  2. java 子类、父类中静态代码块、字段,非静态代码块、字段以及构造函数的初始化顺序和次数

    一个类中的数据初始化顺序是面试官非常喜欢出的面试题之一,本文用一个实例来介绍java中子类.父类中静态代码块.字段,非静态代码块.字段以及构造函数的执行顺序和次数. 一.包结构

  3. .Net高级进阶,在复杂的业务逻辑下,如何以最简练的代码,最直观的编写事务代码?

    本文将通过场景例子演示,来通俗易懂的讲解在复杂的业务逻辑下,如何以最简练的代码,最直观的编写事务代码. 通过一系列优化最终达到两个效果,1.通过代码块来控制事务(分布式事务),2.通过委托优化Tran ...

  4. C# 《编写高质量代码改善建议》整理&笔记 --(六)编码规范及习惯

    一.命名规范 1.考虑在命名空间中使用复数 System.AllCollections System.TheCollection 2.用名词和名词组给类型命名 ScoreManager UserCon ...

  5. WebGIS中以version方式实现代码更新后前端自动读取更新代码的方法

    文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/ 1. 前言 GIS代码进行更新后,由于用户前端已有缓存,导致更新的功能不 ...

  6. 分享下使用 svn,测试服务器代码自动更新、线上服务器代码手动更新的配置经验

    分享下使用 svn,测试服务器代码自动更新.线上服务器代码手动更新的配置经验 利用SVN的POST-COMMIT钩子自动部署代码 Linux SVN 命令详解 Linux SVN 命令详解2 使用sv ...

  7. Upsource——对已签入的代码进行分享、讨论和审查代码

    Upsource 一.Upsource简介 Upsource ,这是一个专门为软件开发团队所设计的源代码协作工具.Upsource能够与多种版本控制工具进行集成,包括Git.Mercurial.Sub ...

  8. 项目一:第五天 1、区域数据(pinyin4j-简码,城市编码) 2、Web层代码重构(model对象,分页代码提取) 3、区域分页查询 3、分区添加功能 4、定区管理管理-添加,分页

    Service: /** * @Description: 1.保存定区  2.让分区关联定区 * 对象三种状态 1.持久态(被session管理对象-一级缓存中有对象) 2.托管态(有OID标识,数据 ...

  9. 无感知的用同步的代码编写方式达到异步IO的效果和性能,避免了传统异步回调所带来的离散的代码逻辑和陷入多层回调中导致代码无法维护

    golang/goroutine 和 swoole/coroutine 协程性能测试对比 - Go语言中文网 - Golang中文社区 https://studygolang.com/articles ...

随机推荐

  1. ASP.NET Core微服务实战系列

    希望给你3-5分钟的碎片化学习,可能是坐地铁.等公交,积少成多,水滴石穿,码字辛苦,如果你吃了蛋觉得味道不错,希望点个赞,谢谢关注. 前言 这里记录的是个人奋斗和成长的地方,该篇只是一个系列目录和构想 ...

  2. openlayers4 入门开发系列之图层控制(附源码下载)

    前言 openlayers4 官网的 api 文档介绍地址 openlayers4 api,里面详细的介绍 openlayers4 各个类的介绍,还有就是在线例子:openlayers4 官网在线例子 ...

  3. Oracle数据库升级注意事项

    1 备份配置参数 数据库升级前的配置参数要备份,如PGA大小 这样数据库升级后还可以升级前的配置,而不至于使用安装升级时的默认配置 2 检查版本兼容 确认数据库升级后是否对生产环境上的代码有影响,如果 ...

  4. 万马齐喑究可哀-中文编程的又一波"讨论"

    刚申诉了自动折叠, 还是把回答转帖一下: 吴烜:假设中国人最先开发电脑和设计程序语言,那么各种程序语言会使用汉字吗? 这种有明显倾向性的问题怎么还有市场呢...不管谁先开发的电脑(就不论算盘之类是不是 ...

  5. Accesss数据库的DBhelper类(带分页)

    首先配置web.config,使配置文件连接access数据库: <connectionStrings> <add name="DBConnection" con ...

  6. Vue番外篇 -- vue-router浅析原理

    近期被问到一个问题,在你们项目中使用的是Vue的SPA(单页面)还是Vue的多页面设计? 这篇文章主要围绕Vue的SPA单页面设计展开. 关于如何展开Vue多页面设计请点击查看. 官网vue-rout ...

  7. 技能提升丨Seacms 8.7版本SQL注入分析

    有些小伙伴刚刚接触SQL编程,对SQL注入表示不太了解.其实在Web攻防中,SQL注入就是一个技能繁杂项,为了帮助大家能更好的理解和掌握,今天小编将要跟大家分享一下关于Seacms 8.7版本SQL注 ...

  8. Spring Cloud 微服务架构学习笔记与示例

    本文示例基于Spring Boot 1.5.x实现,如对Spring Boot不熟悉,可以先学习我的这一篇:<Spring Boot 1.5.x 基础学习示例>.关于微服务基本概念不了解的 ...

  9. Spring Boot分布式系统实践【基础模块构建3.3】注解轻松实现操作日志记录

    日志注解 前言 spring切面的编程,spring中事物处理.日志记录常常与pointcut相结合 * * Pointcut 是指那些方法需要被执行"AOP",是由"P ...

  10. Tesseract 在 windows 下的安装及简单应用

    Tesseract 是一个开源的 OCR 引擎,可以识别多种格式的图像文件并将其转换成文本,最初由 HP 公司开发,后来由 Google 维护.下载地址:https://digi.bib.uni-ma ...