大厂代码规范
引用以下网站:
-
华为技术有限公司 C语言编程规范
-
腾讯 TGideas Docs
概述
大厂的代码规范本质是为了提升协作效率、降低维护成本、保障系统稳定性,其核心围绕“可读性、可维护性、安全性、性能”四大目标展开。不同技术栈(前端、后端、移动端)的规范各有侧重,但底层逻辑一致。以下是大厂通用的代码规范框架,按技术栈分类并补充通用原则。
一、通用核心原则(跨技术栈)
无论何种语言或场景,大厂均遵循以下底层原则,是所有规范的“根”:
- 可读性优先:代码是“写给人看的,顺便能运行”。变量/函数命名、注释、格式必须让他人(甚至3个月后的自己)快速理解意图。
- 一致性至上:团队内使用统一的规范(如命名风格、缩进方式),并通过工具(如ESLint、Pylint)强制落地,避免“个人风格”导致的协作成本。
- 最小权限/职责:函数/类只做一件事(单一职责原则),变量/方法的访问权限(public/private)严格控制,避免过度暴露。
- 可测试性:代码结构需支持单元测试(如避免硬编码、依赖注入),核心逻辑必须覆盖测试用例。
- 安全性前置:编码阶段即规避常见风险(如SQL注入、XSS、空指针),而非依赖后续测试。
- 兼容性与扩展性:考虑版本兼容(如API接口的向后兼容)、业务扩展(如预留配置化入口),避免“改一处崩一片”。
二、前端代码规范(以JS/TS、HTML/CSS为例)
前端直接对接用户与浏览器,规范侧重“兼容性、可复用性、性能优化”。
1. 命名规范
元素类型 | 规范要求 | 示例 |
---|---|---|
变量/常量 | 变量用小驼峰;常量用全大写+下划线 | userName 、MAX_RETRY_COUNT |
函数/方法 | 小驼峰,动词开头(明确动作意图) | getUserInfo() 、handleSubmit() |
类/构造函数 | 大驼峰 | User 、LoginModal |
组件(React/Vue) | 大驼峰,语义明确(避免缩写) | UserProfileCard (非UserCard ) |
CSS类名 | 短横线分隔(BEM规范优先) | user-card__header--active (块-元素-修饰符) |
枚举 | 大驼峰,枚举值全大写+下划线 | enum OrderStatus { PENDING = 1, COMPLETED = 2 } |
2. 代码格式
- 缩进:统一使用2个或4个空格(大厂多偏好2空格,如React官方),禁止混合空格与Tab。
- 换行:
- 函数/类的花括号
{
不换行,与声明在同一行; - 多参数函数/长表达式需换行,保持每个参数/表达式独占一行;
- 逗号
,
后必须空格,运算符(+
、=
)前后必须空格。
- 函数/类的花括号
- 长度限制:单行代码不超过80-120个字符(避免横向滚动),长字符串用模板字符串(
${}
)拆分。
3. 语法与逻辑规范
- 变量声明:优先使用
const
(不可变),其次let
,禁止使用var
(避免变量提升问题)。 - 函数:
- 优先使用箭头函数(简洁,绑定
this
),但类方法避免用(影响this
指向); - 函数参数不超过3-4个(超过则用对象封装,如
function fn({a, b, c}) {}
); - 必须处理边界情况(如参数为空、类型错误,用
typeof
/instanceof
校验)。
- 优先使用箭头函数(简洁,绑定
- 组件(React/Vue):
- 组件拆分:复杂组件拆分为“容器组件(处理逻辑)+ 展示组件(纯UI)”;
- Props:必须定义类型(TypeScript)和默认值,禁止直接修改Props;
- 状态管理:局部状态用组件自身状态,全局状态用Redux/Vuex,避免“状态蔓延”。
- CSS:
- 避免行内样式,优先使用CSS Modules(作用域隔离)或Styled Components;
- 禁止使用
!important
(优先级失控),通过选择器权重优化样式。
4. 安全性规范
- XSS防护:React/Vue默认转义HTML,但动态插入HTML时需用
dangerouslySetInnerHTML
(并过滤危险标签); - CSRF防护:接口请求必须携带CSRF Token;
- 敏感数据:禁止在前端存储明文密码、Token等,需存在
httpOnly
Cookie中。
三、后端代码规范(以Java、Python为例)
后端对接数据库与服务,规范侧重“数据安全、并发控制、性能优化”。
1. 命名规范
元素类型 | 规范要求 | 示例 |
---|---|---|
类 | 大驼峰,名词/名词短语,语义明确 | UserService 、OrderRepository |
方法 | 小驼峰,动词开头 | createUser() 、getOrderById() |
变量/参数 | 小驼峰,避免缩写(如userName 非usrNm ) |
totalAmount 、userId |
常量 | 全大写+下划线,类级常量 | public static final int PAGE_SIZE = 20; |
包名 | 全小写,反向域名(如com.aliyun.order ) |
- |
数据库表/字段 | 下划线分隔(snake_case) | user_info 表、order_id 字段 |
2. 代码格式
- 缩进:Java/Python统一4个空格(Python强制缩进,不可混用)。
- 换行:
- 类/方法之间空2行,逻辑块之间空1行;
- 长方法调用(如链式调用)换行,每个调用独占一行:
// 正确 userService.query().eq("status", 1).page(1, 20);
- 注释:
- 类/公共方法必须加“文档注释”(Java用
/** */
,Python用""" """
),说明功能、参数、返回值、异常; - 复杂逻辑(如算法、特殊判断)加“行内注释”,解释“为什么这么做”(而非“做了什么”)。
- 类/公共方法必须加“文档注释”(Java用
3. 语法与逻辑规范
- 类设计:
- 遵循SOLID原则(单一职责、开闭原则等),一个类不超过200-300行;
- 工具类(如
DateUtils
)设为final
,并提供私有构造函数(禁止实例化)。
- 方法:
- 方法长度不超过80行(超过则拆分),只做单一职责;
- 避免“魔法值”(硬编码的数字/字符串),用常量或枚举替代:
// 错误 if (orderStatus == 1) { ... } // 正确 if (orderStatus == OrderStatus.PENDING) { ... }
- 异常处理:
- 捕获异常需明确类型(禁止
catch (Exception e)
),并处理具体场景(如NullPointerException
、SQLException
); - 异常必须打印堆栈信息(便于排查),但禁止在循环中抛异常(影响性能);
- 自定义业务异常(如
BusinessException
),区分“系统异常”与“业务异常”。
- 捕获异常需明确类型(禁止
- 数据库操作:
- 禁止直接拼接SQL(避免SQL注入),用预编译语句(
PreparedStatement
)或ORM框架(MyBatis/Hibernate)的参数绑定; - 批量操作使用
batchInsert
/batchUpdate
,避免循环单条执行; - 查询加索引,避免
SELECT *
(只查必要字段),大表查询分页。
- 禁止直接拼接SQL(避免SQL注入),用预编译语句(
4. 并发与性能规范
- 线程安全:
- 共享变量需用
volatile
或锁(synchronized
/ReentrantLock
)控制; - 优先使用线程安全的集合(
ConcurrentHashMap
),避免HashMap
在并发下扩容异常。
- 共享变量需用
- 资源释放:
- 流(
InputStream
)、数据库连接、锁等资源必须在finally
或try-with-resources中释放; - 避免内存泄漏(如静态集合持有对象引用、线程池未关闭)。
- 流(
- 接口设计:
- 接口必须做参数校验(非空、格式、范围),用注解(如Java的
@NotNull
)或工具类(ValidationUtils
); - 核心接口加限流、熔断(如Sentinel),避免被高并发打垮。
- 接口必须做参数校验(非空、格式、范围),用注解(如Java的
四、移动端代码规范(以iOS/Android为例)
移动端受设备性能、系统版本限制,规范侧重“流畅度、功耗、兼容性”。
1. 命名规范(以iOS-Swift、Android-Kotlin为例)
元素类型 | iOS-Swift规范 | Android-Kotlin规范 |
---|---|---|
类/结构体 | 大驼峰,如UserViewController |
大驼峰,如UserActivity |
方法 | 小驼峰,动词开头,如fetchUserList() |
小驼峰,如loadUserInfo() |
变量/属性 | 小驼峰,如userNameLabel |
小驼峰,如tvUserName (控件前缀:tv-TextView) |
常量 | 大驼峰+let ,如let MaxRetryCount = 3 |
全大写+下划线,如const val MAX_RETRY_COUNT = 3 |
2. 核心规范
- UI相关:
- 布局优先用约束(AutoLayout/ConstraintLayout),避免固定坐标(适配不同屏幕);
- 图片资源适配多分辨率(iOS的@2x/@3x,Android的mdpi/xhdpi);
- 避免在主线程做耗时操作(如网络请求、数据库查询),必须放子线程(iOS用
DispatchQueue.global
,Android用Coroutine
)。
- 性能优化:
- 列表(UITableView/RecyclerView)复用Cell/Item,避免卡顿;
- 图片懒加载、压缩,避免内存溢出(OOM);
- 减少启动耗时:延迟初始化非核心组件,避免启动时加载过多资源。
- 兼容性:
- 适配最低系统版本(如iOS 13+、Android 8.0+),调用高版本API前需判断系统版本;
- 权限申请:动态申请敏感权限(相机、位置),并处理“用户拒绝”的场景。
五、规范落地工具(大厂必备)
规范不是“靠自觉”,而是靠工具强制约束。大厂均会集成以下工具:
工具类型 | 前端常用工具 | 后端常用工具 |
---|---|---|
代码检查(Lint) | ESLint(JS/TS)、StyleLint(CSS) | Pylint(Python)、Checkstyle(Java) |
代码格式化 | Prettier(全前端) | Google Java Format、Black(Python) |
类型校验 | TypeScript、Flow | Java(泛型)、Python(Type Hint) |
提交校验 | Husky + lint-staged(提交前检查) | GitLab CI/CD(提交后触发检查) |
静态代码分析 | SonarQube(检测漏洞、重复代码、复杂度) | FindBugs(Java) |
六、补充:文档与提交规范
- 文档规范:
- 接口文档:用Swagger/OpenAPI自动生成,包含请求参数、返回值、错误码;
- 架构文档:核心模块画流程图(如时序图、类图),用DrawIO/Figma;
- 注释文档:公共API必须写注释,工具类需说明“适用场景”与“注意事项”。
- Git提交规范:
- 提交信息格式:
类型(模块): 描述
,如feat(login): 新增短信验证码登录
; - 常见类型:
feat
:新功能fix
: bug修复docs
:文档更新style
:代码格式调整(不影响逻辑)refactor
:重构(既无新功能也无bug修复)
《数学之美》读后感
初读《数学之美》中 “余弦定理与新闻分类” 一章时,我正对着杂乱的新闻聚合页面发愁:科技快讯与社会热点混杂交织,娱乐八卦与财经分析边界模糊,仿佛一堆被打乱的拼图,让人难以快速捕捉有效信息。而当看完吴军博士对 “如何用数学驯服信息乱象” 的拆解,我竟生出一种 “原来复杂问题的解法可以如此优雅” 的惊叹 —— 这章最迷人的地方,莫过于让我看见数学如何将抽象的 “相似性” 转化为可计算的 “确定性”,在无序的信息海洋中搭建起清晰的秩序框架。
这一章的核心逻辑并不晦涩,却颠覆了我对 “分类” 的固有认知。过去我总以为,新闻分类依赖编辑的主观判断:给 “人工智能突破” 贴上 “科技” 标签,给 “央行降息” 归为 “财经”,全凭内容与类别的直观关联。但吴军博士却揭示了大厂背后的技术本质:用数学语言重新定义 “相似性”。首先将新闻转化为 “向量”—— 以词汇为坐标轴,以词频为坐标值,一篇几千字的报道便浓缩成一组数字;接着用中学课本里的余弦定理计算两个向量的夹角,夹角越小,新闻主题越相近,分类便有了量化依据。这个过程像给每篇新闻戴上了 “数学身份证”,无需人工干预,机器就能精准完成归类。
最让我触动的,是这种解法中蕴含的 “化繁为简” 的数学智慧。新闻分类的本质是解决 “信息相似度匹配” 的难题,而人类语言的模糊性、多义性本是最大障碍 —— 同样的 “苹果” 可能指水果,也可能指科技公司;“跑路” 可形容离职,也可描述企业破产。但数学工具巧妙地绕开了语义理解的陷阱,用 “向量 + 余弦定理” 的组合,将语言问题转化为几何问题。就像吴军博士举的例子:两篇都高频出现 “人工智能”“算法”“芯片” 的报道,即便表述方式截然不同,其向量夹角也会趋近于零,自然被归为同一类。这种 “抓本质、弃表象” 的思路,让我突然明白为何说 “数学是科学的语言”—— 它能穿透事物的复杂性,找到最底层的逻辑关联。
更深刻的启发在于,这章内容撕开了 “高科技” 的神秘面纱。我们日常使用的新闻 APP、搜索引擎,背后都藏着诸如此类的数学原理。过去我总以为这些功能依赖 “高深莫测的算法”,却没想到核心工具竟是中学就掌握的余弦定理。这让我意识到,技术的进阶往往不是创造全新的理论,而是将基础数学原理创造性地应用于现实问题。正如吴军博士所言:“复杂的应用问题,往往只需要简单的数学工具。” 这种 “以简驭繁” 的思维方式,不仅适用于计算机科学,更适用于生活中的各种难题 —— 当我们面对一团乱麻的任务时,或许也该学学这种 “向量思维”,剥离无关细节,抓住核心要素,问题便会清晰许多。
合上书页再看手机里的新闻 APP,那些整齐归类的栏目突然有了不一样的意义。每一条新闻的精准定位,都是余弦定理在数字世界的无声运作;每一次顺畅的信息获取,都源于数学对秩序的构建。这章内容不仅让我读懂了新闻分类的技术原理,更让我体会到数学的 “实用之美”—— 它不是课本上冰冷的公式,而是能驯服混沌、创造效率的强大工具。这种美,藏在向量与夹角的计算里,藏在复杂问题的简洁解法中,更藏在人类用理性思维理解世界的努力中。