10 月 23 - 25 日,QCon 上海站即将召开,现在购票,享9折优惠 了解详情
写点什么

你知道这五种好用的编程模式吗?

  • 2019-07-18
  • 本文字数:2135 字

    阅读完需:约 7 分钟

你知道这五种好用的编程模式吗?

这篇文章中介绍了一些我在编程时使用的模式。有些模式是基于我最近在工作时所做的观察,还有一些是我这些年来从同事那里偷来的。


下面的顺序不分先后,只是一个简单的汇总。

早退

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);}
复制代码


我将这种模式称为“早退”,但有些人也将它称为“保镖模式”或“保护条款”。除了命名之外,该模式的方法是首先检查无效用例并从该函数返回,否则继续到预期用例并执行函数。


我认为这种方法有一些优点,我很喜欢:


  • 鼓励开发者考虑无效/边缘情况,以及处理这些情况的对策。

  • 避免对意外用例做不必要的代码处理。

  • 让开发者对每个用例的处理更加胸有成竹。

  • 使用这种模式,开发者可以快速浏览功能并了解流程和执行情况,这通常遵循自上而下的模式——无效情况 - >小案例 - >预期案例


更多信息:Rik Schennink 的“保镖模式”:http://rikschennink.nl/thoughts/the-bouncer-pattern/

改用对象字面量

// Switchlet 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 literalconst 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 语句。我经常在写各个 case 时犯错,而且常常会忘记 break。这会导致许多有趣的问题。在编写代码时,switch 语句的用途没那么大,而且有些碍事。


我更喜欢使用对象字面量,原因在于:


  • 不必担心 case 或 break。

  • 代码更容易阅读,可以快速了解正在发生的事情。

  • 对象字面量很容易编写。

  • 代码更简洁。


更多信息:


一次循环两个数组

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;}, [[], []]);
复制代码


这种模式其实没什么特别,我应该早点意识到它的。以前我的做法是检查一大堆对象来获得符合某种条件的所有对象,然后针对不同的条件再做一次检查。这意味着我要做两遍循环数组,但实际上做一遍就够了。


这个模式是从(https://30secondsofcode.org/#bifurcate)这里学来的。这个网站有很多干货,我建议大家都去看看。


我知道 reduce 可能不太好学,大家不是很清楚它背后发生了什么;但是如果你能熟悉它的用法,就可以利用它来构建循环数组时所需的各种数据结构。它其实应该叫 builder 的,比 reduce 这个名字更合适。

不用’foo’变量

// badconst foo = y && z;
// goodconst isPostEnabled = isPost && postDateValid;
复制代码


这个模式看起来挺眼熟的,我相信大家都见过这种代码。花点时间尽量取一个合适的名字吧。


这对于专业人士或教师来说是尤为重要的。变量命名应该用来帮助解释和给出代码内容的上下文。


当别人阅读你的代码时,他们应该能理解你想要解决的问题。


更多信息:


Richard Tan 的“命名变量的艺术”:https://hackernoon.com/the-art-of-naming-variables-52f44de00aad

嵌套三元组

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 作为单词更容易理解;但当它们嵌套在一起时,我就开始越来越糊涂了。


不过嵌套三元组用的多了之后,我的思路也开始变得更清晰。


我认为这种模式完全取决于你和你的团队以及你的偏好。我见过有人能很好地应付两种情况,对各自的优劣都很清楚,我个人而言是用得越来越多了。


更多信息:


Eric Elliot 的“嵌套三元组真棒”:https://medium.com/javascript-scene/nested-ternaries-are-great-361bddd0f340


英文原文:https://www.johnstewart.dev/five-programming-patterns-i-like/


2019-07-18 18:415054

评论

发布
暂无评论
发现更多内容

HTML知识框架 二

默默的成长

html 前端 11月月更

高频react面试题自检

beifeng1996

React

前端高频面试题合集(中高级必备)

loveX001

JavaScript

看透react源码之感受react的进化

goClient1992

React

说说你对Vue的keep-alive的理解

bb_xiaxia1998

Vue

经常会采坑的javascript原型应试题

loveX001

JavaScript

Map接口概述和基本使用

共饮一杯无

Java map 11月月更

20道前端高频面试题(附答案)

loveX001

JavaScript

Map接口的子类HashMap和LinkedHashMap

共饮一杯无

Java 11月月更 Map集合

React源码分析(一)Fiber

goClient1992

React

中高级前端开发需要掌握的vue知识点

bb_xiaxia1998

Vue

谈谈前端性能优化-面试版

loveX001

JavaScript

Flowable 定时器的各种玩法

江南一点雨

Java spring springboot flowable JavaEE

问:React的useState和setState到底是同步还是异步呢?

beifeng1996

React

React-Hooks源码深度解读

goClient1992

React

图学习初探Paddle Graph Learning 构建属于自己的图【系列三】

汀丶人工智能

图神经网络 11月月更 随机游走算法 异质图

【设计模式】原型模式:猴头,我叫你一声你敢答应吗?

游坦之

11月月更

极客时间运维进阶训练营第三周作业

Starry

Python进阶(三十六)Web框架Django项目搭建全过程

No Silver Bullet

Python django 11月月更

Git学习笔记

lxmoe

git 学习笔记 常用命令 11月月更

Python进阶(三十五)Fiddler命令行和HTTP断点调试

No Silver Bullet

Python fiddler 11月月更

Vue内置组件之Transition(一)

Augus

vue.js 11月月更

Python进阶(三十四)Python3多线程解读

No Silver Bullet

多线程 Python3 11月月更

一天梳理完react面试题

beifeng1996

React

Spring 5(三)AOP

浅辄

Java Spring5 11月月更

《数字经济全景白皮书》中国商业银行普惠金融可持续发展能力评价2022

易观分析

普惠金融 数字技术应用

CSS知识框架(一)

默默的成长

CSS 前端 11月月更

问:你是如何进行react状态管理方案选择的?

beifeng1996

React

Spring 5(四)JdbcTemplate

浅辄

Java Spring5 11月月更

【C语言】float 关键字

謓泽

11月月更

Ubuntu部署和体验Nexus3

程序员欣宸

Docker 11月月更 nexus3

你知道这五种好用的编程模式吗?_大前端_John Stewart_InfoQ精选文章