你不需要注释

本文探讨了过度依赖注释的危害,提出通过改进变量命名、重构代码等手段提高代码的自解释性,从而减少不必要的注释。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

翻译自The Knights of Unity

看到一篇好文章,索性练练自己的英语。不过还是要提前申明一下我并不主张完全不写注释,在前年的时候,将一个项目交接给别人,然后去年又回去接手这个项目,发现被改的面目全非,而且非常多bug。同事告诉我被改的原因是没有注释,看不懂。但是当我接手时却发现现在的注释还远不如我当初。在我看来,一个好的项目需要时间,而很可能你在项目前期需要更多的进度,很难做到尽善尽美,因此一些注释是不可避免的。但是正如这篇文章所说的,并不需要太多的注释,尤其在你的代码写的很好的情况下。

如果你是一个Unity的开发者,那你很可能需要写代码,除非你使用Playmaker或者别的相似的工具。作为一个程序员,你很可能想要让你的代码尽可能的阅读行强,因为你不久之后或者马上就要思考你为什么会用这个方式。如果你是通过注释来让你的代码阅读性更强,那么你很可能错了。

为什么注释不好

你很可能觉得我是一个理想主义者,想用冲突,宗教的一些词来形容我,但是这并没有什么关系。每行代码需要或多或少的注释,但是在大多数情况下,当你想写注释的时候,你几乎都有更好的办法。

代码很容易过时

思考这段代码

void Update(){
    //finish level after 60 seconds
    if(Time.timeSinceLevelLoad >= 60){
    }
}

假设某人改成这样

public float PlayTime = 120;
void Update(){
    if(Time.timeSinceLevelLoad >= PlayTime){
    }
}

如果某人将PlayTime从60秒改成了120秒,这就是一个常见的注释错误。即便这个注释可能也会被修改,但是任何修改PlayTime的人不会关心Update函数的注释现在已经对我们撒谎了。

注释需要和代码一起阅读

注释存在的目的难道不就是为了和代码一起阅读吗?但是如果代码的旁边有注释那么读代码的人不就需要更多的时间来阅读因为他说她需要分析代码和所有的注释。只有阅读者在理解代码的注释后才能理解代码,所以这消耗的2倍的时间来理解。

现在我想告诉你一些真实的场景下注释该如何使用。

使用更准确的变量名字

如此显而易见的事却竟然被忽略。你是否经常使用a,b,x2…etc作为变量名。

//计算自己和敌人的距离
float a = Vector3.Distance(p1.transform.position,en.transform.position);
//如果足够近
if(a < 100){

}

首先你需要知道一点,使用短的变量名不会让你的程序更快,只会让你的代码的可读性变差,永远要记得使用更准确地变量名。当然,这并不是说让你使用尽可能长的变量名,所以如果你可以使用简写的变量名,但是确保它很容易被理解。(pointer->ptr,texture -> tex).使用太长的变量名会让你的代码变得臃肿,因此你不得不做出妥协。

float playerToEnemyDist = Vector3.Distance(player.tranform.position,enemy.transform.position);

注意到我们不再需要计算自己和敌人的距离这段注释因为playerToEnemyDist足够告诉我们它在做什么。

不要直接使用数字未变量赋值

直接为数字为变量赋值可能会让人很难理解为什么会是这个值,而应该被先定义成变量或者常量,并且有一个准确的变量名

private static const float EnemyAttackDistance = 100;

void Update(){
    ...
    if(playerToEnemyDist < EnemyAttackDistance)
    ...
}

不要解释if

如果你有一段if语句,而你不知道它做什么或者为什么要加上这个判断,你可能想要为这个语句写一个注释。但是在你做之前,应该将条件提取到一个具有准备意义函数名字的函数中

void Update(){
        if(EnemyIsNearPlaayer()){
    ... 
}
}

bool EnemyIsNearPlayer(){
    float playerToEnemyDist = Vector3.Distance(player.tranform.position,enemy.transform.position);
    return playerToEnemyDist < EnemyAttackDistance;
}

留意函数参数

观察这段代码

//attack the player with claws or poison as secondary attack
enemy.Attack(player,Attack.Claws,Attack.Poison)

如果中毒伤害是二段伤害,那你就需要通过注释来说明,这也是注释有用的真实场景之一。但是你为什么不考虑使用结构体而不是原始参数。

public struct AttackInfo{
    public Attack Primary;
    public Attack Secondary;
}

void Attack(Character player,AttackInfo){

}

enemy.Attack(player,new AttackInfo{
    primary = Attacks.Claws,Secondary = Attack.Poison;
})

总结

咋一看这可能看起来像写更多的代码而不是使用注释来让你的代码可读性更好。但是,相信我,从长远来看,这会让你和你的同事的合作变得更好。

尽管如此,如果你认为你确实需要注释而且没有别的办法。但是你必须记住你的评论在某一天可能会过时,所以尽可能让它们简单而且安全。

内容概要:本文详细介绍了基于FPGA的144输出通道可切换电压源系统的设计与实现,涵盖系统总体架构、FPGA硬件设计、上位机软件设计以及系统集成方案。系统由上位机控制软件(PC端)、FPGA控制核心和高压输出模块(144通道)三部分组成。FPGA硬件设计部分详细描述了Verilog代码实现,包括PWM生成模块、UART通信模块和温度监控模块。硬件设计说明中提及了FPGA选型、PWM生成方式、通信接口、高压输出模块和保护电路的设计要点。上位机软件采用Python编写,实现了设备连接、命令发送、序列控制等功能,并提供了一个图形用户界面(GUI)用于方便的操作和配置。 适合人群:具备一定硬件设计和编程基础的电子工程师、FPGA开发者及科研人员。 使用场景及目标:①适用于需要精确控制多通道电压输出的实验环境或工业应用场景;②帮助用户理解和掌握FPGA在复杂控制系统中的应用,包括PWM控制、UART通信及多通道信号处理;③为研究人员提供一个可扩展的平台,用于测试和验证同的电压源控制算法和策略。 阅读建议:由于涉及硬件和软件两方面的内容,建议读者先熟悉FPGA基础知识和Verilog语言,同时具备一定的Python编程经验。在阅读过程中,应结合硬件电路图和代码注释,逐步理解系统的各个组成部分及其相互关系。此外,实际动手搭建和调试该系统将有助于加深对整个设计的理解。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值