这几周,看了各种各样的代码,经过一堆代码review,也有了一些基本上的码农感觉。打算记录下来,这样以后忘记了还能回来看看。本来上个星期就想写这篇文章的,结果星期天晚上被叫回去修bug了。。
下面分css和js来记录。
css:
在传统意义上,css的书写,只要能够将效果表现出来,同时前面的selector不要太长就好。这样在项目比较小的时候,修改起来就十分方便。但是,当整个项目开始极度膨胀以后,css就会变得极其庞大。1000+行的css轻轻松松就能写到。
在review过程中,可以发现,大部分的css都是无法重用的。一个button样式,基本都只能是在当前页用用,而无法用于整个网站button的基类。所以,在这里,就有一个概念,就是页面中的元素style,是通过一堆class拼凑出来的,每个class都是有自己的样式,比如:
博客园编辑文章下面的发布按钮,它的样式是这样的:
input.Button { float: left; background: #6B86B3; border: 1px solid #333333; text-transform: uppercase; margin-right: 15px; color: #FFFFFF; font-size: 12px; font-weight: bold; width: 70px; text-align: center; cursor: pointer; height: 26px; line-height: 22px; }
这就是我们平时书写css的习惯,一溜样式写下来,效果有了,就可以回家洗洗睡了。但是,这些样式,就基本只能用在下面三个按钮上,其余的button就无法使用这些style了。
当然,我们可以把里面的css抽离出来,让它大部分代码可以在整个站点使用。如下:
.leftFloat { float: left; } .button { border: 1px solid #333; text-transform: uppercase; font-weight: bold; margin-right: 15px; text-align: center; cursor: pointer; } .largetButton { width: 70px; height: 26px; line-height: 22px; } .smallFont{ font-size: 12px; } .whiteFont{ color: #fff; } .darkBlueBackground { background: #6B86B3; }
这样做以后,代码总行数好像变多了,但是它的可重用性大大提升。对于smallFont,whiteFont,leftFloat,darkBlueBackground等,这些类在使用中就可以不拘束在这个button中了,对于所有的字体,我都可以使用smallFont,whiteFont。这样,原来的input.Button就会由一些列类组装来显示按钮效果,如下:
<input type="submit" class="leftFloat button largetButton smallFont whiteFont darkBlueBackground" name="Editor$Edit$lkbPost" value="发布" onclick="return CheckInput();" id="Editor_Edit_lkbPost">
当然,对于规模较小,样式简单的网站,这样做是没有意义的。在那些已经有了自己的显示规范,样式复杂,规模较大的网站,这样做在后期的时候,只要在html里进行class组装,再定制一下当前页简短的css,就可以快速的完成一个页面的开发了。
js
js方面,是被骂了无数遍以后才醒悟的。以前总喜欢写看起来高大上的代码,而且据说效率还很高,比那些传统的代码还看又好用多了。但是,这样的代码,完全是写给机器看的。在多人团队中,代码不仅仅是要写给机器看,更重要的是写给人看。在这方面,甚至可以牺牲一小部分的性能,来做出易读的代码。(注意是一小部分!比如多写几句var之类的)
这里要说一个关于传参数的东西。一般在js中,我们写函数时,参数的使用主要有两大派,如下:
//一溜型 function a(a1,a2,a3,a4,a5,a6,a7,a8){ //...... } //一堆型 //options = {a1: '',a2: '',a3: '',a4: '',a5: '',a6: '',a7: '',a8: ''} function a(options){ }
参数一溜排开的方式,有一个优点,那就是很清楚的让别人知道,你需要的input是什么,要你的程序跑起来需要给你什么。这样在后来人接手的时候方便理解。不过一长串参数吊在函数后面,实在是有碍观赏。而且如果想多加一个参数,还要在后面再加一个名字。总感觉不是很优雅。
参数堆在options里面的方式,让人感觉很赏心悦目。这样的写法感觉很简介大方。但是如果是在这样的情况下:
function a(options){balabala;b(options);};
function b(options){balabala;};
这样的话,想要知道options里面要有什么,就必须找到b里面为止。这还是简单的情况,如果有个5,6层的调用呢,简直要让人抓狂。
有人说可以用注释,在第一次写代码的时候,我们会去乖乖注释。但是,后来人修改你的代码的时候,哪有空改注释,这样反倒形成一个坑了。
现在我的做法一般是这样:
function a(options){ //input start options = options || {}; var a1 = options.a1; var a2 = options.a2; var a3 = options.a3; var a4 = options.a4; var a5 = options.a5; var a6 = options.a6; var a7 = options.a7; var a8 = options.a8; //input end //processing //output start return { a1: a1,a2: a2,a3: a3,a4: a4,a5: a5,a6: a6,a7: a7,a8: a8 }; //output end }
在函数开始的时候,清楚的写明我要的是什么,在出去的时候,写明传出去的是哪些值。options只在input设置中用,后面的函数体中就不再调用了。这样,函数虽然长了,但是在团队开发中,更有利于别人理解你的代码。而在你的具体processing中,别人可以当做一个黑盒,只在input中添加语句,processing后面添加几句,就可以完成修改了。这样更加节省开发成本。
小tips:
我们经常担心传进来的objec或者function是undefined。这样很容易在后期报错。不过有一招,让你不用担心这个:
function a(options){ options = options || {}; var testFunc = options.noFunc || function(){return {};}; //... }
这样,即使没有options,没有options.noFunc,在后面的调用中,调用options.balabala和执行testFunc都不会出错。当然,在testFunc中,后面的默认函数的返回值的类型,最好和原来的noFunc返回类型一致,这样可以更好的增强程序稳定性。
好像不小心在博客园的博客上喷了博客园的css,希望不会被干掉。。。。