大神级程序员透露的11个不传秘籍(上篇)

315 阅读8分钟

作为编程初学者,提高代码技能可能是你的首要任务之一。

但如何提升往往是初学者面临的首要难题,哪些技术最值得学习,哪些技术能帮你更快的写出优秀的代码?

技术方向的选择、具体的学习路线可能无法通过一篇文章就能说清楚,更多的需要根据爱好、目的、市场需求等多方面去了解决策。

但是下文中,将毫无保留的带你掌握无数大神程序员多年工作总结的宝贵经验,有助于你少走弯路写出更优秀的代码,提升编程效率。

甚至很多在职多年的程序员也无法全部掌握,都是通过血与泪的踩坑才逐渐意识到。

image.png

1. 写代码前先做好计划

项目需求下来后,第一要点就是沟通确认清楚需求,做好构思,把可能出现的细节问题沟通清楚,避免后期返工。

写代码前,先把思路理清,整理好逻辑结构。

基础级的计划:

  • 要输入和输出什么数据?

  • 预期结果是什么?

  • 流程中涉及哪些步骤?

  • 需要哪些数据结构?

  • 是否有需要考虑的边缘情况?(例如某个值不能超出一定的范围、字符串不能为空之类)

事先通过上面的方法过一遍逻辑可能花不了你多少时间,但可以帮你避免不少事后产生问题带来的烦恼。

进阶级的计划:

  • 详细的了解分析待解决的需求与问题。(根据需求大致规划细节后,在进一步与产品经理沟通细节问题)

  • 可以提前做个草稿模拟大致的代码结构。

  • 仔细思考好每段代码用来实现什么效果。

  • 绘制流程图、泳道图等图标来帮助可视化的呈现整体逻辑。

  • 代码编写完根据拟定的流程重新审视一遍代码。

  • 做好代码注释,便于其他人理解逻辑。

如果流程复杂且时间充裕,也可以根据上面的方法试一试。

image.png

2. 使用有意义的变量与函数名称

变量与函数的命名一直是程序员日常工作中的一大难题。

但是一个易于阅读与理解的名称还是十分必要的。

应当根据当前变量与函数所代表的功能设置对应的英文名称。

优化前:

let x, y, z;
function f() { 
    // 省略具体函数功能
}

上方的例子往往很难理解x,y,z,f()具体代表什么,甚至你自己过一段时间再来回顾都难以理解。

优化后:

let firstName, lastName;
function printFullName(firstName, secondName) { 
    // 省略具体函数功能
}

优化后,就能很容易的理解这段代码是让你输入姓氏与名称,然后通过函数最终输出完成的姓名。

下面是几种最常用的命名规则:

  • 驼峰法:将单词拼接在一起,除第一个单词外,每个单词都以大写字母开头。(例如:firstName, lastName, printFullName)

  • Pascal法:与驼峰法类似,但第一个单词也是大写的。(例如:FirstName, LastName, PrintFullName)

  • 蛇型法:所有单词都是小写,但是通过下划线分隔。(例如:first_name、last_name、print_full_name)

  • Kebab法:类似蛇型法,但是通过横线作为分隔。(例如:first-name、last-name、print-full-name)

一个项目最好只选择一种命名法,并保持下去。

当变量或函数所表示的意义较为复杂时,最好在声明的时候在旁边通过注释解释清楚具体细节。

let firstName; // firstName 名称 (不允许超过4个字)
let lastName;  // lastName 姓氏 

// 根据输入的姓氏与名称拼接,并显示在页面中 
function printFullName(firstName, secondName) { 
    
}

命名的一些小技巧:

  • 符合描述,贴合对应的变量与函数。

  • 尽量避免单个字母的名称,除非是大众化认知的名称,例如for循环中命名i作为索引。

  • 易于记忆与拼写,尽量简洁。

  • 整个项目同类命名尽量一致,但要避免同一作用域内重复声明导致覆盖。

3. 编写模块化函数

作为程序员日常难以避免与函数打交道。函数有助于将一个复杂需求拆分成多个小部分,单独管理。

优质的函数有助于测试、调试和复用。同时还能提升代码可读性,每个函数的作用目的都是明确的。

优化前:

