惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

H
Help Net Security
博客园 - Franky
GbyAI
GbyAI
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
爱范儿
爱范儿
IT之家
IT之家
酷 壳 – CoolShell
酷 壳 – CoolShell
aimingoo的专栏
aimingoo的专栏
博客园_首页
MongoDB | Blog
MongoDB | Blog
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
Recent Announcements
Recent Announcements
Scott Helme
Scott Helme
有赞技术团队
有赞技术团队
M
MIT News - Artificial intelligence
C
CERT Recently Published Vulnerability Notes
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
Jina AI
Jina AI
F
Fortinet All Blogs
N
Netflix TechBlog - Medium
L
LangChain Blog
L
LINUX DO - 最新话题
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
H
Hacker News: Front Page
MyScale Blog
MyScale Blog
P
Palo Alto Networks Blog
G
Google Developers Blog
Google DeepMind News
Google DeepMind News
AI
AI
T
Troy Hunt's Blog
Microsoft Azure Blog
Microsoft Azure Blog
阮一峰的网络日志
阮一峰的网络日志
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
Vercel News
Vercel News
Microsoft Security Blog
Microsoft Security Blog
罗磊的独立博客
S
Secure Thoughts
大猫的无限游戏
大猫的无限游戏
博客园 - 叶小钗
人人都是产品经理
人人都是产品经理
Blog — PlanetScale
Blog — PlanetScale
博客园 - 司徒正美
Apple Machine Learning Research
Apple Machine Learning Research
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
博客园 - 三生石上(FineUI控件)
S
Security @ Cisco Blogs
Cloudbric
Cloudbric
E
Exploit-DB.com RSS Feed
Attack and Defense Labs
Attack and Defense Labs

博客园 - 枫

2015半年记 再写一帖~就《离开上海》一文再说明 再见,上海~非主流码农在上海的9年心路历程 Mac下配置mysql-python 《Rework》摘录读后随感 Event Sourcing与大数据 无题(1) 在Mac上安装Hadoop [原创]一步一步用C#编写三国杀(三):设计流程 [原创]一步一步用C#编写三国杀(二):牌堆的设计 [原创]一步一步用C#编写三国杀(一):规则和需求描述 走进单元测试(3):消灭HttpContext的依赖,兼谈单元测试的设计辅助性 走进单元测试(2):必须要自动化 我也想对广大程序员说一些话 走进单元测试(1):为什么难以广泛应用? 高级语言发展之回归人类思维——听老赵的Session有感 缺乏自信怎么办? 梦话对象之三:三要素的差异与统一 梦话对象之一:逃不开的生死问题
梦话对象之二:事件之无限扩展
· 2010-01-31 · via 博客园 - 枫

上面已经谈过了对象的生死问题,那么对于这个对象,来分析其在这个生命周期中的状态变化。

在一个对象创建之后,它就被赋予了一个状态。按照分类的原则,生命周期中的对象可以分为状态改变和状态不改变两类。如果这个对象的状态不改变,那么可以将其定义为不变对象(immutable),比如一个网站的设定,在网站提供服务的这个周期中,这个包含了设定数据的对象就可以看成是不变对象。这个不变对象有个学术名称,叫做Value Object,其很多相关东西以后再说。

那么剩下的就是状态可改的对象。实际上,任何一个系统,不可能只存在Value Object。如果真的有这样的一个系统,那么这个系统没有任何的意义。因此对于任何一个状态改变的对象,在其生命周期中必然需要至少改变一次状态,这个状态的改变的操作就会在生命周期的时间轴上留下一个长度。

同样,对这个操作也存在这样的一个完全分类:在该操作之前、该操作中、该操作之后。由于计算机的线性处理,操作中的这个分类必然需要执行状态改变的操作,因此剩下的两个状态就很重要了,其甚至可以构成无限扩展的基础。例如,在恢复ASP.NET的Page对象的ViewState之前,必须要先确定是否所有的控件已经被创建。一般地我们会把代码写在一起,在恢复之前去验证。但是如果出现这样一个情况,我们自己定义了一个ValidatePage,其继承于Page,我们希望在恢复ViewState之前还要做一个数值验证的工作,那么如果没有源码的话就不能修改了。但是,如果从生命周期的角度,将恢复ViewState之前的这个分类使用RestoringViewState这个事件委托出去,那么即使没有源码,你也能进行扩展。

由于委托需要实际挂接在某个对象之中,因此在该对象执行此委托的时候,其又构成了一个状态的变化,按照这样的循环原则,可以将这个事件无限的传递,这样就构成了无限的扩展。而从实际生活来看,所谓的“蝴蝶效应”就是这样无限扩展的一个实例:蝴蝶扇动翅膀是一个操作,在这个操作之后的事件通过气流状态变化的不断传递,最终构成了美国德克萨斯的龙卷风。注意:这里有个前提,就是这样委托出去的事件不能最终传递到自身。如果当中存在一个循环,那么就无法执行所谓的操作,那么这个操作之前的分类也就无从谈起。而对于之后的这种分类,如果其后面还有另外的逻辑,那么上一个操作的之后与下一个操作的之前是重叠的,因此也可以看做是一个操作的之前,同样也归于之前的一类;而后面没有其他的逻辑,那么说明这个逻辑结束了,也就是其生命周期也结束了,其事件无论怎么传递都不会回到自身了。这也就是为什么事件是以生命周期为基础的操作。

上面所论述的都是对于一个对象来说的,如果一个系统严格按照这样的分类来划分,那太复杂,而且各种委托关系传递到最后自己都不知道传递到哪里去了。因此,实际的系统中都是通过对关键业务流程逻辑来保留事件进行扩展。仔细分析下ASP.NET的Page的生命周期,就会发现微软对一些关键性的事件都提供了之前和之后的两种操作。这也是微软为什么封装了很多东西,但大家使用起来都不觉得很麻烦的原因。