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的乐趣。
- code重构学习心得和实践
- 重构 读后感和实践
- 版本控制实践和学习心得
- [重构]Duplicated code
- C#.NET4.0学习心得-1:重构
- 重构实践
- 代码重构实践
- SOA实践 -- 使用IoC和AOP重构SOA应用
- SOA实践 -- 使用IoC和AOP重构SOA应用
- SOA实践 -- 使用IoC和AOP重构SOA应用
- Java多线程和并发编程实践的学习心得----基础篇
- 干货|敏捷实践重构
- Spring学习心得(10)-- 利用注解重构mvc
- 机房重构——透过实践看Datatable和泛型
- 重定向Http status code 303 和 302
- 重构实践——重构的小例子
- 数据库重构工具实践总结
- 重构实践,优化技能释放代码
- 论斯芬克司吃人的合理性。
- Android API Guides 之 App Resources(1) - Overview
- 卡布列克运算
- 高阳:我是黑客我怕谁
- Linux 新手非常有用的 20 个命令
- code重构学习心得和实践
- A Bug's LifeA Bug's Life
- 从杂乱到有序并不简单--排序算法 http://blog.csdn.net/yixueming/article/details/22901349
- Android API Guides 之 App Resources(2) - Providing Resources
- linux下vmstat命令解析 (性能相关以及系统性能诊断)
- UML类图各种关系详解
- Android API Guides 之 App Resources(3) - Accessing Resources
- 【Redis】初探dict字典原理的实现(二)
- 奇异值分解SVD应用——LSI