当前位置: 首页 > news >正文

注释是恶魔,请不要再写一行注释

如果你找到的代码没有出现上面两种毛病而注释依然存在,那你再看看这个注释是否有实际意义,是不是这个注释不要也无所谓呢。

注释是恶魔

这个观点可能你第一次看到,你可能很难接受,因为写了这么多年的注释,你从未想过注释居然是恶魔,所以,你看到这个观点的时候可能就会本能的找出1000种理由反对(绝对不可能实现啊什么的),但是,这个观点并不是今天才出现,相信很多年前就有人提出,现在已被越来越多的人认可。

我第一次接受到这个观点还是从一个美国客户(十几年编程经验的技术大牛)那里,2011年,他让我们不要写注释。他当时主要意思是我们写的中式英语他猜起来太费劲,所以他后面又安慰我们说“好的代码是不需要注释的”,而我从此就将他后面那半句话奉为至宝。

注释是恶魔,它将我们的代码变得很难理解。就像本文开篇说的,你可以找找你们项目中出现注释的地方,要么命名不准确,要么方法太长。你可以随机找10处注释,看看有几处是恶魔,欢迎贴到评论中。

举一个以前项目中的例子吧,命名不准确的例子:

/// <summary> /// 管理员是否可以审核该申请 /// </summary> public bool IsAudit { get; set; }

在这个例子中,其实将"is"换成"can"就不需要注释了。

写注释让代码更难读。

首先,如果一个程序员可以随便写注释,那么他对命名准确性和方法长度的控制就不会那么在意,写代码更随意,代码质量比不能写注释的程序员更大几率低下。

其次,代码注释只是在写代码的时候提供说明,如果读代码都依靠注释的话,那一个类被另一个类引用来引用去的就根本没法阅读了。

所以,“写注释是为了让代码更易读”本身就是站不住脚的。

不写一行注释?根本就做不到!

这句话可能从你阅读本文开始在心里面重复了无数遍,这也是大多数人的心声。

其实前面说的,写注释让代码更难读的观点很多朋友从内心上是认可的。因为确实没有办法啊,有的方法业务逻辑复杂,不知不觉方法已上百行,有的命名还是中西结合的,不写注释自己第二天就读不懂了。所以,真是纠结,内心承受百般折磨。

写到这里,突然想起在园子里看到的一个笑话,说一个公司的产品每年都在更新换代,因为每年新招的程序员都要把程序重新写一遍。

“零注释”根本做不到?如果你丛刻开始怀疑自己的这个观点,那你就可能做得到。

如何做到不写一行注释

1. 从现在开始,强迫自己不要写注释。

2. 控制每个方法不超过50行,用方法定义来描述方法的实现逻辑。

3. 变量命名不要太过随便。

本文想要告诉大家的是,零注释一点都不难。我们团队大约从2012年开始全面执行零注释,后面经历2个产品项目,多个外包项目,积累的经验越来越多,获得的质量效果越来越好,零注释越来越深入人心。

零注释这个编码规则也是我们团队近些年质量建设非常重要的里程碑之一,再此分享给大家。如果能够影响你一点点,那都足够了。

附2个我们的代码片段

虽没有注释,大家不妨猜猜这两个方法做什么用的。

1. 查询的例子

1 public PageResult<IssueDto> Search(IssueSearchCriteria criteria, PageRequest request) 2 { 3 using (var db = base.NewDB()) 4 { 5 return db.Issues 6 .WhereByAssignee(criteria.AssignedUserId) 7 .WhereBySupervisor(criteria.SupervisorUserId) 8 .WhereByCategory(criteria.CategoryId) 9 .WhereBySearchStatus(criteria.Status) 10 .WhereDateRange(criteria) 11 .WhereNotDeleted() 12 .WhereByKeyword(criteria.Keyword) 13 .ToDtos() 14 .OrderByDescending(x => x.CreatedTime) 15 .ToPageResult(request.PageIndex, request.PageSize); 16 } 17 }

