我喜欢的 5 种编程模式 5. 嵌套三元运算符

2025-05-28

我喜欢的 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语句在我写代码时并没有带来太多价值。它似乎很碍事。

我更喜欢使用对象文字,原因如下:

  • 不必担心casebreak
  • 更容易阅读并快速了解正在发生的事情
  • 对象字面量很容易编写
  • 更少的代码

更多信息:

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 子句,以及一些相当可疑的条件逻辑。

我认为ifelse更容易阅读,因为它们是实际的单词,但当它们嵌套时,我开始很难跟上正在发生的事情并在脑海中跟踪一切。

我开始遵循三元运算符和嵌套三元运算符,我发现我能够一眼就快速了解发生了什么。

我认为这种模式完全取决于你和你的团队以及你的偏好。我曾经在两种模式都表现良好的代码库中工作过,并且能够理解其中的两种模式,但就我个人而言,我越来越喜欢嵌套三元组。

更多信息:

文章来源:https://dev.to/thejohnstew/5-programming-patterns-i-like-53dp
PREV
如何轻松提高编程水平简介
NEXT
航站楼生活质量基本改善