【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】读感 - 架构整洁之道(二)
概述 继上一篇文章讲了前两章的读感,已经归纳总结的重点,这章会继续跟进的看一下,深挖架构整洁之道。 编程范式 编程范式从早期到至今,提过哪些编程范式,结构化编程,面向对象编程,函数式编程…...
js vue axios post 数组请求参数获取转换, 后端go参数解析(gin框架)全流程示例
今天介绍的是前后端分离系统中的请求参数 数组参数的生成,api请求发送,到后端请求参数接收的全过程示例。 为何会有这个文章:后端同一个API接口同时处理单条或者多条数据,这样就要求我们在前端发送请求参数的时候需要统一将请…...
揭秘郭采洁浪漫升级
【揭秘!郭采洁浪漫升级,与“莫拉怪乐”共谱爱情新篇章】在这个春意盎然的季节里,娱乐圈迎来了一则既意外又甜蜜的爆炸新闻——郭采洁,这位以独特气质与精湛演技著称的才女,悄然间迈入了人生的新阶段,而她的…...
数据结构(Java):力扣牛客 二叉树面试OJ题(一)
👉 目录 👈 1、题一:检查两棵树是否相同 1.1 思路分析 1.2 代码 2、题二:另一棵树的子树 2.1 思路分析 2.2 代码 3、题三:翻转二叉树 3.1 思路分析 3.2 代码 4、题四:判断树是否对称 …...
在国产芯片上实现YOLOv5/v8图像AI识别-【1.3】YOLOv5的介绍及使用(训练、导出)更多内容见视频
本专栏主要是提供一种国产化图像识别的解决方案,专栏中实现了YOLOv5/v8在国产化芯片上的使用部署,并可以实现网页端实时查看。根据自己的具体需求可以直接产品化部署使用。 B站配套视频:https://www.bilibili.com/video/BV1or421T74f 数据…...
逻辑门的题目怎么做?
FPGA语法练习——二输入逻辑门,一起来听~~ FPGA语法练习——二输入逻辑门 题目介绍:F学社-全球FPGA技术提升平台 (zzfpga.com)...
CentOS 7报错:yum命令报错 “ Cannot find a valid baseurl for repo: base/7/x86_6 ”
参考连接: 【linux】CentOS 7报错: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按下后开始测距,LCD显示距离(mm) 一,STC单片机模块 二,HC-SR04 超声波测距 2.1 HC-SR04 简介 HC-SR04超声波测距模块提供2cm~400cm的测距功能,精度达3mm。 2.2 时序 以上时序图表明…...
WordPress与 wp-cron.php
WordPress 傲居全球最流行的内容管理系统(CMS)之位,占据了互联网约43%的网站后台,这主要得益于其直观易用的用户界面以及丰富的扩展功能,特别是为新手用户提供了极大的便利。 然而,在畅享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的导入包顺序后的代码: 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 :针对肖像图像动画的分层音频驱动视觉合成
政安晨的个人主页:政安晨 欢迎 👍点赞✍评论⭐收藏 收录专栏: 零基础玩转各类开源AI项目 希望政安晨的博客能够对您有所裨益,如有不足之处,欢迎在评论区提出指正! 本文目标:在Ubuntu系统上部署Hallo&#x…...
Spring Boot1(概要 入门 Spring Boot 核心配置 YAML JSR303数据校验 )
目录 一、Spring Boot概要 1. SpringBoot优点 2. SpringBoot缺点 二、Spring Boot入门开发 1. 第一个SpringBoot项目 项目创建方式一:使用 IDEA 直接创建项目 项目创建方式二:使用Spring Initializr 的 Web页面创建项目 (了解&#…...
电脑屏幕录制怎么弄?分享3个简单的电脑录屏方法
在信息爆炸的时代,屏幕上的每一个画面都可能成为我们生活中不可或缺的记忆。作为一名年轻男性,我对于录屏软件的需求可以说是既挑剔又实际。今天,我就为大家分享一下我近期体验的三款录屏软件:福昕录屏大师、转转大师录屏大师和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 下载证书后,获取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(Class Constructor)ObjectRangeSplitterNode::ObjectRangeSplitterNode(mFunc)ObjectRangeSplitterNode::objectCallback Overview 这里处理的依…...
深度学习落地实战:人脸五官定位检测
前言 大家好,我是机长 本专栏将持续收集整理市场上深度学习的相关项目,旨在为准备从事深度学习工作或相关科研活动的伙伴,储备、提升更多的实际开发经验,每个项目实例都可作为实际开发项目写入简历,且都附带完整的代码与数据集。可通过百度云盘进行获取,实现开箱即用 …...
270-VC709E 基于FMC接口的Virtex7 XC7VX690T PCIeX8 接口卡
一、板卡概述 本板卡基于Xilinx公司的FPGA XC7VX690T-FFG1761 芯片,支持PCIeX8、两组 64bit DDR3容量8GByte,HPC的FMC连接器,板卡支持各种FMC子卡扩展。软件支持windows,Linux操作系统。 二、功能和技术指标: 板卡功…...
1564286-24-3,Cy5 DBCO SE,应用于生物分子标记、分子成像
一.名称英文名称:Cy5 DBCO NHS Ester,Cy5 DBCO SE,Cyanine5 DBCO NHS Ester,Cy5 Dibenzocyclooctyne NHS Ester中文名称:Cy5-二苯并环辛炔-NHS 酯,花菁染料Cy5-二苯并环辛炔-琥珀酰亚胺酯CAS 号:…...
3大核心模块:Steam成就管理开源工具从问题解决到效率提升的实战指南
3大核心模块:Steam成就管理开源工具从问题解决到效率提升的实战指南 【免费下载链接】SteamAchievementManager A manager for game achievements in Steam. 项目地址: https://gitcode.com/gh_mirrors/st/SteamAchievementManager 引言 在游戏玩家的日常体…...
FFXIV国际服中文补丁解决方案:零基础上手实战指南
FFXIV国际服中文补丁解决方案:零基础上手实战指南 【免费下载链接】FFXIVChnTextPatch 项目地址: https://gitcode.com/gh_mirrors/ff/FFXIVChnTextPatch 你是否曾在《最终幻想XIV》国际服中因语言障碍错失关键剧情?是否因英文界面降低了游戏沉浸…...
Python零基础到入门-数据类型的内置方法(1)
当我们在操作 字符串/列表,要想到对字符串或者列表做一些高级的操作字符串 判断这个字符是否以 某个字符开头列表 添加元素 删除元素 修改元素 。。。官方根据上边的功能,给我们提供了一些公共的接口(方法)【一】整数类型语法&…...
3分钟完成Axure RP中文界面汉化:终极完整指南
3分钟完成Axure RP中文界面汉化:终极完整指南 【免费下载链接】axure-cn Chinese language file for Axure RP. Axure RP 简体中文语言包,不定期更新。支持 Axure 9、Axure 10。 项目地址: https://gitcode.com/gh_mirrors/ax/axure-cn 还在为Axu…...
【开题答辩全过程】以 基于大数据的智能推送系统设计与实现为例,包含答辩的问题和答案
个人简介一名14年经验的资深毕设内行人,语言擅长Java、php、微信小程序、Python、Golang、安卓Android等开发项目包括大数据、深度学习、网站、小程序、安卓、算法。平常会做一些项目定制化开发、代码讲解、答辩教学、文档编写、也懂一些降重方面的技巧。感谢大家的…...
OV5640摄像头SCCB配置详解:告别照抄寄存器表,教你读懂数据手册进行个性化设置
OV5640摄像头SCCB高级配置实战:从寄存器表解读到图像优化全解析 1. 深入理解OV5640寄存器架构 OV5640作为OmniVision推出的500万像素图像传感器,其强大功能背后是超过200个可配置寄存器。许多开发者习惯直接套用现成的寄存器配置表,但当遇到图…...
html+css+js创意小游戏~记忆卡片配对(附源码)
1. 从零开始打造记忆卡片配对游戏 最近在教家里小朋友认动物,突然想到可以用前端三件套做个记忆卡片小游戏。这个项目特别适合刚学完HTML/CSS基础,想练手JavaScript的朋友。我自己第一次写这个游戏时,只用了不到100行代码就实现了核心功能&am…...
手把手教你用PasteMD:本地AI一键整理笔记和代码片段
手把手教你用PasteMD:本地AI一键整理笔记和代码片段 你是不是也经常被这些场景困扰?开会时用手机快速记下的要点,事后整理时发现全是碎片化的短句,毫无结构可言;从网页复制下来的技术文档,格式混乱&#x…...
深度学习赋能国税局发票查验:中英文混合验证码的高效识别方案
1. 验证码识别的税务场景痛点 每次打开国税局网站查验发票时,那个扭曲变形的中英文混合验证码是不是让你特别头疼?作为财务人员,我每天要处理上百张发票,手动输入这些验证码不仅效率低下,还容易出错。传统OCR技术在这里…...