2. 更新的例子

1 public void Submit(Guid userId, string content, string text, double lng, double lat, string address) 2 { 3 using (var db = base.NewDB()) 4 { 5 var issue = new Issue(userId, content, text, lng, lat, address); 6 db.Issues.Add(issue); 7 db.AddIssueLog(IssueLog.CreateOnSubmit(issue.Id, db.Users.GetNickName(userId))); 8 db.SaveChanges(); 9 10 issue.GenerateSerialNumber(); 11 if (!string.IsNullOrEmpty(SettingContext.Instance.AdminOpenIds)) 12 { 13 var name = db.Users.GetName(userId); 14 var totalPendings = db.Issues.Count(x => x.Status == IssueStatus.None && x.IsDeleted == false); 15 var adminOpenIds = SettingContext.Instance.AdminOpenIds.Split(','); 16 foreach (var openId in adminOpenIds) 17 { 18 var message = new PendingProcessTemplateMessage(openId, issue, name, totalPendings); 19 db.WeixinScheduledMessages.Add(message.ToWeixinScheduledMessage()); 20 } 21 } 22 db.SaveChanges(); 23 } 24 }

http://www.jsqmd.com/news/1114739/

相关文章:

  • 免费文档下载神器:kill-doc浏览器脚本一键获取全网文档
  • 行测总是做不完卷子,粉笔系统班里怎么练提速?
  • MacOS Web环境管理器 FlyEnv,非常好用
  • Pinecone vs Milvus vs Weaviate 2026版:向量数据库选型避坑实测
  • 收藏!小白程序员必看:AI Agent如何重塑白领工作,未来岗位将迎来哪些变革?
  • OnmyojiAutoScript:阴阳师游戏自动化管理的完整解决方案
  • Defender Control终极指南:简单3步彻底管理Windows Defender,提升系统性能50%
  • 为什么你总被扣摘要分?揭秘近3年1372份软考论文摘要的共性缺陷(附诊断自查清单)
  • 软考论文高分秘籍:用阅卷人视角反向构建写作框架(含近3年真题评分原始数据)
  • 【软考论文生死线】:为什么你的项目背景总被评“空洞”?3步重构法立竿见影
  • 如何免费下载百度文库等30+文档平台内容?kill-doc浏览器脚本终极指南
  • 【2026】Adobe After Effects 2026 安装激活完整指南
  • AI Orchestration:企业级大模型集成的双引擎架构
  • 盘锦瓷砖搭配,现代简约色调别太满
  • 2026免费大模型API清单:32个平台实测选型与生产级调度指南
  • 下载 | Win10 LTSB 2016官方精简版,适合低配老电脑的系统!(集成6月最新补丁、Win10 1607)
  • 2026年FDE实战新篇:解锁赋能新路径,你准备好了吗?
  • 直流有刷电机驱动系统设计与TC78H653FTG应用解析
  • 嵌入式EEPROM扩展存储方案与I2C驱动实现
  • 软考高项论文项目背景写作全链路拆解:需求来源→角色定位→技术栈选择→风险预埋(含真实过审案例)
  • Web安全漏洞实战指南:从注入攻击到CSRF的防御与修复
  • 思源宋体CN:7种字重开源字体如何彻底解决中文排版难题?
  • Claude API网关实战:开源代理基础设施搭建指南
  • Defender Control:Windows Defender完全控制工具深度解析
  • KKManager:终极游戏模组管理解决方案,一键解决插件冲突难题
  • 最后72小时急救指南:软考摘要重写提速300%,3类高频偏题摘要重构模板即拿即用
  • 3步掌握Godot逆向工程:完整资源提取与反编译指南
  • 3分钟搞定文档下载:kill-doc浏览器脚本让你轻松获取任何在线文档
  • WeChatPad:终极安卓微信双设备登录解决方案
  • 软考五大知识域权重剧透(附2024命题趋势预测):这17个隐藏得分点已连续5年命中简答题