当前位置: 首页 > news >正文

【20】读感 - 架构整洁之道(二)

概述

继上一篇文章讲了前两章的读感,已经归纳总结的重点,这章会继续跟进的看一下,深挖架构整洁之道。

编程范式

编程范式从早期到至今,提过哪些编程范式,结构化编程,面向对象编程,函数式编程。

结构化编程

结构化编程指的是条件选择,比如if/else/while等等具有跳转含义语句,它让程序的逻辑具有结构性,作者归结为对程序控制权的直接转移进行了限制和规范

面向对象编程

而面向对象编程,这个在从事Android开发的我来说,太熟悉不过,面向对象的特性就是封装、继承、多态,其中多态的表达,就是对程序控制权的间接转移进行了限制和规范

和以往我了解的Android的面向对象特性的解释有所不同的是,封装我们都知道是隐藏细节,对外暴露能力。继承则是在某个作用域内(类&接口)对外部定义的某一组变量和函数进行覆盖,这里解释的是覆盖,事实上还有使用。而多态,我们所理解的同一行为,有多种不同的实现,所表达的就是重载和重写,但在这里,行为抽离出来了,接口定义的就是行为,而对接口的不同实现类似我们所说的重载和重写。它抽离出来想要表达的是什么呢?就是插件特性,所有的实现都可以看成是插件。这点很重要!

再要说的一个点就是依赖关系和控制流。三层架构的软件是什么样子的,高层调用中层,中层调用底层,他们持有对方,可以看作是依赖,而且持有的是具体的实现。系统行为决定了控制流,所以依赖不可避免的跟随程序的控制流。当底层发生了改变,随之产生的就是中层改变,进而影响高层改变,这就是这种架构的弊端。
在这里插入图片描述
一旦我们使用多态(这里指接口的方式),依赖关系的方向和控制流的方向相反,这就是依赖反转
在这里插入图片描述

ML1和接口I在源代码上的依赖关系,或叫继承关系

面向对象编程的核心本质就是这样,依赖关系不再受控制流的限制。这种能力有什么作用呢?我们可以让数据库模块和用户界面模块都依赖于业务逻辑模块,而非相反。这是书中的原话。
在这里插入图片描述
回想到之前讲的多态体现的插件特性,用户界面和数据库都是作为业务逻辑模块的插件,可以随时替换。也就是说,业务逻辑模块的源代码不需要引入用户界面和数据库这两个模块

函数式编程

让我不解的是函数式编程,我最早接触函数式编程的时候,当时是看的第三方库Rxjava,一种函数式编程的概念提出,通过操作符,以及函数化的格式,简化了编程逻辑,后续又应用到kotin的开发中,有许许多多的操作符。而书中的函数式编程,让我不知其解。经过查询才发现,就是我所看到过的东西。书中归结为对程序中的赋值进行了限制和规范。这句话怎么理解呢,它指明函数式编程语言中应该是没有赋值语句的,即所有操作赋值,然后输出值的逻辑,就应该是将操作直接作为参数,传递给输出的方法。

书中表达函数式编程语言中变量是不可变的,这句话说出来可能很矛盾,用书中的例子来说。

#java语言
public class Squint {public static void main(String args[]) {for (int i=0; i<25; i++) {System.out.println(i*i)}}
}
#Clojure语言
(println(take 25 (map (fn [x](*x x))(range))))

java语法上,需要打印前25个从0自然增长数的平方写法是这样的,可见i每时每刻都在变。但是用函数式编程来看,这里换了语言来展现,同样求前25个数的平方,但是此时x就是不可变的,为什么这么说呢。

  • range是返回了一个从0开始的整数无穷列表
  • map是针对列表元素求平方值,产生了一个无穷多的,包含平方值的列表
  • take函数,返回一个仅包含前25个元素的新列表

而只有这些列表的元素在被访问时才会被创建,所以实际上只有前25个元素是真正被创建了。既然是被创建了25个元素,你还会认为变量x是可变的吗? 书中想表达的就是这个意思吧。

