##language:zh #pragma section-numbers on ::-- limodou [<>] <> == 三、创建 client 的套路 == 第二节说到的两个类,是TCP协议客户端的创建套路(方式)。这个套路拆解如下: 1. 定义“工厂”和“协议”两个类: (1)“协议”类是 CallbackAndDisconnectProtocol,“工厂”类是 ConnectionTestFactory 类的名字不重要,但必须正确说明所继承的父类: class CallbackAndDisconnectProtocol(protocol.Protocol) class ConnectionTestFactory(protocol.ClientFactory) (2)“协议”类是“工厂”类实例化的:protocol = CallbackAndDisconnectProtocol; (3)只在“工厂”类中有 __init__ 函数,并在其中实例化一个deferred 对象: self.deferred = defer.Deferred( ) (4)在“工厂”类中,重设父类函数 clientConnectionFailed,通过deferred 引发事件,报告连接失败: self.deferred.errback(reason) (5)在“协议”类中,重设父类函数 onnectionMade,由对象factory引用“工厂”类中的deferred,经其引发事件,报告连接正常: self.factory.deferred.callback("Connected!") 并由对象transport引发事件,报告连接断开: self.transport.loseConnection( ); 上述“对象”,都是从各自父类继承来的。 2. 在函数testConnect(host, port)中, (1)将“工厂”类实例化:testFactory = ConnectionTestFactory( ) (2)由全局循环“主持人”reactor建立以testFactory为“主演”的TCP连接: reactor.connectTCP(host, port, testFactory) (3)返回deferred对象:return testFactory.deferred 至此,一个以事件驱动为基础、异步执行任务的框架程序搭成了。 上述三节的内容,据 Twisted 官方说,是“学习曲线最陡”的部分(They represent the steepest part of the Twisted learning curve.)。 我的感受,造成“最陡”的原因,是由于套路新颖独特,初学乍练不易适应。 1. 框架对象众多,一时记不牢; 2. 对象之间的关系比较复杂,一时理不清; 3. “事件驱动”这种模式,反映在程序文本中,有时见不到明显的函数调用,让人觉得程序的去向不明; 另外,学习方法很重要。如果以学“语言”的习惯来学框架,遇上问题寻根究底,过分追求“水落石出”;或者,依赖教科书、畸重“理论”,忽视 examples 语句、结构和API文档的分析研究,都不利于翻越这段陡坡。 据我的体验,集中精力地啃嚼主干骨架,不纠緾于细枝末节,这段最陡的上坡路,顶多爬个十天八天的,就能越过去。