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

[译] 不用祖传秘方 - 写好代码的几个小技巧

原文:【The Non-Secret Formula for Writing Better Code】 https://hackernoon.com/the-non-secret-formula-for-writing-better-code-e41d1ff38682

免责声明: 尽管文中的观点应该是没什么疑问的正确选择,但都是个人观点。

我喜欢写干净的代码,也希望我的团队写出优良而干净的代码。问题在于,每个人对于 “干净的代码” 有不同的定义。

并不用什么神秘的祖传秘方,这里列出了一些简单易行的小技巧,就可以让我更少的写出 bug,也让我更 happy。

“更好的代码” 指的是什么?

我乐于处理注重以下目标的代码:

  • 可读性 :代码应该易读易理解。why 和 how 都应该清楚的反映在代码中。
  • 简单的 :当不存在无法读懂的情况,且难以被误用,以及即便增添功能也难以破坏它的时候,代码就是简单的。
  • 一致的 :一致的缩进、一致的命名、一致的文件结构。不管采取什么样的风格、范式和决策,都要始终如一。

此外还有一些我较少关心的事情:使代码通用、强制使用设计模式、遵循已知的“正确方式”,以及不必要的性能优化

如何写出更好的代码?

以下是我现在如何写代码的方式,以及为何要这样写的理由:

零注释策略

注释会变得陈旧并由此增加干扰你理解代码的风险。并且,注释会让你觉得可以对一些本不应该存在的含糊代码做一些补偿。

所以说与其写注释,不如关注于代码的可读性。

// ?
if (x > 5) { /* 5 是一个需要 run away 的特殊临界点 */
   runAway()
}

// ?
const runAwayThreshold = 5
const shouldRunAway = (x > runAwayThreshold)
if (shouldRunAway) {
   runAway()
}
复制代码

零 TODO 策略

不要把代码本身当成项目管理系统来用。JIRA、Trello、Asana 等更适合于将计划中的工作文档化。如果诸如 “有时间的时候务必要将这里变得更快” 的注释是必要的,那么就应该把它放在每个人都能看到的地方。

// ?
while (true) {} // TODO: 有时间的时候务必要将这里变得更快

// ?
while (true) {}
复制代码

自文档化的代码

使用变量可以帮助代码变得自文档化(self-documenting)。可以用这些变量更好的解释我们的意图:变量名表明了 why,而对其赋的值则是 how。

// ?
if (x > 2 && x < 5) {
   fireMissiles()
}

// ?
const enemyInRange = (x > 2 && x < 5)
if (enemyInRange) {
   fireMissiles()
}
复制代码

尽早的退出

函数缩进的第一列是个“好位置”。所以我总是尽早退出(return 或 break),从而将更重要的代码片段尽可能的放在函数的“根层次”上。

作为通用的规则: 更少的缩进更易读的代码

// ?
const fetchData = (id) => {
  if (id) {
    fetch('/data/' + id)
  }
}

// ?
const fetchData = (id) => {
  if (!id) {
    return
  }
  fetch('/data/' + id)
}
复制代码

不可变的

相比于可变的引用(JS 中的 var 或 let),我更喜欢 const 引用;因为定义了一个常量之后,就不需要再关注其(如何或什么时候被改变)了。不管是什么语言,基本都有类似的特性支持常量。

// ?
let mul = x * y
if (mul > 70) {
  mul = 70
}

// ?
const mul = Math.min(x * y, 70)
复制代码

另一个例子:

// ?
let x
if (str === 'one') {
  x = 1
} else if (str === 'two') {
  x = 2
} else if (str === 'three') {
  x = 3
}

// ?
const x = {
  one: 1,
  two: 2,
  three: 3
}[str]
复制代码

为每个想法单起一行

我们都需要专注,来面对复杂的代码。可以通过保持“代码句子”的简短,来将复杂的代码变得简单。

// ?
people
  .filter(person => person.age > 10 && person.firstName.length > 2 && person.lastName.length > 4)
  
// ? 逻辑更清晰
people
  .filter(person => person.age > 10)
  .filter(person => person.firstName.length > 2)
  .filter(person => person.lastName.length > 4)
  
// ? ? 逻辑清晰且性能更好
people.filter(
    person => person.age > 10 
    && person.firstName.length > 2 
    && person.lastName.length > 4
)
复制代码

(end)


----------------------------------------

长按二维码或搜索 fewelife 关注我们哦

相关文章:

  • el-input获取焦点 input输入框为空时高亮 el-input值非法时
  • 安装Cassandra数据库和访问客户端配置
  • CSS中background-position使用技巧
  • java调用IPFS去中心化体系
  • Scrapy 1.5.0之基础入门
  • OSChina 周一乱弹 —— 你老婆和闺蜜总用奇怪的眼神看着你
  • Linux 进程后台运行的几种方式 screen
  • ES6系列--4. 对象的扩展
  • 技术沙龙|风口之下,经验丰富的“传统开发者”要不要转型区块链开发?(西安)...
  • 中兴智能视觉大数据报道:至2020年人脸识别市场规模增速为166.6%
  • nginx lua模块安装 让nginx支持lua
  • 【知识小结】Git 个人学习笔记及心得
  • python的len函数
  • 基础网络
  • 巧妙的CSS
  • .pyc 想到的一些问题
  • [nginx文档翻译系列] 控制nginx
  • 3.7、@ResponseBody 和 @RestController
  • ES6之路之模块详解
  • hadoop入门学习教程--DKHadoop完整安装步骤
  • iOS高仿微信项目、阴影圆角渐变色效果、卡片动画、波浪动画、路由框架等源码...
  • Java IO学习笔记一
  • JavaScript函数式编程(一)
  • k8s 面向应用开发者的基础命令
  • Koa2 之文件上传下载
  • Less 日常用法
  • redis学习笔记(三):列表、集合、有序集合
  • VUE es6技巧写法(持续更新中~~~)
  • 从PHP迁移至Golang - 基础篇
  • 飞驰在Mesos的涡轮引擎上
  • 高程读书笔记 第六章 面向对象程序设计
  • 快速构建spring-cloud+sleuth+rabbit+ zipkin+es+kibana+grafana日志跟踪平台
  • 容器化应用: 在阿里云搭建多节点 Openshift 集群
  • 想晋级高级工程师只知道表面是不够的!Git内部原理介绍
  • 小程序开发中的那些坑
  • 用jquery写贪吃蛇
  • 用简单代码看卷积组块发展
  • 积累各种好的链接
  • 通过调用文摘列表API获取文摘
  • ​卜东波研究员:高观点下的少儿计算思维
  • ​马来语翻译中文去哪比较好?
  • #pragam once 和 #ifndef 预编译头
  • (Matlab)遗传算法优化的BP神经网络实现回归预测
  • (MIT博士)林达华老师-概率模型与计算机视觉”
  • (转)C语言家族扩展收藏 (转)C语言家族扩展
  • ****** 二 ******、软设笔记【数据结构】-KMP算法、树、二叉树
  • *2 echo、printf、mkdir命令的应用
  • .NET 2.0中新增的一些TryGet,TryParse等方法
  • .NET 4.0中使用内存映射文件实现进程通讯
  • .NET Compact Framework 多线程环境下的UI异步刷新
  • .NET 表达式计算:Expression Evaluator
  • .NET和.COM和.CN域名区别
  • @CacheInvalidate(name = “xxx“, key = “#results.![a+b]“,multi = true)是什么意思
  • @JSONField或@JsonProperty注解使用
  • @ResponseBody