【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操作系统。 二、功能和技术指标: 板卡功…...
【go】Excelize处理excel表 带合并单元格、自动换行与固定列宽的文件导出
文章目录 1 简介2 相关需求与实现2.1 导出带单元格合并的excel文件2.2 导出增加自动换行和固定列宽的excel文件 1 简介 之前整理过使用Excelize导出原始excel文件与增加数据校验的excel导出。【go】Excelize处理excel表 带数据校验的文件导出 本文整理使用Excelize导出带单元…...
uniapp自定义tabBar
uniapp自定义tabBar 1、在登录页中获取该用户所有的权限 getAppFrontMenu().then(res>{if(res.length > 0){// 把所有权限存入缓存中let firstPath res.reverse()[0].path;uni.setStorageSync(qx_data, res);uni.switchTab({url: firstPath,})// 方法二 通过uni.setTabB…...
IDEA2023版本创建JavaWeb项目及配置Tomcat详细步骤!
一、创建JavaWeb项目 第一步 之前的版本能够在创建时直接选成Web项目,但是2023版本在创建项目时没有该选项,需要在创建项目之后才能配置,首先先创建一个项目。 第二步 在创建好的项目中选中项目后(一定要注意选中项目名称然后继…...
WPF中MVVM常用的框架
在WPF开发中,MVVM(Model-View-ViewModel)是一种广泛使用的设计模式,它有助于分离应用程序的用户界面(View)、业务逻辑(Model)和数据表现层(ViewModel)。以下是…...
Mysql----内置函数
前言 提示:以下是本篇文章正文内容,下面案例可供参考 一、日期函数 日期:年月日 时间:时分秒 查询:当前时间,只显示当前日期 注意:如果类型为date或者datetime。表中数据类型为date,你插入时…...
去除重复字母
题目链接 去除重复字母 题目描述 注意点 s 由小写英文字母组成1 < s.length < 10^4需保证 返回结果的字典序最小(要求不能打乱其他字符的相对位置) 解答思路 本题与移掉 K 位数字类似,需要注意的是,并不是每个字母都能…...
Xcode进行真机测试时总是断连,如何解决?
嗨。大家好,我是兰若姐姐。最近我在用真机进行app自动化测试的时候,经常会遇到xcode和手机断连,每次断连之后需要重新连接,每次断开都会出现以下截图的报错 当这种情况出现时,之前执行的用例就相当于白执行了ÿ…...
Redis的使用(五)常见使用场景-分布式锁实现原理
1.绪论 为了解决并发问题,我们可以通过加锁的方式来保证数据的一致性,比如java中的synchronize关键字或者ReentrantLock,但是他们只能在同一jvm进程上加锁。现在的项目基本上都是分布式系统,如何对多个java实例进行加锁ÿ…...
AppML 案例:Products
AppML 案例:Products AppML(Application Markup Language)是一种创新的、基于XML的标记语言,旨在简化Web应用程序的开发。它允许开发者通过声明性的方式定义应用程序的界面和数据绑定,从而提高开发效率和减少代码量。…...
数据库端口LookUp功能:从数据库中获取并添加数据到XML
本文将为大家介绍如何使用知行之桥EDI系统数据库端口的Lookup功能,从数据库中获取数据,并添加进输入的XML中。 使用场景:期待以输入xml中的值为判断条件从数据库中获取数据,并添加进输入xml中。 例如:接收到包含采购…...
开个做网站公司/网店培训骗局
2021-10-22每日刷题打卡 力扣——每日一题 229. 求众数 II 给定一个大小为 n 的整数数组,找出其中所有出现超过 ⌊ n/3 ⌋ 次的元素。 示例 1: 输入:[3,2,3] 输出:[3]设定一个unordered_map容器mymap来计算各个数字出现的次数…...
自驾游网站建设/短视频培训机构
最近因为环境原因,我们这些互联网从业者,算是比较动荡的,不论是反垄断、还是反教育资本化,都会波及一部分同行们要去折腾重新找工作。对于原本就被996、内卷等因素困扰的程序员们来说,并不是什么好事,尤其对…...
做电子商务系统网站/网站seo优化有哪些方面
博客已搬家,请访问文章新址,谢谢浏览~ http://iflycn.blog.163.com/blog/static/134932753201011223945956/转载于:https://blog.51cto.com/iflycn/35701...
中山建公司网站/广告推广语
title: 拉刷新,上拉加载更多 date: 2018-07-09 14:37:58 tags: 前端 categories:前端继续上一内容,更新第三部分,防重复点击-节流函数的使用。 截图分享功能按钮防重复点击(节流函数应用)3. 下拉刷新,上拉加载更多(这个地方有坑) …...
哈尔滨建设网站制作/nba最新排名东西部
BIM Revit2018软件安装教程 Revit 2018/64位下载地址: pan.baidu.com/s/1fWDJvUcoWKIBB73ddgKG4A 密码:6wdg 安装中有问题咨询管家私人微信:1196586501 微信公众号:性感的小君君 安装教程 1.选中软件压缩包,鼠标右击选择解压…...
网站上删除信息如何做/百度关键词统计
nginx已经配置了,access-control-allow-origin :*;。但是在接口在返回400是未能捕捉到错误信息。报以下错误 CORS(跨域资源共享) CORS是一种网络浏览器的技术规范,它为Web服务器定义了一种方式,允许网页从不同的域访问…...