首页 > 其他分享 >架构演化思考总结(1)

架构演化思考总结(1)

时间:2024-07-23 20:56:03浏览次数:11  
标签:依赖 架构 函数 委托 演化 持有 对象 调用 思考

架构是什么?

答:架构是对依赖的统一管理。

什么是依赖?分为几种?我们为什么要对它进行管理。

依赖就是持有对象,或者说是持有一个非空的引用。

单向依赖

正如项目开发中,对象和对象之间都会有相互持有、相互调用的需求的。而对象间的持有就是一种依赖。A想要完成一个逻辑处理,需要调用B的一个方法来实现,那么我们就可以说A对B产生了依赖。

好,现在A持有了B的引用,可以直接调用B的方法,这就构成了单向依赖。

单项依赖是最基本、最常见的一种依赖关系,初次接触编程项目的小同志也比较容易理解和使用单向依赖。但是产生单项依赖也要根据A和B具体的身份层次而确定,正如老子打小子好像天经地义,儿子打老子自然算作“忤逆”。

正常健康的单向依赖关系是父对象持有子对象。

这也比较容易理解,如果子对象持有父对象关系,那么随着业务量的增加,父对象的方法逻辑内容会越来越多,子对象若想完成某个处理逻辑直接调用父对象的方法来实现,自然会造成头重脚轻的不健康的状态。

考虑层级

对于对象间单项依赖合不合理的判断要看产生依赖关系的两个对象间的层级关系。

如果是父子关系,那么原则是父对象持有子对象的依赖较为合适;

如果是兄弟关系,尽量通过共同持有的父对象进行交流。兄弟间相互持有依赖,也会增加维护成本,尽量通过共同持有一个对象方式来进行“交流”。

image

image

也就是说最好的依赖关系就是上级依赖下级,同级别对象之间依赖不推荐,子对象依赖父对象应当避免。

当然这属于是一种编程设计思想,不仅仅局限于对象和对象之间的依赖关系的实现中,模块与模块中间、层级和层级之间都应遵循上级持有下级的设计准则。

image
游戏项目也应是遵循表层(高层)对底层依赖。

考虑交互方式

上文内容已经展示出对象之间交互的三种方式:

  • 方法
  • 委托
  • 事件

方法:

父对象持有子对象,直接可以调用子对象中的方法,完成交互。

双向依赖

首先表明:不建议出现双向依赖。

image

因为相互持有的对象关系间的耦合度过高,不符合我们一贯追求的“低耦合,高内聚”准则,为此我们坚决杜绝双向依赖关系,不管是父子、兄弟层级之间的,任何形式的双向依赖关系都不应现。

既然把话说的那么绝对,那么需要相互通信怎么办?

这就提到上文中的另外两种交互方式--委托和事件。

试想一下,典型需要相互沟通的一个例子。

按钮点击,按钮控制脚本A需要检测用户的点击、用户点击之后要告知具体执行的脚本B。这是A对B有交流需要,假如B的具体操作是播放一个动画,在动画播放期间按钮要失活,防止用户再次点击,等B的动画播放完毕了需要B告知A,让A恢复按钮状态并继续检测用户的点击,这是B对A产生的依赖需求。

如果相互持有对方对象,直接调用对方的相互方法即可,但是要解耦,自然需要用到委托和事件。

使用委托解耦单向依赖

上文中阐述出单向依赖要符合长辈持有儿孙的原则,那么儿孙对长辈有通信需要但不能持有长辈依赖怎么办?

这里使用委托来完成下层对上层的通信需求。

namespace  DependencyDemo
{

     public class A : MonoBehaviour
    {
        B b;

        void Start()
        {
           b = transform.Find("Animation").GetComponent<B>();

            // 注册完成的事件
            b.OnDoSomethingDone += ()=>{
                Debug.Log("动画播放完毕");
            };
        }
    }

    public class B : MonoBehaviour
    {
        // 定义委托
        public Action OnDoSomethingDone = ()=>{};

        //当动画播放完毕后调用
        public void DoSomething()
        {
            //触发委托中的函数执行
            OnDoSomethingDone();
        }
    }
}

在B中声明一个委托,待动画播放完毕之后触发调用委托中的函数。而持有B的A则可以拿到B中的委托,将动画播放完毕要做的操作函数添加到此委托中,这样实现了下级B对上级A的通信,而B并没有持有A。

那么使用委托有什么缺点呢?

委托中注册函数和注销函数要成对出现!

委托中注册函数要保证最后注销掉,也就是说注册和注销要成对出现,以免出现空引用的问题。使用委托应当像使用没有GC功能的编程语言那样,申请内存使用完毕之后要保证释放,养成成对的好习惯。

其实不论是委托还是内存使用,在编程中常常要注意使用的模块、对象的生命周期,例如调用某个函数时发现对象没有实例化,加载资源时候发现资源管理类还未初始化,诸如此类问题,,自然要我们清除的知晓调用的对象的生命周期。