这个可变和不可变在架构中体现是什么,一切问题都是由于可变导致的,因为可变性,多线程安全问题才会发生,如果一切都不可变,就不可能出现问题。既然这样,开发者应该隔离可变性,一个架构设计良好的应用应该将状态修改的部分和不需要修改状态的部分隔离成单独的组件,然后用适合的机制来保护可变量。
在这里插入图片描述
架构师应该着力于将大部分处理逻辑都归于不可变组件中,可变状态组件的逻辑应该越少越好。

总结

而这三个编程范式,结构化、面向对象、函数式编程对应了软件架构的功能性、组件独立性以及数据管理。我不是很能和解释对应的上,但是对于软件架构关注的点,我还是十分认可的。

最后我们应该了解,过去50年的开发历程当中,每个范式都是约束,没有范式在增加新能力,主要学到的东西是 ---- 什么不应该做!

相关文章:

【20】读感 - 架构整洁之道(二)

概述 继上一篇文章讲了前两章的读感&#xff0c;已经归纳总结的重点&#xff0c;这章会继续跟进的看一下&#xff0c;深挖架构整洁之道。 编程范式 编程范式从早期到至今&#xff0c;提过哪些编程范式&#xff0c;结构化编程&#xff0c;面向对象编程&#xff0c;函数式编程…...

js vue axios post 数组请求参数获取转换, 后端go参数解析(gin框架)全流程示例

今天介绍的是前后端分离系统中的请求参数 数组参数的生成&#xff0c;api请求发送&#xff0c;到后端请求参数接收的全过程示例。 为何会有这个文章&#xff1a;后端同一个API接口同时处理单条或者多条数据&#xff0c;这样就要求我们在前端发送请求参数的时候需要统一将请…...

揭秘郭采洁浪漫升级

【揭秘&#xff01;郭采洁浪漫升级&#xff0c;与“莫拉怪乐”共谱爱情新篇章】在这个春意盎然的季节里&#xff0c;娱乐圈迎来了一则既意外又甜蜜的爆炸新闻——郭采洁&#xff0c;这位以独特气质与精湛演技著称的才女&#xff0c;悄然间迈入了人生的新阶段&#xff0c;而她的…...

数据结构(Java):力扣牛客 二叉树面试OJ题(一)

&#x1f449; ​​​​​​目录 &#x1f448; 1、题一&#xff1a;检查两棵树是否相同 1.1 思路分析 1.2 代码 2、题二&#xff1a;另一棵树的子树 2.1 思路分析 2.2 代码 3、题三&#xff1a;翻转二叉树 3.1 思路分析 3.2 代码 4、题四&#xff1a;判断树是否对称 …...

在国产芯片上实现YOLOv5/v8图像AI识别-【1.3】YOLOv5的介绍及使用(训练、导出)更多内容见视频

本专栏主要是提供一种国产化图像识别的解决方案&#xff0c;专栏中实现了YOLOv5/v8在国产化芯片上的使用部署&#xff0c;并可以实现网页端实时查看。根据自己的具体需求可以直接产品化部署使用。 B站配套视频&#xff1a;https://www.bilibili.com/video/BV1or421T74f 数据…...

逻辑门的题目怎么做?

FPGA语法练习——二输入逻辑门&#xff0c;一起来听~~ FPGA语法练习——二输入逻辑门 题目介绍&#xff1a;F学社-全球FPGA技术提升平台 (zzfpga.com)...

CentOS 7报错:yum命令报错 “ Cannot find a valid baseurl for repo: base/7/x86_6 ”

参考连接&#xff1a; 【linux】CentOS 7报错&#xff1a;yum命令报错 “ Cannot find a valid baseurl for repo: base/7/x86_6 ”_centos linux yum search ifconfig cannot find a val-CSDN博客 Centos7出现问题Cannot find a valid baseurl for repo: base/7/x86_64&…...

51单片机STC89C52RC——18.1 HC-SR04超声波测距

目的/效果 独立按键K1按下后开始测距&#xff0c;LCD显示距离&#xff08;mm&#xff09; 一&#xff0c;STC单片机模块 二&#xff0c;HC-SR04 超声波测距 2.1 HC-SR04 简介 HC-SR04超声波测距模块提供2cm~400cm的测距功能&#xff0c;精度达3mm。 2.2 时序 以上时序图表明…...

WordPress与 wp-cron.php

