架构整洁之道-03 编程范式-函数式编程

简介: 架构设计另一个编程范式—函数式编程,其主要关心数据到数据之间的映射关系,即将计算过程抽象描述成一种表达式求值。先看下以下实现数组转换成数组对象的函数代码:

函数式编程

架构设计另一个编程范式—函数式编程,其主要关心数据到数据之间的映射关系,即将计算过程抽象描述成一种表达式求值。先看下以下实现数组转换成数组对象的函数代码:

// 实现数组转换数组对象
function AryToObjectAry() {
  const ary = ["jasen-yang", "tom-han", "marry-han", "lucy-any"];
  const newObj = [];
​
  ary.forEach((value) => {
    let names = value.split("-");
    let newNames = [];
    names.forEach((name) => {
      const temp = name[0].toUpperCase() + name.slice(1);
      newNames.push(temp);
    });
    newObj.push({ name: newNames.join(" ") });
  });
  console.log(newObj);
  return newObj;
}
​
(()=>{
    AryToObjectAry()
})();
​
// 输出结果
[
  { name: 'Jasen Yang' },
  { name: 'Tom Han' },
  { name: 'Marry Han' },
  { name: 'Lucy Any' }
]

定义变量,循环数组,把值开头大写,每个函数各司其职,按一定的步骤,从函数输入到输出结果。从代码上阅读可以很清楚知道在做什么,但是一但出问题就很难定位,其中掺杂了大些逻辑和变量。

如果每个过程都是一个函数,会怎么样?看下以下伪代码:

​
function convertAry() {
  const ary = ["jasen-yang", "tom-han", "marry-han", "lucy-any"];
​
  const getNames = (value) => {
    return value.split("-");
  };
  const toUpper = (value) => {
    return value[0].toUpperCase() + value.slice(1);
  };
  const convertName = (newObj,value) => {
    return newObj.push({ name: value });
  };
​
  const newObj = [];
  ary.forEach((value)=>{
    const newName = compose(getNames(value),toUpper);
    const result = compose(newObj,convertName(newName));
  });
  return newObj;
}

看整个编程思路,可以清晰看出,函数式编程,重点是函数而不是过程,通过函数的组合变换去解决问题。每个函数可以看出在做什么,一目了然,函数让代码更加语义化,可读性更高。

函数式编程,重点是在构建关系,通过构建一条高效的流水线,一次解决所有的问题,而不是关注各个函数之间的数据。

函数式编程特点

函数式一等公民

在函数式编程中,变量是不能被修改的,所有的变量只能被赋值一次,所有的值全都靠传参来解决的。函数作为一等公民,可以在任何地方定义,可以作为参数和返回值,可以对函数进行组合。

无状态和数据不可变

函数式编程的核心

  • 数据不可变,若修改一个对象,应建一个新对象而不是修改已有的对象
  • 无状态,对于一个函数,无论何时运行,在给定的相同输入都能输出相同结果,完全不依赖外部状态的变化

惰性执行

函数只在需要的适合执行,不产生无意义的中间变量。比如,在处理过程中都在写函数,而只有在最后才去产生实际的结果。

参考资料

\

