公认的比较好的sql编程风格格是怎样的

Javascript编程风格 - 阮一峰的网络日志
Javascript编程风格
是Javascript权威,就是他的发明。
去年11月他有一个演讲(),谈到了好的Javascript编程风格是什么。
我非常推荐这个演讲,它不仅有助于学习Javascript,而且能让你心情舒畅,因为Crockford讲得很幽默,时不时让听众会心一笑。
下面,我根据这个演讲和Crockford编写的,总结一下"Javascript编程风格"。
所谓"编程风格"(programming style),指的是编写代码的样式规则。不同的程序员,往往有不同的编程风格。
有人说,编译器的规范叫做"语法规则"(grammar),这是程序员必须遵守的;而编译器忽略的部分,就叫"编程风格"(programming style),这是程序员可以自由选择的。这种说法不完全正确,程序员固然可以自由选择编程风格,但是好的编程风格有助于写出质量更高、错误更少、更易于维护的程序。
所以,有一点应该明确,"编程风格"的选择不应该基于个人爱好、熟悉程度、打字工作量等因素,而要考虑如何尽量使代码清晰易读、减少出错。你选择的,不是你喜欢的风格,而是一种能够清晰表达你的意图的风格。这一点,对于Javascript这种语法自由度很高、设计的语言尤其重要。
一、大括号的位置
绝大多数的编程语言,都用大括号({})表示区块(block)。起首的大括号的位置,有许多不同的。
最流行的有两种。一种是起首的大括号另起一行:
    ...
