代码规范&《数学之美》第三章NLP读后感

秋星月 2024-09-14 19:13:22

作用

1. 遵循规范可以写出干净简洁的代码
2. 可以代码的质量
3. 提升代码的可读性
4. 使代码维护更加容易

规范

可读性和可维护性

七大原则,空行、空格、成对书写、缩进、对齐、代码行、注释
缩进与空格:规定代码的缩进方式(空格或制表符Tab)和缩进大小,以保持代码的一致性。
大括号:规定大括号的使用方式,如是否在代码块的开始处换行。
代码注释:强调代码注释的重要性,包括文件描述注释、函数注释和行注释等,以提高代码的
目录结构:规定项目的目录结构,如将源代码、测试代码、资源文件等分别放置在不同的目录下。
模块划分:根据项目需求,将代码划分为不同的模块或组件,以降低代码耦合度,提高可维护性。

可维护性和查错

错误处理:规定错误处理的方式,如使用try-catch语句捕获异常,并给出明确的错误信息和处理建议。
代码复用:鼓励代码复用,避免重复造轮子。可以通过定义函数、类库或模块等方式来实现代码复用。
接口与实现分离:鼓励使用接口和抽象类来定义API,而将具体的实现细节放在实现类中。

性能优化:关注代码的性能问题,如避免不必要的循环、减少内存占用等。同时,也可以使用一些性能分析工具来帮助识别和优化性能瓶颈。
五、代码审查与测试
代码审查:建立代码审查制度,通过团队内部或外部的代码审查来发现潜在的问题和改进点。
单元测试:编写单元测试来验证代码的正确性和稳定性。单元测试应该覆盖代码的主要路径和边界情况。
集成测试:进行集成测试以验证不同模块或组件之间的交互是否正常。

代码规范化的七大原则
代码规范化基本上有七大原则,体现在空行、空格、成对书写、缩进、对齐、代码行、注释七方面的书写规范上。

空行

空行起着分隔程序段落的作用。空行得体将使程序的布局更加清晰。空行不会浪费内存,虽然打印含有空行的程序会多消耗一些纸张,但是值得。

规则一:定义变量后要空行。尽可能在定义变量的同时初始化该变量,即遵循就近原则。如果变量的引用和定义相隔比较远,那么变量的初始化就很容易被忘记。若引用了未被初始化的变量,就会导致程序出错。

规则二:每个函数定义结束之后都要加空行。

总规则:两个相对独立的程序块、变量说明之后必须要加空行。比如上面几行代码完成的是一个功能,下面几行代码完成的是另一个功能,那么它们中间就要加空行。这样看起来更清晰。

