最近在给GacUI做1.0之前一个巨大的重构,其实就是因为被代码丑哭了。其实这东西也不是偶故意这么写的,只是用C++写GUI跟用XML写GUI的结构的确不一样(主要是各种组件的依赖方向是相反的)。GacUI刚开始的时候是没有什么XML的,整个设计出来都是为了让C++写GUI方便,于是导致了现在XML生成的代码一环套一环。现在要把类接口改成为了XML方便,C++写GUI管他麻痹,反正也不是不能写(逃
举个例子,一个DataGrid的ItemTemplateFactory,其实就是which 实现了一个ListView的ItemTempateFactory,which 实现了一个SelectableList的ItemTemplateFactory,which 实现了一个List的ItemTemplateFactory。这里面用了无数次adaptor模式。
因为这几个类是分开几年写的,所以单独写它们时候并不觉得有什么问题,现在回过头一看觉得巨傻。所以最近做的事情就是,把ItemTemplateFactory的接口都删掉,把依赖倒转过来,让ItemTemplate去依赖ListControl。那么一个DataGrid的ItemTemplate它就是ListControl的ItemTemplate,而不是Factory一层一层地往下adapt了。然后这些adaptor全部删掉。
估计要改几千行代码了,不过为了干净,GacUI又没有死线,没关系,慢慢改。既然有了XML,那所有的TemplateFactory都可以不要了,列表改完就改控件的,上百个类全部删光,功能不变,XML写好的GUI一行都不用改。做完这次大重构之后,就可以做简单的2D和3D的矢量图,再做几个图表控件,重做一次ParserGen,intellisense搞定,GacStudio的各项技术也就全部准备好了,最后拼起来,1.0就可以发布了!
只能赞叹微软设计WPF的人实在是太牛逼了,除去了一些C#特有的、不兼容C++的设计以外(如dependency property/routed event),凡是偶做的跟WPF不一样的,最后都证明是WPF那样做更好。凡是偶第一次做出来就觉得无比精妙、正确的设计,最后也只是跟WPF一样(譬如说MenuItemTemplate如何跨控件对齐各个部分)。这几年偶给GacUI投入了大量的时间,亲自体验了各种架构设计上的优劣,感觉水平又上了一个档次。偶想做别的东西已经很久了,等什么时候GacUI做完了,换换口味,来写几年前写废了的DB。
Principal和Partner毕竟就是Principal和Partner,就算偶代码写的再熟练,架构的知识也是要靠时间才能堆出来的,还得努力学习才能赶上他们。现在已经过了那种写一个小工具,或者搞一个数据结构,或者代码写得巨优美就沾沾自喜的年纪了。每个人都有过一段中二的、觉得自己天下第一的时期。