写点什么

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

  • 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:415028

评论

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

汇顶科技GR551x系列开发板已支持OpenHarmony

科技汇

海豚调度5月Meetup:6个月重构大数据平台,帮你避开调度升级改造/集群迁移踩过的坑

白鲸开源

Apache 大数据 开源 DolphinScheduler workflow

一种基于事件驱动架构的 SAP 产品集成方案介绍

汪子熙

Kubernetes 云原生 SAP Kyma 5月月更

土地市场分析,基于Python,基于Javascript,包含核心参数

梦想橡皮擦

5月月更

开发者玩转机器学习不能错过的15篇深度文章!

阿里云大数据AI技术

算法 数据处理 算法框架/工具 机器学习/深度学习 搜索推荐

数据预处理利器 Amazon Glue DataBrew

亚马逊云科技 (Amazon Web Services)

数据 处理器

虚谷未来CEO 唐佳娴:让虚拟人“灵” 动起来

阿里云弹性计算

XR 虚拟人

开源夜聊栏目开播:聊聊新晋 CNCF 项目 sealer 背后的故事

阿里巴巴云原生

阿里云 开源 云原生 直播

知识管理在企业创新中的作用

小炮

知识管理

直播预告丨 OpenHarmony 标准系统多媒体子系统之相机解读

OpenHarmony开发者

OpenHarmony

Wallys/QCN9074 /11ax 4x4 6G M.2

wallys-wifi6

wifi6 m.2

洞见科技数据科学家王湾湾:隐私计算助推金融业数字化转型

洞见科技

数据挖掘 金融科技 隐私计算

查看Docker容器的信息

程序员欣宸

Java 5月月更

金融街资本携手索信达:助推金融行业数智化转型

索信达控股

创建自定义的配置信息

Wk

5月月更

青藤《关键信息基础设施增强保护安全实践》论文入选中国科技核心期刊

青藤云安全

信息安全 关键信息 安全保护

互联网公司实行目标管理(OKR)五点原则和基础

laofo

互联网 OKR 研发效能 快手 绩效考核

亚马逊云基础架构:一场从未停歇的技术创新革命

亚马逊云科技 (Amazon Web Services)

架构 亚马逊云

无聊科技正经事周刊(第8期):让子弹飞一会儿,用长期的眼光看中国开源

潘大壮

开源 程序员 周刊 开源中国 科技周刊

Python 编程

兮子

5月月更

java培训 | API 接口如何实现统一格式返回

@零度

JAVA开发 API

Linux环境编译动态库

Loken

音视频 5月月更

跨平台应用开发进阶(十四) :uni-app 实现IOS原生APP-本地打包集成极光推送(JG-JPUSH)详细教程

No Silver Bullet

uni-app App 5月月更 IOS原生 JG-JPUSH

大数据培训 | 数据仓库构建方法论和实践

@零度

数据仓库 大数据开发

监控告警平台的国产化选择—Rancher与夜莺的集成

Rancher

Kubernetes k8s rancher

全场景式全流程监控,博睿数据为券商IT运维难题提供范例

博睿数据

数字化转型 博睿数据 数据链DNA 证券行业

直播预告 | 服务网格规模化应用下的 Istio Sidecar 灵活配置实践

阿里巴巴云原生

阿里云 云原生 直播 服务网格 Istio Sidecar

JavaScript== 和 ===

源字节1号

软件开发 前端开发 后端开发 小程序开发

什么!Sentinel流控规则可以这样玩?

牧小农

sentinel SpringCloud Alibaba

web前端培训 | Tree shaking问题排查

@零度

web前端开发

技术分享| 浅谈IM 产品中的“缩略图”功能

anyRTC开发者

音视频 IM 实时消息 发送图片 缩略图

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