空格

  • 关键字之后要留空格。像 const、case 等关键字之后至少要留一个空格,否则无法辨析关键字。像 if、for、while 等关键字之后应留一个空格再跟左括号(,以突出关键字。

  • 函数名之后不要留空格,应紧跟左括号(,以与关键字区别。

  • ==,之后要留空格==。如果;不是一行的结束符号,其后要留空格。

  • 赋值运算符、关系运算符、算术运算符、逻辑运算符、位运算符,等双目运算符的前后应当加空格。
    注意,运算符“%”是求余运算符,与 printf 中 %d 的“%”不同,所以 %d 中的“%”前后不用加空格。

  • 单目运算符等前后不加空格。

  • 像数组符号[]、结构体成员运算符.、指向结构体成员运算符->,这类操作符前后不加空格。

  • 对于表达式比较长的 for 语句和 if 语句,为了紧凑起见,可以适当地去掉一些空格。但 for 和 if 后面紧跟的空格不可以删,其后面的语句可以根据语句的长度适当地去掉一些空格。例如:
    for (i=0; i<10; i++)
    for 和分号后面保留空格就可以了,=和<前后的空格可去掉。

缩进

缩进是通过键盘上的 Tab 键实现的,缩进可以使程序更有层次感。原则是:如果地位相等,则不需要缩进;如果属于某一个代码的内部代码就需要缩进。

对齐

对齐主要是针对大括号{}说的:

  • {和}分别都要独占一行。互为一对的{和}要位于同一列,并且与引用它们的语句左对齐。
  • {}之内的代码要向内缩进一个 Tab,且同一地位的要左对齐,地位不同的继续缩进。
  • 还有需要注意的是,很多编程软件是会“自动对齐”的
    #include <stdio.h>
    int main(void)
    {
      if (…)
      return 0;
    }
    

代码行

规则一:
一行代码只做一件事情,如只定义一个变量,或只写一条语句。这样的代码容易阅读,并且便于写注释。

规则二:
if、else、for、while、do 等语句自占一行,==执行语句不得紧跟其后==。此外,非常重要的一点是,不论执行语句有多少行,就算只有一行也要加{},并且遵循对齐的原则,这样可以防止书写失误。

注释

C语言中一行注释一般采用//…,多行注释必须采用//。注释通常用于重要的代码行或段落提示。在一般情况下,源程序有效注释量必须在 20% 以上。虽然注释有助于理解代码,但注意不可过多地使用注释。

规则一:
注释是对代码的“提示”,而不是文档。程序中的注释不可喧宾夺主,注释太多会让人眼花缭乱。

规则二:如果代码本来就是清楚的,则不必加注释。例如:
i++; //i加1
这个就是多余的注释。

规则三:
边写代码边注释,修改代码的同时要修改相应的注释,以保证注释与代码的一致性,不再有用的注释要删除。
规则四:
当代码比较长,特别是有多重嵌套的时候,应当在段落的结束处加注释,这样便于阅读。
规则五:
每一条宏定义的右边必须要有注释,说明其作用。

命名规范

命名方法

驼峰命名法

名称折叠驼峰法折叠Pascal法
别名小驼峰法大驼峰法
使用场景命名变量、属性、方法(函数)命名类、空间、常量
规则除第一个单词之外,其他单词首字母大写第一个单词的首字母也大写
举例int myCount;Public class DataUser;
蛇形命名法(snake_case)
测试方法名、常量、枚举名称需要使用蛇形命名法(snake_case)
各个单词之间通过下划线“_”连接,比如should_get_200_status_code_when_request_is_validCLIENT_CONNECT_SERVER_FAILURE

蛇形命名法的优势是命名所需要的单词比较多的时候,

串式命名法(kebab-case)
在串式命名法中,各个单词之间通过连接符“-”连接,比如dubbo-registry
建议项目文件夹名称使用串式命名法(kebab-case),比如 dubbo 项目的各个模块的命名是下面这样的。

命名规范

![[Pasted image 20240909204317.png|225]]
标识符命名:标识符(包括变量、函数、类等)的命名应做到统一、达意和简洁。
驼峰命名法(camelCase
下划线命名法(snake_case),具体取决于公司或项目的约定。
在功能性的命名中尽量避免使用单个字母,不过如果在循环中,可以忽略这一点

//错误示范
const q = () => {
 //....
}
//正确示范
const query = () => {
 //....
}//this is also okay
for(let i = 0;i < 10; i++){
 //...
}

常量命名:常量通常使用全大写字母和下划线进行命名,以区别于其他类型的标识符。

//正确示范
const DAYS_IN_A_YEAR = 365;

文件命名:文件命名应遵循统一的规则,如使用小写字母、下划线或连字符分隔单词,以及避免使用特殊字符。

my_useful_class.cc
my-useful-class.cc
myusefulclass.cc
myusefulclass_test.cc // _unittest 和 _regtest 已弃用.

:大驼峰

函数/方法

  • java
    • 小驼峰
  • python
    • 小写+下划线
  • C++
    • 大驼峰

习惯

函数命名
命名尽量注意详细
比如我们需要一个能够获取用户银行信息的功能,那么要尽量将命名具体化,如下
错误的示范:getUserInfo
正确的示范:getUserBankInfo
命名时注意动词的使用
比如我们需要从数据库中获取用户信息,函数的名称可以是userInfouser或者fetchUser,但我推荐使用含有动词的命名 getUser

//正确示范
function getUser(){
//do something
}

编程语言

C++

作用:C++规定给标识符(变量、常量)命名时,有一套自己的规则

  • 标识符不能是关键字
  • 标识符只能由字母、数字、下划线组成
  • 第一个字符必须为字母或下划线
  • 标识符中字母区分大小写

建议:给标识符命名时,争取做到见名知意的效果,方便自己和他人的阅读


每个单词首字母均大写, 不包含下划线: MyExcitingClass, MyExcitingEnum.
函数
常规函数使用大小写混合, 取值和设值函数则要求与变量名匹配:

MyExcitingFunction() 
MyExcitingMethod() 
my_exciting_member_variable()
set_my_exciting_member_variable()

变量

string table_name;  // 好 - 用下划线.
string tablename;   // 好 - 全小写.

string tableName;  // 差 - 混合大小写

其它
类成员变量
不管是静态的还是非静态的, 类成员变量都可以和普通变量一样, 但要接下划线.

class TableInfo {
  ...
 private:
  string table_name_;  // 好 - 后加下划线.
  string tablename_;   // 好.
  static Pool<TableInfo>* pool_;  // 好.
};

结构体变量
不管是静态的还是非静态的, 结构体数据成员都可以和普通变量一样, 不用像类那样接下划线:

struct UrlTableProperties {
  string name;
  int num_entries;
  static Pool<UrlTableProperties>* pool;
};

JAVA


类(Class)通常采用名词进行命名,且首字母大写,如果一个类名包含两个以上名词,建议使用驼峰命名(Camel-Case)法书写类名,每个名词首字母也应该大写。一般地,类名的书写尽量使其保持简单和描述的完整性,因此在书写类名时不建议使用缩写(一些约定俗成的命名除外。
方法
方法(Method)命名时,其首字母应该小写,如果方法签名由多个单词组成,则从第二个单词起,使用驼峰命名法进行书写。一般地,在对方法进行命名时,通常采用动词/动词+名词的组合
变量
变量(Variable)命名包括参数名称,成员变量和局部变量。变量命名通常以小写字母开头,如果变量名由多个单词构成,则从第二个单词起首字母需要大写,在变量命名过程中,不建议使用“_”作为前缀或者单词之间的分割符号。

  • 类名:首字母大写和驼峰原则,如Man、GoodMan
  • 方法和变量名:首字母小写和驼峰原则
  • 常量:大写字母和下划线,如MAX_VALUE

Python

...

MySQL

...

开发规范命名

springboot
...

引用文献

程序员必知--代码规范_程序员代码规范-CSDN博客
10分钟搞定令人头疼的代码命名规范 | JavaGuide - 知乎 (zhihu.com)
JAVA、C、Python各编程语言命名规范(最全、持续补充)_各个语言的命名规范-CSDN博客
自学用,很多引用其他人文章

《数学之美》第三章读后感

自然语言处理(NLP)发展历程笔记

1. 语言的本质

  • 语言是人类通信的工具
  • 语言本质上是一种信息编码方式
  • 语法规则可视为编解码的算法

2. NLP 发展的两个阶段

2.1 早期阶段(1950s-1970s)

  • 主要采用基于规则的方法
  • 试图模拟人类学习语言的方式
  • 成果近乎为零

2.2 统计方法阶段(1970s-至今)

  • 基于数学模型和统计
  • 取得实质性突破
  • 广泛应用于各种产品

3. 基于规则方法的局限性

  1. 需要海量规则才能覆盖真实语言使用

    • 20%的真实语句需要几万条规则
    • 规则数量与新句子几乎呈线性增长
  2. 计算复杂度问题

    • 自然语言是上下文相关文法
    • 计算复杂度约为句子长度的6次方
    • 远高于程序语言的上下文无关文法(2次方)
  3. 难以处理语义和多义性

    • 严重依赖上下文和常识

4. 统计方法的崛起

4.1 关键人物和事件

  • Frederick Jelinek 和 IBM 华生实验室
  • 在语音识别中首次成功应用统计方法
  • 识别率从70%提升到90%,词汇量达到几万

4.2 从规则到统计的转变过程

  • 持续约15年(1970s-1990s)
  • 争议和学术分歧
  • 需要新技术和新一代研究者

5. 统计方法的优势

  1. 能处理更复杂的NLP任务

    • 句法分析
    • 机器翻译
  2. 更贴近实际应用

    • 网页搜索
    • 数据挖掘
    • 自动问答系统
  3. 与通信理论在数学模型上相通

6. NLP研究重点的转变

从:单纯的句法分析和语义理解
到:机器翻译、语音识别、文本到数据库自动生成、数据挖掘和知识获取等

7. 关键洞见

  1. 科学发展常需要范式转移和新一代研究者
  2. 技术突破往往源于跨学科的方法(如将统计学应用于语言处理)
  3. 实际应用需求能推动基础研究方向的改变
  4. 简单而强大的方法(如统计)有时比复杂的规则更有效

8. 待思考的问题

  1. 当前NLP还面临哪些挑战?
  2. 未来NLP可能的发展方向是什么?
  3. 如何平衡规则方法和统计方法在特定NLP任务中的应用?
...全文
233 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

434

社区成员

发帖
与我相关
我的任务
社区描述
广东外语外贸大学信息科学与技术学院
算法 高校
社区管理员
  • brisksea
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