::-- limodou [2005-12-02 04:49:37]

1. 三、创建 client 的套路

第二节说到的两个类,是TCP协议客户端的创建套路(方式)。这个套路拆解如下:

1. 定义“工厂”和“协议”两个类:

(1)“协议”类是 CallbackAndDisconnectProtocol,“工厂”类是 ConnectionTestFactory

(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文档的分析研究,都不利于翻越这段陡坡。

据我的体验,集中精力地啃嚼主干骨架,不纠緾于细枝末节,这段最陡的上坡路,顶多爬个十天八天的,就能越过去。