function multiplySquaredNumbers(x, y) {
    let xSquared = x * x;
    let ySquared = y * y;
    return xSquared * ySquared;
}

console.log(multiplySquaredNumbers(5, 6)); //最终输出 360

上方的函数针对两个参数的平方值进行相乘,试想一下我们是不是可以将求平方值再次封装成一个函数?

优化后:

function multiplySquaredNumbers(num1, num2) {
    return Math.pow(num1, 2) * Math.pow(num2, 2);
}

console.log(multiplySquaredNumbers(2, 3));

这是使用了JavaScript提供的Math.pow()函数替代原本的平方值获取,我们可以再试试自己来实现这个求平方值的函数。

动动手:

function square(num) {
    return num * num;
}

function multiplySquaredNumbers(num1, num2) {
    return square(num1) * square(num2);
}

console.log(multiplySquaredNumbers(5, 6)); 

此时我们通过生成square()函数,将求平方值这个小需求封装起来,方便调试与复用。

当然日常编程过程中,可根据需求自行拆分函数,同时我们也应该尽量使用代码底层已经帮我们声明好的函数。例如上例中的Math.pow(),尽量避免重复造轮子。

编写函数我们还要注意:

  • 使用规范的命名。

  • 避免函数产生副作用。(例如将数组作为参数传入,最后调整了数组顺序,导致其他地方使用时产生循序错误问题。在命名函数时要定义好适用范围,如果本身就是为了调整顺序的函数那是正确的,如果是作为过滤数据的函数结果变更了顺序,那就回产生问题)

  • 考虑好参数,避免过多不必要的参数

上面的例子只是基础的演示,如何写出更优质的函数还可以多了解一些《设计模式》相关知识,结合使用能让你的函数更具性能与通用性。

如果觉得教程文字太过于枯燥,也可以试试《JavaScript 函数式编程》这种游戏化函数式编程教学体验。

image.png

4. 适当使用数据结构

数据结构是将数据分组的最有效的办法。

数据结构有许多不同的类型,但最常见的是数组对象

数组是数据列表。它们可用于存储任何类型的数据,但数组中的每个项目必须具有相同的类型。

数组使用方括号声明:

const arr = ['a', 'b', 'c'];

对象是使用键值来整理数据的集合。键用于索引访问值,这些值可以是任何类型的数据。

对象使用大括号声明:

const obj = {
    key1: 'value1',
    key2: 'value2',
    key3: 'value3',
};

适当的使用数据结构,能提升代码的可读性与效率。能帮助你更快速的获取到所需要的对应的值。

优化前:

let dog1 = '小强';
let dog2 = '卤蛋';
let dog3 = '腊肠';
let dog4 = '二蛋';
let dog5 = '狗胜';

优化后:

const dogGroup = ['小强', '卤蛋', '腊肠', '二蛋', '狗胜'];

优化后,通过遍历数组中的数据就能快速获取小狗们的名称,不需要在逐个调取变量。

可以通过《JavaScript 基本数据结构》,了解更多数据结构相关知识。

5. 养成写注释的习惯

注释是未执行的代码。

程序员可以通过写注释来帮助自己或者他人理解代码的逻辑。

不同语言的注释方式有所不同,文中我们以JavaScript举例。

// 表示单行注释

/*
    表示多行注释
    表示多行注释
    表示多行注释
 */ 

好的注释习惯有助于:

  • 帮助自己或者他人更快的理解代码逻辑与含义。

  • 帮助自己留下代码实现与修复记录,便于后期理解。

使用注释的小帮手:

  • 使用注释来解释您的代码正在做什么以及为什么要这样做。

  • 使用注释来记录自己关于需要完成或修复的事情的笔记。

  • 使用注释来解释复杂或不明显的代码。

  • 使用注释来增强可读性代码。

  • 在编写代码的时候就添加注释,而不是过后,因为往往没有过后。

  • 不要过度注释您的代码,保持刚需。

  • 在评论中使用清晰简洁的语言。

  • 注释内容尽量说人话。

  • 使用代码使注释保持最新。如果您更改代码,请更改注释。

  • 删除过时的注释。

image.png

由于篇幅过长,本文将分为上/下两篇。

上篇更多介绍了编程基础技巧;

下篇则更侧重于实战中的应用。