2009年2月13日星期五

TelnetEngine重构,Connection, Protocol 以及 Command各司其职

从这个class diagram中可以看到设计问题。
IConnection代表一个对设备的连接的抽象。具体有可能是Telnet, 或者HTTP之类。

TelnetConnection是基于Telnet协议的连接。

ResponseReceiverThread 是TelnetConnection被open()之后启动的接受connection output的线程。

IResponseListener抽象了对output输出进行监听的回调方法。

DslamTelnetProtocol实现了IResponseListener,希望这个类能够实时处理输出。

从类的名称到类提供的方法,都有不少问题。下面依次分析:
  1. TelnetConnection 的其中一个构造函数使用了用户名、密码。Login()功能应该从TelnetConnection中移走。

  2. 在TelnetConnection 中的connect()方法中编码实现了DslamTelnetProtocol到ResponseReceiverThread的注入、ResponseReceiverThread的启动。这样,依赖关系不明显。应当显式的把responseListener注入到connection。ResponseReceiverThread可直隐式的管理比较好。

  3. DslamTelnetProtocol是个名词。实际它完成对Dslam命令结果进行解析的工作。这个类应该分拆成两个类。并应该重命名。
    DslamDeviceConstantData: DslamTelnetProtocol中定义的与DSLAM相关的常数应该分离到这个类中。而且若干参数是用户设定不变的、一些是连接到设备后从中读取的。
    DslamCommandResultParser: 这个名称更能体现类的功能。
    【是否给DslamCommandResultParser创建一个接口ICommandResultParser?目前还感觉不到有什么意义,因为目前还只是处理一个设备,所以也就不知道到底该抽象出哪些东西。其实上面的IConnection, TelnetConnection 也有同样的问题。】

  4. 还有一些方法实现的细节需要改正。比如, wdy建议读取到一个命令结果后就自动把输出缓存清空。是啊,我为什么要保留2M的输出缓存呢?目前其没有对结果缓存的需求,也使得结果处理复杂了。