一个简单的在线Review工具

背景
这段时间,公司会议室紧张,导致我们只能在没有投影仪的Telebooth里Review code, 一个人告诉大家,现在打开哪个文件,在那一行,然后大家就打开那个文件,打开那一行。

当然我们也尝试过其他工具,比如MS的NetMeeting和LotusMeeting,但要么经常掉线,要么跳帧跳得厉害。

设计
我想用一个简单的方法实现一个在线的Review的工具,只需要做到以下几点
1,Reviewee
  (1)可以配置所有Reivewer的IP地址
  (2)可以修改当前Review状态:开始Review和结束Review
  (3)在Review的状态下,监听以下事件,并以UDP发送相关信息到所有Reviewer
      (a)打开一个源文件或一个比较文件:发送文件名
      (c)源文件和比较文件中的以下事件:发送文件名和文件所选中的行
          a)鼠标事件
          b)跳行,换页操作
      (c)关闭源文件或一个比较文件    :发送文件名
2,Reviewer
  (1)监听并处理相应的UDP消息:
      (a)打开一个源文件或一个比较文件:打开该文件并切换到该文件
      (c)源文件和比较文件中的以下事件:打开该文件并切换到该文件,选中相应行
          a)鼠标事件
          b)跳行,换页操作
      (c)关闭源文件或一个比较文件    :关闭该文件

实现
1,由于我们的项目是使用Eclipse进行Java开发,Eclipse平台也提供了比较丰富的接口,所以这个系统在Eclipse平台上,针对于Java源文件,文本源文件,和Java比较文件。

2,这个设计的实现需要满足个条件,就是Eclipse的JavaEditor,TextEditor和CompareEditor暴露自己的控件,让你能够添加自己的事件监听器到这个控件上,当你接收到Review消息时,又能更新这些控件,这其实是破坏封装的方法,Eclipse和JDT做了很多限制。
   (1)JavaEditor,不建议访问,也暴露其核心控件StyledText
   (2)TextEditor,可以访问,但不暴露StyledText,没办法,只好通过扩展实现自己的TextDitor,从而访问到StyledText
   (3)CompareEditor,限制访问,但可以访问其CompareEditorInput,但是也不暴露StyledText,也只好通过扩展CompareEditorInput从而拿到StyledText

3,控制控件还是直接控制控件后面的Model?本来最初的想法是
   (1)Reviewee监听所有的控件事件
   (2)Reviewee发送控件状态
   (3)Reviewer更新控件状态
  但后来发现,太多控件和控件上的事件可以改变代码的选择,后来直接改成控制控件后的Model,如果实在访问不到Model,才控制控件,这样,很多问题就绕过了。
   (1)Reviewee监听主要控件事件
   (2)Reviewee发送Model状态
   (3)Reviewer更新Model状态

4,Reviewee和Reviewer之间的通信用最简单的UDP方式,DatagramSocket和DatagramPacket,没有用到nio的东西,也不考虑任何容错。

某些总结
1,SWT中的控件及可以在其上添加的事件监听器
(1)Widget.addListener(int, Listener) 向这个widget上添加事件监听器
(2)Widget的子类可以监听自己特有的事件,比如Control.addControlListener(ControlListener)。这其实是为了实现更具体更清楚的编程,从方法层次而不是参数层次关心事件。
(3)当在一个作为Composite的控件上添加另一个控件,当我们点击前端控件时,后端Composite控件是不会受到该点击事件的。
(4)Display.windowProc() -> Control.windowProc(),SWT控件处理OS发送给该控件(窗口)的消息。

和未来工作
1,可以将Reviewee和Reviewer之间的交互做得更明确些,比如
  (1)Reviewee开始Review过程时,向某公共处注册自己的IP
  (2)Reviewer打算进行Review过程,从公共处,浏览开始的Review过程,请求加入
  (3)对于Jazz平台,这个公共某处可以是某个ChangeSet
2,可以将这个Review工具和WorkSpace关联起来,对于Jazz平台,可以和某个ChangeSet关联起来。

你可能感兴趣的:(一个简单的在线Review工具)