前几天接了个任务,是要写一个测试工具用来检查一个Form上的控件是不是正确地对齐了,说起来这个需求真的是很模糊:
1) 首先就是怎么去定义“正确地对齐了”,没有个明确的规则恐怕无从下手
2) 其次是Form上的控件排列方式千奇百怪,验证起来恐怕也会让人焦头烂额
3) 再考虑到产品代码里面有成百的Form,到时候要在这些Form上统统调试一遍,每个问题都得确定到底是产品设计的问题,还是你测试工具的问题,或者是一个规则的例外......不免有些灰心。
一开始我试图把Form上的所有可见控件枚举出来,然后针对每两个控件,判断它们应不应该对齐,应该怎样对齐。后来发现这样不怎么行得通,主要就在于“针对每两个控件,判断它们应不应该对齐,应该怎样对齐”,这些很难找到明确的答案。
比如有三个控件如下排列的时候,2和3应当不应当对齐呢?
1) 假如它们都是TextBox,一般我们是会让他们对齐的
2) 但假如它们是Label呢?3和2相比有一些缩进的例子比比皆是
再比如Label在TextBox上面的时候,左对齐和右对齐似乎都无可厚非
幸好及时和DEV以及PM沟通了一下,才发现原来他们也在做类似的工作,并且显然PM在这方面的建议更为实际,从而找到一些比较明确的关于“对齐”的定义,比如:
规则1):“当一个Label位于一个TextBox之上时,它们左边界对齐应该有3pixels的缩进,竖直方向应该有3pixels的距离”。
规则2):“一个TextBox和一个Button在一排时,应当使它们的Text Baseline对齐”
......
诸如此类。
===================================
有了具体的规则之后,一切就变得简单起来。尽管规则很多,但可以明确的是,检查对齐只用考虑相邻的控件即可。所以第一步,就是遍历一下所有的控件,然后把他们的邻接关系生成一张查询表,这样以后检查到某个控件时,便可以很方便的找到自己的左邻右舍:
在这个例子中,ListBox的左邻是label5,右舍是TextBox1, label3和TextBox2,而label5的右舍就是label1, listBox1, label4和textBox3。
下一步就是根据规则去遍历空间,比如遇到一个Label时,就要判断它是不是属于规则1(label1-4)的情况,如果是,则应用规则1。
当然这里还有个麻烦的问题,就是规则的扩展问题。最初的想法是能够将规则抽象为能够用XML表达的一些模型,然后只要写一些通用的引擎来读取这些规则就可以了。但时间仓促始终没能找到合适的解决方案,只好用了很多if...else,幸好现在规则还不是很多。
===================================
工作中经常会遇到很多类似的、目标或者手段不是很明确的任务,这种情况下搞清楚需求无论如何都应该是第一步。虽然做的是技术活,但任何技术最终都是给需求服务的。