简介
作为一个合格的程序员,需要不停地学习新的知识,不断积累,提高个人能力。如果你看自己3个月前的代码,感觉很垃圾,
那么恭喜你进步了,如果你看自己半年前的代码还觉得我写的最棒,只能说明你止步不前。(个人观点,不喜请喷)
正文
下面我用一个简单的实例来说明简介中的观点,我有一个需求如下:
对一个文件依次进行5次写入数据操作。
如果把不同能力的程序员按照学生的学籍来划分的话,我们来看一下不同学籍的程序员的写法(示例代码均为伪代码)
小学生程序员的写法
HANDLE hFile = INVALID_HANDLE_VALUE;
hFile=CreateFile(...);
if(INVALID_HANDLE_VALUE == hFile)
{
return;
}
if(!WriteFile(hFile, ...))
{
CloseHandle(hFile);
return;
}
if(!WriteFile(hFile, ...))
{
CloseHandle(hFile);
return;
}
if(!WriteFile(hFile, ...))
{
CloseHandle(hFile);
return;
}
if(!WriteFile(hFile, ...))
{
CloseHandle(hFile);
return;
}
if(!WriteFile(hFile, ...))
{
CloseHandle(hFile);
return;
}
CloseHandle(hFile);
return;
这种写法弊端显而易见,处处要记着CloseHandle,代码略显冗余
中学生程序员的写法
HANDLE hFile = INVALID_HANDLE_VALUE;
hFile=CreateFile(...);
if(INVALID_HANDLE_VALUE == hFile)
{
return;
}
if(!WriteFile(hFile, ...))
{
goto Err;
}
if(!WriteFile(hFile, ...))
{
goto Err;
}
if(!WriteFile(hFile, ...))
{
goto Err;
}
if(!WriteFile(hFile, ...))
{
goto Err;
}
if(!WriteFile(hFile, ...))
{
goto Err;
}
Err:
CloseHandle(hFile);
return;
有的公司不让用goto,没事,中学生程序员还有另一种写法
HANDLE hFile = INVALID_HANDLE_VALUE;
hFile=CreateFile(...);
if(INVALID_HANDLE_VALUE == hFile)
{
return;
}
do
{
if(!WriteFile(hFile, ...))
{
break;
}
if(!WriteFile(hFile, ...))
{
break;
}
if(!WriteFile(hFile, ...))
{
break;
}
if(!WriteFile(hFile, ...))
{
break;
}
if(!WriteFile(hFile, ...))
{
break;
}
}while(0)
CloseHandle(hFile);
return;
这种写法巧妙的利用了do while
大学生程序员的写法(RAII写法,仅限于面向对象)
CAutoFileHandle autoFileHandle(...);
if(!autoFileHandle.WriteFile(...))
{
return;
}
if(!autoFileHandle.WriteFile(...))
{
return;
}
if(!autoFileHandle.WriteFile(...))
{
return;
}
if(!autoFileHandle.WriteFile(...))
{
return;
}
if(!autoFileHandle.WriteFile(...))
{
return;
}
return;
class CAutoFileHandle
{
public:
CAutoFileHandle(...)
{
m_hFile = CreateFile(...);
}
~CAutoFileHandle(...)
{
if(INVALID_HANDLE_VALUE != m_hFile)
CloseHandle(m_hFile);
}
bool WriteFile(...)
{
if(INVALID_HANDLE_VALUE == m_hFile)
return false;
return WriteFile(m_hFile, ...);
}
private:
HANDLE m_hFile;
};
这种写法巧妙的运用了局部变量生命周期,析构的时候去closehandle,你再也不用处处想着要closehandle了。
RAII是一种思想,不仅限于此例,任何成对出现的API都可用RAII,例如其他需要关闭的句柄,socket等
还可以结合临界区,做成自动锁,示例如下:
RAII写法很是推荐,尤其是代码复杂的时候,不用处处想着清理相关资源
但个人感觉也有缺点,就是每次都要写一个类,对于简单些的逻辑处理使用RAII感觉有些杀鸡用牛刀。
研究生程序员的写法(lamda表达式,仅限c++11)
HANDLE hFile = CreateFile(...);
if(INVALID_HANDLE_VALUE == hFile)
auto f = [hFile] {CloseHandle(hFile);};
else
return;
if(!WriteFile(hFile, ...))
return f;
if(!WriteFile(hFile, ...))
return f;
if(!WriteFile(hFile, ...))
return f;
if(!WriteFile(hFile, ...))
return f;
if(!WriteFile(hFile, ...))
return f;
return f;
这种写法利用c++11里的lamda表达式把类也省了,不过不推荐,语法糖而已。实质感觉跟小学生程序员的写法差不多。
当然,程序员的进步不仅仅体现在这一个方面,不要在意实例中的代码细节,体会这种思想的转变。