我喜欢的 5 种编程模式
5. 嵌套三元运算符
在这篇文章中,我将介绍一些我在编程中尝试运用的模式。这些模式是我最近工作时对自己的观察,以及多年来从同事那里借鉴的一些经验。
这些图案没有特定的顺序,只是简单的集合。
1. 提前退出
function transformData(rawData) {
// check if no data
if (!rawData) {
return [];
}
// check for specific case
if (rawData.length == 1) {
return [];
}
// actual function code goes here
return rawData.map((item) => item);
}
我把这种模式称为“提前退出”,但有些人也称之为“保镖模式”或“保护条款”。撇开名称不谈,这种模式的思路是先检查无效用例,然后从该函数返回,否则就继续执行函数预期的用例。
对我来说,这种方法有一些我非常喜欢的优点:
- 鼓励思考无效/边缘情况以及如何处理这些情况
- 避免针对意外用例进行意外和不必要的代码处理
- 让我在精神上更清楚地处理每个用例
- 一旦采用,您可以快速浏览功能并了解流程和执行情况,通常遵循自上而下的方法,从无效案例->小案例->预期案例
更多信息:
2. 切换到对象字面量
// Switch
let createType = null;
switch (contentType) {
case "post":
createType = () => console.log("creating a post...");
break;
case "video":
createType = () => console.log("creating a video...");
break;
default:
createType = () => console.log('unrecognized content type');
}
createType();
// Object literal
const contentTypes = {
post: () => console.log("creating a post..."),
video: () => console.log("creatinga video..."),
default: () => console.log('unrecognized content type')
};
const createType = contentTypes[contentType] || contentTypes['default'];
createType();
接下来是删除switch
。我经常在写 each 的时候出错case
,而且经常忘记break
。这会导致各种有趣的问题。这个switch
语句在我写代码时并没有带来太多价值。它似乎很碍事。
我更喜欢使用对象文字,原因如下:
- 不必担心
case
或break
- 更容易阅读并快速了解正在发生的事情
- 对象字面量很容易编写
- 更少的代码
更多信息:
- 切换案例、如果否则或循环图(作者:May Shavin)
- Todd Motto 用对象字面量替换 switch 语句
- 重写 Javascript:替换 Chris Burgin 的 Switch 语句
3. 一次循环两个数组
const exampleValues = [2, 15, 8, 23, 1, 32];
const [truthyValues, falseyValues] = exampleValues.reduce((arrays, exampleValue) => {
if (exampleValue > 10) {
arrays[0].push(exampleValue);
return arrays;
}
arrays[1].push(exampleValue);
return arrays;
}, [[], []]);
这种模式其实没什么特别的,我应该早点意识到这一点,但我发现自己会过滤一个集合,获取所有符合特定条件的项,然后根据不同的条件再次执行同样的操作。这意味着需要循环遍历数组两次,而我本来只需循环一次就可以了。
原来这个有个名字(bifurcate),是我从30secondsofcode.org偷来的。如果你还没看过这个网站,我建议你去看看。那里有很多有用的信息和代码。
我知道 reduce 可能有点让人望而生畏,而且不太清楚到底是怎么回事,但如果你能熟练掌握它,就能在循环遍历集合时构建任何你需要的数据结构。他们真的应该叫它 reduce,builder
而不是reduce
。
更多信息:
4. 没有“foo”变量
// bad
const foo = y && z;
// good
const isPostEnabled = isPost && postDateValid;
这可能看起来有点明显,但我相信我们都见过实现这种功能的代码。花点时间,尽量给它起个合适的名字。
这对于专业人士或负责教育他人的人来说尤其重要。变量命名应该用来解释代码中发生的事情,并提供上下文。
有人应该能够读懂你的代码并大致开始理解要解决的问题。
更多信息:
5. 嵌套三元运算符
let result = null;
if (conditionA) {
if (conditionB) {
result = "A & B";
} else {
result = "A";
}
} else {
result = "Not A";
}
const result = !conditionA
? "Not A"
: conditionB
? "A & B"
: "A";
我承认,一开始嵌套三元运算符的想法确实让人很反感。它看起来只是一种写条件语句的巧妙方法。后来我开始写业务逻辑,却发现自己需要嵌套 if else 子句,以及一些相当可疑的条件逻辑。
我认为if
和else
更容易阅读,因为它们是实际的单词,但当它们嵌套时,我开始很难跟上正在发生的事情并在脑海中跟踪一切。
我开始遵循三元运算符和嵌套三元运算符,我发现我能够一眼就快速了解发生了什么。
我认为这种模式完全取决于你和你的团队以及你的偏好。我曾经在两种模式都表现良好的代码库中工作过,并且能够理解其中的两种模式,但就我个人而言,我越来越喜欢嵌套三元组。
更多信息:
文章来源:https://dev.to/thejohnstew/5-programming-patterns-i-like-53dp