前言:新手上路,请多指教,欢迎交流,文中有些例子举例可能不太好,欢迎指正;本文暂时先丢弃顺序,后续有空再整理
本文在《代码大全2》中能找到完整的文字描述,本文只是简单记录一下自己的读书心得
本文的代码举例有可能有错误,毕竟是直接写的
重在表意 ,大概意思到了就好了
阅读规则、要求:待定、简单C#、lua语法知识,或者甚至不用
1. 变量的声明应该遵循某种命名规则
常用的命名方法有两种,一种是 Pascal 命名法(帕斯卡命名法),Pascal 命名法是指每个单词的首字母大写;
另一种是 Camel 命名法(驼峰命名法)。Camel 命名法是指第一个单词小写,从第二个单词开始每个单词的首字母大写。
Pascal 命名法:StudentName、StudentClass
Camel 命名法:studentName、 studentClass
**命名根据项目中怎么用来决定**
2.在声明变量的时候,需要初始化它的值 , 在靠近变量第一次使用的位置初始化它
在靠近变量第一次使用的位置初始化它,能让你更直观的了解到这个变量是做什么的,涉及到了什么的
//**不规范举例**, sum变量
int sum = 0;
//中间省略N行没用到过sum的代码
//中间省略N行没用到过sum的代码
//中间省略N行没用到过sum的代码
//中间省略N行没用到过sum的代码
//中间省略N行没用到过sum的代码
//中间省略N行没用到过sum的代码
//中间省略N行没用到过sum的代码
//中间省略N行没用到过sum的代码
//中间省略N行没用到过sum的代码
//中间省略N行没用到过sum的代码
//中间省略N行没用到过sum的代码
sum = GetArrarySum(intArrary);
//**规范举例** sum 变量
//省略N行没用到过sum的代码
//省略N行没用到过sum的代码
//省略N行没用到过sum的代码
//省略N行没用到过sum的代码
//省略N行没用到过sum的代码
//省略N行没用到过sum的代码
//省略N行没用到过sum的代码
//省略N行没用到过sum的代码
//省略N行没用到过sum的代码
//省略N行没用到过sum的代码
//省略N行没用到过sum的代码
int sum = 0;
sum = GetArrarySum(intArrary);
//或者可以写成
int sum = GetArrarySum(intArrary);
好处:能直接看到它的值是什么,便于阅读(扩展起来甚至可以说是便于维护…)
3.注意变量的生命周期,尽可能的缩短变量的存活时间
举例如2
目的:短生命周期,说明你的变量所涉及到的其它代码、逻辑更少,也就是说你这个变量的目的性更强,和其它语句的耦合更少
4.每个变量只用于单一的用途
//**不规范举例**
int sum = 0;
int tempSum = 0;
for(int i = 0; i < 10; i++){
tempSum += i;
}
sum = tempSum;
//上面是tempSum的一个使用位置
//下面是tempSum的第二个使用位置
//交换两个值
int valueLeft= 5;
int valueRight = 10;
tempSum = valueLeft;
valueLeft= valueRight;
valueRight = tempSum;
坏处:不符合 2、3规则
//**规范举例**
int sum = 0;
int tempSum = 0;
for(int i = 0; i < 10; i++){
tempSum += i;
}
sum = tempSum;
//交换两个值
int valueLeft= 5;
int valueRight = 10;
int temp = valueLeft;
valueLeft= valueRight;
valueRight = temp;
好处:变量涉及的区域少,可以快速知道变量的作用等…
5.使变量有自说明性
良好的变量应该有自说明性,甚至可以让你不用注释、或者让你读到这段代码的时候不需要进行过多的思考,我是谁我在哪为什么
//**不规范举例,包含函数的命名,可能过于夸张**
int a = daqlwijwd(hdstgsg);
//求解:a 是什么? ,daqlwijwd这个方法做了什么
//**规范举例**
int sum = GetArrarySum(arrary);
//求解:sum 是什么? ,GetArrarySum这个方法做了什么
6.较长的名字适用于很少用到的变量,或者全局变量,而较短的名字适用于局部变量或者循环变量
同样的,可读性直接上升,使其成为一个条件反射式的东西,当你读到这样命名规范的时候,你可以知道这是做什么的
比如项目中用到的命名:UPDATE_QUEST_RED_DOT
我一看到这个我就知道,这是一个全局的数据,是关于任务红点事件的
7.变量的命名使用反义词 ----布尔类型
布尔类型只会有两种值,true 、 false
因此使用反义词可以使你的代码可读性大增
//试试能不能一眼知道值是做什么的
bool startDownload = true;
bool endDownload = false;
bool startWalk = true;
bool endWalk = false;
//这应该不难吧
8.给临时变量命名,使其可读性增加
--这个例子用 lua 代码
for i,v pairs(xxx) do
print(v) -- 求问v是什么
end
--
for id,name pairs(xxx) do
print(name) -- 求问name 是什么
end
9.使用肯定的布尔变量名
使用正向的布尔变量命名更符合人的习惯,虽然双重否定也是能读懂的,但是毕竟没有单重否定直接,而且更简单
--**不规范举例**
local notFound
if not notFound then
--todo something
end
--**规范举例**
local found
if not found then
--todo something
end
10.提取相同属性或者类似的变量,然后把他写为 枚举类型
//定义四季
const int spring = 0;
const int summer = 1;
const int autumn = 2;
const int winter = 3;
//改为season或许更合适
enum Season{spring, summer, autumn, winter};
11.避免使用神秘的数字,比如100或者123456
可读性!!!
易维护!!!
//有一个方法,传大于0的int参数 N 进去,作为天数,计算 N 天 有多少秒
int GetSecondsByDay(int day){
return day * 24 * 60 * 60;
}
这样写有什么弊端呢
1.可读性,24 是什么? 60是什么?,第二个60又是什么?
2.维护问题,万一后面一天变成25个小时呢,你是不是要单独进来这里改24改成25?或者23小时呢?
//在某个地方定义 时 分 秒
//所有地方共用这个时分秒,同步所有数据
//更改的时候只更改这里就好了
//(但是项目中肯定不是这样的,此处只是举个简单的例子)
const int Day = 24;
const int Hour = 60;
const int Minute = 60;
//有一个方法,传大于0的int参数 N 进去,作为天数,计算 N 天 有多少秒
int GetSecondsByDay(int day){
return day * Day * Hour * Minute ;
}
12.使用布尔变量来简化复杂的判断
适用于 if (条件){
//todo
}
条件 语句过长的情况
bool IsPlayerDie(生命值,是否直接死亡){
if(生命值 <= 0 && 没有蛮王大招 && 没有复活甲 || 是否直接死亡)
//死亡
}
//改成
bool IsPlayerDie(生命值,是否直接死亡){
bool 普通死亡判断 = 生命值 <= 0 && 没有蛮王大招 && 没有复活甲
if(普通死亡判断 || 是否直接死亡){
//死亡
}
}
13.可以使用结构体来简化参数列表
当传递的参数过多的时候,试试把参数优化一下,做成一个结构体?
//打印学生的资料
void PrintStudentInfo(int id, string name, int classNumber,
string address../*忽略n个属性*/)
{
print(id);
print(name);
print(classNumber);
print(address);
...
}
//改写:
void PrintStudentInfo(Student student)
{
print(student.id);
print(student.name);
print(student.classNumber);
print(student.address);
...
}
14不要把局部数据写成全局数据
明明是一个方法里面用到的变量,其他地方并没有用到,为什么我要把它写在方法外面?
15.使用全局数据的时候,应当用命名突出作用
举例如 6,我能一看看出这个变量做什么用的,是关于哪里的,不是因为我看代码厉害,而是别人的代码写的规范
也许未完…