目录
相关文章
|
3月前
|
消息中间件 Kubernetes 监控
构建高效微服务架构:后端开发的新范式
【5月更文挑战第29天】 在当今快速迭代的软件开发领域,微服务架构已经成为一种流行的设计模式,它通过将应用程序拆分成一组小而专注的服务来增强系统的可扩展性、灵活性和可维护性。本文深入探讨了如何构建一个高效的微服务架构,包括关键的设计原则、技术选型以及实践中常见的挑战与解决方案。我们的目标是为后端开发者提供一套实用的指南,帮助他们在构建现代化、分布式系统时做出明智的决策。
24 1
|
19天前
|
Kubernetes Cloud Native 微服务
探索云原生技术:Kubernetes在微服务架构中的应用Python编程之旅:从基础到进阶
【7月更文挑战第31天】随着云计算技术的迅猛发展,云原生概念应运而生,它代表了一种构建和运行应用程序的全新方式。本文将通过实际代码示例,深入探讨Kubernetes这一云原生关键技术如何在微服务架构中发挥其强大的作用。我们将从容器化开始,逐步过渡到Kubernetes集群的搭建与管理,最后展示如何部署和管理一个微服务应用。
32 2
|
12天前
|
监控 安全 API
构建高效微服务架构:后端开发的新范式
【7月更文挑战第38天】随着现代软件开发的复杂性增加,传统的单体应用架构已经难以满足快速迭代和灵活部署的需求。微服务架构以其模块化、独立性和可伸缩性成为解决这一问题的关键。本文将探讨微服务的核心概念、设计原则以及在实现过程中可能遇到的挑战,并提供相应的解决方案,以期为后端开发者提供一种新的开发范式,帮助他们构建出更加高效、稳定且易于维护的系统。
|
1月前
编程之路:从代码到架构的心路历程
【7月更文挑战第9天】在数字世界的迷宫中,每一行代码都承载着创造者的梦想与挑战。本文将通过个人技术感悟的镜头,探索编程实践的深层次价值,从最初的代码编写到复杂的系统架构设计,揭示技术成长的内在逻辑和情感变迁。我们将一同穿梭在技术的森林里,寻找那些让代码生动起来的秘密。
22 2
|
3月前
|
机器学习/深度学习 设计模式 计算机视觉
深度学习在图像识别中的应用与挑战构建高效微服务架构:后端开发的新范式
【5月更文挑战第30天】 随着计算机视觉技术的飞速发展,深度学习已成为推动该领域进步的关键力量。本文旨在探讨深度学习在图像识别任务中的核心技术和面临的挑战,通过分析卷积神经网络(CNN)的结构和优化策略,以及新兴的对抗性网络和迁移学习等技术,揭示深度学习如何提高图像识别的准确性和效率。同时,文章还将讨论数据偏差、模型泛化能力和计算资源限制等问题对实际应用的影响。 【5月更文挑战第30天】 在本文中,我们将探讨一种现代软件工程实践——微服务架构。通过分析其核心原则和设计模式,我们旨在为开发者提供一个关于如何构建可扩展、灵活且高效的后端系统的指导。文章将详细讨论微服务的优势,挑战以及如何克服这些
|
3月前
|
消息中间件 运维 监控
构建高效微服务架构:后端开发的新范式
【5月更文挑战第31天】在现代软件开发中,随着业务需求的多样化和系统复杂性的增加,传统的单体应用架构逐渐显得笨重且难以适应快速变化。微服务架构作为一种新兴的后端开发模式,以其灵活性、可扩展性和独立部署的特点,成为解决这一问题的关键。本文将探讨微服务架构的核心概念、设计原则以及如何在实际项目中实现一个高效的微服务系统。
|
3月前
|
Cloud Native 算法 程序员
代码与禅意:编程中的哲学思考构建未来:云原生架构在现代企业中的应用与挑战
【5月更文挑战第30天】 在数字世界的繁花似锦之下,编程不仅仅是一种技能,更是一场关于逻辑、美学和哲学的深刻对话。本文将探讨编程过程中所体现出的哲学理念,从禅宗的角度出发,揭示代码背后蕴含的深层次意义。我们将一同走进程序员的内心世界,体会在面对复杂问题时,如何通过冥想般的编码实践,达到问题解决的顿悟。
|
3月前
|
监控 API 开发者
构建高效微服务架构:后端开发的新范式
【5月更文挑战第30天】随着现代应用程序的复杂性日益增加,传统的单体架构已不足以满足快速迭代和可伸缩性的需求。本文将探讨如何通过微服务架构来优化后端开发流程,实现敏捷开发和部署,并提高系统的可靠性与维护性。我们将深入分析微服务设计原则、技术栈选择、以及在实施过程中可能遇到的挑战,为开发者提供一种创新的后端开发解决方案。
|
3月前
|
消息中间件 数据管理 持续交付
构建高效微服务架构:后端开发的新范式
【5月更文挑战第30天】 在当今快速演变的软件开发领域,微服务架构已经成为推动创新和实现敏捷性的关键因素。本文将深入探讨如何构建一个高效的微服务系统,涵盖关键设计原则、技术选型及实践案例。我们将重点讨论如何通过优化服务间通信、数据管理和部署流程来提升系统的整体性能和可维护性。
|
3月前
|
监控 持续交付 开发者
构建高效微服务架构:后端开发的新范式
【5月更文挑战第28天】 在现代软件开发领域,随着业务需求的日益复杂和多变,传统的单体应用架构逐渐暴露出其扩展性和维护性的局限。微服务架构作为一种新兴的架构模式,以其服务的细粒度、独立性和弹性,正在成为后端开发的重要趋势。本文将探讨如何构建一个高效的微服务架构,涵盖设计原则、技术选型以及实践案例,旨在为后端开发者提供一种系统化的解决方案,以应对快速变化的业务挑战。