WordPress 傲居全球最流行的内容管理系统&#xff08;CMS&#xff09;之位&#xff0c;占据了互联网约43%的网站后台&#xff0c;这主要得益于其直观易用的用户界面以及丰富的扩展功能&#xff0c;特别是为新手用户提供了极大的便利。 然而&#xff0c;在畅享WordPress带来的便…...

bb-------

社保费申报及缴纳...

数据挖掘与分析部分实验与实训项目报告

一、机器学习算法的应用 1. 朴素贝叶斯分类器 相关代码 import pandas as pd from sklearn.model_selection import train_test_split from sklearn.naive_bayes import GaussianNB, MultinomialNB from sklearn.metrics import accuracy_score # 将数据加载到DataFrame中&a…...

Python中使用SpeechLib实现文本转换语音朗读的示例(修正bug)

一、修正SpeechLib的导入包顺序后的代码&#xff1a; from comtypes.client import CreateObjectengine CreateObject(SAPI.SpVoice) stream CreateObject(SAPI.SpFileStream)from comtypes.gen import SpeechLibinfile E:\\语音文档\\易经64卦读音.txt outfile E:\\demo.…...

政安晨【零基础玩转各类开源AI项目】基于Ubuntu系统部署Hallo :针对肖像图像动画的分层音频驱动视觉合成

政安晨的个人主页&#xff1a;政安晨 欢迎 &#x1f44d;点赞✍评论⭐收藏 收录专栏: 零基础玩转各类开源AI项目 希望政安晨的博客能够对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff01; 本文目标&#xff1a;在Ubuntu系统上部署Hallo&#x…...

Spring Boot1(概要 入门 Spring Boot 核心配置 YAML JSR303数据校验 )

目录 一、Spring Boot概要 1. SpringBoot优点 2. SpringBoot缺点 二、Spring Boot入门开发 1. 第一个SpringBoot项目 项目创建方式一&#xff1a;使用 IDEA 直接创建项目 项目创建方式二&#xff1a;使用Spring Initializr 的 Web页面创建项目 &#xff08;了解&#…...

电脑屏幕录制怎么弄?分享3个简单的电脑录屏方法

在信息爆炸的时代&#xff0c;屏幕上的每一个画面都可能成为我们生活中不可或缺的记忆。作为一名年轻男性&#xff0c;我对于录屏软件的需求可以说是既挑剔又实际。今天&#xff0c;我就为大家分享一下我近期体验的三款录屏软件&#xff1a;福昕录屏大师、转转大师录屏大师和OB…...

idea双击没有反应,打不开

问题描述 Error opening zip file or JAR manifest missing : /home/IntelliJ-IDEA/bin/jetbrains-agent.jar解决方案...

关于UniApp使用的个人笔记

UniApp 开发者中心 用于注册应用以及申请对应证书 https://dev.dcloud.net.cn/pages/app/list https://blog.csdn.net/fred_kang/article/details/124988303 下载证书后&#xff0c;获取SHA1关键cmd keytool -list -v -keystore test.keystore Enter keystore password…...

autoware.universe源码略读(3.16)--perception:object_range_splitter

autoware.universe源码略读3.16--perception:object_range_splitter Overviewnode&#xff08;Class Constructor&#xff09;ObjectRangeSplitterNode::ObjectRangeSplitterNode&#xff08;mFunc&#xff09;ObjectRangeSplitterNode::objectCallback Overview 这里处理的依…...

深度学习落地实战:人脸五官定位检测

前言 大家好,我是机长 本专栏将持续收集整理市场上深度学习的相关项目,旨在为准备从事深度学习工作或相关科研活动的伙伴,储备、提升更多的实际开发经验,每个项目实例都可作为实际开发项目写入简历,且都附带完整的代码与数据集。可通过百度云盘进行获取,实现开箱即用 …...

270-VC709E 基于FMC接口的Virtex7 XC7VX690T PCIeX8 接口卡

一、板卡概述 本板卡基于Xilinx公司的FPGA XC7VX690T-FFG1761 芯片&#xff0c;支持PCIeX8、两组 64bit DDR3容量8GByte&#xff0c;HPC的FMC连接器&#xff0c;板卡支持各种FMC子卡扩展。软件支持windows&#xff0c;Linux操作系统。 二、功能和技术指标&#xff1a; 板卡功…...

