昨天一个同学在MSN上问我一些问题,他正在用DELPHI做一个东西,类似于QQ这样的,即对不同的IP发来的UDP包信息,用不同的窗口显示。其类图大致如下:

可以看出,这是一个很明显的表现与逻辑混合的设计:其中MainForm除了作为主窗体以外,还要负责创建ChatForm,并维护ChatForms列表,并且当收到UDP包时,还要负责将其分发到相应的ChatForm。结果只能是出现一个巨大无比的MainForm,在其中包罗万有,最后常常会造成难以维护的下场。
这是从RAD开始编程的人的通常做法,同时也是RAD工具被人垢病的一个主要方面。
所以我给他提了一个建议,如下图:

在其中插入一个中间类,用于把MainForm中创建和维护ChatForms的功能剥离出来。至于分发UDP消息的功能,暂时可以继续放在MainForm里,由TChatFormManager提供一个根据源IP查询ChatForm的方法,MainForm通过调用此方法取得相应的ChatForm,并将UDP消息交由此ChatForm处理。
其实这就是一种消除“坏味道”的重构,其做法便是所谓的“Extract Class”。
因为他这个东西我也没看到,不知道他具体要做成什么样,所以只能给一个这样的简单意见。在实际的开发中,情况应该会复杂一些,比如有可能需要把UDP的分发放到一个单独的类中处理,或者可能有不同种类的ChatForm,则需要有一个Factory Method来处理创建工作……等等。
随便说说,仅供参考。^O^
