给函数和变量取一个有意义的名字

本文深入探讨了为何给函数和变量取有意义的名字对于提高代码可读性和编程技能至关重要,提供了有效的命名策略和原则,并详细介绍了不同场景下常用的命名规范和术语,旨在帮助开发者构建更高质量的代码。

为什么要给函数和变量取一个有意义的名字?

1. 代码写出来是给以后的自己和别人看的,易于理解的变量名可以更好的阅读,并且可以看出编码者的个人修养和编程功底;

2. 好的变量名字有利于提高自己英语水平(词汇量、表达能力),英语水平提高了,对代码中的注释也是很有帮助的;

3.  可以培养自己咬文嚼字的能力,选用什么样的一个词来表达其在代码中最为贴近的含义;


如何给函数和变量取一个有意义的名字?

1. 阅读优秀的代码,体会别人是怎么取变量名的,并不断积累,好记性不如烂笔头;

2. 阅读相关书籍,《代码大全》、《代码整洁之道》;

3. 自己在写的时候,多推敲,可以借助英语词典,选取最为准确表达意思的词;

4. 一有时间就去回顾自己的笔记,加深记忆(应遵循大脑的记忆曲线);


函数命名原则:

文件名+动宾结构(filename_dosth() 函数名前加上文件名的好处是以防止函数未进行static声明时,有可能重复定义;单词首字母最好大写,这样醒目一些,避免多个单词连在一起出现混淆)。 常有单词有:

reset 复位某一个外设,比如复位phy芯片 _ResetPhy8201f

init exit   _InitConfig _InitReg  Chip_Init Chip_Exit

start/run stop 开始或停止某一状态,比如开启或关闭看门狗,和begin(起始) end区别

reg unreg  

_RegOps:注册操作函数,这个一般用于连接设备驱动层次关系(通用代码处理modules层和具体的操作方法实现chips层,连接两者的桥梁是模块配置指针,这样有利于代码的移植性)。

_RegCmd:注册

get set _SetXxxState  _SetXxxParam _SetXxxRunParam _GetXxxPos 将寄存器某些位置位SetRegBits 

_SetGpioDir_SetGpioLevel _SetXxxVal _GetCapacity

write read _ReadReg  _ReadRegCache(一个是读寄存器,另一个是读保存在数组当中的寄存器值)_WriteReg  

dowrite doread被write read调用

dump _DumpReg_DumpInfo

open close

input output

probe Remove

createdelete

enable disable使能片选  _EnableCs、读写使能

execute 执行 _ExecuteCmd 用于注册调试接口命令 XxxCmdUsage

calc 计算(calculate) 计算偏差  _CalcOffset  _CalcElapse _CalcLength

reverse forward

1. 翻转,例如SPI传输中,是否需要进行位翻转,Reverse_8/16/32bits

2. 前进和倒退

backto退回到某个位置,_BackToZero,退回到原点

parse _ParseHeader 解析一个字符串中的特定字符

show _ShowInfo _ShowState


变量命名原则:

变量命名遵循准确表达其在代码中所表达的含义。驱动程序中常用的单词有:

寄存器参数结构体T_RegParam:addr    data    num

参数配置结构体T_XxxConfig: 

1. 外设和主控制器相连的一些管脚命名,CsPinIdRstPinId

2. 芯片类型Type 页大小PageSize 页总数 PageNum 容量 Capacity 地址标致 i2cFlag 读写超时TimeOut  

3. 

设备对象结构体T_XxxDev:几个大部分。

1. 外设驱动的状态,SpiFlag I2cFlag spi i2c是否probe成功

2. 寄存器数组 RegCache

    参数配置结构体T_XxxConfig 

3. 和modules交互的相关结构体

4. 内核相关驱动机制

等待队列Wq等待队列判断条件Condition 

内核定时器Timer

互斥量Mutex

内核线程Task

设备指针这块主要是用来进行总线通信使用,i2c/ spi   SpiDev Client  Adapter


