程序员的进步在哪里?

简介

作为一个合格的程序员,需要不停地学习新的知识,不断积累,提高个人能力。如果你看自己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表达式把类也省了,不过不推荐,语法糖而已。实质感觉跟小学生程序员的写法差不多。


当然,程序员的进步不仅仅体现在这一个方面,不要在意实例中的代码细节,体会这种思想的转变。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Barry__

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值