另一种是起首的大括号跟在关键字的后面:
  block {
    ...
一般来说,这两种写法都可以接受。但是,Javascript要使用后一种,因为Javascript会自动添加句末的分号,导致一些难以察觉的错误。
  return
    key:
上面的代码的原意,是要返回一个对象,但实际上返回的是undefined,因为Javascript自动在return语句后面添加了分号。为了避免这一类错误,需要写成下面这样:
  return {
    key :
  规则1:表示区块起首的大括号,不要另起一行。
二、 圆括号
圆括号(parentheses)在Javascript中有两种作用,一种表示调用函数,另一种表示不同的值的组合(grouping)。我们可以用空格,区分这两种不同的括号。
  规则2:调用函数的时候,函数名与左括号之间没有空格。
  规则3:函数名与参数序列之间,没有空格。
  规则4:所有其他语法元素与左括号之间,都有一个空格。
按照上面的规则,下面的写法都是不规范的:
  foo (bar)
  return(a+b);
  if(a === 0) {...}
  function foo (b) {...}
  function(x) {...}
分号表示语句的结束。大多数情况下,如果你省略了句尾的分号,Javascript会自动添加。
  var a = 1
  var a = 1;
因此,有人省略句尾的分号。但麻烦的是,如果下一行的第一个字元(token)是下面这五个字符之一,Javascript将不对上一行句尾:"("、"["、"/"、"+"和"-"。
  (function (){
    ...
上面的代码等同于
  x = y(function (){...})();
  规则5:不要省略句末的分号。
四、with语句
with可以减少代码的书写,但是会造成混淆。
  with (o) {
    foo =
上面的代码,可以有四种运行结果:
  o.foo =
  o.foo = o.
  foo = o.
这四种结果都可能发生,取决于不同的变量是否有定义。因此,
  规则6:不要使用with语句。
五、相等和严格相等
Javascript有两个表示"相等"的运算符:"相等"(==)和"严格相等"(===)。
因为"相等"运算符会自动转换变量类型,造成很多意想不到的:
  0 == ''// true
  1 == true // true
  2 == true // false
  0 == '0' // true
  false == 'false' // false
  false == '0' // true
  " \t\r\n " == 0 // true
  规则7:不要使用"相等"(==)运算符,只使用"严格相等"(===)运算符。
六、语句的合并
有些程序员追求简洁,喜欢合并不同目的的语句。比如,原来的语句是
  if (a) {...}
他喜欢写成下面这样:
  if (a = b) {...}
虽然语句少了一行,但是可读性大打折扣,而且会造成误读,让别人误以为这行代码的意思是:
  if (a === b){...}
另外一种情况是,有些程序员喜欢在同一行中赋值多个变量:
  var a = b = 0;
他以为,这行代码等同于
  var a = 0, b = 0;
实际上不是,它的真正效果是下面这样:
  b = 0;
  var a =
  规则8:不要将不同目的的语句,合并成一行。
七、变量声明
Javascript会自动将变量声明"提升"(hoist)到代码块(block)的头部。
  if (!o) {
    var o = {};
  if (!o) {
    o = {};
为了避免可能出现的问题,不如把变量声明都放在代码块的头部。
  for (var i ...) {...}
最好写成:
  for (i ...) {...,}
  规则9:所有变量声明都放在函数的头部。
  规则10:所有函数都在使用之前定义。
八、全局变量
Javascript最大的语法缺点,可能就是全局变量对于任何一个代码块,都是可读可写。这对代码的模块化和重复使用,非常不利。
  规则11:避免使用全局变量;如果不得不使用,用大写字母表示变量名,比如UPPER_CASE。
九、new命令
Javascript使用new命令,从建构函数生成一个新对象。
  var o = new myObject();
这种做法的问题是,一旦你忘了加上new,myObject()内部的this关键字就会指向全局对象,导致所有绑定在this上面的变量,都变成全部变量。
  规则12:不要使用new命令,改用命令。
如果不得不使用new,为了防止出错,最好在视觉上把建构函数与其他函数区分开来。
  规则13:建构函数的函数名,采用首字母大写(InitialCap);其他函数名,一律首字母小写。
十、自增和自减运算符
自增(++)和自减(--)运算符,放在变量的前面或后面,返回的值不一样,很容易发生错误。
事实上,所有的++运算符都可以用"+= 1"代替。
  x += 1;
代码变得更清晰了。有一个很可笑的例子,某个Javascript函数库的源代码中出现了下面的片段:
这个程序员忘了,还有更简单、更合理的写法:
  x += 2;
  规则14:不要使用自增(++)和自减(--)运算符,用+=和-=代替。
十一、区块
如果循环和判断的代码体只有一行,Javascript允许该区块(block)省略大括号。
下面的代码
  if (a) b(); c();
原意可能是
  if (a) { b(); c();}
但是,实际效果是
  if (a) { b();} c();
  规则15:总是使用大括号表示区块。
JavaScript 是单线程运行,异步操作特别重要。
2017年6月,TC39 委员会正式发布了《ES2017 标准》。
Web 技术突飞猛进,但是有一个领域一直无法突破 ---- 游戏。
Node 主要用在开发 Web 应用。这决定了使用 Node,往往离不开 Web 应用框架。3968人阅读
嵌入式C语言(9)
本文摘自我整理编写的&嵌入式C进阶之道&,完全版本请访问
编程的总则: 编程首要是要考虑程序的可行性,然后是可读性、可移植性、健壮性以及可测试性。大多数程序员只是关注程序的可行性,而忽略了可读性,可移植性和健壮性,其实我个人认为,程序的可行性和健壮性与程序的可读性有很大的关系,能写出可读性很好的程序的程序员,他写的程序的可行性和健壮性必然不会差,也会有不错的可移植性.程序的可读性需要程序员有一个良好的编程风格.好风格应该成为一种习惯。如果你在开始写代码时就关心风格问题,如果你花时间去审视和改进它,你将会逐渐养成一种好的编程习惯。一旦这种习惯变成自动的东西,你的潜意识就会帮你照料许多细节问题,甚至你在工作压力下写出的代码也会更好。 1.排版a. 代码缩进空格数为4个。若是可能,尽量用空格来代替Tab键,因为有些编译器不支持Tab键(我自己至今未见过,但确实有这个风险),这给程序的移植带来了问题。在keil中这个问题很容易解决,只需在在keil主界面的菜单栏点击Edit—Configuration…,弹出Configuration窗口,点击Editor标签,在其中C/C++ File:、ASM、Other Files栏下,选中Insert spaces for tab:复选框,Tab对应的框中填4,这样按tab键就相当于按下四个空格键。BOOL BufClr(UINT8 * dest,UINT32 size)
if(NULL ==dest || NULL==size)
return FALSE;
}b. 较长的语句要分2行来书写,并用‘\’符号隔开。uncrc=calcCRC16(Packet.p,unlen);
if((UINT8) uncrc != Packet.down_ser.mCrc[0] \
||(UINT8)(uncrc&&8)!= Packet.down_ser.mCrc[1])
}c. 函数代码的参数过长,分多行来书写。void UARTSendAndRecv(UINT8 *ucSendBuf,
UINT8 ucSendLength,
UINT8 *ucRecvBuf,
UINT8 ucRecvLength)
}d. if、do、while、switch、for、case、default等关键字,必须加上大括号{}。if(bSendEnd)
BELL(OFF);
//--------------------------
for(i=0; i& ucRecvL i++)
ucRecvBuf[i]=i;
//--------------------------
switch(ucintStatus)
case USB_INT_EP2_OUT:
USBCiEP2Send(USBMainBuf,ucrecvLen);
USBCiEP1Send(USBMainBuf,ucrecvLen);
case USB_INT_EP2_IN:
USBCiWriteSingleCmd (CMD_UNLOCK_USB);
}2.注释a. 边写代码边注释,修改代码同时修改相应的注释,以保证注释与代码的一致性。不再有用的注释要删除。
注释应当准确、易懂,防止注释有二义性。错误的注释不但无益反而有害。
尽量避免在注释中使用缩写,特别是不常用缩写。
注释的位置应与被描述的代码相邻,可以放在代码的上方或右方,不可放在下方。 b. 说明性文件必选在文件头着重说明,例如*.c、*.h文件/***************************************************************************
定时器+计数器测频
件: frequency.c
者: 小瓶盖
明:定时器+计数机测频率
* 编写时间:
* 修改日期: 无
*---------------------------------------------------------------------------
* 注: 本程序定义6个数码管,经过实测,在200HZ~50KHZ时结果较准确,误差小于0.4%,
50KHZ以上频率未进行测量.据资料表明,可以测量到120KHZ,本程序未证明.
*****************************************************************************/
#include &xxxx.h&
void func(void)
}c. 函数头应该进行注释,例如函数名称、输入参数、返回值、功能说明。/**************将所有参数写入AT24C64,共4字节*********************
*说明:将表号和用户电量共四字节数据写入AT24C64中
*入口参数:
1.数据间接寻址地址-buf
2.写入到AT24C64的地址字-addh,addrl
3.写入字节数-count
*出口参数:1表示写成功,0表示写失败
***************************************************************/
bit write_byte( unsigned char * buf,
unsigned char addrh,
unsigned char addrl,
unsigned char count)
}d. 全局变量要注释其功能,若为关键的局部变量同样需要注释其功能。volatile UINT8 __ucSysMsg=SYS_IDLE;
void SYSSetMsgPriority(void)
SYSMSG M//临时存储消息
}e. 复杂的宏定义同样要加上注释。/* SYS_MSG_MAP 建立一个消息映射
宏参数NAME:消息映射表的名字
宏参数NUM_OF_MSG:消息映射的个数
#define SYS_MSG_MAP(NAME,NUM_OF_MSG) do/
DEFINE_MSG_NAME((NAME));/
for(i=0;i& NUM_OF_MSG;i++)/
ININ_CUR_MSG(i)/
}while(0)f. 复杂的结构体同样要加上注释。/* 奇偶校验结构体*/
typedef struct _ PKT_PARITY
UINT8 m_ucHead1;
UINT8 m_ucHead2;
UINT8 m_ucOptC
UINT8 m_ucDataL //数据长度
UINT8 m_szDataBuf[16];//数据
UINT8 m_ucP
//奇偶校验值
}PKT_PARITY;g. 相对独立的语句组注释。对这一组语句做特别说明,写在语句组上侧,和此语句组之间不留空行,与当前语句组的缩进一致。注意,说明语句组的注释一定要写在语句组上面,不能写在语句组下面。
文章:20篇
阅读:374006
文章:11篇
阅读:130200
阅读:1904551CTO旗下网站
C++新手之培养良好的编程风格
本文介绍的是C++新手应该遵守的一些编程的风格,希望对你有帮助,一起来看。
作者:佚名来源:互联网| 15:49
内功深厚的武林高手出招往往平淡无奇。同理,编程高手也不会用奇门怪招写程序。良好的编程风格是产生高质量程序的前提。 下面以C++为例,来给大家介绍。
一、&命名约定
有不少人编程时用拼音给函数或变量命名,这样做并不能说明你很爱国,却会让用此程序的人迷糊(很多南方人不懂拼音,我就不懂)。程序中的英文一般不会太复杂,用词要力求准确。匈牙利命名法是Microsoft 公司倡导的[Maguire 1993],虽然很烦琐,但用习惯了也就成了自然。没有人强迫你采用何种命名法,但有一点应该做到:自己的程序命名必须一致。
以下是我编程时采用的命名约定:
(1)宏定义用大写字母加下划线表示,如MAX_LENGTH;
(2)函数用大写字母开头的单词组合而成,如SetName, GetName ;
(3)指针变量加前缀p,如*pNode ;
(4)BOOL 变量加前缀b,如bFlag ;
(5)int 变量加前缀i,如iWidth&;
(6)float 变量加前缀f,如fWidth ;
(7)double 变量加前缀d,如dWidth ;
(8)字符串变量加前缀str,如strName ;
(9)枚举变量加前缀e,如eDrawMode ;
(10)类的成员变量加前缀m_,如m_strName, m_iWidth ;
对于int, float, double 型的变量,如果变量名的含义十分明显,则不加前缀,避免烦琐。如用于循环的int 型变量i,j,k ;float 型的三维坐标(x,y,z)等。
二、&使用断言
程序一般分为Debug 版本和Release 版本,Debug 版本用于内部调试,Release 版本发行给用户使用。断言assert 是仅在Debug 版本起作用的宏,它用于检查&不应该&发生的情况。以下是一个内存复制程序,在运行过程中,如果assert 的参数为假,那么程序就会中止(一般地还会出现提示对话,说明在什么地方引发了assert)。
&void&memcpy(void&*pvTo,&void&*pvFrom,&size_t&size) &{ &void&*pbTo&=&(byte&*)&pvTo; &void&*pbFrom&=&(byte&*)&pvF &assert(&pvTo&!=&NULL&&&&pvFrom&!=&NULL&); &while(size&-&-&&&0&) &*pbTo&+&+&=&*pbFrom&+&+&; &return&(pvTo); &}&
assert 不是一个仓促拼凑起来的宏,为了不在程序的Debug 版本和Release 版本引起差别,assert 不应该产生任何副作用。所以assert 不是函数,而是宏。程序员可以把assert 看成一个在任何系统状态下都可以安全使用的无害测试手段。
很少有比跟踪到程序的断言,却不知道该断言的作用更让人沮丧的事了。你化了很多时间,不是为了排除错误,而只是为了弄清楚这个错误到底是什么。有的时候,程序员偶尔还会设计出有错误的断言。所以如果搞不清楚断言检查的是什么,就很难判断错误是出现在程序中,还是出现在断言中。幸运的是这个问题很好解决,只要加上清晰的注释即可。这本是显而易见的事情,可是很少有程序员这样做。这好比一个人在森林里,看到树上钉着一块&危险&的大牌子。但危险到底是什么?树要倒?有废井?有野兽?除非告诉人们&危险&是什么,否则这个警告牌难以起到积极有效的作用。难以理解的断言常常被程序员忽略,甚至被删除。[Maguire 1993]
以下是使用断言的几个原则:
(1)使用断言捕捉不应该发生的非法情况。不要混淆非法情况与错误情况之间的区别,后者是必然存在的并且是一定要作出处理的。
(2)使用断言对函数的参数进行确认。
(3)在编写函数时,要进行反复的考查,并且自问:&我打算做哪些假定?&一旦确定了的假定,就要使用断言对假定进行检查。
(4)一般教科书都鼓励程序员们进行防错性的程序设计,但要记住这种编程风格会隐瞒错误。当进行防错性编程时,如果&不可能发生&的事情的确发生了,则要使用断言进行报警。
三、&new、delete 与指针
在C++中,操作符new 用于申请内存,操作符delete 用于释放内存。在C 语言中,函数malloc 用于申请内存,函数free 用于释放内 存。由于C++兼容C 语言,所以new、delete、malloc、free 都有可能一起使用。new 能比malloc 干更多的事,它可以申请对象的内存,而malloc 不能。C++和C 语言中的指针威猛无比,用错了会带来灾难。对于一个指针p,如果是用new申请的内存,则必须用delete 而不能用free 来释放。如果是用malloc 申请的内存,则必须用free 而不能用delete 来释放。在用delete 或用free 释放p 所指的内存后,应该马上显式地将p 置为NULL,以防下次使用p 时发生错误。示例程序如下:
void&Test(void) &{ &float&*p; &p&=&new&float[100]; &if(p==NULL)&return; &&&delete&p; &p=NULL;&&&p&=&new&float[500]; &if(p==NULL)&return; &&&delete&p; &p=NULL; &}&
我们还要预防&野指针&,&野指针&是指向&垃圾&内存的指针,主要成因有两种:
(1)指针没有初始化。
(2)指针指向已经释放的内存,这种情况最让人防不胜防,示例程序如下:
class&A &{ &public: &void&Func(void){&} &}; &void&Test(void) &{ &A&*p; &{ &A&a; &p&=&&a;&&} &p-&Func();&&}&
四、使用const
在定义一个常量时,const 比#define 更加灵活。用const 定义的常量含有数据类型,该常量可以参与逻辑运算。例如:
const&int&LENGTH&=&100;&&const&float&MAX=100;&&#define&LENGTH&100&//&LENGTH&无类型 &#define&MAX&100&//&MAX&无类型&
除了能定义常量外,const 还有两个&保护&功能:
一、强制保护函数的参数值不发生变化
以下程序中,函数f 不会改变输入参数name 的值,但是函数g 和h 都有可能改变name的值。
void&f(String&s);&&void&g(String&&s);&&void&h(String&*s);&&main() &{ &String&name=&Dog&; &f(name);&&g(name);&&h(name);&&}&
对于一个函数而言,如果其&&&或&*&类型的参数只作输入用,不作输出用,那么应当在该参数前加上const,以确保函数的代码不会改变该参数的值(如果改变了该参数的值,编译器会出现错误警告)。因此上述程序中的函数g 和h 应该定义成:
void&g(const&String&&s); &void&h(const&String&*s);&
二、强制保护类的成员函数不改变任何数据成员的值
以下程序中,类stack 的成员函数Count 仅用于计数,为了确保Count 不改变类中的任何数据成员的值,应将函数Count 定义成const 类型。
class&Stack &{ &public: &void&push(int&elem); &void&pop(void); &int&Count(void)&const;&&private: &int& &int&data[100]; &}; &int&Stack::Count(void)&const&{ &++&&&pop();&&return& &}&
五、&其它建议
(1)不要编写一条过分复杂的语句,紧凑的C++/C 代码并不见到能得到高效率的机器代码,却会降低程序的可理解性,程序出错误的几率也会提高。
(2)不要编写集多种功能于一身的函数,在函数的返回值中,不要将正常值和错误标志混在一起。
(3)不要将BOOL 值TRUE 和FALSE 对应于1 和0 进行编程。大多数编程语言将FALSE定义为0,任何非0 值都是TRUE。Visual C++将TRUE 定义为1,而Visual Basic 则将TRUE定义为-1。示例程序如下:
BOOL& && &if(flag)&{&&if(flag==TRUE)&{&&if(flag==1)&{&&if(!flag)&{&&if(flag==FALSE)&{&&if(flag==0)&{&&
(4)小心不要将&= =&写成&=&,编译器不会自动发现这种错误。
(5)不要将123 写成0123,后者是八进制的数值。
(6)将自己经常犯的编程错误记录下来,制成表格贴在计算机旁边。
C++/C 程序设计如同少林寺的武功一样博大精深,我练了8 年,大概只学到二三成。所以无论什么时候,都不要觉得自己的编程水平天下第一,看到别人好的技术和风格,要虚心学习。本章的内容少得可怜,就象口渴时只给你一颗杨梅吃,你一定不过瘾。我借花献佛,推荐一本好书:Marshall P. Cline 著的《C++ FAQs》[Cline 1995]。你看了后一定会赞不绝口。会编写C++/C 程序,不要因此得意洋洋,这只是程序员基本的技能要求而已。如果把系统分析和系统设计比作&战略决策&,那么编程充其量只是&战术&。
如果指挥官是个大笨蛋,士兵再勇敢也会吃败仗。所以我们程序员不要只把眼光盯在程序上,要让自己博学多才。我们应该向北京胡同里的小孩们学习,他们小小年纪就能指点江山,评论世界大事。
【编辑推荐】
【责任编辑: TEL:(010)】
大家都在看猜你喜欢
头条头条头条头条头条
24H热文一周话题本月最赞
讲师:92154人学习过
讲师:96666人学习过
讲师:132812人学习过
精选博文论坛热帖下载排行
本书结合JSP和Servlet的最新规范,从基本的语法和规范入手,以经验为后盾,以实用为目标,以实例为导向,以实践为指导,深入浅出地讲解了JS...
订阅51CTO邮刊C++编程规范之编程风格
[问题点数:20分,结帖人kaly0204]
C++编程规范之编程风格
[问题点数:20分,结帖人kaly0204]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
2012年 总版技术专家分年内排行榜第一
2013年 总版技术专家分年内排行榜第七2011年 总版技术专家分年内排行榜第五2009年 总版技术专家分年内排行榜第九
2014年 总版技术专家分年内排行榜第二
2013年 总版技术专家分年内排行榜第三
2012年1月 其他开发语言大版内专家分月排行榜第二2011年5月 其他开发语言大版内专家分月排行榜第二2010年12月 其他开发语言大版内专家分月排行榜第二2009年2月 其他开发语言大版内专家分月排行榜第二2008年9月 其他开发语言大版内专家分月排行榜第二2008年8月 其他开发语言大版内专家分月排行榜第二2008年5月 其他开发语言大版内专家分月排行榜第二2007年11月 其他开发语言大版内专家分月排行榜第二
2011年4月 其他开发语言大版内专家分月排行榜第三2011年1月 其他开发语言大版内专家分月排行榜第三2009年6月 其他开发语言大版内专家分月排行榜第三2009年4月 其他开发语言大版内专家分月排行榜第三2009年1月 其他开发语言大版内专家分月排行榜第三2008年11月 其他开发语言大版内专家分月排行榜第三2008年7月 其他开发语言大版内专家分月排行榜第三2008年6月 其他开发语言大版内专家分月排行榜第三2006年9月 其他开发语言大版内专家分月排行榜第三
匿名用户不能发表回复!|他的最新文章
他的热门文章
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)

我要回帖

更多关于 良好的编程风格 的文章

 

随机推荐