垃圾代码编写指南_C语言版
前言
作为一名程序员,通常都需要跟别人协作编写代码。https://github.com/trekhleb/state-of-the-art-shitcode 是一个教你如何编写 💩 代码的教程,但是这个教程的代码示例是用 JavaScript 编写的,在本文我将其转成了经典的C语言,并且将一些语言风格写成符合中国程序员的编码习惯
代码编写原则
💩 定义变量的时候,尽可能用混淆的方式
变量命名的时候尽可能写短,能节省敲代码的时间
正确做法 👍🏻
1 | int a = 42; |
错误做法 👎🏻
1 | int age = 42; |
💩 采用变量/函数的混合命名风格
命名风格要采取多样化,彰显个人魅力
正确做法 👍🏻
1 | int wWidth = 640; |
错误做法 👎🏻
1 | int windowWidth = 640; |
💩 永远不要写注释
程序员最讨厌的两件事是:
- 别人的代码不写注释
- 别人让自己给代码写注释
正确做法 👍🏻
1 | const int cdr = 700; |
错误做法 👎🏻
注释应该包含一些”为什么”而不是”做了什么”。如果代码中的”做了什么”不清楚,那么代码可能太混乱了。
1 | // 700ms的数量是根据UX A/B测试结果进行经验计算的。 |
💩 尽量用母语写注释
中国人写注释当然要用中文,怎么可能用英语这种通用语言,当然是怎么爽怎么来
正确做法 👍🏻
1 | // 错误时隐藏模态窗口。 |
错误做法 👎🏻
1 | // Hide modal window on error. |
💩 尽可能混合各种格式风格
跟上述变量命名的原则一样,保持个性化~
正确做法 👍🏻
1 | char* i[] = {"tomato", "onion", "mushrooms"}; |
错误做法 👎🏻
1 | char* ingredients[] = {"tomato", "onion", "mushrooms"}; |
💩 把代码都写到一行
正确做法 👍🏻
1 | void parse_url_params(char* url, char* params) { char* p=strstr(url,"?");if(!p)return;p++;char* token=strtok(p,"&");while(token!=NULL){char* eq=strchr(token,'=');if(eq){*eq='\0';strcat(params,token);strcat(params,"=");strcat(params,eq+1);strcat(params,";");}token=strtok(NULL,"&");}} |
错误做法 👎🏻
1 | void parse_url_params(char* url, char* params) { |
💩 不要做异常处理
程序中任何可能出现异常的代码片段,没必要去捕捉,也不要写日志进行记录,更不要弹出啥错误提示,让你的协作者自己猜可能的报错原因就好了
正确做法 👍🏻
1 | FILE* file = fopen("important.dat", "r"); |
错误做法 👎🏻
1 | FILE* file = fopen("important.dat", "r"); |
💩 大量使用全局变量
吕蒙过江,我也过江,别的函数能使用的变量,我为什么不能访问到?所以要多使用全局变量
正确做法 👍🏻
1 | int x = 5; |
错误做法 👎🏻
1 | int x = 5; |
💩 多创建一些用不到的变量
以备不时之需。
正确做法 👍🏻
1 | int sum(int a, int b, int c) { |
错误做法 👎🏻
1 | int sum(int a, int b) { |
💩 如果你的编程语言允许,不要指定类型和/或不做类型检查
代码跑的怎样你别管,你就说能不能跑吧
正确做法 👍🏻
1 | void* sum(void* a, void* b) { |
错误做法 👎🏻
1 | int sum(int a, int b) { |
💩 你需要有一段永远无法执行到的代码
没想到吧 jojo 这就是我的逃跑路线!
正确做法 👍🏻
1 | int square(int num) { |
错误做法 👎🏻
1 | int square(int num) { |
💩 三角形原则
像鸟一样筑巢,一层又一层。
正确做法 👍🏻
1 | void someFunction() { |
错误做法 👎🏻
1 | void someFunction() { |
💩 搞乱缩进
避免使用缩进,因为它们会使复杂的代码在编辑器中占用更多空间。如果你不想避免它们,那就把它们弄乱。
正确做法 👍🏻
1 | const char* fruits[] = {"apple", |
错误做法 👎🏻
1 | const char* fruits[] = {"apple", "orange", "grape", "pineapple"}; |
💩 总是将你的逻辑判断的变量命名为 flag
布尔变量统一命名为 flag
,如果有多个逻辑变量,那就定义成 flag+数字
,以此类推
至于这个逻辑变量到底是判断啥逻辑的,你别管,让你的协作者猜就好了
正确做法 👍🏻
1 | bool flag = 1; |
错误做法 👎🏻
1 | bool isDone = 0; |
💩 长函数比短函数更好
不要将程序逻辑分割成可读的片段。如果你的IDE搜索功能出故障,你将无法找到必要的文件或函数,那该怎么办?
- 10000 行代码在一个文件中是可以的。
- 1000 行的函数体是可以的。
- 在一个
service.c
中处理许多服务(第三方和内部的,还有一些辅助工具、手写的数据库ORM和套接字实现)?没问题。
💩 避免用测试覆盖你的代码
这是重复和不必要的工作量。代码能跑就行了,还测试啥
💩 尽可能避免使用代码检查工具
按照你想要的方式编写代码,尤其是当团队中有多个开发人员时。这是一种”自由”原则。
💩 在没有 README 文件的情况下开始你的项目
写啥说明文档啊,让用户自己摸索就好了
💩 代码冗余是有必要的
不要删除你的程序没有使用的代码。最多,注释掉它。