code重构学习心得和实践

来源:互联网 发布:网络教育本科统考免考 编辑:程序博客网 时间:2024/05/18 00:11

        coding本来就是就是门艺术,不懂它的人看到什么样code都一样,只有懂它的人才能看出好的code的美。大师级的艺术家随手的作品都很美,所以在我们没有成为大师级艺术家的时候我们就需要对我们的code不停的进行重构,在重构当中去不段的成长,在重构中不段让我们的code变的更美。有些人可能会说代码重构没有多大意思,有重构代码的时间还不如把时间用来多写点代码,其实写烂代码的人你再写多少代码还是那么烂,个人觉得不是在产正能量而是在做负能量。对于做小项目的人来说可能无所谓,代码再烂只是用在这个项目上,后面的项目又重新写代码,但是对于做大项目和长期产品的人来说不同,你需要在前期的需求上不断的磊代码,如果前面的代码写的烂,到了后边磊不了多久代码就会崩了,每天做的事不是在做新的需求,而是在不停的解bug。所以我个人觉得我们有时间就应该把我们写的代码进行不停的重构,函数级重构、模块级重构、框架级重构,只有把函数级重构做好了才能为模块级重构、框架级重构打好基础。在我们自己review代码的时候,如果很难看懂函数功能的话,多半这个函数是有问题的,也就是需要我们去重构的。每天重构一点,日积月累效果就出来了,你会发现自己看护的代码问题单越来越少,加班时间也会越来越少。很多公司很推崇救火英雄,但是我个人觉得那种随时都在救自己火的事就没有什么意愿了。

        昨天学习了点重构的知识,也尝试了下随便把自己以前写的一个函数拿来重构了一下:

       重构前的代码:

static int FBShowPixel(int iX, int iY, unsigned int dwColor)
{
unsigned char *pucFB;
unsigned short *pwFB16bpp;
unsigned int *pdwFB32bpp;
unsigned short wColor16bpp; /* 565 */
int iRed;
int iGreen;
int iBlue;


if ((iX >= g_tFBVar.xres) || (iY >= g_tFBVar.yres))
{
DBG_PRINTF("out of region\n");
return -1;
}


pucFB      = g_pucFBMem + g_dwLineWidth * iY + g_dwPixelWidth * iX;
pwFB16bpp  = (unsigned short *)pucFB;
pdwFB32bpp = (unsigned int *)pucFB;

switch (g_tFBVar.bits_per_pixel)
{
case 8:
{
*pucFB = (unsigned char)dwColor;
break;
}
case 16:
{
/* 从dwBackColor中取出红绿蓝三原色,
* 构造为16Bpp的颜色
*/
iRed   = (dwColor >> (16+3)) & 0x1f;
iGreen = (dwColor >> (8+2)) & 0x3f;
iBlue  = (dwColor >> 3) & 0x1f;
wColor16bpp = (iRed << 11) | (iGreen << 5) | iBlue;
*pwFB16bpp = wColor16bpp;
break;
}
case 32:
{
*pdwFB32bpp = dwColor;
break;
}
default :
{
DBG_PRINTF("can't support %d bpp\n", g_tFBVar.bits_per_pixel);
return -1;
}
}


return 0;
}


重构后的代码:

static unsigned short getSixteenBitColor(unsigned int uidwColor)
{
unsigned short usColor16bpp;
int iRed;
int iGreen;
int iBlue;

iRed   = (dwColor >> (16+3)) & 0x1f;
iGreen = (dwColor >> (8+2)) & 0x3f;
iBlue  = (dwColor >> 3) & 0x1f;
usColor16bpp = (iRed << 11) | (iGreen << 5) | iBlue;

return usColor16bpp;
}


static unsigned char * getMemOfFB(int iX, int iY)
{
int iLineLength;
int iWidthLength;
unsigned char *pucMemOfFB;

if ((iX >= g_tFBVar.xres) || (iY >= g_tFBVar.yres))
{
DBG_PRINTF("out of region\n");
return -1;


iWidthLength = g_dwPixelWidth * iX;
iLineLength = g_dwLineWidth * iY;
pucMemOfFB = g_pucFBMem + iLineLength + iWidthLength;

return pucMemOfFB;
}


static int setFBShowPixel(int iX, int iY, unsigned int uiDrawColor)
{
unsigned char *pucFB8bpp;
unsigned short *pusFB16bpp;
unsigned int *puiFB32bpp;

switch (g_tFBVar.bits_per_pixel)
{
case 8:
{
pucFB8bpp = getMemOfFB(iX, iY);
*pucFB8bpp = (unsigned char)dwColor;
break;
}
case 16:
{
pusFB16bpp  = (unsigned short *)getMemOfFB(iX, iY);
*pusFB16bpp = getSixteenBitColor(dwColor);
break;
}
case 32:
{
puiFB32bpp = (unsigned int *)getMemOfFB(iX, iY);
*puiFB32bpp = dwColor;
break;
}
default :
{
DBG_PRINTF("can't support %d bpp\n", g_tFBVar.bits_per_pixel);
return -1;
}
}

return 0;
}

重构原因:抽象层不统一,函数功能的意思是设置屏幕上一点的颜色,但是函数中做的事有获取屏幕点的内存映射、组织颜色,获取屏幕点的内存映射、组织颜色应该放到更加低一层的抽象进行处理。

        处理过程:把获取屏幕点的内存映射、组织颜色提取出来分别组成一个独立的函数,然后在设置屏幕上一点的颜色的函数中用的的时候直接调用,而不是再自己去实现。

       重构后的好处:抽象层得到了统一,而且每一个函数的功能独立,让阅读代码的人能够很容易的看懂每一个函数在做什么。

PS:由于个人能力有限,后期在学习当中再对此函数进一步的进行重构,写文档的目的只是为了对学习的东西进行梳理,为后面的学习做个打点记录,对知识进行分享,这就是code monkey的乐趣。

0 0