本规范适用于所有编程语言

关于代码规范的简单原则,以下几条同等重要

  • 实现需求
  • 可维护性高
  • 性能高

可维护性与性能有时候是冲突的,追求可维护性可能会牺牲性能,追求性能可能会损害可维护性;二者必须有所取舍;所以针对这两者有以下几条建议,六四开即可:

  • 对于基础的、公共的代码,在实现功能,追求性能的前提下保证可维护性
  • 对于业务相关的代码,在实现功能,追求可维护性的前提下保证性能

可维护性又包含以下几点

  • 易读性
  • 可扩展性

可维护性是为了后面的人考虑,后面的人包括将来可能接手这部分代码的人,也包括未来的自己。自己的代码易维护,未来的自己会感谢过去的付出;交接更简单,别人也会感谢你。自己才可能有更多时间做更多事,否则只能在几件固定的事情上转转,在计算机的这个领域如果一直只能在固定的事情上转,进步就太有限了。

名词解释:

  • 字面值:出现在代码中的基本类型值和字符串为字面值。又称做字面量、魔数、魔鬼数字、常量值。
let a=1//1在此处为字面值
  • 驼峰命名法(camel):第一个单词首字母小写,后面每个单词首字母大写
  • 帕斯卡命名法(Pascal):又称做大驼峰命名法,每个单词首字母大写
  • 蛇型命名法:全小写、下划线分割各个单词

所有规范里面首先必须遵守的原则:

  1. 标识符命名
    • 要见名知义,不要有二义性。代码就是你的孩子,一定要给孩子起个好名字。
    • 只使用英文和下划线命名,标识符不要出现英文和下划线以外的任何字符,也不要使用拼音命名标识符。
      • 包名、项目名使用蛇形命名法,且命名应尽量简短,避免冗长。
        • 不要反转域名作为包名
      • 类、结构体、枚举、接口使用驼峰命名法
      • 函数(包括成员函数、顶级函数)、变量(包括顶级变量、成员变量)、属性、函数参数使用帕斯卡命名法
      • 对于类、结构体、枚举、接口等.cj源文件,文件名必须与这些声明的类型名完全一致,比如有一个类名叫做TimeWheel,文件名必须是TimeWheel.cj
      • 对于顶级函数顶级变量应当在专门的文件声明,与类、结构体、枚举、接口的声明在文件上分开,且声明它们的文件名采用蛇形命名法。
      • 如果一个文件内有不止一个声明,应以文件内的主要功能或声明作为文件名。
  2. 包与模块的划分
    • 同一类的功能划分到同一模块
    • 一个包内的代码完成同一个目的的功能
    • 一个类、结构体内部完成一件事
    • 一个函数完成一件事的某一步。
  3. 类与结构体的选择
    • 结构体用于声明不变模式、适用于数量比较少的小类型(实例成员变量少、成员变量占用空间小)。
    • 对于实例特别多特别集中的情况,适合声明为类,即使每一个实例成员都很少、占用空间也很小,比如DataModel和json库。

业务实现规范

  1. None和空字符串不能拥有业务含义。
  2. 只有一种情况下0可以有业务含义,即某些业务逻辑的起始状态可以从0开始。
  3. 如果已经有代码已经给这些值赋予了业务意义且很难改变了,新的与之无关的代码要保证这一点。

重复代码与公共代码

  1. 服务器逻辑要逐步做到按照模块划分子工程。前端逻辑也要逐步做到按照模块划分子目录或子模块。
  2. 服务器逻辑实现服务化,一个业务内的代码只出现在相关子工程内以RPC服务的形式开放给其它模块调用。
  3. 服务器业务无关的代码在公共子工程内,其它子工程通过maven添加公共代码包依赖。
  4. 前端业务无关的代码在公共子工程内,其它模块通过通用域名访问,比如名为common的二级域名

关于版本控制

  • git的master,只能有一个工程的目录结构,不能在主干目录下创建其它目录结构。
  • 所有git分支目录分为以下几类
    1. 仓颉SDK长期支持版本项目分支以lts/开头,仓颉版本号结尾,比如仓颉1.0.x创建分支为lts/1.0
    2. 仓颉SDK短期支持版创建分支为sts/x.y
    3. 对于有重大变更的nightly可以创建分支为nightly/x.y

技术选型

所有同类api库或框架只使用一种 良好的代码风格,在形成阶段可能会很痛苦,一旦形成习惯,将会提升很多的开发效率。 保持风格一致,会降低很多沟通成本。 我们的目标是:所有代码看起来像一个人实现的。这个“人”就是我们整个的开发团队。

代码风格

  1. 尽快忘记过往编程习惯,并形成新的编程思想
    • 每种编程语言都有自己的特色,也必然拥有自己独特的编程思想
    • 不要受过往经验束缚,也不要试图跟自己主用编程语言比较,否则会阻碍迅速掌握一种编程语言
      • 仓颉是编译期优化的静态语言,不要试图用拥有动态特性的语言跟它类比。
      • 多学习几种编程语言,不一定用它们开发,主要是为形成灵活的编程思想。掌握的语言多了,自然就容易形成每种语言都有独特的编程思想的认识。
      • 语言既思想,语言会影响人的思维。自然语言如此,编程语言也是。所以不要期待可以一招鲜吃遍天。
        • 开发者只能顺应语言特性实现功能
        • 而不是停留在过往的舒适区,用一套编程思想面对各种编程语言。
        • 就像没有人能用汉语思维学习英语,反过来也不能。
  2. 仓颉是图灵完全的编程语言。
    • 我相信不存在用别的语言能实现,用仓颉却实现不了的功能。