首页 > 其他分享 >抽象,解耦,粒度,关系的个人理解

抽象,解耦,粒度,关系的个人理解

时间:2024-08-31 11:57:07浏览次数:10  
标签:关系 实例 粒度 理解 分组 抽象 主表

学习java和k8s时发现他们的概念有共性,觉得比较有意思记录一下.

只是由技术引发的乱七八糟的想法,和具体技术没有太大关系,写着玩 (#^.^#)

延展思考后,提炼出四个关键词,先概述下,后面分别详述:

1.抽象: 代码解决了很多重复性的工作,能够实现去重的基础就是从千奇百怪的具象事物中抽象出共有的规律,抽象出不变的规律,以不变应万变.我这里对于抽象的理解是,它是对真实世界的 "分组" / "分类".

2.解耦: 我理解为"如何"去"分组",选择合适的方式,可以实现最大程度的复用.

3.粒度: 即颗粒度,我理解为"分组"的"大小"控制到何种程度.

4.关系: 真实世界被自己以 "某种方式" 细分到 "一定大小" 的 "分组" ,需要通过对于他们关系的描述,重新组成有机的整体.

从1到4的过程有点天下大势,合久必分,分久必合的感觉.

抽象是"分",解耦是如何"分",粒度是"分"到什么程度,关系是"合".

具体解释:

1.抽象:

Java有一句:万事万物皆对象

k8s同理:万事万物皆资源

他们的模式都是定义xxx类(Java)/xxx资源类型(k8s),有了类/类型,就可以据此创建出无数实例,比如定义学生类,然后new 无数个学生对象.

所以我把面向对象的抽象方法,理解为对真实世界的概念进行分组

比如把世界中的学生都划分到A组,称为学生类,任意一个学生都属于A组.

但世界不是泾渭分明的,一个人既可以是学生,也可以是别人的老师,分组是任意的,可交叠的

而以下图的方式才能真正表现出分组的任意性,世界本身就是混乱的,可以从不同的角度去理解,我可以框选任意范围作为一个分组

 

所以面向对象的抽象就是对世界进行任意的分组.

2. 解耦

刚接触解耦的概念时,我是困惑的,比如本来A模块调用B模块,A与B耦合.

如果加入中间件C,A调用C,C调用B,突然就说A和B解耦了,我第一反应是A和C耦合,C和B耦合,那么A和B难道不是耦合的吗?

但耦合不是等式,不能这样传递,以下图为例:A耦合B,B发生变化,那么A也受影响.

如果加入C作为桥梁,即使B变化了,只需要调整C和B的耦合关系,A和C的耦合可以保持不变,也就意味着A不需要变化.

java中的JDBC屏蔽数据库差异,k8s的PV屏蔽掉具体存储载体的差异,都是承担C的角色,可以让成型的代码主体A不用变化.

这正是我把"解耦"理解为"如何"分组的原因,本来是把事物分成两组即可描述清楚,现在要分成三组才能描述清楚,但分成三组时A更具通用性(因为它可以保持不变).

3. 粒度

沿用上图的概念就是框选范围的大小,拆分的越细,可控性越强,但粒度不是越细越好,合适是最重要的.

合适的粒度是:用斧头砍木头,用雕刻刀在米粒上雕花

粒度过大: 斧头雕花,没有那个操作精度,无法操作

粒度过小: 雕刻刀砍木头,累死你

 对于"解耦"我理解为"如何分组",这里当然你也可以将"粒度"控制也强行理解为"如何分组"

但我更想表达的是,解耦是在决定以何种角度拆分事物,粒度是将事物拆分到何种程度.

他们的概念虽然可以相互转化,但还是略有不同.

4.关系

通过前三步,已经找到一种合适角度对事物分组并且分组的大小也刚好合适(这个答案往往并不是唯一的),现在已经以面向对象的方式对真实世界进行了映射,世界是有机的整体,而被我们拆分的事物,就是通过"关系"的描述重组成有机整体.

我们常说关系有三种:1对1,1对多,多对多

最具普适性的是多对多关系,因为可以说,1对多是特殊的多对多关系,而1对1是特殊的1对多关系.

但我惯用的思路是,关系只有一种: 1对多关系

因为1对1是特殊的1对多关系,而我舍弃多对多关系,是因为我往往需要从一个出发点去看待事物.

倘若有两个分组:A组 和 B组 (注意这是指被抽象出来的两大分组,每个组中都可以有无数实例)

1. 假设A和B是一对一关系,一个A实例对应一个B实例,可以理解成一个A实例可以对应多个B实例,但是B此时只有一个而已.

2. 假设A和B是多对多关系,那么对A而言,一个A实例可以对应多个B实例,此时只体现A与B的一对多关系.  他们多对多关系体现在:于此同时,一个B实例可以对应多个A实例,而这对于A而言是不用感知的.

以数据库联表查询为例,单次的联表查询其实只有一对多关系,首先1对1是特殊的1对多,不多解释,而查询的时候总是有一张表是概念上的[主表], [其它的表]都是这个概念上的主表的附属.

即使[主表] 和 [其它的表]是多对多的关系,由于确定了[主表], [主表]是基点,对于它而言,[主表]和[其它的表]的关系永远是一对多.

既然确定了谁是主表,一切都要从它的角度出发去看,永远看不到[其它的表]和[主表]的一对多关系,所以多对多关系永远得不到体现.

正如我们都是从自己的角度去看世界,有点"我"外无物的意味

标签:关系,实例,粒度,理解,分组,抽象,主表
From: https://blog.csdn.net/weixin_59146005/article/details/141728737

相关文章

  • AI学会“视听”新语言,人大北邮上海AI Lab引领多模态理解革命 | ECCV2024亮点
    你是否想过,AI是如何“理解”我们这个多彩世界的呢?最近,一项由中国人民大学高瓴GeWu-Lab、北京邮电大学、上海AILab等机构联合研究的成果,为AI的“感官”升级提供了一种新思路。这项研究被收录于即将召开的计算机视觉顶级会议ECCV2024。AI的“视听盛宴”想象一下,你正在观......
  • IOC和DI的理解
    IOC与DI的理解1.1、IoC是什么Ioc—InversionofControl,即“控制反转”,不是什么技术,而是一种设计思想。在Java开发中,Ioc意味着将你设计好的对象交给容器控制,而不是传统的在你的对象内部直接控制。如何理解好Ioc呢?理解好Ioc的关键是要明确“谁控制谁,控制什么,为何是......
  • CRISP-DM的应用与理解
    本文分享自天翼云开发者社区《CRISP-DM的应用与理解》,作者:吴****嫄CRISP-DM是一个数据挖掘项目规划的开放标准流程框架模型,主要分为业务理解、数据理解、数据准备、建模、评估、部署六个阶段。业务理解从业务的角度理解项目的目标和需求,将业务的目的转换为一个数据挖掘的问题,制......
  • 深入理解 C# 中的适配器模式:连接不兼容的世界
    在软件开发中,我们经常会遇到需要将两个不兼容的接口连接在一起的场景。适配器模式(AdapterPattern)作为结构型设计模式之一,提供了一种灵活的解决方案,使得不兼容的接口能够协同工作,从而提高系统的可扩展性和复用性。本文将详细介绍适配器模式的概念、适用场景,并通过一个C#......
  • 阿里重磅开源超强AI模型Qwen2-VL:能理解超 20 分钟视频!
    炸裂!阿里巴巴的云计算部门刚刚发布了一款全新的AI模型——Qwen2-VL,而且一口气发布了20亿参数和70亿参数两个版本,还开放了最强720亿参数版本的API!小伙伴们可能要问了,这个Qwen2-VL到底有多厉害?01、Qwen2-VL有多厉害?·看得清,看得懂: Qwen2-VL在各种视觉理解任务上都取......
  • Vue 过滤器(Filter)的理解与用法
    Vue.js是一个渐进式JavaScript框架,它提供了丰富的功能来构建用户界面。其中,过滤器(Filter)是一个非常有用的特性,它允许我们在模板中对数据进行格式化处理。本文将详细介绍Vue过滤器的概念、用法以及一些最佳实践。1.过滤器的基本概念1.1什么是过滤器?过滤器是Vue提供的一种......
  • 深入理解Java中的分布式锁实现:从理论到实践
    引言在分布式系统中,多个进程或线程可能需要访问同一份资源,这时就需要一种机制来确保资源不被同时修改,从而避免数据不一致的问题。分布式锁正是应对这种场景的重要手段。本文将详细介绍Java中的分布式锁实现原理、常见的分布式锁技术,以及具体的代码示例。目录分布式锁的基本......
  • python模型训练之朴素理解
            模型训练就是通过一组训练数据,这组数据我这里举例x,y。x是自变量,y是因变量。那么我们可以定义数据x=[2,5,8,11,13],y=[100,156,144,180],        这些数据是我自己随便写的。我们可以看到这组数据类似y=ax。        然后我们想要的是通......
  • 深入理解前向传播、反向传播和计算图
    1.什么是前向传播?前向传播(ForwardPropagation)是神经网络的推理过程。它将输入数据逐层传递,通过每一层的神经元计算,最终生成输出。前向传播的公式假设我们有一个简单的三层神经网络(输入层、一个隐藏层和输出层),网络的每一层计算如下:......
  • day02-面向对象-多态&抽象类&接口
    一、⭐多态⭐1.1概述1.多态  是在继承/实现情况下的一种现象,表现为对象多态和行为多态​2.⭐对象多态写法:​继承:父类变量=new子类1();​父类变量=new子类2();实现:接口变量=new实现类();​......