写点什么

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

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

评论

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

什么是404页面?

源字节1号

404

CPU的“花招”已耍完?无指令集架构颠覆旧套路

OneFlow

人工智能 机器学习 深度学习 英伟达 芯片

Spark的job、stage和task的机制论述

编程江湖

在线常用crontab表达式大全验证解析

入门小站

工具

在线HTML压缩工具

入门小站

工具

摩尔定律的现在及未来

科技新消息

vivo 商品中台的可视化微前端实践

vivo互联网技术

可视化 前端特效

Apache Impala架构解析及与Hive、SparkSQL的性能比较

编程江湖

微信业务架构图&学生管理系统架构设计

高山觅流水

架构实战营 「架构实战营」

AppCube快速开发问卷调查应用在WeLink发布上线

DS小龙哥

3月月更

【研讨会报名截止最后一天】全程参会,还有惊喜奖品等你拿!

龙智—DevSecOps解决方案

CI/CD 在线研讨会

web前端技术Mongoose详解

编程江湖

【Git教程】Git最全使用指南

阿里云云效

git 云计算 阿里云 DevOps Codeup

助力数字经济 明源云助力不动产行业打造数字新引擎

科技热闻

赋能创新,深开鸿重磅发布面向金融行业KaihongOS发行版

科技汇

分布式事务详解:分段提交与最终一致性

分布式事务 可靠消息最终一致 TCC 构架 最终一致性

[Day2]-[回溯] N皇后问题

方勇(gopher)

LeetCode 动态规划 数据结构算法

如何建立高效的质量保障机制

老张

软件测试 质量保障 交付能力

React Router 6 (React路由) 最详细教程

蒋川

React react rout

TDengine 和 InfluxDB 查询性能对比测试报告

TDengine

数据库 tdengine

【躲过裁员,成功上岸】发现小公司有不好的苗头,赶紧学习!

小傅哥

面试 小傅哥 中间件 项目

TDengine 在智慧矿山系统中的应用

TDengine

架构实战营-第6期 模块一课后作业

乐邦

「架构实战营」

Echarts 折线图完全配置指南 - 手把手教你设置 Echarts 折线图详细教程

蒋川

Vue eCharts

Video.js 使用教程 - 手把手教你基于 Vue 搭建 HTML 5 视频播放器

蒋川

Vue video.js

想做好分布式架构?这个知识点一定要理解透!

博文视点Broadview

DiDi Kafka-Manager安装和简单使用

云原生

kafka spring kafka manager

成为 DevOps 工程师需要具备哪些能力?

SoFlu软件机器人

Linux常用命令分享:有手就会,但能解决95%以上的问题

优麒麟

Linux 开源 计算机 优麒麟

个全中文注释的迷你Spring!

程序员阿杜

Java spring springboot

解决报错:SSL certificate problem: certificate has expired

liuzhen007

git

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