- VisualStudio2022插件的安装及使用-编程手把手系列文章
- pprof-在现网场景怎么用
- C#实现的下拉多选框,下拉多选树,多级节点
- 【学习笔记】基础数据结构:猫树
答:架构是对依赖的统一管理.
依赖就是持有对象,或者说是持有一个非空的引用.
正如项目开发中,对象和对象之间都会有相互持有、相互调用的需求的。而对象间的持有就是一种依赖。A想要完成一个逻辑处理,需要调用B的一个方法来实现,那么我们就可以说A对B产生了依赖.
好,现在A持有了B的引用,可以直接调用B的方法,这就构成了单向依赖.
单项依赖是最基本、最常见的一种依赖关系,初次接触编程项目的小同志也比较容易理解和使用单向依赖。但是产生单项依赖也要根据A和B具体的身份层次而确定,正如老子打小子好像天经地义,儿子打老子自然算作“忤逆”.
正常健康的单向依赖关系是父对象持有子对象.
这也比较容易理解,如果子对象持有父对象关系,那么随着业务量的增加,父对象的方法逻辑内容会越来越多,子对象若想完成某个处理逻辑直接调用父对象的方法来实现,自然会造成头重脚轻的不健康的状态.
对于对象间单项依赖合不合理的判断要看产生依赖关系的两个对象间的层级关系.
如果是父子关系,那么原则是父对象持有子对象的依赖较为合适; 。
如果是兄弟关系,尽量通过共同持有的父对象进行交流。兄弟间相互持有依赖,也会增加维护成本,尽量通过共同持有一个对象方式来进行“交流”.
也就是说最好的依赖关系就是上级依赖下级,同级别对象之间依赖不推荐,子对象依赖父对象应当避免.
当然这属于是一种编程设计思想,不仅仅局限于对象和对象之间的依赖关系的实现中,模块与模块中间、层级和层级之间都应遵循上级持有下级的设计准则.
游戏项目也应是遵循表层(高层)对底层依赖.
上文内容已经展示出对象之间交互的三种方式:
父对象持有子对象,直接可以调用子对象中的方法,完成交互.
首先表明:不建议出现双向依赖.
因为相互持有的对象关系间的耦合度过高,不符合我们一贯追求的“低耦合,高内聚”准则,为此我们坚决杜绝双向依赖关系,不管是父子、兄弟层级之间的,任何形式的双向依赖关系都不应现.
既然把话说的那么绝对,那么需要相互通信怎么办?
这就提到上文中的另外两种交互方式--委托和事件.
试想一下,典型需要相互沟通的一个例子.
按钮点击,按钮控制脚本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功能的编程语言那样,申请内存使用完毕之后要保证释放,养成成对的好习惯.
其实不论是委托还是内存使用,在编程中常常要注意使用的模块、对象的生命周期,例如调用某个函数时发现对象没有实例化,加载资源时候发现资源管理类还未初始化,诸如此类问题,,自然要我们清除的知晓调用的对象的生命周期.
委托另一点就是会增加代码量,可以想象委托算作一个回调函数容器,一个函数执行时候要有个对应的回调,那么随着业务量增加,函数增多,对应的委托也相应的增多,而且委托需要相应的声明,不免也增加了对委托管理的工作量.
至此,本节展示了使用委托来解耦下级对上级依赖。但是同级别之间的单项依赖则不建议使用委托.
自此我们知晓这样一个原则或者观念:底部向高层通信可以使用委托.
最后此篇关于架构演化思考总结(1)的文章就讲到这里了,如果你想了解更多关于架构演化思考总结(1)的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
是否可以简化在裸机上运行的这条链: 具有随时间变化的副本数的 StatefulSet 服务 使用 proxy-next-upstream: "error http_502 timeout invali
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 1
我需要为应用程序制定架构。它专为销售产品而设计。 系统每天将接受大约 30-40k 的新产品。它将导致在表 product 中创建新记录。 系统应保留价格历史记录。用户应该能够看到产品 A 的价格在去
我需要一些帮助来理解 PHP 的内部工作原理。 还记得,在过去,我们曾经写过 TSR(Terminate and stay resident)例程(pre-windows 时代)吗?一旦该程序被执行,
1.Nginx 基础架构 nginx 启动后以 daemon 形式在后台运行,后台进程包含一个 master 进程和多个 worker 进程。如下图所示: master与
本文深入探讨了Kubernetes(K8s)的关键方面,包括其架构、容器编排、网络与存储管理、安全与合规、高可用性、灾难恢复以及监控与日志系统。 关注【TechLeadCloud】,
我知道 CNN 的工作原理,包括每一层的用途(Dropout、Pooling 等)。但是,在为新数据集设计 CNN 时,我不知道要使用多少个 Conv-Relu-Pool 层,在最终获得输出之前我应该
在基于 REST 的架构中,资源和方法之间有什么区别。有吗? 最佳答案 资源是您的应用程序定义的东西;它们与物体非常相似。方法是 HTTP 动词之一,例如 GET、POST、PUT、DELETE。它们
我想用 oneOf仅在 xyType 的值上不同的模式属性(property)。我想要其中两个:一个是 xyType设置为 "1"第二个在哪里xyType是 任何其他值 .这可以使用 json 模式完
寻求 PHP 架构师的建议! 我对 PHP 不是很熟悉,但已经接管了一个用该语言编写的大型分析包的维护工作。该架构旨在将报告的数据读取到大型键/值数组中,这些数组通过各种解析模块传递,以提取每个模块已
这些存在吗? 多年来,我一直是大型强类型面向对象语言(Java 和 C#)的奴隶,并且是 Martin Fowler 及其同类的信徒。 Javascript,由于它的松散类型和函数性质,似乎不适合我习
我已经阅读了 Manning 的 Big Data Lambda Architecture ( http://www.manning.com/marz/BD_meap_ch01.pdf ),但仍然无法
在过去的几年里,我做了相当多的 iOS 开发,所以我非常熟悉 iOS 架构和应用程序设计(一切都是一个 ViewController,您可以将其推送、弹出或粘贴到选项卡栏中)。我最近开始探索正确的 M
我有以下应用程序,我在其中循环一些数据并显示它。 {{thing.title}} {{thing.description}}
昨天我和我的伙伴讨论了我正在开发的这个电子购物网站的架构。请注意,我为此使用 ASP.NET。他非常惊讶地发现我没有将添加到购物车的项目保留在 ArrayList 或其他通用列表中,而是使用 LINQ
我正在使用在 tridion 蓝图层次结构中处于较低位置的出版物。从蓝图中较高级别的出版物继承的一些内容和模式不适合我的出版物,并且永远不会被我的出版物使用。 我将跟进添加这些项目的内部团队,并尝试说
我目前已经在 Cassandra 中设计了一个架构,但我想知道是否有更好的方法来做事情。基本上,问题在于大多数(如果不是全部)读取都是动态的。我构建了一个分段系统作为应用程序服务,读取动态自定义查询(
我正在按照 documentation 中给出的 icingaweb UI v 2.0 布局执行在服务器上设置 icinga 的步骤。 。我成功进入设置页面,该页面要求您输入 token ,然后按照步
我必须保存来自不同社交媒体的用户的不同个人资料。例如用户可能有 1 个 Facebook 和 2 个 Twitter 个人资料。如果我保存每个配置文件它作为新文档插入不同的集合中,例如 faceboo
我的团队使用 Puppet 架构,该架构目前可在多个环境(流浪者、暂存、生产)中容纳单个应用程序。 我们现在想要扩展此设置的范围以支持其他应用程序。他们中的许多人将使用我们已经定义的现有模块的子集,而
我是一名优秀的程序员,十分优秀!