434
社区成员
发帖
与我相关
我的任务
分享. 原则
• 同一性:在编写一个子模块或派生类的时候,要遵循其基类或整体模块的命名风格,保持命名风格在整个模块中的同一性。
• 标识符组成:标识符采用英文单词或其组合,应当直观且可以拼读,可望文知意,用词应当准确,避免用拼音命名。
• 最小化长度 && 最大化信息量原则:在保持一个标识符意思明确的同时,应当尽量缩短其长度。
• 避免过于相似:不要出现仅靠大小写区分的相似的标识符,例如"i"与"I","function"与"Function"等等。
• 避免在不同级别的作用域中重名:程序中不要出现名字完全相同的局部变量和全局变量,尽管两者的作用域不同而不会发生语法错误,但容易使人误解。
• 正确命名具有互斥意义的标识符:用正确的反义词组命名具有互斥意义的标识符,如:"nMinValue" 和"nMaxValue","GetName()" 和"SetName()" ….
• 避免名字中出现数字编号:尽量避免名字中出现数字编号,如Value1,Value2等,除非逻辑上的确需要编号。这是为了防止程序员偷懒,不肯为命名动脑筋而导致产生无意义的名字(因为用数字编号最省事)。
• T类表示简单数据类型,不对资源拥有控制权,在析构过程中没有释放资源动作。
• C表示从CBase继承的类。该类不能从栈上定义变量,只能从堆上创建。
• M表示接口类。
• R是资源类,通常是系统固有类型。除了特殊情况,不应在开发代码中出现R类型。
• M类的函数名称应采用HandleXXX命名,例如:HandleTimerEvent;不推荐采用java风格,例如handleTimerEvent;除了标准c风格代码,不推荐用下划线,例如,handle_event。
• Leave函数,用后缀L。
• Leave函数,且进清除栈,用后缀LC。
• Leave函数,且删除对象,用后缀LD。
• 函数参数用a作为前缀。
• 避免出现和匈牙利混合的命名规则如apBuffer名称。用aBuffer即可。
• 函数参数比较多时,应考虑用结构代替。
• 如果不能避免函数参数比较多,应在排版上可考虑每个参数占用一行,参数名竖向对齐。
• 成员变量用m最为前缀。
• 避免出现和匈牙利混合的命名规则如mpBuffer名称。用mBuffer即可。
• 循环变量和简单变量采用简单小写字符串即可。例如,int i;
• 指针变量用p打头,例如void* pBuffer;
• 全局变量用g_最为前缀。
• 类和对象名应是名词。
• 实现行为的类成员函数名应是动词。
• 类的存取和查询成员函数名应是名词或形容词。
• 对于移植的或者开源的代码,可以沿用原有风格,不用C++的命名规范。
1. 文件头注释
• 作者,文件名称,文件说明,生成日期(可选)
• 关键函数必须写上注释,说明函数的用途。
• 特别函数参数,需要说明参数的目的,由谁负责释放等等。
• 除了特别情况,注释写在代码之前,不要放到代码行之后。
• 对每个#else或#endif给出行末注释。
• 关键代码注释,包括但不限于:赋值,函数调用,表达式,分支等等。
• 善未实现完整的代码,或者需要进一步优化的代码,应加上 // TODO …
• 调试的代码,加上注释 // only for DEBUG
• 需要引起关注的代码,加上注释 // NOTE …
• 对于较大的代码块结尾,如for,while,do等,可加上 // end for|while|do
1. Tab和空格
• 每一行开始处的缩进只能用Tab,不能用空格,输入内容之后统一用空格。除了最开始的缩进控制用Tab,其他部分为了对齐,需要使用空格进行缩进。这样可以避免在不同的编辑器下显示不对齐的情况。
• 在代码行的结尾部分不能出现多余的空格。
• 不要在"::","->","."前后加空格。
• 不要在",",";"之前加空格。
• 类,结构,枚举,联合:大括号另起一行
• 函数体的{需要新起一行,在{之前不能有缩进。
• 除了特别情况,函数体内不能出现两个空行。
• 除了特别情况,函数体内不能宏定义指令。
• 在一个函数体内,逻揖上密切相关的语句之间不加空行,其它地方应加空行分隔。
• 在头文件定义的inline函数,函数之间可以不用空行,推荐用一个空行。
• "if"、"for"、"while"、"do"、"try"、"catch" 等语句自占一行,执行语句不得紧跟其后。不论执行语句有多少都要加 “{ }” 。这样可以防止书写和修改代码时出现失误。
• "if"、"for"、"while"、"do"、"try"、"catch" 的括号和表达式,括号可紧挨关键字,这样强调的是表达式。
• if语句如果有else语句,用 } else { 编写为一行,不推荐用 3 行代码的方式。
• 一行代码只做一件事情,如只定义一个变量,或只写一条语句。这样的代码容易阅读,并且方便于写注释。
• 多行变量定义,为了追求代码排版美观,可将变量竖向对齐。
• 代码行最大长度宜控制在一定个字符以内,能在当前屏幕内全部可见为宜。
• case关键字应和switch对齐。
• case子语句如果有变量,应用{}包含起来。
• 如果有并列的类似的简单case语句,可考虑将case代码块写为一行代码。
• 简单的case之间可不用空行,复杂的case之间应考虑用空行分割开。
• case字语句的大括号另起一行,不要和case写到一行。
• 为所有switch语句提供default分支。
• 若某个case不需要break一定要加注释声明。
• 空循环可用 for( ;; ) 或者 while( 1 ) 或者 while( true )
• 类继承应采用每个基类占据一行的方式。
• 单继承可将基类放在类定义的同一行。如果用多行,则应用Tab缩进。
• 多继承在基类比较多的情况下,应将基类分行,并采用Tab缩进对齐。
• 重载基类虚函数,应在该组虚函数前写注释 // implement XXX
• 友元声明放到类的末尾。
• 不要用分号结束宏定义。
• 函数宏的每个参数都要括起来。
• 不带参数的宏函数也要定义成函数形式。
• 尽量不要用goto。
《数学之美》是吴军继《浪潮之巅》后的又一力作,是他2006年起在google黑板报上一系列文章的合集,主要讲解了各种各样的数学模型,包括自然语言处理的算法,搜索领域的相关技术以及google云计算的一些主要算法。
为了让非计算机专业的读者也能看懂,吴军再次展示了其强大的表达能力和专业素养:马尔科夫链,贝叶斯网络,最大熵模型和维比特算法等从他口中讲出,就变成了一个个引人入胜的精彩故事。如果读者以前对一些抽象的数学概念和模型退而止步,不是因为数学不够美,只是因为以前的教材被阉割过,一上来就是公式和推导,而没有详细的介绍每一种数学思想或者模型产生的背景,能够解决的问题,以及各种流派的发展方向和各派掌门人之间的恩怨情仇。当然,为了兼顾计算机专业的读者,很多章节都从数学模型和公式上做了进一步的推导和阐述。
全书1-7章主要介绍了如何用统计模型来处理自然语言。按照以前计算机课程《编译原理》,对语言的处理主要分为特征词寻找,语法分析和语义分析等几步。计算机编程语言一般都可以归为上下文无关文法,可用传统的语义分析来完美解释。但这种传统的语义分析方法对自然语言的处理遇到了以下的两个难题
1. 自然语言规则的多样性。大部分计算机编程语言的语法可以用有限的几十条BNF范式表达清楚,而自然语言本身太复杂,又处在一个不断变化的过程中,即使写几万条文法规则,也只能覆盖20%左右的真实句子。而且,这众多的文法中很有可能是互相矛盾的
2. 即使能把自然语言的所有文法规则都表达出来,因为自然语言的上下文相关性,计算量过大,远远超出了计算机能处理的范围