委托另一点就是会增加代码量,可以想象委托算作一个回调函数容器,一个函数执行时候要有个对应的回调,那么随着业务量增加,函数增多,对应的委托也相应的增多,而且委托需要相应的声明,不免也增加了对委托管理的工作量。

至此,本节展示了使用委托来解耦下级对上级依赖。但是同级别之间的单项依赖则不建议使用委托。

自此我们知晓这样一个原则或者观念:底部向高层通信可以使用委托。

标签:依赖,架构,函数,委托,演化,持有,对象,调用,思考
From: https://www.cnblogs.com/TonyCode/p/18319625

相关文章

  • Vue 在大型项目中的架构设计和最佳实践
    前面分享了很多八股和算法,现在开始慢慢进入项目搭建随着项目规模的扩大,合理的架构设计和最佳实践变得尤为重要。一个良好的架构能够提高开发效率、维护性和可扩展性。本文将探讨在大型Vue项目中,如何进行架构设计并遵循最佳实践。一、项目结构一个清晰的项目结构有助于代码的......
  • k1.Keepalived 架构和安装
    Keepalived架构和安装1.Keepalived安装1.1包安装1.2编译安装2.KeepAlived配置说明2.1全局配置2.2配置虚拟路由器2.3启用Keepalived日志功能2.4实现Keepalived独立子配置文件3.Keepalived实现VRRP3.1实现master/slave的Keepalived单主架构4.抢占模......
  • STM32 芯片架构
    STM32芯片架构把STM32想像类比成一台电脑。CPU通过总线(Bus)控制各类外设。各部分功能如下:CPU:包含运算器,控制器及若干寄存器,是单片机的控制和指挥中心。ROM(STM32中称为FLASH):用于存放程序和数据,为只读储存器。更改(擦除)和写入程序都较为麻烦,需要遵守FLASH相关的......
  • 简单架构:采集库dll、检测算法dll、项目程序exe,框架库dll
    一般项目exe通过调用各种封装的dll来完成工作。视觉项目exe调用采集库dll、检测算法dll就可以了,有一定积累后凝练出框架库dll(日志、队列、线程池等必不可少的部分封装)它们之间通过“接口函数+数据”来配合。针对采集dll:IGrabber.h里放接口函数,如开始采集、停止采集、set参数......
  • 龙芯3A6000架构安装x86架构安装包
    1.环境准备:一台龙芯3A6000架构的银河麒麟桌面版系统2.步骤:以安装realvncserver为例打开必应(https://cn.bing.com/)搜索realvnc,打开下载安装包,下载x64架构的deb格式的安装包下载完成后,进行安装提示与当前架构不符,对这个deb安装包使用归档管理器解压到当前目录,然后打开control......
  • 架构师的新武器:Codigger之软件项目体检Software Project HealthCheck
    在软件架构这一充满挑战与创新的领域中,架构师宛如精心雕琢宏伟建筑的艺术大师,他们的每一个决策都决定着软件系统的稳固性、可扩展性和性能表现。而Codigger软件项目体检,无疑是架构师手中一件崭新且威力强大的神兵利器,为打造卓越的软件架构提供了有力支撑。项目体检在架构合理性......
  • 多模态大模型主流架构模式的演化历程
    多模态大模型主流架构模式的演化历程一、引言近年来,随着深度学习技术的飞速发展,多模态学习逐渐成为人工智能领域的研究热点。与单一模态不同,多模态学习旨在利用不同模态数据(如文本、图像、音频等)之间的互补信息,构建更加全面、准确的智能模型。多模态融合是实现多模......
  • AI大模型技术的四大核心架构演进之路
    随着人工智能技术的飞速发展,大模型技术已经成为AI领域的重要分支。本文将深入探讨四种关键的大模型技术架构:纯粹Prompt提示词法、Agent+FunctionCalling机制、RAG(检索增强生成)以及Fine-tuning微调技术,揭示它们的特性和应用场景。一、纯粹Prompt提示词法:构建直观交互模......
  • 多模态大模型:基础架构
    多模态大型语言模型(MLLM)是人工智能领域的前沿创新,它结合了语言和视觉模型的功能,可以处理复杂的任务,如视觉问答和图像字幕。这些模型利用大规模预训练,集成了多种数据模态,以显著提高其在各种应用程序中的性能。架构概览较为常见的MLLM框架可以分为三个主要模块:接收且有效......
  • 一文看懂AI的 Transformer 架构!
    1AI的转换器是啥?转换器,一种将输入序列转换或更改为输出序列的神经网络架构。它们通过学习上下文和跟踪序列组件之间的关系来做到这一点。例如,请考虑以下输入序列:“天空是什么颜色的?”转换器模型会使用内部数学表示法来识别颜色、天空和蓝色这三个词之间的相关性和关系。......