惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
U
Unit 42
GbyAI
GbyAI
M
MIT News - Artificial intelligence
美团技术团队
罗磊的独立博客
雷峰网
雷峰网
量子位
博客园 - 【当耐特】
Last Week in AI
Last Week in AI
D
Docker
小众软件
小众软件
S
SegmentFault 最新的问题
Blog — PlanetScale
Blog — PlanetScale
阮一峰的网络日志
阮一峰的网络日志
宝玉的分享
宝玉的分享
T
Tailwind CSS Blog
WordPress大学
WordPress大学
V
V2EX
博客园_首页
腾讯CDC
The Cloudflare Blog
A
About on SuperTechFans
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC

博客园 - 北山秋叶

macos 上的 zsh 启动问题记录 Keychron Max 键盘改键指南 Github 命令在 命令行 中访问特别慢的解决方法 ai 随想 影响记忆 monorepo(多包)管理中, 引入的 css 文件丢失的问题 (或者说package.json中的 sideEffects 的探索) 浏览器插件 Obsidian web 与 Obsidian 插件 local rest api 结合配置过程记录 package.json中的版本号 mac 下检测网络状态的命令 git clone 需要用户名密码的一个小问题 yeoman编写自己的脚手架 await和promise结合使用的问题 有趣的二分 ngix反向代理-之反向 redux和flux究竟有什么不同, 说点自己的理解 npm发包记录 由一个聚焦-focus-事件异常跟踪引起的总结 git查看分支的几个方法 test-your-mind-快速测试自己的代码 给Promise在外部增加断点 js中调试技巧-打印日志信息
怎么才能写一个好代码
北山秋叶 · 2020-07-25 · via 博客园 - 北山秋叶

给自己布置这个标体在这里的时候, 我就知道不是一个好的题目. 并且这个也是一个持续的体会和总结.

当然, 对于一个好的代码的评判, 网上搜索可能一大推. 在多年coding后, 总结出来也会差不多.

基本上大方向的:

  1. 可读性
  2. 可维护性
  3. 可扩展性

从实际角度考虑的:

  1. 逻辑清晰
  2. 运行效率高
  3. 问题(bug)少

进一步的:

  1. 算法上有调优处理 -- 可能归结为效率问题
  2. 有模式上的实现 -- 认为 模式是对逻辑清晰的一种命名, 将这个事情进行固化
  3. 模块之间的解耦 -- 多人开发,沟通协作上有利, 也利于编码的可读性

所以, 理解一下, 代码好坏与否, 在于两大块:

  1. 代码的沟通上
    代码作为程序的实现, 更作为程序员之间的语言, 是大家的一个工作"沟通"之地, 高效沟通是基础
  2. 代码的实际运行上
    show me the code, 代码的高效产出结果才是目的

所以, 到这里我还没有达到我表体要说的事情, 具体这些还是原则上的东西. 所以, 有没有一些具体的东西呢?

我自己简单想了一下, 也争取做一个持续的总结整理, 这里只说一些具体的代码书写习惯以及风格上的东西

多条件判断场景

上代码, 经常遇到很多个条件下的判断的问题, 存在多个符合条件下的判断

function whatYouWillSay(role) {

    const conditionA = ...;
    const conditionB = ...;
    const conditionC = ...;

    if (conditionA && conditionB && conditionC) {
        ...
    }

}

我的一个感觉就是非常不清晰, 别人读取这些条件判断的时候很不容易理解
我的一个感觉比好的体验是: 如果过分复杂,(将判断条件单独提出这个再说)

需要提取一些短路判断, 比如上边的判断

function ...(){
    if (!conditionA){
        return ...
    }

    if (!condtionB) {
        return ...
    }

    if (!condtionC) {
        return ...
    }

    //到这里的条件肯定都是满足的了, 上边的判断尽量简单明了, 让大家知道是什么意思
    //并且方法命名上也能自解释
    return ...

}

要有默认值的返回

对于一个方法, 首先要有一个判定, 我的输入和输出是什么, 然后再进行具体实现. 对于输出最好有一个默认值
所以 typescript 这里做得就比较好, 如果有声明输出, 没有显示输出的话, 经常会提示错误

function returnStr() : string {

    ...


    // 我是一个 str
    return 'defaultStr'
}

写法上尽量少的创建一些中间变量

但是如果中间变量可以让代码更清晰的话, 那就创建吧. 这里想到一个例子, 比如对数组需要做一个统计返回的处理
reducer 都可以进行实现.

例如最普通的求和

const arr = [];
const sum = arr.reduce((sum, cur)=>sum+cur, 0);

例如要去遍历一个数组, 但是需要根据数组输出一个东西 (其实类似上边的求和, 复杂了一些)

const arr = [4,5,6];

const effectYourSomething = arr.reduce((effect, item, index)=>{
    effect[item] = index
    return effect;;
}, {})

//输出
{4: 0, 5: 1, 6: 2}

总结

一种习惯或者素养, 并且是一个不断持续的过程.