业务系统对接大模型的基础方案:架构设计与关键步骤

业务系统对接大模型&#xff1a;架构设计与关键步骤 在当今数字化转型的浪潮中&#xff0c;大语言模型&#xff08;LLM&#xff09;已成为企业提升业务效率和创新能力的关键技术之一。将大模型集成到业务系统中&#xff0c;不仅可以优化用户体验&#xff0c;还能为业务决策提供…...

3.3.1_1 检错编码(奇偶校验码)

从这节课开始&#xff0c;我们会探讨数据链路层的差错控制功能&#xff0c;差错控制功能的主要目标是要发现并且解决一个帧内部的位错误&#xff0c;我们需要使用特殊的编码技术去发现帧内部的位错误&#xff0c;当我们发现位错误之后&#xff0c;通常来说有两种解决方案。第一…...

dedecms 织梦自定义表单留言增加ajax验证码功能

增加ajax功能模块&#xff0c;用户不点击提交按钮&#xff0c;只要输入框失去焦点&#xff0c;就会提前提示验证码是否正确。 一&#xff0c;模板上增加验证码 <input name"vdcode"id"vdcode" placeholder"请输入验证码" type"text&quo…...

ESP32 I2S音频总线学习笔记(四): INMP441采集音频并实时播放

简介 前面两期文章我们介绍了I2S的读取和写入&#xff0c;一个是通过INMP441麦克风模块采集音频&#xff0c;一个是通过PCM5102A模块播放音频&#xff0c;那如果我们将两者结合起来&#xff0c;将麦克风采集到的音频通过PCM5102A播放&#xff0c;是不是就可以做一个扩音器了呢…...

Caliper 配置文件解析:config.yaml

Caliper 是一个区块链性能基准测试工具,用于评估不同区块链平台的性能。下面我将详细解释你提供的 fisco-bcos.json 文件结构,并说明它与 config.yaml 文件的关系。 fisco-bcos.json 文件解析 这个文件是针对 FISCO-BCOS 区块链网络的 Caliper 配置文件,主要包含以下几个部…...

在web-view 加载的本地及远程HTML中调用uniapp的API及网页和vue页面是如何通讯的?

uni-app 中 Web-view 与 Vue 页面的通讯机制详解 一、Web-view 简介 Web-view 是 uni-app 提供的一个重要组件&#xff0c;用于在原生应用中加载 HTML 页面&#xff1a; 支持加载本地 HTML 文件支持加载远程 HTML 页面实现 Web 与原生的双向通讯可用于嵌入第三方网页或 H5 应…...

现有的 Redis 分布式锁库(如 Redisson)提供了哪些便利?

现有的 Redis 分布式锁库&#xff08;如 Redisson&#xff09;相比于开发者自己基于 Redis 命令&#xff08;如 SETNX, EXPIRE, DEL&#xff09;手动实现分布式锁&#xff0c;提供了巨大的便利性和健壮性。主要体现在以下几个方面&#xff1a; 原子性保证 (Atomicity)&#xff…...

Webpack性能优化:构建速度与体积优化策略

一、构建速度优化 1、​​升级Webpack和Node.js​​ ​​优化效果​​&#xff1a;Webpack 4比Webpack 3构建时间降低60%-98%。​​原因​​&#xff1a; V8引擎优化&#xff08;for of替代forEach、Map/Set替代Object&#xff09;。默认使用更快的md4哈希算法。AST直接从Loa…...

c++第七天 继承与派生2

这一篇文章主要内容是 派生类构造函数与析构函数 在派生类中重写基类成员 以及多继承 第一部分&#xff1a;派生类构造函数与析构函数 当创建一个派生类对象时&#xff0c;基类成员是如何初始化的&#xff1f; 1.当派生类对象创建的时候&#xff0c;基类成员的初始化顺序 …...

LOOI机器人的技术实现解析:从手势识别到边缘检测

LOOI机器人作为一款创新的AI硬件产品&#xff0c;通过将智能手机转变为具有情感交互能力的桌面机器人&#xff0c;展示了前沿AI技术与传统硬件设计的完美结合。作为AI与玩具领域的专家&#xff0c;我将全面解析LOOI的技术实现架构&#xff0c;特别是其手势识别、物体识别和环境…...