<think>我们正在讨论C#中方法内部处理前处理后的变量命名建议。用户希望了解在处理前处理后的变量应该如何命名。 常见的做法包括: 1. 使用前缀或后缀来区分处理前处理后的值。例如: - 处理前:originalValue, inputValue, sourceValue - 处理后:result, outputValue, processedValue 2. 如果方法只是对输入进行转换,且输入变量不会被改变(例如在函数编程中),那么可以直接使用相同的变量名,但通常我们会将转换后的值赋给一个新的变量。 3. 在某些情况下,我们可能会使用临时变量(temp)来存储中间结果,但这不是处理前处理后的命名,而是中间步骤。 4. 对于布尔类型的变量,处理前可以是isValid(表示原始状态),处理后可以是isProcessedValid(表示处理后的状态),但更常见的可能是直接使用新的含义命名。 5. 注意:C#中推荐使用驼峰命名法(camelCase)来命名局部变量。 6. 避免使用无意义名称,如a, b, c等。 7. 有时也会使用下划线前缀来表示私有字段(但这不是针对方法内部局部变量的,而是类级别的)。 综合以上考虑,我们可以给出一些示例: 示例1:简单转换 ```csharp // 处理前 int number = 10; // 处理后 int doubledNumber = number * 2; ``` 示例2:使用前缀 ```csharp string inputText = "some text"; string normalizedText = Normalize(inputText); // 假设Normalize是一个处理方法 ``` 示例3:如果方法内部需要修改同一个变量(注意:这可能会改变原始值,如果是值类型则不会影响传入的变量,但如果是引用类型则需要谨慎) 通常,我们不建议在方法内部改变传入的参数(除非是ref或out参数),而是返回一个新的结果。 示例4:使用out参数(这种情况需要两个变量名,一个传入,一个传出) ```csharp public bool TryParse(string input, out int result) { // 尝试解析,如果成功,result就是解析后的值 } // 调用时: string inputStr = "123"; int outputNum; // 这里就是处理后的变量,我们可以命名为outputNum或者parsedValue if (TryParse(inputStr, out outputNum)) { // 使用outputNum } ``` 根据以上分析,我们可以给出以下建议: 1. 处理前的变量:使用能够清晰描述原始数据的名称,如inputX, originalX, sourceX等。 2. 处理后的变量:使用能够描述处理结果含义的名称,如result, outputX, processedX, transformedX等。 3. 如果处理过程有多个步骤,中间变量可以适当使用步骤描述,如step1Result, intermediateValue等。 另外,注意变量名应该简洁且具有描述性,同时遵循C#的命名规范。 下面我们按照指令要求进行回答: </think>### C# 方法处理前后的变量命名建议 在 C# 中为方法处理前处理后的变量命名时,推荐以下命名方案: --- #### 1. **基础命名模式** ```csharp // 处理前 → 处理后 var inputData = GetRawData(); // 原始输入 var processedData = Transform(inputData); // 处理结果 // 示例: var originalList = new List<int> {1, 2, 3}; var sortedList = originalList.OrderBy(x => x).ToList(); // 处理后变量添加描述性后缀 ``` #### 2. **语义化命名** ```csharp // 明确表达状态变化 var unvalidatedInput = Console.ReadLine(); // 处理前 var validatedInput = Validate(unvalidatedInput); // 处理后 // 示例(表单处理): var rawFormData = form.Controls; var sanitizedFormData = SanitizeInput(rawFormData); // [^4] ``` #### 3. **使用前缀/后缀标识** | 阶段 | 前缀示例 | 后缀示例 | 使用场景 | |------------|--------------|----------------|---------------------| | **处理前** | `raw_` | `Original` | 原始未处理数据 | | **处理后** | `processed_` | `Result`/`Final`| 完成处理的结果数据 | ```csharp // 前缀示例 var rawImage = LoadImage(); var processedImage = ApplyFilter(rawImage); // 后缀示例 var temperatureOriginal = ReadSensor(); var temperatureAdjusted = Calibrate(temperatureOriginal); ``` #### 4. **元组解构命名** ```csharp // 处理前后直接关联 var (input, output) = ProcessData(dataSource); // 显式命名元组字段 [^3] var (unprocessed:(int x, int y), processed:(int x2, int y2)) = TransformCoordinates(point); ``` --- ### ✨ 最佳实践原则 1. **一致性** 同一项目中保持相同命名模式(如全用 `rawX`/`finalX` 或全用 `XInput`/`XOutput`) 2. **可读性优先** 避免 `a`/`b` 或 `tmp1`/`tmp2` 等无意义名称 3. **作用域限定** 方法内局部变量优先于类字段(防止状态污染) 4. **避免歧义** 不推荐使用反义前缀(如 `notValidated`),用正向描述(`unvalidated`)更清晰 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值